step 10 : proses insert transaksi

This commit is contained in:
sindhu
2024-01-15 15:22:08 +07:00
parent 72dbe53fd5
commit e35e3c5b68
4 changed files with 440 additions and 191 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -46,4 +46,48 @@ class TransaksiRepository extends BaseRepository {
}); });
return result; return result;
} }
// insert transaksi
Future<String> insertTransaksi(
String tanggal,
String tipe,
String kategoriid,
String jumlah,
String catatan,
String userid,
String sender,
String url) async {
String paramPostInUrl = "";
if (tipe == "KREDIT") {
sender = "";
paramPostInUrl =
"?tanggal=$tanggal&tipe=$tipe&kategoriid=$kategoriid&jumlah=$jumlah&catatan=$catatan&url=$url&userid=$userid&sender=$sender";
} else {
if (tipe == "DEBIT") {
kategoriid = "0";
paramPostInUrl =
"?tanggal=$tanggal&tipe=$tipe&kategoriid=$kategoriid&jumlah=$jumlah&catatan=$catatan&url=$url&userid=$userid&sender=$sender";
}
}
// /?tanggal=2023-12-29&tipe=KREDIT&kategoriid=3&jumlah=5000&catatan=Lakban%20Besar&url=&userid=1&sender=
final service =
"${Constant.baseUrlDevone}transaction/addtransaction/$paramPostInUrl";
final resp = await get(
// param: {
// "": "",
// },
service: service,
);
print("url insert transaksi : $service");
// final result = List<ListCategory>.empty(growable: true);
// resp['data'].forEach((e) {
// final model = ListCategory.fromJson(e);
// result.add(model);
// });
return resp['status'];
}
} }

View File

@@ -0,0 +1,84 @@
import 'package:equatable/equatable.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../repository/transaksi_repository.dart';
import '../../provider/dio_provider.dart';
import '../../repository/base_repository.dart';
abstract class InsertTransaksiState extends Equatable {
final DateTime date;
const InsertTransaksiState(this.date);
@override
List<Object?> get props => [date];
}
class InsertTransaksiStateInit extends InsertTransaksiState {
InsertTransaksiStateInit() : super(DateTime.now());
}
class InsertTransaksiStateLoading extends InsertTransaksiState {
InsertTransaksiStateLoading() : super(DateTime.now());
}
class InsertTransaksiStateError extends InsertTransaksiState {
final String message;
InsertTransaksiStateError({
required this.message,
}) : super(DateTime.now());
}
class InsertTransaksiStateDone extends InsertTransaksiState {
// final List<ListType> model;
final String resp;
InsertTransaksiStateDone({
required this.resp,
}) : super(DateTime.now());
}
//notifier
class InsertTransaksiNotifier extends StateNotifier<InsertTransaksiState> {
final Ref ref;
InsertTransaksiNotifier({
required this.ref,
}) : super(InsertTransaksiStateInit());
void insertTransaksi(
String tanggal,
String tipe,
String kategoriid,
String jumlah,
String catatan,
String userid,
String sender,
String url,
) async {
try {
state = InsertTransaksiStateLoading();
final dio = ref.read(dioProvider);
final resp = await TransaksiRepository(dio: dio).insertTransaksi(
tanggal,
tipe,
kategoriid,
jumlah,
catatan,
userid,
sender,
url,
);
state = InsertTransaksiStateDone(resp: resp);
} catch (e) {
if (e is BaseRepositoryException) {
state = InsertTransaksiStateError(message: e.message.toString());
} else {
state = InsertTransaksiStateError(message: e.toString());
}
}
}
}
//provider
final insertTransaksiProvider =
StateNotifierProvider<InsertTransaksiNotifier, InsertTransaksiState>(
(ref) => InsertTransaksiNotifier(ref: ref),
);

View File

