feat : new changes from back

This commit is contained in:
2025-10-12 12:05:02 +03:30
parent 9a29b0ea58
commit 60dd806f7c
23 changed files with 472 additions and 233 deletions

View File

@@ -31,6 +31,7 @@ class BuyOutOfProvinceLogic extends GetxController {
Rxn<XFile> selectedImage = Rxn<XFile>();
RxnString _base64Image = RxnString();
RxnString editImageUrl = RxnString();
RxnString editFreeBarKey = RxnString();
StewardRootLogic rootLogic = Get.find<StewardRootLogic>();
@@ -172,7 +173,7 @@ class BuyOutOfProvinceLogic extends GetxController {
selectedProvince.value != null &&
selectedCity.value != null &&
selectedProduct.value != null &&
selectedImage.value != null;
(selectedImage.value != null || editImageUrl.value != null);
if (isSubmitButtonEnabled.value) {
isOnLoadingSubmitOrEdit.value = false;
@@ -196,6 +197,7 @@ class BuyOutOfProvinceLogic extends GetxController {
province: selectedProvince.value!.name,
city: selectedCity.value!.name,
weightOfCarcasses: int.parse(carcassWeightController.text.clearComma),
numberOfCarcasses: int.parse(carcassCountController.text.clearComma),
barImage: _base64Image.value,
date: DateTime.now().formattedYHMS,
);
@@ -228,42 +230,56 @@ class BuyOutOfProvinceLogic extends GetxController {
isSubmitButtonEnabled.value = false;
}
void setEditData(StewardFreeBar item) {
void setEditData(StewardFreeBar item) async {
editImageUrl.value = item.barImage;
sellerNameController.text = item.killHouseName ?? '';
sellerPhoneController.text = item.killHouseMobile ?? '';
carcassWeightController.text = item.weightOfCarcasses?.toInt().toString() ?? '';
carcassWeightController.text = item.weightOfCarcasses.separatedByComma;
carcassCountController.text = item.numberOfCarcasses.separatedByComma;
editFreeBarKey.value = item.key;
selectedProvince.value = IranProvinceCityModel(name: item.province);
selectedCity.value = IranProvinceCityModel(name: item.city);
selectedProduct.value = rootLogic.rolesProductsModel.firstWhere(
(element) => element.key == item.product!.key,
);
isSubmitButtonEnabled.value = true;
}
Future<void> editStewardPurchaseOutOfProvince(StewardFreeBar item) async {
Future<void> editStewardPurchaseOutOfProvince() async {
CreateStewardFreeBar edit = CreateStewardFreeBar(
productKey: selectedProduct.value!.key,
key: editFreeBarKey.value,
killHouseName: sellerNameController.text,
killHouseMobile: sellerPhoneController.text,
province: selectedProvince.value!.name,
city: selectedCity.value!.name,
weightOfCarcasses: int.parse(carcassWeightController.text.clearComma),
barImage: _base64Image.value,
numberOfCarcasses: int.parse(carcassCountController.text.clearComma),
date: DateTime.now().formattedYHMS,
);
if (_base64Image.value != null) {
edit = edit.copyWith(barImage: _base64Image.value);
}
await safeCall(
showError: true,
call: () => rootLogic.chickenRepository.editStewardPurchasesOutSideOfTheProvince(
token: rootLogic.tokenService.accessToken.value!,
queryParameters: buildRawQueryParams(queryParams: {'key': key}),
body: edit,
),
onSuccess: (result) {
onRefresh();
rootLogic.onRefresh();
toggleExpansion();
},
);
}
Future<void> deleteStewardPurchaseOutOfProvince(String key) async {
await safeCall(
call: () => rootLogic.chickenRepository.editStewardPurchasesOutSideOfTheProvince(
call: () => rootLogic.chickenRepository.deleteStewardPurchasesOutSideOfTheProvince(
token: rootLogic.tokenService.accessToken.value!,
queryParameters: buildRawQueryParams(queryParams: {'key': key}),
),
@@ -278,9 +294,9 @@ class BuyOutOfProvinceLogic extends GetxController {
void toggleExpansion({int? index}) {
if (expandedListIndex.value == index || index == null) {
expandedListIndex.value = -1; // Collapse if the same index is tapped
expandedListIndex.value = -1;
} else {
expandedListIndex.value = index; // Expand the new index
expandedListIndex.value = index;
}
}
}

View File

@@ -218,10 +218,12 @@ class BuyOutOfProvincePage extends GetView<BuyOutOfProvinceLogic> {
onPressed: () {
buildDeleteDialog(
onConfirm: () => controller.deleteStewardPurchaseOutOfProvince(item.key!),
onRefresh: () => controller.getStewardPurchaseOutOfProvince(),
).then((value) {
controller.onRefresh();
});
onRefresh: () async {
controller.rootLogic.onRefresh();
controller.onRefresh();
controller.toggleExpansion();
},
);
},
borderColor: AppColor.redNormal,
),
@@ -409,14 +411,18 @@ class BuyOutOfProvincePage extends GetView<BuyOutOfProvinceLogic> {
width: Get.width,
backgroundColor: AppColor.greenNormal,
isLoading: controller.isOnLoadingSubmitOrEdit.value,
onPressed: controller.isSubmitButtonEnabled.value
enabled: controller.isSubmitButtonEnabled.value,
onPressed: isOnEdit
? () async {
var res = await controller.editStewardPurchaseOutOfProvince();
Get.back();
}
: () async {
var res = await controller.createStewardPurchaseOutOfProvince();
if (res) {
Get.back();
}
}
: null,
},
height: 40,
);
});

View File

@@ -18,7 +18,7 @@ class SalesInProvinceLogic extends GetxController {
StewardRootLogic rootLogic = Get.find<StewardRootLogic>();
SaleLogic saleLogic = Get.find<SaleLogic>();
RxnString searchedValue = RxnString();
RxList<int> isExpandedList = <int>[].obs;
RxInt expandedListIndex = (-1).obs;
RxList<String> routesName = RxList();
Rx<Color> bgConfirmAllColor = AppColor.blueNormal.obs;
final RxBool isLoadingMoreAllocationsMade = false.obs;
@@ -33,12 +33,8 @@ class SalesInProvinceLogic extends GetxController {
GlobalKey<FormState> formKey = GlobalKey<FormState>();
Rx<Jalali> fromDateFilter = Jalali
.now()
.obs;
Rx<Jalali> toDateFilter = Jalali
.now()
.obs;
Rx<Jalali> fromDateFilter = Jalali.now().obs;
Rx<Jalali> toDateFilter = Jalali.now().obs;
Rxn<ProductModel> selectedProductModel = Rxn<ProductModel>();
Rxn<GuildModel> selectedGuildModel = Rxn<GuildModel>();
Rxn<GuildProfile> guildProfile = Rxn<GuildProfile>();
@@ -84,16 +80,14 @@ class SalesInProvinceLogic extends GetxController {
});
totalCost.listen((data) {
totalCostController.text = data
.toString()
.separatedByComma;
totalCostController.text = data.toString().separatedByComma;
isValid.value =
weight.value > 0 &&
pricePerKilo.value > 0 &&
totalCost.value > 0 &&
selectedProductModel.value != null &&
selectedGuildModel.value != null;
pricePerKilo.value > 0 &&
totalCost.value > 0 &&
selectedProductModel.value != null &&
selectedGuildModel.value != null;
});
everAll([
totalCost,
@@ -114,7 +108,7 @@ class SalesInProvinceLogic extends GetxController {
debounce(
searchedValue,
(callback) => getAllocatedMade(),
(callback) => getAllocatedMade(),
time: Duration(milliseconds: timeDebounce),
);
}
@@ -133,8 +127,7 @@ class SalesInProvinceLogic extends GetxController {
}
safeCall(
call: () async =>
await rootLogic.chickenRepository.getAllocatedMade(
call: () async => await rootLogic.chickenRepository.getAllocatedMade(
token: rootLogic.tokenService.accessToken.value!,
queryParameters: buildQueryParams(
page: currentPage.value,
@@ -176,16 +169,15 @@ class SalesInProvinceLogic extends GetxController {
void checkVerification() {
isValid.value =
weight.value > 0 &&
pricePerKilo.value > 0 &&
totalCost.value > 0 &&
selectedProductModel.value != null &&
selectedGuildModel.value != null;
pricePerKilo.value > 0 &&
totalCost.value > 0 &&
selectedProductModel.value != null &&
selectedGuildModel.value != null;
}
void confirmAllocation(ConformAllocation allocation) {
safeCall(
call: () async =>
await rootLogic.chickenRepository.confirmAllocation(
call: () async => await rootLogic.chickenRepository.confirmAllocation(
token: rootLogic.tokenService.accessToken.value!,
allocation: allocation.toJson(),
),
@@ -198,8 +190,7 @@ class SalesInProvinceLogic extends GetxController {
void denyAllocation(String token) {
safeCall(
call: () async =>
await rootLogic.chickenRepository.denyAllocation(
call: () async => await rootLogic.chickenRepository.denyAllocation(
token: rootLogic.tokenService.accessToken.value!,
allocationToken: token,
),
@@ -212,8 +203,7 @@ class SalesInProvinceLogic extends GetxController {
Future<void> confirmAllAllocations() async {
safeCall(
call: () async =>
await rootLogic.chickenRepository.confirmAllAllocation(
call: () async => await rootLogic.chickenRepository.confirmAllAllocation(
token: rootLogic.tokenService.accessToken.value!,
allocationTokens: allocatedList.value.data?.results?.map((e) => e.key!).toList() ?? [],
),
@@ -226,8 +216,7 @@ class SalesInProvinceLogic extends GetxController {
Future<void> getRolesProducts() async {
safeCall(
call: () async =>
await rootLogic.chickenRepository.getRolesProducts(
call: () async => await rootLogic.chickenRepository.getRolesProducts(
token: rootLogic.tokenService.accessToken.value!,
),
onSuccess: (result) {
@@ -242,8 +231,7 @@ class SalesInProvinceLogic extends GetxController {
Future<void> getGuilds() async {
safeCall(
call: () async =>
await rootLogic.chickenRepository.getGuilds(
call: () async => await rootLogic.chickenRepository.getGuilds(
token: rootLogic.tokenService.accessToken.value!,
queryParameters: buildQueryParams(
queryParams: {'free': saleType.value == 2 ? true : false},
@@ -274,8 +262,7 @@ class SalesInProvinceLogic extends GetxController {
Future<void> getGuildProfile() async {
await safeCall(
call: () async =>
await rootLogic.chickenRepository.getProfile(
call: () async => await rootLogic.chickenRepository.getProfile(
token: rootLogic.tokenService.accessToken.value!,
),
onError: (error, stackTrace) {},
@@ -289,8 +276,7 @@ class SalesInProvinceLogic extends GetxController {
tmpStewardAllocation = SubmitStewardAllocation(
approvedPriceStatus: broadcastPrice.value?.active ?? false,
allocationType:
'${guildProfile.value?.steward == true ? "steward" : "guild"}_${selectedGuildModel.value
?.steward == true ? "steward" : "guild"}',
'${guildProfile.value?.steward == true ? "steward" : "guild"}_${selectedGuildModel.value?.steward == true ? "steward" : "guild"}',
sellerType: guildProfile.value?.steward == true ? "Steward" : "Guild",
buyerType: selectedGuildModel.value?.steward == true ? "Steward" : "Guild",
amount: pricePerKilo.value,
@@ -301,23 +287,25 @@ class SalesInProvinceLogic extends GetxController {
quota: quotaType.value == 1 ? 'governmental' : 'free',
guildKey: selectedGuildModel.value?.key,
productKey: selectedProductModel.value?.key,
date: DateTime
.now()
.formattedDashedGregorian,
date: DateTime.now().formattedDashedGregorian,
type: "manual",
);
}
Future<void> submitAllocation() async {
setSubmitData();
safeCall(
call: () async =>
await rootLogic.chickenRepository.postSubmitStewardAllocation(
showError: true,
call: () async => await rootLogic.chickenRepository.postSubmitStewardAllocation(
token: rootLogic.tokenService.accessToken.value!,
request: tmpStewardAllocation!,
),
onSuccess: (result) {
getAllocatedMade();
clearForm();
onRefresh();
rootLogic.onRefresh();
},
onError: (error, stackTrace) {},
);
@@ -325,8 +313,7 @@ class SalesInProvinceLogic extends GetxController {
Future<void> deleteAllocation(AllocatedMadeModel model) async {
safeCall(
call: () async =>
await rootLogic.chickenRepository.deleteStewardAllocation(
call: () async => await rootLogic.chickenRepository.deleteStewardAllocation(
token: rootLogic.tokenService.accessToken.value!,
queryParameters: {'steward_allocation_key': model.key},
),
@@ -352,15 +339,9 @@ class SalesInProvinceLogic extends GetxController {
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;
weightController.text = weight.value.toString().separatedByComma;
pricePerKiloController.text = pricePerKilo.value.toString().separatedByComma;
totalCostController.text = totalCost.value.toString().separatedByComma;
isValid.value = true;
}
@@ -389,14 +370,16 @@ class SalesInProvinceLogic extends GetxController {
);
safeCall(
call: () async =>
await rootLogic.chickenRepository.updateStewardAllocation(
showError: true,
call: () async => await rootLogic.chickenRepository.updateStewardAllocation(
token: rootLogic.tokenService.accessToken.value!,
request: updatedAllocationModel,
),
onSuccess: (result) {
getAllocatedMade();
clearForm();
onRefresh();
rootLogic.onRefresh();
},
onError: (error, stackTrace) {},
);
@@ -434,17 +417,14 @@ class SalesInProvinceLogic extends GetxController {
Future<void> getBroadcastPrice() async {
safeCall(
call: () async =>
await rootLogic.chickenRepository.getBroadcastPrice(
call: () async => await rootLogic.chickenRepository.getBroadcastPrice(
token: rootLogic.tokenService.accessToken.value!,
),
onSuccess: (result) {
broadcastPrice.value = result;
if (broadcastPrice.value?.active == true) {
pricePerKilo.value = broadcastPrice.value?.stewardPrice ?? 0;
pricePerKiloController.text = pricePerKilo.value
.toString()
.separatedByComma;
pricePerKiloController.text = pricePerKilo.value.toString().separatedByComma;
}
},
onError: (error, stacktrace) {},
@@ -452,9 +432,17 @@ class SalesInProvinceLogic extends GetxController {
}
Future<void> onRefresh() async {
toggleExpansion();
currentPage.value = 1;
hasMoreDataAllocationsMade.value = true;
await rootLogic.onRefresh();
await Future.wait([getAllocatedMade()]);
await Future.wait([getAllocatedMade(), rootLogic.onRefresh()]);
}
void toggleExpansion({int? index}) {
if (expandedListIndex.value == index || index == null) {
expandedListIndex.value = -1;
} else {
expandedListIndex.value = index;
}
}
}

View File

@@ -47,8 +47,8 @@ class SalesInProvincePage extends GetView<SalesInProvinceLogic> {
var item = data.value.data!.results![index];
return ObxValue((val) {
return ExpandableListItem2(
selected: val.contains(index),
onTap: () => controller.isExpandedList.toggle(index),
selected: val.value == index,
onTap: () => controller.toggleExpansion(index: index),
index: index,
child: itemListWidget(item),
secondChild: itemListExpandedWidget(item, index),
@@ -58,7 +58,7 @@ class SalesInProvincePage extends GetView<SalesInProvinceLogic> {
? AppColor.darkGreyDark
: AppColor.error,
);
}, controller.isExpandedList);
}, controller.expandedListIndex);
},
itemCount: data.value.data?.results?.length ?? 0,
separatorBuilder: (context, index) => SizedBox(height: 8.h),
@@ -353,7 +353,7 @@ class SalesInProvincePage extends GetView<SalesInProvinceLogic> {
onPressed: () {
buildDeleteDialog(
onConfirm: () async {
controller.isExpandedList.remove(index);
controller.toggleExpansion(index: index);
await controller.deleteAllocation(item);
},
@@ -372,7 +372,7 @@ class SalesInProvincePage extends GetView<SalesInProvinceLogic> {
Widget addOrEditBottomSheet([bool isEditMode = false]) {
return BaseBottomSheet(
height: Get.height * (isEditMode ? 0.45 : 0.75),
height: Get.height * (isEditMode ? 0.55 : 0.75),
child: Form(
key: controller.formKey,
child: Column(
@@ -526,7 +526,7 @@ class SalesInProvincePage extends GetView<SalesInProvinceLogic> {
SizedBox(width: 30.w),
Radio(value: 2),
Text('فروش آزاد', style: AppFonts.yekan14),
Text('انبار آزاد', style: AppFonts.yekan14),
],
),
);
@@ -576,22 +576,16 @@ class SalesInProvincePage extends GetView<SalesInProvinceLogic> {
textStyle: AppFonts.yekan16.copyWith(color: Colors.white),
backgroundColor: AppColor.greenNormal,
height: 40,
onPressed: data.value
enabled: data.value,
onPressed: isEditMode
? () async {
if (isEditMode) {
await controller.updateAllocation();
controller.clearForm();
controller.getAllocatedMade();
controller.rootLogic.getInventory();
Get.back();
} else {
if (controller.formKey.currentState?.validate() ?? false) {
controller.setSubmitData();
await Get.bottomSheet(show2StepAddBottomSheet());
}
}
await controller.updateAllocation();
Get.back();
}
: null,
: () async {
await controller.submitAllocation();
Get.back();
},
);
}, controller.isValid),
],

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart';
import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart';
import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart';
@@ -13,21 +12,18 @@ import 'package:rasadyar_chicken/presentation/utils/utils.dart';
import 'package:rasadyar_core/core.dart';
class SalesOutOfProvinceLogic extends GetxController {
StewardRootLogic rootLogic = Get.find<StewardRootLogic>();
StewardRootLogic rootLogic = Get.find<StewardRootLogic>();
SaleLogic saleLogic = Get.find<SaleLogic>();
SaleLogic saleLogic = Get.find<SaleLogic>();
SalesOutOfProvinceSalesListLogic saleListLogic = Get.find<SalesOutOfProvinceSalesListLogic>();
SalesOutOfProvinceSalesListLogic get saleListLogic =>
Get.find<SalesOutOfProvinceSalesListLogic>();
SalesOutOfProvinceBuyersLogic buyerLogic = Get.find<SalesOutOfProvinceBuyersLogic>();
SalesOutOfProvinceBuyersLogic buyerLogic = Get.find<SalesOutOfProvinceBuyersLogic>();
RxBool isExpanded = false.obs;
RxInt currentPage = 1.obs;
RxBool isSaleSubmitButtonEnabled = false.obs;
RxList<int> isExpandedList = <int>[].obs;
RxInt expandedListIndex = (-1).obs;
Rx<Jalali> fromDateFilter = Jalali.now().obs;
Rx<Jalali> toDateFilter = Jalali.now().obs;
RxnString searchedValue = RxnString();
@@ -35,10 +31,10 @@ class SalesOutOfProvinceLogic extends GetxController {
RxBool isLoadingMoreAllocationsMade = false.obs;
Rxn<IranProvinceCityModel> selectedCity = Rxn();
GlobalKey<FormState> formKey = GlobalKey<FormState>();
TextEditingController quarantineCodeController = TextEditingController();
TextEditingController saleWeightController = TextEditingController();
TextEditingController saleCountController = TextEditingController();
Rx<Jalali> saleDate = Jalali.now().obs;
String? key;
@@ -48,6 +44,9 @@ class SalesOutOfProvinceLogic extends GetxController {
Rxn<ProductModel> selectedProduct = Rxn();
Rxn<OutProvinceCarcassesBuyer> selectedBuyer = Rxn();
RxInt saleType = 2.obs;
RxInt quotaType = 1.obs;
@override
void onInit() {
super.onInit();
@@ -119,6 +118,12 @@ class SalesOutOfProvinceLogic extends GetxController {
void setupListeners() {
saleWeightController.addListener(checkSalesFormValid);
quarantineCodeController.addListener(checkSalesFormValid);
saleWeightController.addListener(() {
checkSalesFormValid();
var weight = int.parse(saleWeightController.text.clearComma);
var res = (weight / selectedProduct.value!.weightAverage!.toInt()).round();
saleCountController.text = res.separatedByComma;
});
ever(selectedBuyer, (_) => checkSalesFormValid);
ever(selectedProduct, (_) => checkSalesFormValid);
ever(saleDate, (_) => checkSalesFormValid());
@@ -143,14 +148,16 @@ class SalesOutOfProvinceLogic extends GetxController {
);
selectedProduct.value = rootLogic.rolesProductsModel.first;
key = item.key;
saleType.value = item.saleType == 'free' ? 2 : 1;
quotaType.value = item.quota == 'governmental' ? 1 : 2;
isSaleSubmitButtonEnabled.value = true;
}
Future<void> deleteStewardPurchaseOutOfProvince(String key) async {
await safeCall(
call: () => rootLogic.chickenRepository.editStewardPurchasesOutSideOfTheProvince(
call: () => rootLogic.chickenRepository.deleteOutProvinceStewardFreeBar(
token: rootLogic.tokenService.accessToken.value!,
stewardFreeBarKey: key,
key: key,
),
);
}
@@ -159,19 +166,24 @@ class SalesOutOfProvinceLogic extends GetxController {
bool res = false;
StewardFreeSaleBarRequest requestBody = StewardFreeSaleBarRequest(
buyerKey: selectedBuyer.value?.key,
numberOfCarcasses: 0,
numberOfCarcasses: int.tryParse(saleCountController.text.clearComma),
weightOfCarcasses: int.tryParse(saleWeightController.text.clearComma),
date: saleDate.value.toDateTime().formattedDashedGregorian,
clearanceCode: quarantineCodeController.text,
productKey: selectedProduct.value?.key,
saleType: saleType.value == 2 ? 'free' : 'exclusive',
quota: quotaType.value == 1 ? 'governmental' : 'free',
);
await safeCall(
showError: true,
call: () => rootLogic.chickenRepository.createOutProvinceStewardFreeBar(
token: rootLogic.tokenService.accessToken.value!,
body: requestBody,
),
onSuccess: (_) {
res = true;
onRefresh();
rootLogic.onRefresh();
},
);
return res;
@@ -181,8 +193,9 @@ class SalesOutOfProvinceLogic extends GetxController {
quarantineCodeController.clear();
saleWeightController.clear();
saleDate.value = Jalali.now();
saleType.value = 2;
quotaType.value = 1;
selectedBuyer.value = null;
selectedProduct.value = null;
}
Future<bool> editSale() async {
@@ -192,6 +205,8 @@ class SalesOutOfProvinceLogic extends GetxController {
weightOfCarcasses: int.tryParse(saleWeightController.text.clearComma),
date: saleDate.value.toDateTime().formattedDashedGregorian,
clearanceCode: quarantineCodeController.text,
saleType: saleType.value == 2 ? 'free' : 'exclusive',
quota: quotaType.value == 1 ? 'governmental' : 'free',
key: key,
);
await safeCall(
@@ -201,6 +216,7 @@ class SalesOutOfProvinceLogic extends GetxController {
),
onSuccess: (_) {
res = true;
onRefresh();
},
);
return res;
@@ -208,16 +224,23 @@ class SalesOutOfProvinceLogic extends GetxController {
void resetSubmitForm() {
selectedCity.value = null;
selectedProduct.value = null;
key = null;
}
Future<void> onRefresh() async {
currentPage.value = 1;
resetSubmitForm();
clearSaleForm();
await rootLogic.onRefresh();
await getOutProvinceSales();
}
void toggleExpansion({int? index}) {
if (expandedListIndex.value == index || index == null) {
expandedListIndex.value = -1;
} else {
expandedListIndex.value = index;
}
}
}

View File

@@ -44,15 +44,15 @@ class SalesOutOfProvincePage extends GetView<SalesOutOfProvinceLogic> {
var item = data.value.data!.results![index];
return ObxValue((val) {
return ExpandableListItem2(
selected: val.contains(index),
onTap: () => controller.isExpandedList.toggle(index),
selected: val.value == index,
onTap: () => controller.toggleExpansion(index: index),
index: index,
child: itemListWidget(item),
secondChild: itemListExpandedWidget(item, index),
labelColor: AppColor.blueLight,
labelIcon: Assets.vec.timerSvg.path,
);
}, controller.isExpandedList);
}, controller.expandedListIndex);
},
itemCount: data.value.data?.results?.length ?? 0,
separatorBuilder: (context, index) => SizedBox(height: 8.h),
@@ -69,7 +69,11 @@ class SalesOutOfProvincePage extends GetView<SalesOutOfProvinceLogic> {
children: [
RFab.add(
onPressed: () {
Get.bottomSheet(addOrEditSaleBottomSheet(), isScrollControlled: true);
Get.bottomSheet(addOrEditSaleBottomSheet(), isScrollControlled: true).then((
value,
) {
controller.clearSaleForm();
});
},
),
Spacer(),
@@ -245,9 +249,13 @@ class SalesOutOfProvincePage extends GetView<SalesOutOfProvinceLogic> {
buildRow(title: 'تلفن خریدار', value: item.buyer?.mobile ?? 'N/A'),
buildRow(title: 'نام واحد', value: item.buyer?.unitName ?? 'N/A'),
buildRow(
title: 'وزن لاشه (ريال)',
title: 'وزن لاشه (کیلوگرم)',
value: '${item.weightOfCarcasses?.separatedByCommaFa}',
),
buildRow(
title: 'حجم تقریبی لاشه (قطعه)',
value: '${item.numberOfCarcasses?.separatedByCommaFa}',
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
@@ -277,10 +285,12 @@ class SalesOutOfProvincePage extends GetView<SalesOutOfProvinceLogic> {
onPressed: () {
buildDeleteDialog(
onConfirm: () async {
controller.isExpandedList.remove(index);
controller.toggleExpansion();
controller.deleteStewardPurchaseOutOfProvince(item.key!);
},
onRefresh: () => controller.onRefresh(),
onRefresh: () async {
controller.onRefresh();
},
);
},
borderColor: AppColor.redNormal,
@@ -294,7 +304,7 @@ class SalesOutOfProvincePage extends GetView<SalesOutOfProvinceLogic> {
Widget addOrEditSaleBottomSheet([bool isOnEdit = false]) {
return BaseBottomSheet(
height: 500.h,
height: 600.h,
child: SingleChildScrollView(
child: Form(
key: controller.formKey,
@@ -331,7 +341,7 @@ class SalesOutOfProvincePage extends GetView<SalesOutOfProvinceLogic> {
_buyerWidget(),
RTextField(
controller: controller.saleWeightController,
label: 'وزن لاشه',
label: 'وزن لاشه (کیلوگرم)',
keyboardType: TextInputType.number,
borderColor: AppColor.darkGreyLight,
filledColor: AppColor.bgLight,
@@ -348,6 +358,28 @@ class SalesOutOfProvincePage extends GetView<SalesOutOfProvinceLogic> {
return null;
},
),
RTextField(
controller: controller.saleCountController,
label: 'حجم تقریبی(قطعه)',
keyboardType: TextInputType.number,
borderColor: AppColor.darkGreyLight,
filledColor: AppColor.bgLight,
variant: RTextFieldVariant.noBorder,
filled: true,
enabled: false,
inputFormatters: [
FilteringTextInputFormatter.digitsOnly,
SeparatorInputFormatter(),
],
validator: (value) {
if (value == null) {
return 'لطفاً قطعه لاشه را وارد کنید';
}
return null;
},
),
RTextField(
controller: controller.quarantineCodeController,
label: 'کد قرنطینه',
@@ -361,10 +393,54 @@ class SalesOutOfProvincePage extends GetView<SalesOutOfProvinceLogic> {
return null;
},
),
submitButtonWidget(isOnEdit),
SizedBox(
height: 40,
child: ObxValue((data) {
return RadioGroup(
onChanged: (value) {
controller.saleType.value = value ?? 0;
},
groupValue: controller.saleType.value,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Radio(value: 1, enabled: false),
Text('فروش دولتی', style: AppFonts.yekan14),
SizedBox(width: 12),
Radio(value: 2, enabled: isOnEdit ? false : true),
Text('فروش آزاد', style: AppFonts.yekan14),
],
),
);
}, controller.saleType),
),
SizedBox(
height: 40,
child: ObxValue((data) {
return RadioGroup(
onChanged: (value) {
controller.quotaType.value = value ?? 0;
},
groupValue: controller.quotaType.value,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Radio(value: 1, enabled: isOnEdit ? false : true),
Text('انبار دولتی', style: AppFonts.yekan14),
SizedBox(width: 12),
Radio(value: 2, enabled: isOnEdit ? false : true),
Text('انبار آزاد', style: AppFonts.yekan14),
],
),
);
}, controller.saleType),
),
],
),
),
submitButtonWidget(isOnEdit),
SizedBox(),
],
),
@@ -383,8 +459,6 @@ class SalesOutOfProvincePage extends GetView<SalesOutOfProvinceLogic> {
? () async {
var res = isOnEdit ? await controller.editSale() : await controller.createSale();
if (res) {
controller.getOutProvinceSales();
controller.clearSaleForm();
Get.back();
}
}

View File

@@ -16,7 +16,7 @@ class SalesOutOfProvinceBuyersLogic extends GetxController {
SalesOutOfProvinceLogic get saleOutOfProvince => Get.find<SalesOutOfProvinceLogic>();
RxInt currentPage = 1.obs;
RxList<int> isExpandedList = <int>[].obs;
RxInt expandedListIndex = (-1).obs;
Rx<Jalali> fromDateFilter = Jalali.now().obs;
Rx<Jalali> toDateFilter = Jalali.now().obs;
RxnString searchedValue = RxnString();
@@ -70,7 +70,7 @@ class SalesOutOfProvinceBuyersLogic extends GetxController {
buyerUnitNameController.dispose();
selectedCity.value = null;
selectedProvince.value = null;
isExpandedList.clear();
super.onClose();
}
@@ -215,4 +215,11 @@ class SalesOutOfProvinceBuyersLogic extends GetxController {
await rootLogic.onRefresh();
await getOutProvinceCarcassesBuyer();
}
void toggleExpansion({int? index}) {
if (expandedListIndex.value == index || index == null) {
expandedListIndex.value = -1;
} else {
expandedListIndex.value = index;
}
}
}

View File

@@ -52,15 +52,15 @@ class SalesOutOfProvinceBuyersPage extends GetView<SalesOutOfProvinceBuyersLogic
var item = data.value.data!.results![index];
return ObxValue((val) {
return ExpandableListItem2(
selected: val.contains(index),
onTap: () => controller.isExpandedList.toggle(index),
selected: val.value == index,
onTap: () => controller.toggleExpansion(),
index: index,
child: itemListWidget(item),
secondChild: itemListExpandedWidget(item),
labelColor: AppColor.blueLight,
labelIcon: Assets.vec.userRaduisSvg.path,
);
}, controller.isExpandedList);
}, controller.expandedListIndex);
},
itemCount: data.value.data?.results?.length ?? 0,
separatorBuilder: (context, index) => SizedBox(height: 8.h),

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_chicken/data/models/request/steward_free_sale_bar/steward_free_sale_bar_request.dart';
import 'package:rasadyar_chicken/data/models/response/iran_province_city/iran_province_city_model.dart';
import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buyer/out_province_carcasses_buyer.dart';
@@ -12,18 +11,17 @@ import 'package:rasadyar_chicken/presentation/utils/utils.dart';
import 'package:rasadyar_core/core.dart';
class SalesOutOfProvinceSalesListLogic extends GetxController {
StewardRootLogic rootLogic = Get.find<StewardRootLogic>();
StewardRootLogic rootLogic = Get.find<StewardRootLogic>();
SaleLogic get saleLogic => Get.find<SaleLogic>();
SaleLogic saleLogic = Get.find<SaleLogic>();
SalesOutOfProvinceBuyersLogic get buyerLogic =>
Get.find<SalesOutOfProvinceBuyersLogic>();
SalesOutOfProvinceBuyersLogic buyerLogic = Get.find<SalesOutOfProvinceBuyersLogic>();
RxInt selectedSegmentIndex = 0.obs;
RxBool isExpanded = false.obs;
RxInt currentPage = 1.obs;
RxBool isSaleSubmitButtonEnabled = false.obs;
RxList<int> isExpandedList = <int>[].obs;
RxInt expandedListIndex = (-1).obs;
Rx<Jalali> fromDateFilter = Jalali.now().obs;
Rx<Jalali> toDateFilter = Jalali.now().obs;
RxnString searchedValue = RxnString();
@@ -34,9 +32,16 @@ class SalesOutOfProvinceSalesListLogic extends GetxController {
//TODO add this to Di
ImagePicker imagePicker = ImagePicker();
RxInt saleType = 1.obs;
RxInt quotaType = 1.obs;
GlobalKey<FormState> formKey = GlobalKey<FormState>();
TextEditingController quarantineCodeController = TextEditingController();
TextEditingController saleWeightController = TextEditingController();
TextEditingController saleCountController = TextEditingController();
Rx<Jalali> saleDate = Jalali.now().obs;
String? key;
@@ -92,21 +97,16 @@ class SalesOutOfProvinceSalesListLogic extends GetxController {
),
onSuccess: (res) {
if ((res?.count ?? 0) == 0) {
salesList.value =
Resource<PaginationModel<StewardFreeSaleBar>>.empty();
salesList.value = Resource<PaginationModel<StewardFreeSaleBar>>.empty();
} else {
salesList.value =
Resource<PaginationModel<StewardFreeSaleBar>>.success(
PaginationModel<StewardFreeSaleBar>(
count: res?.count ?? 0,
next: res?.next,
previous: res?.previous,
results: [
...(salesList.value.data?.results ?? []),
...(res?.results ?? []),
],
),
);
salesList.value = Resource<PaginationModel<StewardFreeSaleBar>>.success(
PaginationModel<StewardFreeSaleBar>(
count: res?.count ?? 0,
next: res?.next,
previous: res?.previous,
results: [...(salesList.value.data?.results ?? []), ...(res?.results ?? [])],
),
);
isLoadingMoreAllocationsMade.value = false;
}
@@ -115,7 +115,7 @@ class SalesOutOfProvinceSalesListLogic extends GetxController {
}
void setupListeners() {
saleWeightController.addListener(checkSalesFormValid);
quarantineCodeController.addListener(checkSalesFormValid);
ever(selectedBuyer, (_) => checkSalesFormValid);
ever(selectedProduct, (_) => checkSalesFormValid);
@@ -133,8 +133,7 @@ class SalesOutOfProvinceSalesListLogic extends GetxController {
void setEditDataSales(StewardFreeSaleBar item) {
quarantineCodeController.text = item.clearanceCode ?? '';
saleWeightController.text =
item.weightOfCarcasses?.toInt().toString() ?? '';
saleWeightController.text = item.weightOfCarcasses?.toInt().toString() ?? '';
saleDate.value = Jalali.fromDateTime(DateTime.parse(item.date!));
selectedCity.value = IranProvinceCityModel(name: item.city);
selectedBuyer.value = buyerLogic.buyerList.value.data?.results?.firstWhere(
@@ -146,21 +145,25 @@ class SalesOutOfProvinceSalesListLogic extends GetxController {
}
Future<void> deleteStewardPurchaseOutOfProvince(String key) async {
await safeCall(
//todo
/* await safeCall(
call: () => rootLogic.chickenRepository
.editStewardPurchasesOutSideOfTheProvince(
token: rootLogic.tokenService.accessToken.value!,
stewardFreeBarKey: key,
),
);
);*/
}
Future<bool> createSale() async {
bool res = false;
var tmpWight = int.tryParse(saleWeightController.text.clearComma);
var tmpCount = (tmpWight! / selectedProduct.value!.weightAverage!).round();
StewardFreeSaleBarRequest requestBody = StewardFreeSaleBarRequest(
buyerKey: selectedBuyer.value?.key,
numberOfCarcasses: 0,
weightOfCarcasses: int.tryParse(saleWeightController.text.clearComma),
numberOfCarcasses: tmpCount,
weightOfCarcasses: tmpWight,
date: saleDate.value.toDateTime().formattedDashedGregorian,
clearanceCode: quarantineCodeController.text,
productKey: selectedProduct.value?.key,
@@ -211,4 +214,11 @@ class SalesOutOfProvinceSalesListLogic extends GetxController {
selectedProduct.value = null;
key = null;
}
void toggleExpansion({int? index}) {
if (expandedListIndex.value == index || index == null) {
expandedListIndex.value = -1;
} else {
expandedListIndex.value = index;
}
}
}

View File

@@ -5,8 +5,6 @@ import 'package:rasadyar_chicken/data/models/response/out_province_carcasses_buy
import 'package:rasadyar_chicken/data/models/response/roles_products/roles_products.dart';
import 'package:rasadyar_chicken/data/models/response/steward_free_sale_bar/steward_free_sale_bar.dart';
import 'package:rasadyar_chicken/presentation/routes/routes.dart';
import 'package:rasadyar_chicken/presentation/widget/list_item/list_item.dart' hide ListItem2;
import 'package:rasadyar_core/core.dart';
import 'logic.dart';
@@ -29,15 +27,15 @@ class SalesOutOfProvinceSalesListPage extends GetView<SalesOutOfProvinceSalesLis
var item = data.value.data!.results![index];
return ObxValue((val) {
return ExpandableListItem2(
selected: val.contains(index),
onTap: () => controller.isExpandedList.toggle(index),
selected: val.value == index,
onTap: () => controller.toggleExpansion(),
index: index,
child: itemListWidget(item),
secondChild: itemListExpandedWidget(item, index),
labelColor: AppColor.blueLight,
labelIcon: Assets.vec.timerSvg.path,
);
}, controller.isExpandedList);
}, controller.expandedListIndex);
},
itemCount: data.value.data?.results?.length ?? 0,
separatorBuilder: (context, index) => SizedBox(height: 8.h),
@@ -227,7 +225,7 @@ class SalesOutOfProvinceSalesListPage extends GetView<SalesOutOfProvinceSalesLis
onPressed: () {
buildDeleteDialog(
onConfirm: () async {
controller.isExpandedList.remove(index);
controller.toggleExpansion();
controller.deleteStewardPurchaseOutOfProvince(item.key!);
},
onRefresh: () => controller.getOutProvinceSales(),
@@ -298,6 +296,26 @@ class SalesOutOfProvinceSalesListPage extends GetView<SalesOutOfProvinceSalesLis
return null;
},
),
RTextField(
controller: controller.saleCountController,
label: 'حجم تقریبی(قطعه)',
keyboardType: TextInputType.number,
borderColor: AppColor.darkGreyLight,
filledColor: AppColor.bgLight,
filled: true,
inputFormatters: [
FilteringTextInputFormatter.digitsOnly,
SeparatorInputFormatter(),
],
validator: (value) {
if (value == null) {
return 'لطفاً وزن لاشه را وارد کنید';
}
return null;
},
),
RTextField(
controller: controller.quarantineCodeController,
label: 'کد قرنطینه',