diff --git a/packages/chicken/lib/data/repositories/chicken_repository.dart b/packages/chicken/lib/data/repositories/chicken_repository.dart index d86de00..5f5092c 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository.dart @@ -1,3 +1,4 @@ +import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; import 'package:rasadyar_chicken/data/models/response/allocated_made/allocated_made.dart'; @@ -81,6 +82,19 @@ abstract class ChickenRepository { required SubmitStewardAllocation request, }); + Future deleteStewardAllocation({ + required String token, + Map? queryParameters, + }); + + + Future updateStewardAllocation({ + required String token, + required ConformAllocation request, + }); + + + Future getStewardDashboard({ required String token, required String stratDate, diff --git a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart index 3bf032b..d5d33d8 100644 --- a/packages/chicken/lib/data/repositories/chicken_repository_imp.dart +++ b/packages/chicken/lib/data/repositories/chicken_repository_imp.dart @@ -1,3 +1,4 @@ +import 'package:rasadyar_chicken/data/models/request/conform_allocation/conform_allocation.dart'; import 'package:rasadyar_chicken/data/models/request/create_steward_free_bar/create_steward_free_bar.dart'; import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart'; import 'package:rasadyar_chicken/data/models/request/submit_steward_allocation/submit_steward_allocation.dart'; @@ -112,11 +113,11 @@ class ChickenRepositoryImpl implements ChickenRepository { }) async { var res = await _httpClient.get( '/steward-allocation/', - queryParameters:queryParameters, + queryParameters: queryParameters, headers: {'Authorization': 'Bearer $token'}, fromJson: (json) => PaginationModel.fromJson( json, - (json) => AllocatedMadeModel.fromJson(json as Map), + (json) => AllocatedMadeModel.fromJson(json as Map), ), ); return res.data; @@ -207,6 +208,30 @@ class ChickenRepositoryImpl implements ChickenRepository { ); } + @override + Future deleteStewardAllocation({ + required String token, + Map? queryParameters, + }) async { + await _httpClient.delete( + '/steward-allocation/0/', + headers: {'Authorization': 'Bearer $token'}, + queryParameters: queryParameters, + ); + } + + @override + Future updateStewardAllocation({ + required String token, + required ConformAllocation request, + }) async { + await _httpClient.put( + '/steward-allocation/0/', + headers: {'Authorization': 'Bearer $token'}, + queryParameters: request.toJson(), + ); + } + @override Future getStewardDashboard({ required String token, diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart index 6a96717..972beb8 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/logic.dart @@ -37,10 +37,13 @@ class SalesInProvinceLogic extends GetxController { final RxBool addPageAllocationsMade = false.obs; final RxBool hasMoreDataAllocationsMade = true.obs; + Rxn selectedAllocationModelForUpdate = + Rxn(); + @override void onInit() { super.onInit(); - //rootLogic.getInventory(); + getAllocatedMade(); getRolesProducts(); getGuilds(); @@ -254,12 +257,73 @@ class SalesInProvinceLogic extends GetxController { ); } + Future deleteAllocation(AllocatedMadeModel model) async { + safeCall( + call: () async => + await rootLogic.chickenRepository.deleteStewardAllocation( + token: rootLogic.tokenService.accessToken.value!, + queryParameters: {'steward_allocation_key': model.key}, + ), + + onSuccess: (result) { + getAllocatedMade(); + }, + onError: (error, stackTrace) {}, + ); + } + @override void dispose() { rootLogic.inventoryExpandedList.clear(); super.dispose(); } - //TODO - void setEditData(AllocatedMadeModel item) {} + void setEditData(AllocatedMadeModel item) { + selectedAllocationModelForUpdate.value = item; + selectedProductModel.value = rolesProductsModel.first; + selectedGuildModel.value = GuildModel(guildsName: 'tst'); + weight.value = item.weightOfCarcasses ?? 0; + pricePerKilo.value = item.amount ?? 0; + totalCost.value = item.totalAmount ?? 0; + weightController.text = weight.value.toString().separatedByComma; + pricePerKiloController.text = pricePerKilo.value + .toString() + .separatedByComma; + totalCostController.text = totalCost.value.toString().separatedByComma; + isValid.value = true; + } + + void clearForm() { + selectedGuildModel.value = null; + weight.value = 0; + pricePerKilo.value = 0; + totalCost.value = 0; + weightController.clear(); + pricePerKiloController.clear(); + totalCostController.clear(); + isValid.value = false; + } + + Future updateAllocation() async { + ConformAllocation updatedAllocationModel = ConformAllocation( + allocation_key: selectedAllocationModelForUpdate.value?.key, + amount: pricePerKilo.value, + total_amount: totalCost.value, + number_of_carcasses: 0, + weight_of_carcasses: weight.value, + ); + + safeCall( + call: () async => + await rootLogic.chickenRepository.updateStewardAllocation( + token: rootLogic.tokenService.accessToken.value!, + request: updatedAllocationModel, + ), + + onSuccess: (result) { + getAllocatedMade(); + }, + onError: (error, stackTrace) {}, + ); + } } diff --git a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart index 860201e..b9c5bbe 100644 --- a/packages/chicken/lib/presentation/pages/sales_in_province/view.dart +++ b/packages/chicken/lib/presentation/pages/sales_in_province/view.dart @@ -338,9 +338,9 @@ class SalesInProvincePage extends GetView { ); } - Widget showAddBottomSheet() { + Widget showAddBottomSheet([bool isEditMode = false]) { return BaseBottomSheet( - height: Get.height * 0.75, + height: Get.height * (isEditMode ? 0.45 : 0.75), child: Padding( padding: EdgeInsets.only( left: 16, @@ -352,52 +352,63 @@ class SalesInProvincePage extends GetView { mainAxisSize: MainAxisSize.min, children: [ Text( - 'ثبت توزیع/ فروش', + '${isEditMode ? 'ویرایش' :'ثبت' } توزیع/ فروش', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), ), - const SizedBox(height: 12), - RTextField( - controller: TextEditingController(), - label: 'تاریخ', - enabled: false, - initText: Jalali.now().formatCompactDate(), + Visibility( + visible: isEditMode == false, + child: Column( + children: [ + const SizedBox(height: 12), + RTextField( + controller: TextEditingController(), + label: 'تاریخ', + enabled: false, + initText: Jalali.now().formatCompactDate(), + ), + const SizedBox(height: 12), + Material( + type: MaterialType.transparency, + child: productDropDown(), + ), + const SizedBox(height: 12), + SizedBox( + height: 40, + child: ObxValue((data) { + return Row( + children: [ + Radio( + value: 1, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; + + controller.selectedGuildModel.value = null; + controller.selectedGuildModel.refresh(); + }, + ), + Text('فروش اختصاصی', style: AppFonts.yekan14), + SizedBox(width: 12), + Radio( + value: 2, + groupValue: controller.saleType.value, + onChanged: (value) { + controller.saleType.value = value!; + }, + ), + Text('فروش آزاد', style: AppFonts.yekan14), + ], + ); + }, controller.saleType), + ), + const SizedBox(height: 12), + + guildsDropDown(), + + + ], + ), ), - const SizedBox(height: 12), - Material(type: MaterialType.transparency, child: productDropDown()), - const SizedBox(height: 12), - SizedBox( - height: 40, - child: ObxValue((data) { - return Row( - children: [ - Radio( - value: 1, - groupValue: controller.saleType.value, - onChanged: (value) { - controller.saleType.value = value!; - - controller.selectedGuildModel.value = null; - controller.selectedGuildModel.refresh(); - }, - ), - Text('فروش اختصاصی', style: AppFonts.yekan14), - SizedBox(width: 12), - Radio( - value: 2, - groupValue: controller.saleType.value, - onChanged: (value) { - controller.saleType.value = value!; - }, - ), - Text('فروش آزاد', style: AppFonts.yekan14), - ], - ); - }, controller.saleType), - ), - const SizedBox(height: 12), - - guildsDropDown(), - const SizedBox(height: 12), RTextField( controller: controller.weightController, @@ -423,7 +434,8 @@ class SalesInProvincePage extends GetView { ], onChanged: (p0) { - controller.pricePerKilo.value = int.tryParse(p0.clearComma) ?? 0; + controller.pricePerKilo.value = + int.tryParse(p0.clearComma) ?? 0; }, keyboardType: TextInputType.number, label: 'قیمت هر کیلو', @@ -438,7 +450,9 @@ class SalesInProvincePage extends GetView { SeparatorInputFormatter(), ], borderColor: AppColor.darkGreyLight, - initText: controller.totalCost.value.toString().separatedByComma, + initText: controller.totalCost.value + .toString() + .separatedByComma, controller: controller.totalCostController, label: 'هزینه کل', ), @@ -447,10 +461,16 @@ class SalesInProvincePage extends GetView { const SizedBox(height: 20), ObxValue((data) { return RElevated( - text: 'ثبت', + text:isEditMode? 'ویرایش': 'ثبت', + textStyle: AppFonts.yekan16.copyWith(color: Colors.white), + height: 40, onPressed: data.value - ? () async{ - await controller.submitAllocation(); + ? () async { + isEditMode + ? await controller.submitAllocation() + : await controller.updateAllocation(); + + controller.clearForm(); controller.getAllocatedMade(); Get.back(); } @@ -680,13 +700,12 @@ class SalesInProvincePage extends GetView { GestureDetector( onTap: () { controller.setEditData(item); - //TODO - /* Get.bottomSheet( - addOrEditBuyerBottomSheet(true), - isScrollControlled: true, - ).whenComplete(() { - controller.resetSubmitForm(); - });*/ + Get.bottomSheet( + showAddBottomSheet(true), + isScrollControlled: true, + ).whenComplete(() { + controller.clearForm(); + }); }, child: Assets.vec.editSvg.svg( width: 20, @@ -706,7 +725,22 @@ class SalesInProvincePage extends GetView { ), ), - SizedBox(), + GestureDetector( + onTap: () { + buildDeleteDialog( + onConfirm: () => + controller.deleteAllocation(item), + ); + }, + child: Assets.vec.trashSvg.svg( + width: 16, + height: 16, + colorFilter: ColorFilter.mode( + AppColor.error, + BlendMode.srcIn, + ), + ), + ), ], ), @@ -883,4 +917,30 @@ class SalesInProvincePage extends GetView { return model.steward; } } + + Future buildDeleteDialog({ + required Future Function() onConfirm, + }) async { + await Get.defaultDialog( + title: 'حذف ', + middleText: 'آیا از حذف این مورد مطمئن هستید؟', + confirm: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.error, + foregroundColor: Colors.white, + ), + onPressed: () async { + await onConfirm(); + Get.back(); + }, + child: Text('بله'), + ), + cancel: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text('خیر'), + ), + ).whenComplete(() => controller.getAllocatedMade()); + } }