@@ -1,5 +1,7 @@
import 'package:app_petty_cash/app/app_extension.dart'; import 'package:app_petty_cash/app/app_extension.dart';
import 'package:app_petty_cash/app/route.dart';
import 'package:app_petty_cash/model/list_type_model.dart'; import 'package:app_petty_cash/model/list_type_model.dart';
import 'package:app_petty_cash/screen/transaksi/insert_transaksi_provider.dart';
import 'package:app_petty_cash/screen/transaksi/list_category_provider.dart'; import 'package:app_petty_cash/screen/transaksi/list_category_provider.dart';
import 'package:app_petty_cash/screen/transaksi/list_type_provider.dart'; import 'package:app_petty_cash/screen/transaksi/list_type_provider.dart';
import 'package:dropdown_button2/dropdown_button2.dart'; import 'package:dropdown_button2/dropdown_button2.dart';
@@ -66,6 +68,9 @@ class TransaksiScreen extends HookConsumerWidget {
), ),
); );
// transaksi
final transaksiIsLoading = useState(false);
// A. LISTEN PROVIDER // A. LISTEN PROVIDER
ref.listen( ref.listen(
listTypeProvider, listTypeProvider,
@@ -73,7 +78,7 @@ class TransaksiScreen extends HookConsumerWidget {
if (next is ListTypeStateLoading) { if (next is ListTypeStateLoading) {
listTypeLoading.value = true; listTypeLoading.value = true;
} else if (next is ListTypeStateError) { } else if (next is ListTypeStateError) {
print(next.message); // print(next.message);
listTypeLoading.value = false; listTypeLoading.value = false;
SanckbarWidget(context, next.message, snackbarType.error); SanckbarWidget(context, next.message, snackbarType.error);
} else if (next is ListTypeStateDone) { } else if (next is ListTypeStateDone) {
@@ -100,7 +105,7 @@ class TransaksiScreen extends HookConsumerWidget {
if (next is ListCategoryStateLoading) { if (next is ListCategoryStateLoading) {
listCategoryLoading.value = true; listCategoryLoading.value = true;
} else if (next is ListCategoryStateError) { } else if (next is ListCategoryStateError) {
print(next.message); // print(next.message);
listCategoryLoading.value = false; listCategoryLoading.value = false;
SanckbarWidget(context, next.message, snackbarType.error); SanckbarWidget(context, next.message, snackbarType.error);
} else if (next is ListCategoryStateDone) { } else if (next is ListCategoryStateDone) {
@@ -113,6 +118,31 @@ class TransaksiScreen extends HookConsumerWidget {
}, },
); );
// insert transaksi provider
ref.listen(
insertTransaksiProvider,
(previous, next) {
if (next is InsertTransaksiStateLoading) {
transaksiIsLoading.value = true;
} else if (next is InsertTransaksiStateError) {
print(next.message);
transaksiIsLoading.value = false;
SanckbarWidget(context, next.message, snackbarType.error);
} else if (next is InsertTransaksiStateDone) {
// print(jsonEncode(next.model));
// print(next.model.length);
transaksiIsLoading.value = false;
SanckbarWidget(
context,
'Data Berhasil Disimpan',
snackbarType.success,
);
Navigator.of(context).pop();
Navigator.of(context).pushNamed(homeRoute);
}
},
);
useEffect(() { useEffect(() {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
// list Type Provider // list Type Provider
@@ -254,13 +284,25 @@ class TransaksiScreen extends HookConsumerWidget {
SizedBox( SizedBox(
width: Constant.getActualXPhone(context: context, x: 340), width: Constant.getActualXPhone(context: context, x: 340),
height: Constant.getActualYPhone(context: context, y: 36), height: Constant.getActualYPhone(context: context, y: 36),
child: Row( child: (listTypeLoading.value)
? SizedBox(
width: Constant.getActualXPhone(
context: context, x: 24),
height: Constant.getActualYPhone(
context: context, y: 32),
child: Center(
child: CircularProgressIndicator(),
),
)
: Row(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
if (listTypeData.value.isEmpty) if (listTypeData.value.isEmpty)
Text('Radio Button Empty') Text('Radio Button Empty')
else else
for (var i = 0; i < listTypeData.value.length; i++) for (var i = 0;
i < listTypeData.value.length;
i++)
Padding( Padding(
padding: const EdgeInsets.only(right: 20), padding: const EdgeInsets.only(right: 20),
child: Row( child: Row(
@@ -268,10 +310,12 @@ class TransaksiScreen extends HookConsumerWidget {
Radio<ListType>( Radio<ListType>(
activeColor: Constant.confirmed, activeColor: Constant.confirmed,
value: listTypeData.value[i], value: listTypeData.value[i],
groupValue: selectedListTypeData.value, groupValue:
selectedListTypeData.value,
onChanged: (ListType? index) { onChanged: (ListType? index) {
if (isMounted()) { if (isMounted()) {
selectedListTypeData.value = index!; selectedListTypeData.value =
index!;
} else { } else {
return; return;
} }
@@ -279,7 +323,8 @@ class TransaksiScreen extends HookConsumerWidget {
), ),
Text( Text(
listTypeData.value[i].typename ?? "", listTypeData.value[i].typename ?? "",
style: Constant.body1(context: context) style:
Constant.body1(context: context)
.copyWith( .copyWith(
color: Constant.textBlack, color: Constant.textBlack,
fontWeight: FontWeight.w400, fontWeight: FontWeight.w400,
@@ -297,19 +342,31 @@ class TransaksiScreen extends HookConsumerWidget {
), ),
// Kategori // Kategori
if (selectedListTypeData.value.typeid != "KREDIT") ...[ if (selectedListTypeData.value.typeid == "KREDIT") ...[
Text( Text(
'Kategori', 'Kategori',
style: Constant.body1(context: context).copyWith( style: Constant.body1(context: context).copyWith(
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
color: Constant.textBlack), color: Constant.textBlack,
),
), ),
SizedBox( SizedBox(
height: Constant.getActualYPhone(context: context, y: 10), height: Constant.getActualYPhone(context: context, y: 10),
), ),
// Dropdown kategori // Dropdown kategori
SizedBox( (listCategoryLoading.value)
width: Constant.getActualXPhone(context: context, x: 390), ? SizedBox(
width: Constant.getActualXPhone(
context: context, x: 24),
height: Constant.getActualYPhone(
context: context, y: 32),
child: Center(
child: CircularProgressIndicator(),
),
)
: SizedBox(
width: Constant.getActualXPhone(
context: context, x: 390),
child: DropdownButtonHideUnderline( child: DropdownButtonHideUnderline(
child: DropdownButton2<ListCategory>( child: DropdownButton2<ListCategory>(
isExpanded: true, isExpanded: true,
@@ -327,8 +384,8 @@ class TransaksiScreen extends HookConsumerWidget {
), ),
], ],
), ),
items: items: listCategoryData.value
listCategoryData.value.map((ListCategory option) { .map((ListCategory option) {
return DropdownMenuItem<ListCategory>( return DropdownMenuItem<ListCategory>(
value: option, value: option,
child: Text( child: Text(
@@ -348,15 +405,15 @@ class TransaksiScreen extends HookConsumerWidget {
// } // }
}, },
buttonStyleData: ButtonStyleData( buttonStyleData: ButtonStyleData(
height: height: Constant.getActualY(
Constant.getActualY(context: context, y: 56), context: context, y: 56),
width: width: Constant.getActualX(
Constant.getActualX(context: context, x: 320), context: context, x: 320),
padding: EdgeInsets.only( padding: EdgeInsets.only(
left: left: Constant.getActualX(
Constant.getActualX(context: context, x: 10), context: context, x: 10),
right: right: Constant.getActualX(
Constant.getActualX(context: context, x: 10), context: context, x: 10),
), ),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Constant.white, color: Constant.white,
@@ -375,17 +432,18 @@ class TransaksiScreen extends HookConsumerWidget {
iconDisabledColor: Colors.grey, iconDisabledColor: Colors.grey,
), ),
dropdownStyleData: DropdownStyleData( dropdownStyleData: DropdownStyleData(
maxHeight: maxHeight: Constant.getActualY(
Constant.getActualY(context: context, y: 200), context: context, y: 200),
// width: Constant.getActualX(context: context, x: 320), // width: Constant.getActualX(context: context, x: 320),
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: Constant.getActualY(context: context, y: 10), top: Constant.getActualY(
left: context: context, y: 10),
Constant.getActualX(context: context, x: 10), left: Constant.getActualX(
right: context: context, x: 10),
Constant.getActualX(context: context, x: 10), right: Constant.getActualX(
bottom: context: context, x: 10),
Constant.getActualY(context: context, y: 10), bottom: Constant.getActualY(
context: context, y: 10),
), ),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Constant.white, color: Constant.white,
@@ -403,20 +461,22 @@ class TransaksiScreen extends HookConsumerWidget {
offset: const Offset(0, -10), offset: const Offset(0, -10),
scrollbarTheme: ScrollbarThemeData( scrollbarTheme: ScrollbarThemeData(
radius: const Radius.circular(40), radius: const Radius.circular(40),
thickness: MaterialStateProperty.all<double>(6), thickness:
MaterialStateProperty.all<double>(6),
thumbVisibility: thumbVisibility:
MaterialStateProperty.all<bool>(true), MaterialStateProperty.all<bool>(true),
), ),
), ),
menuItemStyleData: MenuItemStyleData( menuItemStyleData: MenuItemStyleData(
height: height: Constant.getActualY(
Constant.getActualY(context: context, y: 56), context: context, y: 56),
padding: EdgeInsets.only( padding: EdgeInsets.only(
top: Constant.getActualY(context: context, y: 10), top: Constant.getActualY(
left: context: context, y: 10),
Constant.getActualX(context: context, x: 10), left: Constant.getActualX(
right: context: context, x: 10),
Constant.getActualX(context: context, x: 10), right: Constant.getActualX(
context: context, x: 10),
), ),
), ),
), ),
@@ -428,10 +488,13 @@ class TransaksiScreen extends HookConsumerWidget {
), ),
], ],
// Nama Pengirim
if (selectedListTypeData.value.typeid == "DEBIT") ...[
Text( Text(
'Nama Pengirim', 'Nama Pengirim',
style: Constant.body1(context: context).copyWith( style: Constant.body1(context: context).copyWith(
fontWeight: FontWeight.w600, color: Constant.textBlack), fontWeight: FontWeight.w600,
color: Constant.textBlack),
), ),
SizedBox( SizedBox(
height: Constant.getActualYPhone(context: context, y: 10), height: Constant.getActualYPhone(context: context, y: 10),
@@ -439,10 +502,12 @@ class TransaksiScreen extends HookConsumerWidget {
TextField( TextField(
controller: ctrlNamaPengirim, controller: ctrlNamaPengirim,
decoration: InputDecoration( decoration: InputDecoration(
hintStyle: Constant.body2_400(context: context).copyWith( hintStyle:
Constant.body2_400(context: context).copyWith(
color: Colors.orange, color: Colors.orange,
), ),
labelStyle: Constant.body2_400(context: context).copyWith( labelStyle:
Constant.body2_400(context: context).copyWith(
color: Colors.orange, color: Colors.orange,
), ),
border: OutlineInputBorder( border: OutlineInputBorder(
@@ -461,6 +526,7 @@ class TransaksiScreen extends HookConsumerWidget {
// hintText: 'Nama Pengirim', // hintText: 'Nama Pengirim',
), ),
), ),
],
// CustomTextField( // CustomTextField(
// isNumber: false, // isNumber: false,
// isReadOnly: false, // isReadOnly: false,
@@ -618,12 +684,67 @@ class TransaksiScreen extends HookConsumerWidget {
width: Constant.getActualXPhone(context: context, x: 336), width: Constant.getActualXPhone(context: context, x: 336),
height: Constant.getActualYPhone(context: context, y: 42), height: Constant.getActualYPhone(context: context, y: 42),
child: ElevatedButton( child: ElevatedButton(
child: Text( child: Stack(
children: [
(transaksiIsLoading.value)
? SizedBox(
width: Constant.getActualXPhone(
context: context, x: 24),
height: Constant.getActualYPhone(
context: context, y: 32),
child: CircularProgressIndicator(
color: Colors.white,
),
)
: Text(
'Simpan', 'Simpan',
style: Constant.body1(context: context).copyWith( style: Constant.body1(context: context).copyWith(
fontWeight: FontWeight.w600, color: Constant.textBlack), fontWeight: FontWeight.w600,
color: Constant.textBlack),
), ),
onPressed: () {}, ],
),
onPressed: () {
if (selectedListTypeData.value.typeid.toString() ==
"KREDIT") {
ctrlNamaPengirim.text = "";
// validasi form
} else {
if (selectedListTypeData.value.typeid.toString() ==
"DEBIT") {
selectedListCategory.value.categoryid = "0";
// validasi form
}
}
DateTime parsedDate = DateFormat('dd-MM-yyyy').parse(
ctrlTglAwal.value.text.toString(),
);
String formattedDateTransaksi =
DateFormat('yyyy-MM-dd').format(parsedDate);
var param = {
"tgltransaksi": formattedDateTransaksi,
"typeid": selectedListTypeData.value.typeid.toString(),
"categoryid":
selectedListCategory.value.categoryid.toString(),
"jumlah": ctrlJumlah.value.text.toString(),
"catatan": ctrlCatatan.value.text.toString(),
"userid": "1",
"namapengirim": ctrlNamaPengirim.value.text.toString(),
"url": "",
};
print(param);
ref.read(insertTransaksiProvider.notifier).insertTransaksi(
formattedDateTransaksi,
selectedListTypeData.value.typeid.toString(),
selectedListCategory.value.categoryid.toString(),
ctrlJumlah.value.text.toString(),
ctrlCatatan.value.text.toString(),
"1",
ctrlNamaPengirim.value.text.toString(),
"",
);
},
), ),
), ),
), ),