Commit d006edb4 authored by Sai Srinivas's avatar Sai Srinivas
Browse files

18-06-2025 By Sai Srinivas

Pubspec, Order Module Add and Edit.
parent b06467c3
<svg width="21" height="21" viewBox="0 0 21 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.9784 7.57059L15.5616 9.99559L7.80344 17.7456C7.54361 18.0033 7.20735 18.1699 6.84495 18.2206L3.99501 18.6289C3.91482 18.6389 3.83415 18.6445 3.75335 18.6456C3.5114 18.6435 3.27266 18.5899 3.05301 18.4885C2.83335 18.387 2.63781 18.24 2.47937 18.0571C2.32094 17.8742 2.20323 17.6597 2.13409 17.4278C2.06495 17.196 2.04594 16.952 2.07835 16.7123L2.48668 13.8623C2.53736 13.4999 2.70403 13.1637 2.96174 12.9039L10.7201 5.15393L13.1366 2.72893C13.6253 2.26351 14.2743 2.00391 14.9492 2.00391C15.624 2.00391 16.273 2.26351 16.7617 2.72893L17.9784 3.94559C18.4586 4.42655 18.7283 5.07843 18.7283 5.75809C18.7283 6.43776 18.4586 7.08964 17.9784 7.57059Z" fill="#37D0EE"/>
<path d="M17.9785 7.57059L16.0827 9.47454L11.2412 4.63287L13.1367 2.72893C13.6254 2.26351 14.2744 2.00391 14.9493 2.00391C15.6241 2.00391 16.2731 2.26351 16.7618 2.72893L17.9785 3.94559C18.4587 4.42655 18.7284 5.07843 18.7284 5.75809C18.7284 6.43776 18.4587 7.08964 17.9785 7.57059Z" fill="#FFCE29"/>
</svg>
class AddOrderViewResponse {
List<Employees>? employees;
List<States>? states;
List<SaleProducts>? saleProducts;
List<String>? unloadingScope;
List<String>? freightScope;
List<String>? erectionScope;
String? error;
String? message;
AddOrderViewResponse(
{this.employees,
this.states,
this.saleProducts,
this.unloadingScope,
this.freightScope,
this.erectionScope,
this.error,
this.message});
AddOrderViewResponse.fromJson(Map<String, dynamic> json) {
if (json['employees'] != null) {
employees = <Employees>[];
json['employees'].forEach((v) {
employees!.add(new Employees.fromJson(v));
});
}
if (json['states'] != null) {
states = <States>[];
json['states'].forEach((v) {
states!.add(new States.fromJson(v));
});
}
if (json['sale_products'] != null) {
saleProducts = <SaleProducts>[];
json['sale_products'].forEach((v) {
saleProducts!.add(new SaleProducts.fromJson(v));
});
}
unloadingScope = json['unloading_scope'].cast<String>();
freightScope = json['freight_scope'].cast<String>();
erectionScope = json['erection_scope'].cast<String>();
error = json['error'];
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.employees != null) {
data['employees'] = this.employees!.map((v) => v.toJson()).toList();
}
if (this.states != null) {
data['states'] = this.states!.map((v) => v.toJson()).toList();
}
if (this.saleProducts != null) {
data['sale_products'] =
this.saleProducts!.map((v) => v.toJson()).toList();
}
data['unloading_scope'] = this.unloadingScope;
data['freight_scope'] = this.freightScope;
data['erection_scope'] = this.erectionScope;
data['error'] = this.error;
data['message'] = this.message;
return data;
}
}
class Employees {
String? id;
String? name;
Employees({this.id, this.name});
Employees.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['name'] = this.name;
return data;
}
}
class SaleProducts {
String? id;
String? productCode;
String? project;
String? subGroup;
String? vendor1;
String? vendor2;
String? vendorCode;
String? prodName;
String? brand;
String? imageDirFilePath;
String? imageViewFileName;
String? prodDesc;
String? hsnCode;
String? units;
String? unitsId;
String? worksMsl;
String? refType;
String? refId;
String? price;
String? type;
String? productionProcessId;
String? createdBy;
String? datetime;
String? isExists;
String? updatedDatetime;
SaleProducts(
{this.id,
this.productCode,
this.project,
this.subGroup,
this.vendor1,
this.vendor2,
this.vendorCode,
this.prodName,
this.brand,
this.imageDirFilePath,
this.imageViewFileName,
this.prodDesc,
this.hsnCode,
this.units,
this.unitsId,
this.worksMsl,
this.refType,
this.refId,
this.price,
this.type,
this.productionProcessId,
this.createdBy,
this.datetime,
this.isExists,
this.updatedDatetime});
SaleProducts.fromJson(Map<String, dynamic> json) {
id = json['id'];
productCode = json['product_code'];
project = json['project'];
subGroup = json['sub_group'];
vendor1 = json['vendor_1'];
vendor2 = json['vendor_2'];
vendorCode = json['vendor_code'];
prodName = json['prod_name'];
brand = json['brand'];
imageDirFilePath = json['image_dir_file_path'];
imageViewFileName = json['image_view_file_name'];
prodDesc = json['prod_desc'];
hsnCode = json['hsn_code'];
units = json['units'];
unitsId = json['units_id'];
worksMsl = json['works_msl'];
refType = json['ref_type'];
refId = json['ref_id'];
price = json['price'];
type = json['type'];
productionProcessId = json['production_process_id'];
createdBy = json['created_by'];
datetime = json['datetime'];
isExists = json['is_exists'];
updatedDatetime = json['updated_datetime'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['product_code'] = this.productCode;
data['project'] = this.project;
data['sub_group'] = this.subGroup;
data['vendor_1'] = this.vendor1;
data['vendor_2'] = this.vendor2;
data['vendor_code'] = this.vendorCode;
data['prod_name'] = this.prodName;
data['brand'] = this.brand;
data['image_dir_file_path'] = this.imageDirFilePath;
data['image_view_file_name'] = this.imageViewFileName;
data['prod_desc'] = this.prodDesc;
data['hsn_code'] = this.hsnCode;
data['units'] = this.units;
data['units_id'] = this.unitsId;
data['works_msl'] = this.worksMsl;
data['ref_type'] = this.refType;
data['ref_id'] = this.refId;
data['price'] = this.price;
data['type'] = this.type;
data['production_process_id'] = this.productionProcessId;
data['created_by'] = this.createdBy;
data['datetime'] = this.datetime;
data['is_exists'] = this.isExists;
data['updated_datetime'] = this.updatedDatetime;
return data;
}
}
class States {
String? id;
String? name;
States({this.id, this.name});
States.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['name'] = this.name;
return data;
}
}
\ No newline at end of file
class addOrderAccontDetailsResponse {
AccountDetails? accountDetails;
String? error;
String? message;
addOrderAccontDetailsResponse(
{this.accountDetails, this.error, this.message});
addOrderAccontDetailsResponse.fromJson(Map<String, dynamic> json) {
accountDetails = json['account_details'] != null
? new AccountDetails.fromJson(json['account_details'])
: null;
error = json['error'];
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.accountDetails != null) {
data['account_details'] = this.accountDetails!.toJson();
}
data['error'] = this.error;
data['message'] = this.message;
return data;
}
}
class AccountDetails {
String? id;
String? tempId;
String? ownerId;
String? accManagerId;
String? name;
String? salutationName;
String? subLocality;
String? district;
String? state;
String? pincode;
String? address;
String? date;
String? source;
String? reference;
String? segment;
String? team;
String? gstNumber;
String? isExists;
String? createdDatetime;
String? updatedDatetime;
AccountDetails(
{this.id,
this.tempId,
this.ownerId,
this.accManagerId,
this.name,
this.salutationName,
this.subLocality,
this.district,
this.state,
this.pincode,
this.address,
this.date,
this.source,
this.reference,
this.segment,
this.team,
this.gstNumber,
this.isExists,
this.createdDatetime,
this.updatedDatetime});
AccountDetails.fromJson(Map<String, dynamic> json) {
id = json['id'];
tempId = json['temp_id'];
ownerId = json['owner_id'];
accManagerId = json['acc_manager_id'];
name = json['name'];
salutationName = json['salutation_name'];
subLocality = json['sub_locality'];
district = json['district'];
state = json['state'];
pincode = json['pincode'];
address = json['address'];
date = json['date'];
source = json['source'];
reference = json['reference'];
segment = json['segment'];
team = json['team'];
gstNumber = json['gst_number'];
isExists = json['is_exists'];
createdDatetime = json['created_datetime'];
updatedDatetime = json['updated_datetime'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['temp_id'] = this.tempId;
data['owner_id'] = this.ownerId;
data['acc_manager_id'] = this.accManagerId;
data['name'] = this.name;
data['salutation_name'] = this.salutationName;
data['sub_locality'] = this.subLocality;
data['district'] = this.district;
data['state'] = this.state;
data['pincode'] = this.pincode;
data['address'] = this.address;
data['date'] = this.date;
data['source'] = this.source;
data['reference'] = this.reference;
data['segment'] = this.segment;
data['team'] = this.team;
data['gst_number'] = this.gstNumber;
data['is_exists'] = this.isExists;
data['created_datetime'] = this.createdDatetime;
data['updated_datetime'] = this.updatedDatetime;
return data;
}
}
class addOrderTpcAgentListResponse {
List<TpcList>? tpcList;
String? error;
String? message;
addOrderTpcAgentListResponse({this.tpcList, this.error, this.message});
addOrderTpcAgentListResponse.fromJson(Map<String, dynamic> json) {
if (json['tpc_list'] != null) {
tpcList = <TpcList>[];
json['tpc_list'].forEach((v) {
tpcList!.add(new TpcList.fromJson(v));
});
}
error = json['error'];
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.tpcList != null) {
data['tpc_list'] = this.tpcList!.map((v) => v.toJson()).toList();
}
data['error'] = this.error;
data['message'] = this.message;
return data;
}
}
class TpcList {
String? id;
String? text;
TpcList({this.id, this.text});
TpcList.fromJson(Map<String, dynamic> json) {
id = json['id'];
text = json['text'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['text'] = this.text;
return data;
}
}
...@@ -192,6 +192,7 @@ class CheckInOutProvider with ChangeNotifier { ...@@ -192,6 +192,7 @@ class CheckInOutProvider with ChangeNotifier {
if (data.error == 0) { if (data.error == 0) {
toast(context, "CheckedIn Successfully"); toast(context, "CheckedIn Successfully");
await BackgroundLocationService.startLocationService(context); await BackgroundLocationService.startLocationService(context);
locationController.clear();
Navigator.pop(context, true); Navigator.pop(context, true);
} else { } else {
toast(context, "Check-In UnSuccessful"); toast(context, "Check-In UnSuccessful");
...@@ -225,8 +226,9 @@ class CheckInOutProvider with ChangeNotifier { ...@@ -225,8 +226,9 @@ class CheckInOutProvider with ChangeNotifier {
); );
if (data != null) { if (data != null) {
if (data.error == 0) { if (data.error == 0) {
toast(context, "Checked Out Successfully"); toast(context, "Check-Out Successful");
await BackgroundLocationService.stopLocationService(); await BackgroundLocationService.stopLocationService();
locationController.clear();
Navigator.pop(context, true); Navigator.pop(context, true);
} else { } else {
toast(context, "Check-Out UnSuccessful"); toast(context, "Check-Out UnSuccessful");
......
...@@ -9,6 +9,7 @@ import 'package:generp/Notifiers/HomeScreenNotifier.dart'; ...@@ -9,6 +9,7 @@ import 'package:generp/Notifiers/HomeScreenNotifier.dart';
import 'package:generp/Utils/SharedpreferencesService.dart'; import 'package:generp/Utils/SharedpreferencesService.dart';
import 'package:generp/screens/serviceEngineer/serviceEngineerDashboard.dart'; import 'package:generp/screens/serviceEngineer/serviceEngineerDashboard.dart';
import 'package:generp/services/api_calling.dart'; import 'package:generp/services/api_calling.dart';
import 'package:get/utils.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
...@@ -31,7 +32,9 @@ class Pendingcomplaintsprovider extends ChangeNotifier { ...@@ -31,7 +32,9 @@ class Pendingcomplaintsprovider extends ChangeNotifier {
File? _imageName; File? _imageName;
var _image_picked = 0; var _image_picked = 0;
bool _submitLoading = false; bool _submitLoading = false;
String? statusError;
String? fsrError;
String? runningHoursError;
List<TP_List> get technician_complaint_list => _technician_complaint_list; List<TP_List> get technician_complaint_list => _technician_complaint_list;
bool get isLoading => _isLoading; bool get isLoading => _isLoading;
bool get submitLoading => _submitLoading; bool get submitLoading => _submitLoading;
...@@ -42,7 +45,10 @@ class Pendingcomplaintsprovider extends ChangeNotifier { ...@@ -42,7 +45,10 @@ class Pendingcomplaintsprovider extends ChangeNotifier {
int get imagePicked => _image_picked; int get imagePicked => _image_picked;
File? get imagePath => _imageName; File? get imagePath => _imageName;
File? get imageFilePath => _image; File? get imageFilePath => _image;
final List<Map<String, dynamic>> CompletedStatus = [
{"id": "1", "name": "Pending"},
{"id": "2", "name": "Completed"}
];
set imagePicked(int value){ set imagePicked(int value){
_image_picked = value; _image_picked = value;
notifyListeners(); notifyListeners();
...@@ -72,6 +78,15 @@ class Pendingcomplaintsprovider extends ChangeNotifier { ...@@ -72,6 +78,15 @@ class Pendingcomplaintsprovider extends ChangeNotifier {
_submitLoading = false; _submitLoading = false;
_statusId = ""; _statusId = "";
_image_picked = 0; _image_picked = 0;
fsrNumberController.clear();
runningHoursController.clear();
feedbackController.clear();
statusError = "";
fsrError = "";
runningHoursError = "";
_image = null;
_imageName = null;
notifyListeners();
} }
Future<void> TechnicianPendingComplaints(BuildContext context) async { Future<void> TechnicianPendingComplaints(BuildContext context) async {
...@@ -151,7 +166,10 @@ class Pendingcomplaintsprovider extends ChangeNotifier { ...@@ -151,7 +166,10 @@ class Pendingcomplaintsprovider extends ChangeNotifier {
runningHr, runningHr,
statusId, statusId,
) async { ) async {
if (!validatereceiptForm(context)) {
return;
}
var HomeProvider = Provider.of<HomescreenNotifier>(context,listen: false); var HomeProvider = Provider.of<HomescreenNotifier>(context,listen: false);
try { try {
final data = await ApiCalling.UpdateComplaintAPI( final data = await ApiCalling.UpdateComplaintAPI(
...@@ -171,7 +189,7 @@ class Pendingcomplaintsprovider extends ChangeNotifier { ...@@ -171,7 +189,7 @@ class Pendingcomplaintsprovider extends ChangeNotifier {
if (data.sessionExists == 1) { if (data.sessionExists == 1) {
if (data.error == 0) { if (data.error == 0) {
toast(context, "Complaint Status Updated!"); toast(context, "Complaint Status Updated!");
resetAll();
Navigator.pop(context); Navigator.pop(context);
...@@ -202,6 +220,35 @@ class Pendingcomplaintsprovider extends ChangeNotifier { ...@@ -202,6 +220,35 @@ class Pendingcomplaintsprovider extends ChangeNotifier {
} }
} }
bool validatereceiptForm(BuildContext context) {
statusError = null;
fsrError = null;
runningHoursError = null;
_submitLoading = false;
bool isValid = true;
if (_statusId == null || _statusId!.isEmpty) {
statusError = "Please Select Status";
_submitLoading = false;
isValid = false;
}
if(_statusId!="Pending"){
if (fsrNumberController.text.trim().isEmpty) {
fsrError = "Please Enter FSR number";
_submitLoading = false;
isValid = false;
}
}
if(runningHoursController.text.trim().isEmpty){
runningHoursError = "Enter Running Hours";
_submitLoading = false;
isValid = false;
}
notifyListeners();
return isValid;
}
Future SelectAttachmentDialogue( Future SelectAttachmentDialogue(
BuildContext context BuildContext context
) async { ) async {
......
...@@ -66,7 +66,7 @@ class Visitdetailsprovider extends ChangeNotifier{ ...@@ -66,7 +66,7 @@ class Visitdetailsprovider extends ChangeNotifier{
if (data.error == 0) { if (data.error == 0) {
// complaintdetails = data.complaintDetails!; // complaintdetails = data.complaintDetails!;
_followupList = data.list!; _followupList = data.list??[];
_isLoading = false; _isLoading = false;
notifyListeners(); notifyListeners();
} else { } else {
......
This diff is collapsed.
import 'dart:async';
import 'dart:io';
import 'package:camera/camera.dart';
import 'package:dropdown_button2/dropdown_button2.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:generp/Notifiers/HomeScreenNotifier.dart';
import 'package:generp/services/api_calling.dart';
import 'package:image_picker/image_picker.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
import '../../Models/ordersModels/AddOrderPaymentSelectAccountResponse.dart';
import '../../Models/ordersModels/AddOrderPaymentSelectOrderResponse.dart';
class Addpaymentprovider extends ChangeNotifier{
TextEditingController dropDownSearchController = TextEditingController();
TextEditingController amountController = TextEditingController();
TextEditingController orderAdjustedAmountController = TextEditingController();
TextEditingController descriptionController = TextEditingController();
TextEditingController paymentReceivedDateController = TextEditingController();
TextEditingController paymentRefController = TextEditingController();
String selectAccountError = "";
String amountError = "";
String orderAdjustedAmountError = "";
String descriptionError = "";
String paymentModeError = "";
String paymentRefError = "";
List<TextEditingController> orderAmountControllers = [];
String? FileError;
String? dateError;
bool _isLoading = false;
int _imagePicked = 0;
File? _image;
File? _imageName;
final ImagePicker _picker = ImagePicker();
DateTime? _date;
String? _formattedDate;
Timer? _debounce;
List<String> _paymentMode = [];
List<String> _description = [];
List<AccountList> _accountList = [];
List<OrderList> _orderList= [];
List<Map<String, String>> _selectedOrders = [];
String? _selectedPaymentMode;
String? _selectedDescription;
AccountList? _selectedAccountList;
String? _selectedAccountID;
String? _selectedAccountName;
OrderList? _selectedOrderLists;
List<String?> _selectedOrderIds = [];
List<String?> _selectedOrderNumbers = [];
List<String?> _selectedTotalAmounts = [];
List<String?> _selectedBalanceAmounts = [];
List<String?> _selectedCreatedDatetimes = [];
List<String> get paymentMode => _paymentMode;
List<String> get description => _description;
bool get isLoading => _isLoading;
List<AccountList> get accountList => _accountList;
List<OrderList> get orderList => _orderList;
List<Map<String, String>> get selectedOrders => _selectedOrders;
String? get selectedPaymentMode => _selectedPaymentMode;
String? get selectedDescription => _selectedDescription;
AccountList? get selectedAccountList => _selectedAccountList;
String? get selectedAccountID => _selectedAccountID;
String? get selectedAccountName => _selectedAccountName;
OrderList? get selectedOrderLists => _selectedOrderLists;
List<String?> get selectedOrderIds => _selectedOrderIds;
List<String?> get selectedOrderNumbers => _selectedOrderNumbers;
List<String?> get selectedTotalAmounts => _selectedTotalAmounts;
List<String?> get selectedBalanceAmounts => _selectedBalanceAmounts;
List<String?> get selectedCreatedDatetimes => _selectedCreatedDatetimes;
String? get formattedDate => _formattedDate;
DateTime? get dateNow => _date;
File? get imagePath => _imageName;
File? get imageFilePath => _image;
int get imagePicked => _imagePicked;
set accountList(List<AccountList> value){
_accountList = value;
notifyListeners();
}
set selectedPaymentMode(String? value){
_selectedPaymentMode = value;
paymentModeError = "";
notifyListeners();
}
set selectedOrders(value){
_selectedOrders = selectedOrders;
notifyListeners();
}
set selectedDescription(String? value){
_selectedDescription = value;
notifyListeners();
}
set selectedAccountList(AccountList? value){
_selectedAccountList = value;
_selectedAccountID = value?.id!;
_selectedAccountName = value!.text!;
selectAccountError = "";
notifyListeners();
}
set selectedAccountID(String? value){
_selectedAccountID = value;
notifyListeners();
}
set selectedAccountName(String? value){
_selectedAccountName = value;
notifyListeners();
}
set selectedOrderLists(OrderList? value){
_selectedOrderLists = value;
notifyListeners();
}
void updateSelectedOrderId(int index, OrderList? value) {
_selectedOrderLists = value!;
_selectedOrderIds[index] = value!.orderId;
print(_selectedOrderIds[index]);
notifyListeners();
}
set selectedOrderNumbers(List<String?> value) {
_selectedOrderNumbers = value;
notifyListeners();
}
set selectedTotalAmounts(List<String?> value) {
_selectedTotalAmounts = value;
notifyListeners();
}
set selectedBalanceAmounts(List<String?> value) {
_selectedBalanceAmounts = value;
notifyListeners();
}
set selectedCreatedDatetimes(List<String?> value) {
_selectedCreatedDatetimes = value;
notifyListeners();
}
set imagePath(File? value) {
_imageName = value;
notifyListeners();
}
set imageFilePath(File? value) {
_image = value;
notifyListeners();
}
set imagePicked(value) {
_imagePicked = value;
notifyListeners();
}
set formattedDate(String? value) {
_formattedDate = value;
paymentReceivedDateController.text = _formattedDate!;
dateError = null;
notifyListeners();
}
void setDate(DateTime newDate) {
_date = newDate;
_formattedDate = DateFormat('yyyy-MM-dd').format(newDate);
paymentReceivedDateController.text = _formattedDate!;
dateError = null;
notifyListeners();
}
void addNewRow() {
// if (_selectedOrderIds.length < _orderList.length ) {
final controller = TextEditingController();
// Add a listener to recalculate the total when the text changes
controller.addListener(_updateAdjustedAmount);
orderAmountControllers.add(TextEditingController());
_selectedOrderIds.add(null);
notifyListeners();
}
void removeRow(int index) {
orderAmountControllers[index].removeListener(_updateAdjustedAmount);
orderAmountControllers[index].dispose();
orderAmountControllers.removeAt(index);
_selectedOrderIds.removeAt(index);
_updateAdjustedAmount();
notifyListeners();
}
void _updateAdjustedAmount() {
int tempAdjustAmount = 0;
for (int i = 0; i < orderAmountControllers.length; i++) {
final text = orderAmountControllers[i].text;
if (_selectedOrderIds[i] != null && text.isNotEmpty) {
tempAdjustAmount += int.tryParse(text) ?? 0;
}
}
orderAdjustedAmountController.text = tempAdjustAmount.toString();
notifyListeners();
}
List<Map<String, String>> getFormData() {
_selectedOrders = [];
Map<String, String> latestEntries = {};
var tempAdjustAmount = 0;
for (int i = 0; i < orderAmountControllers.length; i++) {
if (_selectedOrderIds[i] != null &&
orderAmountControllers[i].text.isNotEmpty) {
latestEntries[_selectedOrderIds[i]!] = orderAmountControllers[i].text;
tempAdjustAmount = tempAdjustAmount+int.parse(double.parse(orderAmountControllers[i].text).round().toString());
}
}
_selectedOrders = latestEntries.entries
.map((entry) => {
"order_id": entry.key,
"amount": entry.value,
})
.toList();
print("Form Data: $_selectedOrders");
orderAdjustedAmountController.text = tempAdjustAmount.toString();
print(tempAdjustAmount);
notifyListeners();
return _selectedOrders;
}
Future<void> ordersAddPaymentAPIViewFunction(context) async {
try{
final provider = Provider.of<HomescreenNotifier>(context,listen: false);
final data = await ApiCalling.addOrderpaymentListViewAPI(provider.empId, provider.session);
if(data!=null){
if(data.error=="0"){
_paymentMode = data.paymentMode!;
_description = data.description!;
checkDropdownselected();
// if (_selectedAccountList != null &&
// !_accountList.contains(_selectedAccountList)) {
// dropDownSearchController.clear();
// _selectedAccountList = null;
// _selectedAccountID = "";
// _selectedAccountName = "";
// }
notifyListeners();
}else{
}
}else{
}
}catch(e,s){
}
}
void onSearchChanged(BuildContext context, String mode, String? accountId, String search) {
if (_debounce?.isActive ?? false) _debounce!.cancel();
_debounce = Timer(const Duration(milliseconds: 300), () {
// if (search.isNotEmpty) { // Only call API for non-empty search
ordersAddPaymentSelectAccountAPIFunction(context, mode, accountId, search);
// } else {
// _accountList = []; // Clear list for empty search
// _isLoading = false;
// notifyListeners();
// }
});
}
Future<void> ordersAddPaymentSelectAccountAPIFunction(context,mode,accountId,search) async {
print(search);
try{
if (search.isEmpty) {
_accountList = [];
_isLoading = false;
notifyListeners();
return;
}
_isLoading = true;
notifyListeners();
final provider = Provider.of<HomescreenNotifier>(context,listen: false);
final data = await ApiCalling.AddOrderPaymentSelectAccountAPI(provider.empId, provider.session, mode, search);
if(data!=null){
if(data.error=="0"){
_accountList = data.accountList!;
if (_selectedAccountList != null && !_accountList.contains(_selectedAccountList)) {
_selectedAccountList = null;
_selectedAccountID = null;
_selectedAccountName = null;
}
_isLoading = false;
notifyListeners();
if (_accountList.isNotEmpty && _selectedAccountID != null) {
await ordersAddPaymentSelectOrderAPIFunction(context, _selectedAccountID);
}
}else{
selectAccountError = data?.message ?? "Failed to load accounts";
_isLoading = false;
notifyListeners();
}
}else{
selectAccountError = "No data received from server";
_isLoading = false;
notifyListeners();
}
}catch(e,s){
selectAccountError = "An error occurred while fetching accounts";
_isLoading = false;
notifyListeners();
}
}
Future<void> ordersAddPaymentSelectOrderAPIFunction(context,accountID) async {
try{
final provider = Provider.of<HomescreenNotifier>(context,listen: false);
final data = await ApiCalling.AddOrderPaymentSelectOrderAPI(provider.empId, provider.session, accountID);
if(data!=null){
if(data.error=="0"){
_orderList = data.orderList!;
notifyListeners();
}else{
}
}else{
}
}catch(e,s){
}
}
Future<void> ordersAddPaymentAPISubmitFunction(context,
accountId,selDescription, selectedOrders,
paymentMode,) async {
try{
final provider = Provider.of<HomescreenNotifier>(context,listen: false);
final data = await ApiCalling.addOrderpaymentListSubmitAPI(provider.empId, provider.session,
accountId, selDescription,
selectedOrders, amountController.text,
paymentReceivedDateController.text,
paymentMode, paymentRefController.text, _image);
if(data!=null){
if(data.error=="0"){
resetForm();
Navigator.pop(context);
}else{
}
}else{
}
}catch(e,s){
}
}
imgFromCamera(context) async {
// Capture a photo
try {
final XFile? galleryImage = await _picker.pickImage(
source: ImageSource.camera,
imageQuality: 50,
);
debugPrint("added");
_image = File(galleryImage!.path);
_imageName = File(galleryImage!.name);
_imagePicked = 1;
FileError = null;
notifyListeners();
} catch (e) {
debugPrint("mmmm: ${e.toString()}");
}
}
imgFromGallery(context) async {
// Pick an image
try {
final XFile? galleryImage = await _picker.pickImage(
source: ImageSource.gallery,
);
final bytes = (await galleryImage?.readAsBytes())?.lengthInBytes;
final kb = bytes! / 1024;
final mb = kb / 1024;
debugPrint("Jenny: bytes:$bytes, kb:$kb, mb: $mb");
_image = File(galleryImage!.path);
_imageName = File(galleryImage!.name);
_imagePicked = 1;
FileError = null;
notifyListeners();
// var file = FlutterImageCompress.compressWithFile(galleryImage!.path);
} catch (e) {
debugPrint("mmmm: ${e.toString()}");
}
}
void onChangeAmount(value){
amountError = "";
notifyListeners();
}
void onChangeorderAdjustedAmount(value){
orderAdjustedAmountError = "";
notifyListeners();
}
void onChangeDescription(value){
descriptionError = "";
notifyListeners();
}
void onChangepaymentRef(value){
paymentRefError = "";
notifyListeners();
}
void resetForm() {
dropDownSearchController.clear();
amountController.clear();
orderAdjustedAmountController.clear();
descriptionController.clear();
paymentReceivedDateController.clear();
paymentRefController.clear();
_selectedAccountList = null;
_selectedAccountID = null;
_selectedAccountName = null;
_selectedOrderIds.clear();
_selectedOrderNumbers.clear();
_selectedTotalAmounts.clear();
_selectedBalanceAmounts.clear();
_selectedCreatedDatetimes.clear();
_image = null;
_imageName = null;
_imagePicked = 0;
_selectedOrders.clear();
orderAmountControllers.forEach((controller) => controller.dispose());
orderAmountControllers.clear();
selectAccountError = "";
amountError = "";
orderAdjustedAmountError = "";
descriptionError = "";
paymentModeError = "";
paymentRefError = "";
FileError = null;
dateError = null;
_accountList = [];
_selectedAccountID = "";
_selectedAccountList = null;
_selectedAccountName = "";
checkDropdownselected();
notifyListeners();
}
void checkDropdownselected() {
if (_selectedAccountList != null &&
!_accountList.contains(_selectedAccountList)) {
_selectedAccountID = null;
_selectedAccountName = "";
}
if(_selectedOrderLists!=null && !_orderList.contains(_selectedOrderLists)){
_selectedOrderLists = null;
_selectedOrderIds.clear();
_selectedOrderIds = [];
_selectedOrderIds.clear();
_selectedOrderNumbers.clear();
_selectedTotalAmounts.clear();
_selectedBalanceAmounts.clear();
_selectedCreatedDatetimes.clear();
}
notifyListeners();
}
void showDatePickerDialog(BuildContext context) {
if (_date == null) {
setDate(DateTime.now()); // Ensure current date is set before opening the picker
}
showCupertinoModalPopup<void>(
context: context,
builder:
(BuildContext context) => Container(
height: 216,
padding: const EdgeInsets.only(top: 6.0),
margin: EdgeInsets.only(
bottom: MediaQuery.of(context).viewInsets.bottom,
),
color: CupertinoColors.systemBackground.resolveFrom(context),
child: SafeArea(
top: false,
child: Column(
children: [
Expanded(
flex: 1,
child: SizedBox(
height: 40,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
CupertinoButton(
child: Text(
'Cancel',
style: TextStyle(fontFamily: "JakartaMedium"),
),
onPressed: () {
Navigator.pop(context);
},
),
CupertinoButton(
child: Text(
'Done',
style: TextStyle(fontFamily: "JakartaMedium"),
),
onPressed: () {
Navigator.pop(context);
},
),
],
),
),
),
Expanded(
flex: 3,
child: CupertinoDatePicker(
initialDateTime: _date ?? DateTime.now(),
mode: CupertinoDatePickerMode.date,
use24hFormat: true,
showDayOfWeek: true,
onDateTimeChanged: (DateTime newDate) {
setDate(newDate);
},
),
),
],
),
),
),
);
}
}
\ No newline at end of file
import 'package:flutter/cupertino.dart';
import 'package:generp/Notifiers/HomeScreenNotifier.dart';
import 'package:generp/Utils/commonServices.dart';
import 'package:generp/services/api_calling.dart';
import 'package:provider/provider.dart';
import '../../Models/ordersModels/AddOrderPaymentSelectOrderResponse.dart';
import 'addPaymentProvider.dart';
class Editpaymentprovider extends ChangeNotifier{
bool _submitLoading = false;
bool get submitLoading => _submitLoading;
set submitLoading(bool value){
_submitLoading = value;
notifyListeners();
}
List<OrderList> _orderList = [];
List<Map<String, String>> _selectedOrders = [];
OrderList? _selectedOrderLists;
List<String?> _selectedOrderIds = [];
List<TextEditingController> orderAmountControllers = [];
TextEditingController orderAdjustedAmountController = TextEditingController();
List<Map<String, String>?> _rowMetadata = [];
List<OrderList> get orderList => _orderList;
OrderList? get selectedOrderLists => _selectedOrderLists;
set selectedOrderLists(OrderList? value){
_selectedOrderLists = value;
notifyListeners();
}
Future<void> ordersAddPaymentSelectOrderAPIFunction(context, accountID) async {
try {
final provider = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.AddOrderPaymentSelectOrderAPI(
provider.empId, provider.session, accountID);
if (data != null) {
if (data.error == "0") {
_orderList = data.orderList!;
notifyListeners();
} else {
print("API Error: ${data.error}");
}
} else {
print("API returned null data");
}
} catch (e, s) {
print("Error: $e, Stack: $s");
}
}
void addNewRow() {
final controller = TextEditingController();
controller.addListener(_updateAdjustedAmount);
orderAmountControllers.add(controller);
_selectedOrderIds.add(null);
_rowMetadata.add(null); // New row, no metadata
notifyListeners();
}
void addRowWithMetadata(Map<String, String> metadata) {
final controller = TextEditingController();
controller.addListener(_updateAdjustedAmount);
orderAmountControllers.add(controller);
_selectedOrderIds.add(null);
_rowMetadata.add(metadata); // Store metadata for existing order
notifyListeners();
}
void removeRow(int index) {
orderAmountControllers[index].removeListener(_updateAdjustedAmount);
orderAmountControllers[index].dispose();
orderAmountControllers.removeAt(index);
_selectedOrderIds.removeAt(index);
_rowMetadata.removeAt(index);
_updateAdjustedAmount();
notifyListeners();
}
void _updateAdjustedAmount() {
int tempAdjustAmount = 0;
for (int i = 0; i < orderAmountControllers.length; i++) {
final text = orderAmountControllers[i].text;
if (_selectedOrderIds[i] != null && text.isNotEmpty) {
tempAdjustAmount += int.tryParse(text) ?? 0;
}
}
orderAdjustedAmountController.text = tempAdjustAmount.toString();
notifyListeners();
}
List<Map<String, String>> getFormData() {
_selectedOrders = [];
int tempAdjustAmount = 0;
for (int i = 0; i < orderAmountControllers.length; i++) {
if (_selectedOrderIds[i] != null && orderAmountControllers[i].text.isNotEmpty) {
final amount = orderAmountControllers[i].text;
tempAdjustAmount += int.parse(double.parse(amount).round().toString());
if (_rowMetadata[i] != null) {
// Existing order from widget.values
_selectedOrders.add({
"order_id": _rowMetadata[i]!["order_id"]!,
"order_payment_id": _rowMetadata[i]!["order_payment_id"]!,
"selected_order_id": _selectedOrderIds[i]!,
"updateable_payment_amount": amount,
});
} else {
// New row added by user
_selectedOrders.add({
"selected_order_id": _selectedOrderIds[i]!,
"insert_amount": amount,
});
}
}
}
print("Form Data: $_selectedOrders");
orderAdjustedAmountController.text = tempAdjustAmount.toString();
print("Total Adjusted Amount: $tempAdjustAmount");
notifyListeners();
return _selectedOrders;
}
Future<void> editPaymentDetailsAPIFunction(context,payment_id, description, payment_type, ref_no, payment_date, amount) async {
try{
_submitLoading = true;
notifyListeners();
final provider = Provider.of<HomescreenNotifier>(context,listen: false);
final addOrderProvider = Provider.of<Addpaymentprovider>(context,listen: false);
final data = await ApiCalling.ordersEditPaymentDetailsAPI(provider.empId, provider.session, payment_id, description, payment_type, ref_no, payment_date, amount);
if(data!=null){
if(data.error=="0"){
_submitLoading = false;
addOrderProvider.resetForm();
Navigator.pop(context);
toast(context, data.message);
notifyListeners();
}else if(data.error=="1"){
_submitLoading = false;
notifyListeners();
}
}else{
_submitLoading = false;
notifyListeners();
}
}catch(e,s){
_submitLoading = false;
notifyListeners();
}
}
void updateSelectedOrderId(int index, OrderList? value) {
if (value != null) {
_selectedOrderLists = value;
_selectedOrderIds[index] = value.orderId;
print("Selected Order ID at index $index: ${_selectedOrderIds[index]}");
notifyListeners();
}
}
void resetForm() {
for (var controller in orderAmountControllers) {
controller.removeListener(_updateAdjustedAmount);
controller.dispose();
}
orderAmountControllers.clear();
_selectedOrderIds.clear();
_rowMetadata.clear();
_selectedOrders.clear();
orderAdjustedAmountController.clear();
submitLoading = false;
notifyListeners();
}
}
...@@ -198,6 +198,9 @@ class MyApp extends StatelessWidget { ...@@ -198,6 +198,9 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_) => Pagesdashboardprovider(),), ChangeNotifierProvider(create: (_) => Pagesdashboardprovider(),),
ChangeNotifierProvider(create: (_) => Paymentsprovider(),), ChangeNotifierProvider(create: (_) => Paymentsprovider(),),
ChangeNotifierProvider(create: (_) => Tpcagentsprovider(),), ChangeNotifierProvider(create: (_) => Tpcagentsprovider(),),
ChangeNotifierProvider(create: (_) => Addpaymentprovider(),),
ChangeNotifierProvider(create: (_) => Addorderprovider(),),
ChangeNotifierProvider(create: (_) => Editpaymentprovider(),),
], ],
child: Builder( child: Builder(
builder: (BuildContext context) { builder: (BuildContext context) {
......
...@@ -120,8 +120,8 @@ class _MyHomePageState extends State<MyHomePage> { ...@@ -120,8 +120,8 @@ class _MyHomePageState extends State<MyHomePage> {
"Whizzdom", "Whizzdom",
"Common", "Common",
"Finance", "Finance",
"Orders", // "Orders",
"CRM", // "CRM",
]; ];
final icons = [ final icons = [
"assets/svg/home_icons_1.svg", "assets/svg/home_icons_1.svg",
...@@ -133,8 +133,8 @@ class _MyHomePageState extends State<MyHomePage> { ...@@ -133,8 +133,8 @@ class _MyHomePageState extends State<MyHomePage> {
"assets/svg/home_icons_81.svg", "assets/svg/home_icons_81.svg",
"assets/svg/home_icons_9.svg", "assets/svg/home_icons_9.svg",
"assets/svg/home_icons_10.svg", "assets/svg/home_icons_10.svg",
"assets/svg/home_icons_11.svg", // "assets/svg/home_icons_11.svg",
"assets/svg/home_icons_12.svg", // "assets/svg/home_icons_12.svg",
]; ];
final requiredRoles = [ final requiredRoles = [
"430", "430",
...@@ -146,8 +146,8 @@ class _MyHomePageState extends State<MyHomePage> { ...@@ -146,8 +146,8 @@ class _MyHomePageState extends State<MyHomePage> {
"431", "431",
"430", "430",
"430", "430",
"430", // "430",
"430", // "430",
]; ];
final filteredItems = <Map<String, String>>[]; final filteredItems = <Map<String, String>>[];
......
...@@ -35,4 +35,7 @@ export 'package:generp/Notifiers/financeProvider/approveRejectPaymentRequestResp ...@@ -35,4 +35,7 @@ export 'package:generp/Notifiers/financeProvider/approveRejectPaymentRequestResp
export 'package:generp/Notifiers/ordersProvider/pagesDashboardProvider.dart'; export 'package:generp/Notifiers/ordersProvider/pagesDashboardProvider.dart';
export 'package:generp/Notifiers/ordersProvider/paymentsProvider.dart'; export 'package:generp/Notifiers/ordersProvider/paymentsProvider.dart';
export 'package:generp/Notifiers/ordersProvider/tpcAgentsProvider.dart'; export 'package:generp/Notifiers/ordersProvider/tpcAgentsProvider.dart';
\ No newline at end of file export 'package:generp/Notifiers/ordersProvider/addPaymentProvider.dart';
export 'package:generp/Notifiers/ordersProvider/addOrderProvider.dart';
export 'package:generp/Notifiers/ordersProvider/editPaymentProvider.dart';
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:generp/screens/screensExports.dart'; import 'package:generp/screens/screensExports.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../Notifiers/ordersProvider/pagesDashboardProvider.dart'; import '../../Notifiers/ordersProvider/pagesDashboardProvider.dart';
...@@ -67,9 +68,20 @@ class _OrdermoduledashboardState extends State<Ordermoduledashboard> { ...@@ -67,9 +68,20 @@ class _OrdermoduledashboardState extends State<Ordermoduledashboard> {
onTap: () async { onTap: () async {
var navigate; var navigate;
if (pages[index].pageName!.contains("Add Order") ) { if (pages[index].pageName!.contains("Add Order") ) {
print("navigate to Add Order"); navigate = AddorderScreen(
mode: pages[index].mode!,
pageTitleName:
pages[index]
.pageName!,
);
}if (pages[index].pageName!.contains("Add Payment") ) { }if (pages[index].pageName!.contains("Add Payment") ) {
print("navigate to Add Payment"); ("navigate to Add Payment");
navigate = AddpaymentScreen(
mode: pages[index].mode!,
pageTitleName:
pages[index]
.pageName!,
);
} }
else if (pages[index].pageName!.contains("Payments List")) { else if (pages[index].pageName!.contains("Payments List")) {
navigate = Paymentlistsbymode( navigate = Paymentlistsbymode(
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:generp/Notifiers/ordersProvider/paymentsProvider.dart'; import 'package:generp/Notifiers/ordersProvider/paymentsProvider.dart';
import 'package:generp/screens/order/editAdjustedOrderList.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../Utils/app_colors.dart'; import '../../Utils/app_colors.dart';
import '../../Utils/commonWidgets.dart'; import '../../Utils/commonWidgets.dart';
import '../finance/FileViewer.dart'; import '../finance/FileViewer.dart';
import 'editPaymentDetailsByMode.dart';
import 'ordersDetailsByModes.dart'; import 'ordersDetailsByModes.dart';
class Paymentdetailsbymode extends StatefulWidget { class Paymentdetailsbymode extends StatefulWidget {
...@@ -44,6 +46,14 @@ class _PaymentdetailsbymodeState extends State<Paymentdetailsbymode> { ...@@ -44,6 +46,14 @@ class _PaymentdetailsbymodeState extends State<Paymentdetailsbymode> {
child: Scaffold( child: Scaffold(
resizeToAvoidBottomInset: true, resizeToAvoidBottomInset: true,
appBar: appbar2(context, widget.pageTitleName, provider.resetAll, appBar: appbar2(context, widget.pageTitleName, provider.resetAll,
paymentDetails.status=="Registered"?InkResponse(
onTap: () {
_showOptionsSheet(
context
);
},
child: SvgPicture.asset("assets/svg/ic_more.svg", height: 30,),
):
SizedBox(width: 0,),), SizedBox(width: 0,),),
backgroundColor: AppColors.scaffold_bg_color, backgroundColor: AppColors.scaffold_bg_color,
body: Container( body: Container(
...@@ -496,6 +506,97 @@ class _PaymentdetailsbymodeState extends State<Paymentdetailsbymode> { ...@@ -496,6 +506,97 @@ class _PaymentdetailsbymodeState extends State<Paymentdetailsbymode> {
); );
} }
Future<void> _showOptionsSheet(BuildContext context) {
return showModalBottomSheet(
useSafeArea: true,
isDismissible: true,
isScrollControlled: true,
showDragHandle: true,
backgroundColor: Colors.white,
enableDrag: true,
context: context,
builder: (context) {
return StatefulBuilder(
builder: (context, setState) {
return SafeArea(
child: Consumer<Paymentsprovider>(
builder: (context, provider, child) {
return Container(
margin: EdgeInsets.only(
bottom: 15,
left: 15,
right: 15,
top: 10,
),
child: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(height: 15),
...List.generate(2, (index) {
final assetnames = [
"ic_edit",
"ic_edit",
];
final Headingnames = [
"Edit Payment Details",
"Edit Adjusted Order",
];
return ListTile(
onTap: () {
switch (index) {
case 0:
Navigator.push(context, MaterialPageRoute(builder: (context) => Editpaymentdetailsbymode(pageTitleName: "Edit Payment (${widget.mode})",mode: widget.mode,
values:{
"payment_id":provider.paymentDetails.paymentId,
"description":provider.paymentDetails!.description,
"amount":provider.paymentDetails!.amount,
"payment_mode":provider.paymentDetails!.paymentType,
"pay_ref":provider.paymentDetails!.refNo,
"pay_received_date":provider.paymentDetails!.paymentDate,
}),
));
break;
case 1:
Navigator.push(context, MaterialPageRoute(builder: (context) => Editadjustedorderlist(mode: widget.mode,pageTitleName: "Edit Adjusted Order List (${widget.mode})",
values: {
"account_id":provider.paymentDetails.accId,
"orders": provider.paidLists.map((order) => {
"order_number": order.orderNumber,
"amount": order.adjustedAmount,
}).toList(),
},),));
break;
}
},
leading: SvgPicture.asset(
"assets/svg/${assetnames[index]}.svg",
),
title: Text(
Headingnames[index],
style: TextStyle(fontFamily: "JakartaMedium"),
),
trailing: SvgPicture.asset(
"assets/svg/arrow_right_new.svg",
),
);
}),
],
),
),
);
},
),
);
},
);
},
);
}
Future<void> _showLevelApprovalRejectionSheet(BuildContext context, type) { Future<void> _showLevelApprovalRejectionSheet(BuildContext context, type) {
return showModalBottomSheet( return showModalBottomSheet(
......
...@@ -30,6 +30,8 @@ export 'package:generp/screens/finance/paymentListPaymentRequisition.dart'; ...@@ -30,6 +30,8 @@ export 'package:generp/screens/finance/paymentListPaymentRequisition.dart';
export 'package:generp/screens/finance/paymentreceiptList.dart'; export 'package:generp/screens/finance/paymentreceiptList.dart';
export 'package:generp/screens/finance/submitPaymentRequestionListsByMode.dart'; export 'package:generp/screens/finance/submitPaymentRequestionListsByMode.dart';
export 'package:generp/screens/order/addPayment.dart';
export 'package:generp/screens/order/addOrder.dart';
export 'package:generp/screens/order/ordersListByModes.dart'; export 'package:generp/screens/order/ordersListByModes.dart';
export 'package:generp/screens/order/paymentListsByMode.dart'; export 'package:generp/screens/order/paymentListsByMode.dart';
export 'package:generp/screens/order/tpcAgentIssueList.dart'; export 'package:generp/screens/order/tpcAgentIssueList.dart';
...@@ -37,3 +39,4 @@ export 'package:generp/screens/order/tpcAgentListByMode.dart'; ...@@ -37,3 +39,4 @@ export 'package:generp/screens/order/tpcAgentListByMode.dart';
export 'package:generp/screens/order/orderDetailsFeedbackHistory.dart'; export 'package:generp/screens/order/orderDetailsFeedbackHistory.dart';
export 'package:generp/screens/order/orderDetailsPaymentHistory.dart'; export 'package:generp/screens/order/orderDetailsPaymentHistory.dart';
export 'package:generp/screens/order/orderDetailsProductsHistory.dart'; export 'package:generp/screens/order/orderDetailsProductsHistory.dart';
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment