Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Sai Srinivas
GEN_ERP_2025
Commits
12aa06e4
Commit
12aa06e4
authored
Aug 13, 2025
by
Sai Srinivas
Browse files
13-08-2025 By Sai Srinivas
Test Cases
parent
2a5b9635
Changes
20
Show whitespace changes
Inline
Side-by-side
lib/Models/ordersModels/ordersDetailsByModeResponse.dart
View file @
12aa06e4
...
...
@@ -127,7 +127,7 @@ class OrderDetails {
String
?
tpcaAgentName
;
OrderDetails
(
{
this
.
id
,
{
this
.
id
,
this
.
orderNumber
,
this
.
orderNumberHash
,
this
.
balanceAmount
,
...
...
lib/Notifiers/crmProvider/addNewLeadsandProspectsProvider.dart
View file @
12aa06e4
...
...
@@ -844,10 +844,10 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier {
nameError
=
"Please Enter Name"
;
isValid
=
false
;
}
//
if(customerMailIdController.text.trim().isEmpty){
//
mailIdError = "Please enter Email I
d
";
//
isValid = false;
//
}
if
(
customerMailIdController
.
text
.
trim
().
is
Not
Empty
&&
!
RegExp
(
r'\S+@\S+\.\S+'
).
hasMatch
(
customerMailIdController
.
text
)
){
mailIdError
=
"Please enter
a proper
Email I
D
"
;
isValid
=
false
;
}
if
(
mobileController
.
text
.
trim
().
isEmpty
){
mobileError
=
"Please enter Mobile Number"
;
isValid
=
false
;
...
...
lib/Notifiers/ordersProvider/addOrderProvider.dart
View file @
12aa06e4
...
...
@@ -566,66 +566,63 @@ String? productsEmptyError ;
notifyListeners
();
}
dynamic
get
basicAmount
{
double
total
=
0
;
for
(
var
controller
in
TaxableValueControllers
)
{
total
+=
double
.
tryParse
(
controller
.
text
)?.
round
()
??
0.0
;
}
basicAmountReadOnlyController
.
text
=
total
.
toStringAsFixed
(
2
);
return
total
;
}
dynamic
get
cgstAmount
{
double
total
=
0
;
for
(
int
i
=
0
;
i
<
ProductControllers
.
length
;
i
++)
{
final
taxableValue
=
double
.
tryParse
(
TaxableValueControllers
[
i
].
text
)
??
0.0
;
final
cgst
=
double
.
tryParse
(
CGSTControllers
[
i
].
text
)
??
0.0
;
total
+=
(
taxableValue
*
cgst
)
/
100
;
}
cgstReadOnlyController
.
text
=
total
.
toStringAsFixed
(
2
);
return
total
;
}
dynamic
get
sgstAmount
{
double
total
=
0
;
for
(
int
i
=
0
;
i
<
ProductControllers
.
length
;
i
++)
{
final
taxableValue
=
double
.
tryParse
(
TaxableValueControllers
[
i
].
text
)
??
0.0
;
final
sgst
=
double
.
tryParse
(
SGSTControllers
[
i
].
text
)
??
0.0
;
total
+=
(
taxableValue
*
sgst
).
round
()
/
100
;
}
sgstReadOnlyController
.
text
=
total
.
toStringAsFixed
(
2
);
return
total
;
}
dynamic
get
igstAmount
{
double
total
=
0
;
for
(
int
i
=
0
;
i
<
ProductControllers
.
length
;
i
++)
{
final
taxableValue
=
double
.
tryParse
(
TaxableValueControllers
[
i
].
text
)
??
0.0
;
final
igst
=
double
.
tryParse
(
IGSTControllers
[
i
].
text
)
??
0.0
;
total
+=
(
taxableValue
*
igst
).
round
()
/
100
;
}
igstReadOnlyController
.
text
=
total
.
toStringAsFixed
(
2
);
return
total
;
}
dynamic
get
totalAmount
{
double
total
=
basicAmount
+
cgstAmount
+
sgstAmount
+
igstAmount
;
totalReadOnlyAmountController
.
text
=
total
.
round
().
toStringAsFixed
(
2
);
return
total
!;
}
// dynamic get basicAmount {
// double total = 0;
// total += double.tryParse(TaxableValueController.text)?.round() ?? 0.0;
// basicAmountReadOnlyController.text = total.toStringAsFixed(2);
// return total;
// }
//
// dynamic get cgstAmount {
// double total = 0;
//
// final taxableValue =
// double.tryParse(TaxableValueController.text) ?? 0.0;
// final cgst = double.tryParse(CGSTController.text) ?? 0.0;
// total += (taxableValue * cgst) / 100;
//
// cgstReadOnlyController.text = total.toStringAsFixed(2);
// return total;
// }
//
// dynamic get sgstAmount {
// double total = 0;
//
// final taxableValue =
// double.tryParse(TaxableValueController.text) ?? 0.0;
// final sgst = double.tryParse(SGSTController.text) ?? 0.0;
// total += (taxableValue * sgst).round() / 100;
//
// sgstReadOnlyController.text = total.toStringAsFixed(2);
// return total;
// }
//
// dynamic get igstAmount {
// double total = 0;
//
// final taxableValue =
// double.tryParse(TaxableValueController.text) ?? 0.0;
// final igst = double.tryParse(IGSTController.text) ?? 0.0;
// total += (taxableValue * igst).round() / 100;
//
// igstReadOnlyController.text = total.toStringAsFixed(2);
// return total;
// }
//
// dynamic get totalAmount {
// double total = basicAmount + cgstAmount + sgstAmount + igstAmount;
// totalReadOnlyAmountController.text = total.round().toStringAsFixed(2);
// return total!;
// }
void
addProduct
(
Map
<
String
,
dynamic
>
product
)
{
productRows
.
add
(
product
);
updateSummaryCalculations
();
notifyListeners
();
}
void
updateProduct
(
int
index
,
Map
<
String
,
dynamic
>
updatedProduct
)
{
productRows
[
index
]
=
updatedProduct
;
updateSummaryCalculations
();
notifyListeners
();
}
...
...
@@ -649,6 +646,61 @@ String? productsEmptyError ;
notifyListeners
();
}
void
updateSummaryCalculations
()
{
double
basicAmount
=
0.0
;
double
cgstAmount
=
0.0
;
double
sgstAmount
=
0.0
;
double
igstAmount
=
0.0
;
for
(
var
product
in
productRows
)
{
final
price
=
double
.
tryParse
(
product
[
'price'
]?.
toString
()
??
'0'
)
??
0.0
;
final
qty
=
double
.
tryParse
(
product
[
'qty'
]?.
toString
()
??
'0'
)
??
0.0
;
final
cgst
=
double
.
tryParse
(
product
[
'cgst_p'
]?.
toString
()
??
'0'
)
??
0.0
;
final
sgst
=
double
.
tryParse
(
product
[
'sgst_p'
]?.
toString
()
??
'0'
)
??
0.0
;
final
igst
=
double
.
tryParse
(
product
[
'igst_p'
]?.
toString
()
??
'0'
)
??
0.0
;
final
taxableValue
=
price
*
qty
;
basicAmount
+=
taxableValue
;
cgstAmount
+=
(
taxableValue
*
cgst
)
/
100
;
sgstAmount
+=
(
taxableValue
*
sgst
)
/
100
;
igstAmount
+=
(
taxableValue
*
igst
)
/
100
;
}
final
totalAmount
=
basicAmount
+
cgstAmount
+
sgstAmount
+
igstAmount
;
basicAmountReadOnlyController
.
text
=
basicAmount
.
toStringAsFixed
(
2
);
cgstReadOnlyController
.
text
=
cgstAmount
.
toStringAsFixed
(
2
);
sgstReadOnlyController
.
text
=
sgstAmount
.
toStringAsFixed
(
2
);
igstReadOnlyController
.
text
=
igstAmount
.
toStringAsFixed
(
2
);
totalReadOnlyAmountController
.
text
=
totalAmount
.
toStringAsFixed
(
2
);
notifyListeners
();
}
String
getJsonEncodedProducts
()
{
return
jsonEncode
(
productRows
);
}
dynamic
get
basicAmount
{
return
double
.
tryParse
(
basicAmountReadOnlyController
.
text
)
??
0.0
;
}
dynamic
get
cgstAmount
{
return
double
.
tryParse
(
cgstReadOnlyController
.
text
)
??
0.0
;
}
dynamic
get
sgstAmount
{
return
double
.
tryParse
(
sgstReadOnlyController
.
text
)
??
0.0
;
}
dynamic
get
igstAmount
{
return
double
.
tryParse
(
igstReadOnlyController
.
text
)
??
0.0
;
}
dynamic
get
totalAmount
{
return
double
.
tryParse
(
totalReadOnlyAmountController
.
text
)
??
0.0
;
}
void
updateSelectedSingleProduct
(
SaleProducts
?
product
)
{
_selectedSaleProducts
=
product
;
_selectedSingleSaleProductID
=
product
!.
id
;
...
...
@@ -675,99 +727,99 @@ String? productsEmptyError ;
notifyListeners
();
}
String
getJsonEncodedProducts
()
{
return
jsonEncode
(
productRows
);
}
void
addNewRow
()
{
ProductControllers
.
add
(
TextEditingController
());
PriceControllers
.
add
(
TextEditingController
());
QuantityControllers
.
add
(
TextEditingController
(
text:
'1'
));
CGSTControllers
.
add
(
TextEditingController
(
text:
'9'
));
SGSTControllers
.
add
(
TextEditingController
(
text:
'9'
));
IGSTControllers
.
add
(
TextEditingController
(
text:
'0'
));
TaxableValueControllers
.
add
(
TextEditingController
());
TotalPriceControllers
.
add
(
TextEditingController
());
selectedSaleProductID
.
add
(
null
);
notifyListeners
();
}
void
removeRow
(
int
index
)
{
if
(
index
>=
0
&&
index
<
ProductControllers
.
length
)
{
ProductControllers
[
index
].
dispose
();
PriceControllers
[
index
].
dispose
();
QuantityControllers
[
index
].
dispose
();
CGSTControllers
[
index
].
dispose
();
SGSTControllers
[
index
].
dispose
();
IGSTControllers
[
index
].
dispose
();
TaxableValueControllers
[
index
].
dispose
();
TotalPriceControllers
[
index
].
dispose
();
ProductControllers
.
removeAt
(
index
);
PriceControllers
.
removeAt
(
index
);
QuantityControllers
.
removeAt
(
index
);
CGSTControllers
.
removeAt
(
index
);
SGSTControllers
.
removeAt
(
index
);
IGSTControllers
.
removeAt
(
index
);
TaxableValueControllers
.
removeAt
(
index
);
TotalPriceControllers
.
removeAt
(
index
);
selectedSaleProductID
.
removeAt
(
index
);
notifyListeners
();
}
}
void
updateSelectedProduct
(
int
index
,
SaleProducts
?
product
)
{
if
(
index
>=
0
&&
index
<
_saleProducts
.
length
)
{
_selectedSaleProducts
=
product
;
_selectedSaleProductID
[
index
]
=
product
!.
id
;
PriceControllers
[
index
].
text
=
product
!.
price
!;
updateRowCalculations
(
index
);
notifyListeners
();
}
}
void
updateRowCalculations
(
int
index
)
{
if
(
index
>=
0
&&
index
<
PriceControllers
.
length
)
{
final
inclusivePrice
=
double
.
tryParse
(
PriceControllers
[
index
].
text
)
??
0.0
;
final
quantity
=
double
.
tryParse
(
QuantityControllers
[
index
].
text
)
??
1.0
;
final
cgst
=
double
.
tryParse
(
CGSTControllers
[
index
].
text
)
??
0.0
;
final
sgst
=
double
.
tryParse
(
SGSTControllers
[
index
].
text
)
??
0.0
;
final
igst
=
double
.
tryParse
(
IGSTControllers
[
index
].
text
)
??
0.0
;
final
totalTaxRate
=
(
cgst
+
sgst
+
igst
)
/
100
;
// Calculate taxable value per unit
final
taxableValuePerUnit
=
inclusivePrice
/
(
1
+
totalTaxRate
);
// Total taxable value = taxable value per unit * quantity
final
totalTaxableValue
=
taxableValuePerUnit
*
quantity
;
TaxableValueControllers
[
index
].
text
=
totalTaxableValue
.
toStringAsFixed
(
0
,
);
notifyListeners
();
}
}
Map
<
String
,
dynamic
>
getFormData
()
{
final
List
<
Map
<
String
,
dynamic
>>
orders
=
[];
for
(
int
i
=
0
;
i
<
ProductControllers
.
length
;
i
++)
{
orders
.
add
({
'product_id'
:
selectedSaleProductID
[
i
],
'qty'
:
QuantityControllers
[
i
].
text
,
'price'
:
PriceControllers
[
i
].
text
,
'cgst_p'
:
CGSTControllers
[
i
].
text
,
'sgst_p'
:
SGSTControllers
[
i
].
text
,
'igst_p'
:
IGSTControllers
[
i
].
text
,
'total_price'
:
TaxableValueControllers
[
i
].
text
,
});
}
return
{
'orders'
:
orders
,
'basic_amount'
:
basicAmount
.
toStringAsFixed
(
2
),
'cgst_amount'
:
cgstAmount
.
toStringAsFixed
(
2
),
'sgst_amount'
:
sgstAmount
.
toStringAsFixed
(
2
),
'igst_amount'
:
igstAmount
.
toStringAsFixed
(
2
),
'total_amount'
:
totalAmount
.
toStringAsFixed
(
2
),
'note'
:
noteController
.
text
,
};
}
// void addNewRow() {
// ProductControllers.add(TextEditingController());
// PriceControllers.add(TextEditingController());
// QuantityControllers.add(TextEditingController(text: '1'));
// CGSTControllers.add(TextEditingController(text: '9'));
// SGSTControllers.add(TextEditingController(text: '9'));
// IGSTControllers.add(TextEditingController(text: '0'));
// TaxableValueControllers.add(TextEditingController());
// TotalPriceControllers.add(TextEditingController());
//
// selectedSaleProductID.add(null);
// notifyListeners();
// }
//
// void removeRow(int index) {
// if (index >= 0 && index < ProductControllers.length) {
// ProductControllers[index].dispose();
// PriceControllers[index].dispose();
// QuantityControllers[index].dispose();
// CGSTControllers[index].dispose();
// SGSTControllers[index].dispose();
// IGSTControllers[index].dispose();
// TaxableValueControllers[index].dispose();
// TotalPriceControllers[index].dispose();
// ProductControllers.removeAt(index);
// PriceControllers.removeAt(index);
// QuantityControllers.removeAt(index);
// CGSTControllers.removeAt(index);
// SGSTControllers.removeAt(index);
// IGSTControllers.removeAt(index);
// TaxableValueControllers.removeAt(index);
// TotalPriceControllers.removeAt(index);
// selectedSaleProductID.removeAt(index);
// notifyListeners();
// }
// }
//
// void updateSelectedProduct(int index, SaleProducts? product) {
// if (index >= 0 && index < _saleProducts.length) {
// _selectedSaleProducts = product;
// _selectedSaleProductID[index] = product!.id;
// PriceControllers[index].text = product!.price!;
// updateRowCalculations(index);
// notifyListeners();
// }
// }
//
// void updateRowCalculations(int index) {
// if (index >= 0 && index < PriceControllers.length) {
// final inclusivePrice =
// double.tryParse(PriceControllers[index].text) ?? 0.0;
// final quantity = double.tryParse(QuantityControllers[index].text) ?? 1.0;
// final cgst = double.tryParse(CGSTControllers[index].text) ?? 0.0;
// final sgst = double.tryParse(SGSTControllers[index].text) ?? 0.0;
// final igst = double.tryParse(IGSTControllers[index].text) ?? 0.0;
// final totalTaxRate = (cgst + sgst + igst) / 100;
// // Calculate taxable value per unit
// final taxableValuePerUnit = inclusivePrice / (1 + totalTaxRate);
// // Total taxable value = taxable value per unit * quantity
// final totalTaxableValue = taxableValuePerUnit * quantity;
// TaxableValueControllers[index].text = totalTaxableValue.toStringAsFixed(
// 0,
// );
// notifyListeners();
// }
// }
//
// Map<String, dynamic> getFormData() {
// final List<Map<String, dynamic>> orders = [];
// for (int i = 0; i < ProductControllers.length; i++) {
// orders.add({
// 'product_id': selectedSaleProductID[i],
// 'qty': QuantityControllers[i].text,
// 'price': PriceControllers[i].text,
// 'cgst_p': CGSTControllers[i].text,
// 'sgst_p': SGSTControllers[i].text,
// 'igst_p': IGSTControllers[i].text,
// 'total_price': TaxableValueControllers[i].text,
// });
// }
// return {
// 'orders': orders,
// 'basic_amount': basicAmount.toStringAsFixed(2),
// 'cgst_amount': cgstAmount.toStringAsFixed(2),
// 'sgst_amount': sgstAmount.toStringAsFixed(2),
// 'igst_amount': igstAmount.toStringAsFixed(2),
// 'total_amount': totalAmount.toStringAsFixed(2),
// 'note': noteController.text,
// };
// }
Future
<
void
>
ordersAddOrderAPIViewFunction
(
context
,
mode
)
async
{
try
{
...
...
@@ -878,14 +930,21 @@ String? productsEmptyError ;
_accountDetails
=
data
.
accountDetails
!;
data
.
accountDetails
!.
accManagerId
!;
billingNameController
.
text
=
data
.
accountDetails
!.
name
!;
_selectedBillingStateID
=
data
.
accountDetails
!.
state
!;
print
(
"data.accountDetails!.state
${data.accountDetails!.state}
"
);
if
(
_selectedBillingStateID
!=
null
){
getDistrictAPI
(
context
,
_selectedBillingStateID
);
}
_selectedBillingDistrictID
=
data
.
accountDetails
!.
district
!;
if
(
_selectedBillingDistrictID
!=
null
){
getSubLocationAPI
(
context
,
_selectedBillingDistrictID
);
}
_selectedBillingStates
=
billingStates
!.
firstWhere
((
e
)
=>
e
.
id
==
data
.
accountDetails
!.
state
!);
_selectedBillingStateID
=
data
.
accountDetails
!.
state
!;
_selectedBillingStateName
=
billingStates
!.
firstWhere
((
e
)
=>
e
.
id
==
data
.
accountDetails
!.
state
!).
name
;
_selectedBillingDistrictID
=
data
.
accountDetails
!.
district
!;
_selectedBillingSubLocID
=
data
.
accountDetails
!.
subLocality
!;
billingPincodeController
.
text
=
data
.
accountDetails
!.
pincode
!;
...
...
@@ -918,6 +977,9 @@ String? productsEmptyError ;
if
(
data
!=
null
)
{
if
(
data
.
error
==
"0"
)
{
_billingDistricts
=
data
.
districts
!;
_selectedBillingDistricts
=
data
.
districts
!.
firstWhere
((
e
)
=>
e
.
id
==
accountDetails
!.
district
!);
_selectedBillingDistrictValue
=
data
.
districts
!.
firstWhere
((
e
)
=>
e
.
id
==
accountDetails
!.
district
!).
district
;
notifyListeners
();
}
...
...
@@ -958,6 +1020,9 @@ String? productsEmptyError ;
if
(
data
!=
null
)
{
if
(
data
.
error
==
"0"
)
{
_billingSubLocations
=
data
.
subLocations
!;
_selectedBillingSubLocations
=
data
.
subLocations
!.
firstWhere
((
e
)
=>
e
.
id
==
accountDetails
!.
subLocality
!);
_selectedBillingSubLocValue
=
data
.
subLocations
!.
firstWhere
((
e
)
=>
e
.
id
==
accountDetails
!.
subLocality
!).
subLocality
;
notifyListeners
();
}
...
...
@@ -1003,6 +1068,31 @@ String? productsEmptyError ;
}
catch
(
e
,
s
)
{}
}
Future
<
List
<
TpcList
>>
fetchTPCAccountsfromAPI
(
context
,
mode
,
text
)
async
{
try
{
final
provider
=
Provider
.
of
<
HomescreenNotifier
>(
context
,
listen:
false
);
final
data
=
await
ApiCalling
.
addOrderTPCAgentListAPI
(
provider
.
empId
,
provider
.
session
,
mode
,
text
,
);
if
(
data
!=
null
)
{
if
(
data
.
error
==
"0"
)
{
_tpcAgent
=
data
.
tpcList
!;
notifyListeners
();
return
_tpcAgent
;
}
else
{
return
[];
}
}
else
{
return
[];
}
}
catch
(
e
,
s
)
{
return
[];
}
}
Future
<
void
>
ordersAddOrderAPISubmitFunction
(
context
,
mode
,
...
...
@@ -1178,7 +1268,7 @@ String? productsEmptyError ;
)
async
{
print
(
search
);
try
{
if
(
search
.
isEmpty
)
{
if
(
search
==
null
)
{
_accountList
=
[];
_isLoading
=
false
;
notifyListeners
();
...
...
@@ -1222,6 +1312,65 @@ String? productsEmptyError ;
}
}
Future
<
List
<
AccountList
>>
fetchAccountsFromApi
(
context
,
mode
,
accountId
,
search
,
)
async
{
print
(
search
);
try
{
if
(
search
==
null
)
{
_accountList
=
[];
_isLoading
=
false
;
notifyListeners
();
return
_accountList
;
}
_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
();
return
_accountList
;
}
else
{
selectAccountError
=
data
?.
message
??
"Failed to load accounts"
;
_isLoading
=
false
;
notifyListeners
();
return
[];
}
}
else
{
selectAccountError
=
"No data received from server"
;
_isLoading
=
false
;
notifyListeners
();
return
[];
}
}
catch
(
e
,
s
)
{
selectAccountError
=
"An error occurred while fetching accounts"
;
_isLoading
=
false
;
notifyListeners
();
return
[];
}
}
imgFromCamera
(
context
)
async
{
// Capture a photo
try
{
...
...
lib/Notifiers/ordersProvider/editOrderProvider.dart
View file @
12aa06e4
...
...
@@ -202,6 +202,24 @@ class Editorderprovider extends ChangeNotifier {
_erectionScope
=
[
"Included"
,
"Excluded"
];
_unloadingScope
=
[
"Included"
,
"Excluded"
];
_freightScope
=
[
"Included"
,
"Excluded"
];
if
(
data
.
orderDetails
!.
dispatchStateId
!=
null
){
getDispatchDistrictAPI
(
context
,
data
.
orderDetails
!.
dispatchStateId
!);
}
if
(
data
.
orderDetails
!.
dispatchDistrictId
!=
null
){
getDispatchSubLocationAPI
(
context
,
data
.
orderDetails
!.
dispatchDistrictId
!);
}
_selectedDispatchStates
=
data
.
states
!.
firstWhere
((
e
)
=>
e
.
id
==
data
.
orderDetails
!.
dispatchStateId
!);
_selectedDispatchStateID
=
data
.
orderDetails
!.
dispatchStateId
!;
_selectedDispatchStateName
=
data
.
states
!.
firstWhere
((
e
)
=>
e
.
id
==
data
.
orderDetails
!.
dispatchStateId
!).
name
;
_selectedDispatchDistrictID
=
data
.
orderDetails
!.
dispatchDistrictId
!;
_selectedDispatchSubLocID
=
data
.
orderDetails
!.
dispatchSubLocationId
!;
dispatchAddressController
.
text
=
data
.
orderDetails
!.
dispatchAddress
!;
dispatchPincodeController
.
text
=
data
.
orderDetails
!.
dispatchPincode
!;
noteController
.
text
=
data
.
orderDetails
!.
note
!;
_selectedUnloadingScope
=
data
.
orderDetails
!.
unloadingScope
!;
_selectedErectionScope
=
data
.
orderDetails
!.
erectionScope
!;
_selectedFreightScope
=
data
.
orderDetails
!.
freightScope
!;
notifyListeners
();
}
else
{}
...
...
@@ -222,7 +240,8 @@ class Editorderprovider extends ChangeNotifier {
if
(
data
!=
null
)
{
if
(
data
.
error
==
"0"
)
{
_dispatchDistricts
=
data
.
districts
!;
_selectedDispatchDistricts
=
data
.
districts
!.
firstWhere
((
e
)
=>
e
.
id
==
orderDetails
!.
dispatchDistrictId
!);
_selectedDispatchDistrictValue
=
data
.
districts
!.
firstWhere
((
e
)
=>
e
.
id
==
orderDetails
!.
dispatchDistrictId
!).
district
;
notifyListeners
();
}
}
...
...
@@ -242,6 +261,8 @@ class Editorderprovider extends ChangeNotifier {
if
(
data
!=
null
)
{
if
(
data
.
error
==
"0"
)
{
_dispatchSubLocations
=
data
.
subLocations
!;
_selectedDispatchSubLocations
=
data
.
subLocations
!.
firstWhere
((
e
)
=>
e
.
id
==
orderDetails
!.
dispatchSubLocationId
!);
_selectedDispatchSubLocValue
=
data
.
subLocations
!.
firstWhere
((
e
)
=>
e
.
id
==
orderDetails
!.
dispatchSubLocationId
!).
subLocality
;
notifyListeners
();
}
...
...
lib/Notifiers/ordersProvider/pagesDashboardProvider.dart
View file @
12aa06e4
...
...
@@ -362,10 +362,73 @@ class Pagesdashboardprovider extends ChangeNotifier {
orderId
,
);
if
(
data
!=
null
)
{
_isLoading
=
true
;
//
_isLoading = true;
notifyListeners
();
if
(
data
.
error
==
"0"
)
{
_orderDetails
=
data
.
orderDetails
!;
_orderDetails
=
data
.
orderDetails
??
OrderDetails
(
id:
""
,
orderNumber:
""
,
orderNumberHash:
""
,
balanceAmount:
""
,
accId:
""
,
refType:
""
,
refId:
""
,
salesPersonEmpId:
""
,
enteredEmpId:
""
,
dispatchStateId:
""
,
dispatchDistrictId:
""
,
dispatchSubLocationId:
""
,
dispatchPincode:
""
,
dispatchAddress:
""
,
basicAmount:
""
,
cgstAmount:
""
,
sgstAmount:
""
,
igstAmount:
""
,
paidAmount:
""
,
totalAmount:
""
,
status:
""
,
orderReceivedDate:
""
,
scheduledDispatchDate:
""
,
otp:
""
,
note:
""
,
poViewFileName:
""
,
poDirFilePath:
""
,
unloadingScope:
""
,
freightScope:
""
,
erectionScope:
""
,
saleOrderNumber:
""
,
invoiceNumber:
""
,
vehicleNumber:
""
,
driverName:
""
,
driverMobileNumber:
""
,
tpcApplicable:
""
,
requestedTpcAmount:
""
,
level1TpcApprovedAmount:
""
,
level2TpcApprovedAmount:
""
,
tpcPaymentMode:
""
,
tpcPaymentReferenceNo:
""
,
tpcPaymentAttachmentDirFilePath:
""
,
tpcPaymentAttachementViewFileName:
""
,
tpcStatus:
""
,
tpcAgentId:
""
,
isExist:
""
,
createdDatetime:
""
,
updatedDatetime:
""
,
accountName:
""
,
gstNumber:
""
,
billingAddress:
""
,
billingDistrict:
""
,
billingState:
""
,
billingSubLocality:
""
,
billingPincode:
""
,
stateName:
""
,
districtName:
""
,
subLocationName:
""
,
adjustedAmount:
""
,
enteredEmpName:
""
,
salesPersonEmpName:
""
,
tpcaAgentName:
""
);
_productsHistory
=
data
.
products
!;
_feedbackHistory
=
data
.
feedbackHistory
!;
_paymentHistory
=
data
.
paymentHistory
!;
...
...
lib/Notifiers/ordersProvider/tpcAgentsProvider.dart
View file @
12aa06e4
...
...
@@ -4,6 +4,7 @@ import 'package:camera/camera.dart';
import
'package:flutter/cupertino.dart'
;
import
'package:flutter/foundation.dart'
;
import
'package:generp/Models/ordersModels/TPCListResponse.dart'
;
import
'package:get/get.dart'
;
import
'package:image_picker/image_picker.dart'
;
import
'package:provider/provider.dart'
;
...
...
@@ -303,6 +304,10 @@ class Tpcagentsprovider extends ChangeNotifier{
tpcMobileNumberError
=
"PLease Enter Your Mobile Number"
;
isValid
=
false
;
}
if
(
tpcMobileNumberController
.
text
.
trim
().
isNotEmpty
&&
tpcMobileNumberController
.
text
.
length
<
10
){
tpcMobileNumberError
=
"Please Enter a Valid Mobile Number"
;
isValid
=
false
;
}
if
(
_image_picked
==
0
){
imageError
=
"Please select ID Proof"
;
...
...
lib/screens/crm/addLeadsProspectsScreen.dart
View file @
12aa06e4
...
...
@@ -899,9 +899,11 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> {
),
],
if
(
provider
.
productsEmptyError
!.
trim
().
isNotEmpty
)...[
if
(
provider
.
productRows
.
isEmpty
)...[
if
(
provider
.
productsEmptyError
!=
null
)...[
errorWidget
(
context
,
provider
.
productsEmptyError
)
]
]
],
),
),
...
...
lib/screens/order/addOrder.dart
View file @
12aa06e4
import
'dart:async'
;
import
'dart:io'
;
import
'package:dotted_line/dotted_line.dart'
;
...
...
@@ -12,11 +13,14 @@ import 'package:generp/screens/notifierExports.dart';
import
'package:generp/screens/order/addOrderAddProduct.dart'
;
import
'package:provider/provider.dart'
;
import
'../../Models/ordersModels/AddOrderPaymentSelectAccountResponse.dart'
;
import
'../../Models/ordersModels/AddOrderViewResponse.dart'
;
import
'../../Models/ordersModels/addOrderTpcAgentListResponse.dart'
;
import
'../../Utils/app_colors.dart'
;
import
'../../Utils/commonWidgets.dart'
;
import
'package:connectivity_plus/connectivity_plus.dart'
;
import
'package:generp/Utils/commonServices.dart'
;
import
'package:dropdown_search/dropdown_search.dart'
;
class
AddorderScreen
extends
StatefulWidget
{
final
pageTitleName
;
...
...
@@ -37,6 +41,7 @@ class _AddorderScreenState extends State<AddorderScreen> {
final
_formKey
=
GlobalKey
<
FormState
>();
Map
_source
=
{
ConnectivityResult
.
mobile
:
true
};
final
MyConnectivity
_connectivity
=
MyConnectivity
.
instance
;
final
GlobalKey
<
DropdownButton2State
<
AccountList
>>
_dropdownKey
=
GlobalKey
();
@override
void
initState
()
{
...
...
@@ -51,9 +56,16 @@ class _AddorderScreenState extends State<AddorderScreen> {
if
(
provider
.
dateNow
==
null
)
{
provider
.
setDate
(
DateTime
.
now
());
}
provider
.
getLocationPermission
(
context
);
provider
.
getCurrentLocation
();
provider
.
ordersAddOrderAPIViewFunction
(
context
,
widget
.
mode
);
provider
.
ordersAddOrderSelectAccountAPIFunction
(
context
,
widget
.
mode
,
provider
.
selectedAccountID
,
''
,
);
});
}
...
...
@@ -207,179 +219,366 @@ class _AddorderScreenState extends State<AddorderScreen> {
crossAxisAlignment:
CrossAxisAlignment
.
start
,
children:
[
TextWidget
(
context
,
"Account"
),
InkResponse
(
onTap:
()
{
if
(
focusNode
.
hasFocus
)
{
focusNode
.
unfocus
();
}
else
{
FocusScope
.
of
(
context
,
).
requestFocus
(
focusNode
);
}
},
child:
Container
(
alignment:
Alignment
.
center
,
decoration:
BoxDecoration
(
color:
AppColors
.
text_field_color
,
borderRadius:
BorderRadius
.
circular
(
14
),
),
child:
ListTile
(
onTap:
()
{
if
(
focusNode
.
hasFocus
)
{
focusNode
.
unfocus
();
}
else
{
FocusScope
.
of
(
context
,
).
requestFocus
(
focusNode
);
}
},
title:
TextFormField
(
focusNode:
focusNode
,
onTapUpOutside:
(
event
)
{
focusNode
.
unfocus
();
},
DropdownSearch
<
AccountList
>(
compareFn:
(
item1
,
item2
)
=>
true
,
popupProps:
PopupProps
.
menu
(
showSearchBox:
true
,
searchFieldProps:
TextFieldProps
(
controller:
provider
.
dropDownSearchController
,
onChanged:
(
value
)
async
{
Future
.
delayed
(
Duration
(
milliseconds:
100
),
()
async
{
await
provider
.
ordersAddOrderSelectAccountAPIFunction
(
context
,
widget
.
mode
,
provider
.
selectedAccountID
,
value
,
);
},
);
},
decoration:
InputDecoration
(
enabledBorder:
InputBorder
.
none
,
focusedBorder:
InputBorder
.
none
,
isDense:
true
,
contentPadding:
const
EdgeInsets
.
symmetric
(
horizontal:
0
,
horizontal:
1
0
,
vertical:
8
,
),
hintText:
'Select Account Type'
,
hintStyle:
const
TextStyle
(
fontSize:
14
,
),
hintText:
'Search Account...'
,
border:
OutlineInputBorder
(
border
Radius
:
Border
Radius
.
circular
(
8
,
border
Side
:
Border
Side
(
color:
AppColors
.
semi_black
,
),
borderRadius:
BorderRadius
.
circular
(
8
),
),
suffixIcon:
provider
.
isLoading
?
const
CircularProgressIndicator
()
:
null
,
),
onChanged:
(
value
)
{
Timer
(
const
Duration
(
milliseconds:
500
),
()
{
print
(
'Search query:
$value
'
);
// Items are fetched via the items parameter
},
);
},
),
trailing:
InkResponse
(
onTap:
()
{
if
(
focusNode
.
hasFocus
)
{
focusNode
.
unfocus
();
}
else
{
FocusScope
.
of
(
context
,
).
requestFocus
(
focusNode
);
}
},
child:
SvgPicture
.
asset
(
"assets/svg/arrow_dropdown.svg"
,
height:
25
,
width:
20
,
fit:
FlexFit
.
loose
,
menuProps:
MenuProps
(
borderRadius:
BorderRadius
.
circular
(
8
),
elevation:
8
,
),
itemBuilder:
(
context
,
item
,
isDisabled
,
isSelected
)
=>
Padding
(
padding:
EdgeInsets
.
symmetric
(
horizontal:
12
,
vertical:
10
,
),
child:
SizedBox
(
height:
20
,
child:
Text
(
item
.
text
!,
style:
const
TextStyle
(
fontSize:
14
,
),
),
),
if
(
provider
.
accountList
.
isNotEmpty
&&
focusNode
.
hasFocus
)
...[
Card
(
margin:
EdgeInsets
.
symmetric
(
horizontal:
0
),
child:
Container
(
padding:
EdgeInsets
.
symmetric
(
horizontal:
10
,
),
height:
provider
.
accountList
.
isNotEmpty
?
150
:
50
,
decoration:
BoxDecoration
(
borderRadius:
BorderRadius
.
circular
(
16
),
),
child:
Scrollbar
(
thickness:
2.5
,
radius:
Radius
.
circular
(
6
),
thumbVisibility:
true
,
child:
ListView
.
builder
(
itemCount:
provider
.
accountList
.
length
,
shrinkWrap:
true
,
physics:
AlwaysScrollableScrollPhysics
(),
itemBuilder:
(
context
,
index
)
{
return
InkResponse
(
onTap:
()
async
{
if
(
provider
.
accountList
.
isNotEmpty
)
{
provider
.
selectedAccountList
=
provider
.
accountList
[
index
];
print
(
"Selected Complaint Type:
${provider.accountList[index].text}
, ID:
${provider.accountList[index].id}
"
,
);
provider
.
selectedAccountID
=
provider
.
accountList
[
index
]
.
id
!;
provider
.
selectedAccountName
=
provider
.
accountList
[
index
]
.
text
!;
print
(
"hfjkshfg"
+
provider
.
selectedAccountID
.
toString
(),
items:
(
filter
,
infiniteScrollProps
)
async
{
print
(
'Fetching items for filter:
$filter
'
);
return
provider
.
fetchAccountsFromApi
(
context
,
widget
.
mode
,
provider
.
selectedAccountID
,
filter
,
);
provider
.
dropDownSearchController
.
text
=
provider
.
accountList
[
index
]
.
text
!;
},
itemAsString:
(
AccountList
?
item
)
=>
item
?.
text
??
''
,
onChanged:
(
AccountList
?
value
)
{
if
(
value
!=
null
)
{
print
(
'Selected account:
${value.text}
'
);
provider
.
selectedAccountList
=
(
value
);
provider
.
selectedAccountID
=
value
!.
id
!;
provider
.
selectedAccountName
=
value
!.
text
!;
provider
.
ordersAddOrderAccountDetailsAPIFunction
(
context
,
provider
.
selectedAccountID
,
value
.
id
,
);
}
// provider.ordersAddPaymentSelectOrderAPIFunction(context, provider.selectedAccountID);
provider
.
accountList
=
[];
provider
.
selectAccountError
=
""
;
provider
.
notifyListeners
();
},
child:
SizedBox
(
height:
45
,
child:
Align
(
alignment:
Alignment
.
centerLeft
,
child:
Text
(
provider
.
accountList
[
index
]
.
text
!,
selectedItem:
provider
.
selectedAccountList
,
decoratorProps:
DropDownDecoratorProps
(
decoration:
InputDecoration
(
hintText:
'Select Account'
,
hintStyle:
TextStyle
(
fontSize:
14
,
color:
AppColors
.
grey_thick
,
),
// labelText: 'Select Account',
enabledBorder:
OutlineInputBorder
(
borderSide:
BorderSide
.
none
,
borderRadius:
BorderRadius
.
circular
(
14
),
),
focusedBorder:
OutlineInputBorder
(
borderSide:
BorderSide
(
color:
AppColors
.
cyan_blue
,
),
);
},
borderRadius:
BorderRadius
.
circular
(
14
),
),
disabledBorder:
OutlineInputBorder
(
borderSide:
BorderSide
.
none
,
borderRadius:
BorderRadius
.
circular
(
14
),
),
errorBorder:
OutlineInputBorder
(
borderSide:
BorderSide
.
none
,
borderRadius:
BorderRadius
.
circular
(
14
),
),
border:
OutlineInputBorder
(
borderSide:
BorderSide
.
none
,
borderRadius:
BorderRadius
.
circular
(
8
),
),
contentPadding:
ddtheme
.
buttonStyleData
.
padding
,
fillColor:
AppColors
.
text_field_color
,
filled:
true
,
),
),
onBeforePopupOpening:
(
selectedItem
)
async
{
provider
.
dropDownSearchController
.
clear
();
return
Future
.
value
();
},
// onBeforePopupOpening: () {
// print('Dropdown closed, clearing search');
// provider.dropDownSearchController.clear();
// },
),
],
// DropdownSearch<AccountList>(
// filterFn: (item, filter) {
// return provider.ordersAddOrderSelectAccountAPIFunction(
// widget.mode,
// provider.selectedAccountID,
// filter,
// );
// },
// popupProps: PopupProps.menu(
// showSearchBox: true,
// searchFieldProps: TextFieldProps(
// controller: provider.dropDownSearchController,
// decoration: InputDecoration(
// isDense: true,
// contentPadding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8),
// hintText: 'Search Account...',
// border: OutlineInputBorder(
// borderRadius: BorderRadius.circular(8),
// ),
// suffixIcon: provider.isLoading ? const CircularProgressIndicator() : null,
// ),
// ),
// emptyBuilder: (context, searchEntry) => const Padding(
// padding: EdgeInsets.all(8.0),
// child: Text('No accounts found, please search'),
// ),
// ),
//
// itemAsString: (AccountList? item) => item?.text ?? '',
// onChanged: (AccountList? value) {
// if (value != null) {
// print('Selected account: ${value.text}');
// provider.selectedAccountList = value;
// provider.selectedAccountID = value!.id!;
// provider.selectedAccountName
// provider.ordersAddOrderAccountDetailsAPIFunction(
// context,
// value.id,
// );
// }
// },
// selectedItem: provider.selectedAccountList,
//
// decoratorProps: DropDownDecoratorProps(
//
// decoration: InputDecoration(
// labelText: 'Select Account',
// border: OutlineInputBorder(
// borderRadius: BorderRadius.circular(8),
// ),
// ),
// ),
//
//
// ),
// InkResponse(
// onTap: () {
// if (focusNode.hasFocus) {
// focusNode.unfocus();
// } else {
// FocusScope.of(
// context,
// ).requestFocus(focusNode);
// }
// },
// child: Container(
// alignment: Alignment.center,
// decoration: BoxDecoration(
// color: AppColors.text_field_color,
// borderRadius: BorderRadius.circular(14),
// ),
// child: ListTile(
// onTap: () {
// if (focusNode.hasFocus) {
// focusNode.unfocus();
// } else {
// FocusScope.of(
// context,
// ).requestFocus(focusNode);
// }
// },
// title: TextFormField(
// focusNode: focusNode,
// onTapUpOutside: (event) {
// focusNode.unfocus();
// },
// controller:
// provider.dropDownSearchController,
// onChanged: (value) async {
// Future.delayed(
// Duration(milliseconds: 100),
// () async {
// await provider
// .ordersAddOrderSelectAccountAPIFunction(
// context,
// widget.mode,
// provider.selectedAccountID,
// value,
// );
// },
// );
// },
// decoration: InputDecoration(
// enabledBorder: InputBorder.none,
// focusedBorder: InputBorder.none,
// isDense: true,
// contentPadding:
// const EdgeInsets.symmetric(
// horizontal: 0,
// vertical: 8,
// ),
//
// hintText: 'Select Account Type',
// hintStyle: const TextStyle(
// fontSize: 14,
// ),
// border: OutlineInputBorder(
// borderRadius: BorderRadius.circular(
// 8,
// ),
// ),
// ),
// ),
//
// trailing: InkResponse(
// onTap: () {
// if (focusNode.hasFocus) {
// focusNode.unfocus();
// } else {
// FocusScope.of(
// context,
// ).requestFocus(focusNode);
// }
// },
// child: SvgPicture.asset(
// "assets/svg/arrow_dropdown.svg",
// height: 25,
// width: 20,
// ),
// ),
// ),
// ),
// ),
// if (provider.accountList.isNotEmpty &&
// focusNode.hasFocus) ...[
// Card(
// margin: EdgeInsets.symmetric(horizontal: 0),
// child: Container(
// padding: EdgeInsets.symmetric(
// horizontal: 10,
// ),
// height:
// provider.accountList.isNotEmpty
// ? 150
// : 50,
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(16),
// ),
// child: Scrollbar(
// thickness: 2.5,
// radius: Radius.circular(6),
// thumbVisibility: true,
// child: ListView.builder(
// itemCount: provider.accountList.length,
// shrinkWrap: true,
// physics:
// AlwaysScrollableScrollPhysics(),
// itemBuilder: (context, index) {
// return InkResponse(
// onTap: () async {
// if (provider
// .accountList
// .isNotEmpty) {
// provider.selectedAccountList =
// provider.accountList[index];
//
// print(
// "Selected Complaint Type: ${provider.accountList[index].text}, ID: ${provider.accountList[index].id}",
// );
// provider.selectedAccountID =
// provider
// .accountList[index]
// .id!;
// provider.selectedAccountName =
// provider
// .accountList[index]
// .text!;
// print(
// "hfjkshfg" +
// provider.selectedAccountID
// .toString(),
// );
// provider
// .dropDownSearchController
// .text = provider
// .accountList[index]
// .text!;
// provider
// .ordersAddOrderAccountDetailsAPIFunction(
// context,
// provider
// .selectedAccountID,
// );
// }
// // provider.ordersAddPaymentSelectOrderAPIFunction(context, provider.selectedAccountID);
// provider.accountList = [];
// provider.selectAccountError = "";
// provider.notifyListeners();
// },
// child: SizedBox(
// height: 45,
// child: Align(
// alignment: Alignment.centerLeft,
// child: Text(
// provider
// .accountList[index]
// .text!,
// ),
// ),
// ),
// );
// },
// ),
// ),
// ),
// ),
// ],
if
(
provider
.
selectAccountError
!=
null
)
...[
errorWidget
(
context
,
...
...
@@ -686,16 +885,31 @@ class _AddorderScreenState extends State<AddorderScreen> {
provider
.
billingDistricts
.
isNotEmpty
?
provider
.
selectedBillingDistricts
!=
null
?
provider
.
billingDistricts
.
firstWhere
(
?
provider
.
billingDistricts
.
firstWhere
(
(
ord
)
=>
ord
.
id
==
provider
.
selectedBillingDistrictId
,
orElse:
()
=
>
orElse:
()
{
provider
.
selectedBillingDistricts
=
provider
.
billingDistricts
[
0
],
.
billingDistricts
[
0
];
provider
.
selectedBillingDistrictId
=
provider
.
billingDistricts
[
0
]
.
id
;
provider
.
selectedBillingDistrictValue
=
provider
.
billingDistricts
[
0
]
.
district
;
provider
.
getSubLocationAPI
(
context
,
provider
.
selectedBillingDistrictId
,
);
return
provider
.
billingDistricts
[
0
];
},
)
:
null
:
null
,
...
...
@@ -824,17 +1038,27 @@ class _AddorderScreenState extends State<AddorderScreen> {
.
isNotEmpty
?
provider
.
selectedBillingSubLocations
!=
null
?
provider
.
billingSubLocations
.
firstWhere
(
?
provider
.
billingSubLocations
.
firstWhere
(
(
ord
)
=>
ord
.
id
==
provider
.
selectedBillingSubLocID
,
orElse:
()
=
>
orElse:
()
{
provider
.
selectedBillingSubLocations
=
provider
.
billingSubLocations
[
0
],
.
billingSubLocations
[
0
];
provider
.
selectedBillingSubLocID
=
provider
.
billingSubLocations
[
0
]
.
id
;
provider
.
selectedBillingSubLocValue
=
provider
.
billingSubLocations
[
0
]
.
subLocality
;
return
provider
.
billingSubLocations
[
0
];
},
)
:
null
:
null
,
...
...
@@ -1013,6 +1237,7 @@ class _AddorderScreenState extends State<AddorderScreen> {
ord
.
id
==
provider
.
selectedDispatchStateID
,
orElse:
()
=>
provider
...
...
@@ -1159,10 +1384,31 @@ class _AddorderScreenState extends State<AddorderScreen> {
ord
.
id
==
provider
.
selectedDispatchDistrictId
,
orElse:
()
=>
orElse:
()
{
provider
.
selectedDispatchDistricts
=
provider
.
dispatchDistricts
[
0
],
.
dispatchDistricts
[
0
];
provider
.
selectedDispatchDistrictId
=
provider
.
dispatchDistricts
[
0
]
.
id
;
provider
.
selectedDispatchDistrictValue
=
provider
.
dispatchDistricts
[
0
]
.
district
;
provider
.
getDispatchSubLocationAPI
(
context
,
provider
.
selectedBillingDistrictId
,
);
return
provider
.
dispatchDistricts
[
0
];
},
// orElse:
// () =>
// provider
// .dispatchDistricts[0],
)
:
null
:
null
,
...
...
@@ -1297,10 +1543,28 @@ class _AddorderScreenState extends State<AddorderScreen> {
ord
.
id
==
provider
.
selectedDispatchSubLocID
,
orElse:
()
=>
orElse:
()
{
provider
.
selectedDispatchSubLocations
=
provider
.
dispatchSubLocations
[
0
],
.
dispatchSubLocations
[
0
];
provider
.
selectedDispatchSubLocID
=
provider
.
dispatchSubLocations
[
0
]
.
id
;
provider
.
selectedDispatchSubLocValue
=
provider
.
dispatchSubLocations
[
0
]
.
subLocality
;
return
provider
.
dispatchSubLocations
[
0
];
},
// orElse:
// () =>
// provider
// .dispatchSubLocations[0],
)
:
null
:
null
,
...
...
@@ -1782,149 +2046,280 @@ class _AddorderScreenState extends State<AddorderScreen> {
],
if
(
provider
.
selectedTpcStatus
==
"Yes"
)
...[
TextWidget
(
context
,
"TPC Agent"
),
//dd
Container
(
alignment:
Alignment
.
center
,
decoration:
BoxDecoration
(
color:
AppColors
.
text_field_color
,
borderRadius:
BorderRadius
.
circular
(
14
),
),
child:
ListTile
(
title:
TextFormField
(
focusNode:
focusNodetpc
,
onTapUpOutside:
(
event
)
{
focusNodetpc
.
unfocus
();
},
DropdownSearch
<
TpcList
>(
compareFn:
(
item1
,
item2
)
=>
true
,
popupProps:
PopupProps
.
menu
(
showSearchBox:
true
,
searchFieldProps:
TextFieldProps
(
controller:
provider
.
dropDownTpcSearchController
,
onChanged:
(
value
)
async
{
Future
.
delayed
(
Duration
(
milliseconds:
100
),
()
async
{
await
provider
.
ordersAddOrderTPCAgentFunction
(
context
,
widget
.
mode
,
value
,
);
},
);
},
decoration:
InputDecoration
(
enabledBorder:
InputBorder
.
none
,
focusedBorder:
InputBorder
.
none
,
isDense:
true
,
contentPadding:
const
EdgeInsets
.
symmetric
(
horizontal:
0
,
horizontal:
1
0
,
vertical:
8
,
),
hintText:
'Select TPC Agent'
,
hintStyle:
const
TextStyle
(
fontSize:
14
,
),
hintText:
'Search ...'
,
border:
OutlineInputBorder
(
borderSide:
BorderSide
(
color:
AppColors
.
semi_black
,
),
borderRadius:
BorderRadius
.
circular
(
8
,
),
),
suffixIcon:
provider
.
isLoading
?
const
CircularProgressIndicator
()
:
null
,
),
onChanged:
(
value
)
{
Timer
(
const
Duration
(
milliseconds:
500
),
()
{
print
(
'Search query:
$value
'
);
// Items are fetched via the items parameter
},
);
},
),
trailing:
InkResponse
(
onTap:
()
{
if
(
focusNodetpc
.
hasFocus
)
{
focusNodetpc
.
unfocus
();
}
else
{
FocusScope
.
of
(
fit:
FlexFit
.
loose
,
menuProps:
MenuProps
(
borderRadius:
BorderRadius
.
circular
(
8
),
elevation:
8
,
),
itemBuilder:
(
context
,
).
requestFocus
(
focusNodetpc
);
}
}
,
child:
SvgPicture
.
asset
(
"assets/svg/arrow_dropdown.svg"
,
height:
25
,
width
:
2
0
,
item
,
isDisabled
,
isSelected
,
)
=>
Padding
(
padding:
EdgeInsets
.
symmetric
(
horizontal:
12
,
vertical
:
1
0
,
),
child:
SizedBox
(
height:
20
,
child:
Text
(
item
.
text
!,
style:
const
TextStyle
(
fontSize:
14
,
),
),
),
if
(
provider
.
tpcAgent
.
isNotEmpty
&&
focusNodetpc
.
hasFocus
)
...[
Card
(
margin:
EdgeInsets
.
symmetric
(
horizontal:
0
),
child:
Container
(
padding:
EdgeInsets
.
symmetric
(
horizontal:
10
,
),
height:
150
,
decoration:
BoxDecoration
(
borderRadius:
BorderRadius
.
circular
(
16
),
),
child:
Scrollbar
(
thickness:
2.5
,
radius:
Radius
.
circular
(
6
),
thumbVisibility:
true
,
child:
ListView
.
builder
(
itemCount:
provider
.
tpcAgent
.
length
,
shrinkWrap:
true
,
physics:
AlwaysScrollableScrollPhysics
(),
itemBuilder:
(
context
,
index
)
{
return
InkResponse
(
onTap:
()
async
{
if
(
provider
.
tpcAgent
.
isNotEmpty
)
{
provider
.
selectedTpcAgent
=
provider
.
tpcAgent
[
index
];
print
(
"Selected Complaint Type:
${provider.tpcAgent[index].text}
, ID:
${provider.tpcAgent[index].id}
"
,
items:
(
filter
,
infiniteScrollProps
)
async
{
print
(
'Fetching items for filter:
$filter
'
);
return
provider
.
fetchTPCAccountsfromAPI
(
context
,
widget
.
mode
,
filter
,
);
provider
.
selectedTpcAgentID
=
provider
.
tpcAgent
[
index
]
.
id
!;
},
itemAsString:
(
TpcList
?
item
)
=>
item
?.
text
??
''
,
onChanged:
(
TpcList
?
value
)
{
if
(
value
!=
null
)
{
print
(
'Selected account:
${value.text}
'
);
provider
.
selectedTpcAgent
=
(
value
);
provider
.
selectedTpcAgentID
=
value
!.
id
!;
provider
.
selectedTpcAgentValue
=
provider
.
tpcAgent
[
index
]
.
text
!;
print
(
"hfjkshfg"
+
provider
.
selectedTpcAgentID
.
toString
(),
);
provider
.
dropDownTpcSearchController
.
text
=
provider
.
tpcAgent
[
index
]
.
text
!;
value
!.
text
!;
}
// provider.ordersAddPaymentSelectOrderAPIFunction(context, provider.selectedAccountID);
// provider.tpcAgent = [];
},
child:
SizedBox
(
height:
45
,
child:
Align
(
alignment:
Alignment
.
centerLeft
,
child:
Text
(
provider
.
tpcAgent
[
index
]
.
text
!,
selectedItem:
provider
.
selectedTpcAgent
,
decoratorProps:
DropDownDecoratorProps
(
decoration:
InputDecoration
(
hintText:
'Select TPC Agent'
,
hintStyle:
TextStyle
(
fontSize:
14
,
color:
AppColors
.
grey_thick
,
),
// labelText: 'Select Account',
enabledBorder:
OutlineInputBorder
(
borderSide:
BorderSide
.
none
,
borderRadius:
BorderRadius
.
circular
(
14
),
),
focusedBorder:
OutlineInputBorder
(
borderSide:
BorderSide
(
color:
AppColors
.
cyan_blue
,
),
);
},
borderRadius:
BorderRadius
.
circular
(
14
),
),
disabledBorder:
OutlineInputBorder
(
borderSide:
BorderSide
.
none
,
borderRadius:
BorderRadius
.
circular
(
14
),
),
errorBorder:
OutlineInputBorder
(
borderSide:
BorderSide
.
none
,
borderRadius:
BorderRadius
.
circular
(
14
),
),
border:
OutlineInputBorder
(
borderSide:
BorderSide
.
none
,
borderRadius:
BorderRadius
.
circular
(
8
),
),
],
contentPadding:
ddtheme
.
buttonStyleData
.
padding
,
fillColor:
AppColors
.
text_field_color
,
filled:
true
,
),
),
onBeforePopupOpening:
(
selectedItem
)
async
{
provider
.
dropDownSearchController
.
clear
();
return
Future
.
value
();
},
// onBeforePopupOpening: () {
// print('Dropdown closed, clearing search');
// provider.dropDownSearchController.clear();
// },
),
//dd
// Container(
// alignment: Alignment.center,
// decoration: BoxDecoration(
// color: AppColors.text_field_color,
// borderRadius: BorderRadius.circular(14),
// ),
// child: ListTile(
// title: TextFormField(
// focusNode: focusNodetpc,
// onTapUpOutside: (event) {
// focusNodetpc.unfocus();
// },
// controller:
// provider.dropDownTpcSearchController,
// onChanged: (value) async {
// Future.delayed(
// Duration(milliseconds: 100),
// () async {
// await provider
// .ordersAddOrderTPCAgentFunction(
// context,
// widget.mode,
// value,
// );
// },
// );
// },
// decoration: InputDecoration(
// enabledBorder: InputBorder.none,
// focusedBorder: InputBorder.none,
// isDense: true,
// contentPadding:
// const EdgeInsets.symmetric(
// horizontal: 0,
// vertical: 8,
// ),
// hintText: 'Select TPC Agent',
// hintStyle: const TextStyle(
// fontSize: 14,
// ),
// border: OutlineInputBorder(
// borderRadius: BorderRadius.circular(
// 8,
// ),
// ),
// ),
// ),
//
// trailing: InkResponse(
// onTap: () {
// if (focusNodetpc.hasFocus) {
// focusNodetpc.unfocus();
// } else {
// FocusScope.of(
// context,
// ).requestFocus(focusNodetpc);
// }
// },
// child: SvgPicture.asset(
// "assets/svg/arrow_dropdown.svg",
// height: 25,
// width: 20,
// ),
// ),
// ),
// ),
// if (provider.tpcAgent.isNotEmpty &&
// focusNodetpc.hasFocus) ...[
// Card(
// margin: EdgeInsets.symmetric(horizontal: 0),
// child: Container(
// padding: EdgeInsets.symmetric(
// horizontal: 10,
// ),
// height: 150,
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(16),
// ),
// child: Scrollbar(
// thickness: 2.5,
// radius: Radius.circular(6),
// thumbVisibility: true,
// child: ListView.builder(
// itemCount: provider.tpcAgent.length,
// shrinkWrap: true,
// physics:
// AlwaysScrollableScrollPhysics(),
// itemBuilder: (context, index) {
// return InkResponse(
// onTap: () async {
// if (provider
// .tpcAgent
// .isNotEmpty) {
// provider.selectedTpcAgent =
// provider.tpcAgent[index];
//
// print(
// "Selected Complaint Type: ${provider.tpcAgent[index].text}, ID: ${provider.tpcAgent[index].id}",
// );
// provider.selectedTpcAgentID =
// provider
// .tpcAgent[index]
// .id!;
// provider.selectedTpcAgentValue =
// provider
// .tpcAgent[index]
// .text!;
// print(
// "hfjkshfg" +
// provider
// .selectedTpcAgentID
// .toString(),
// );
// provider
// .dropDownTpcSearchController
// .text = provider
// .tpcAgent[index]
// .text!;
// }
// // provider.ordersAddPaymentSelectOrderAPIFunction(context, provider.selectedAccountID);
// // provider.tpcAgent = [];
// },
// child: SizedBox(
// height: 45,
// child: Align(
// alignment:
// Alignment.centerLeft,
// child: Text(
// provider
// .tpcAgent[index]
// .text!,
// ),
// ),
// ),
// );
// },
// ),
// ),
// ),
// ),
// ],
if
(
provider
.
selectedTPCAgentError
!=
null
)
...[
errorWidget
(
context
,
...
...
@@ -1948,17 +2343,18 @@ class _AddorderScreenState extends State<AddorderScreen> {
errorWidget
(
context
,
provider
.
tpcAmountError
),
],
],
SizedBox
(
height:
15
,
)
SizedBox
(
height:
15
)
,
],
),
),
),
),
Step
(
label:
Text
(
"Step 4"
,
style:
TextStyle
(
fontSize:
12
)),
Step
(
label:
Text
(
"Step 4"
,
style:
TextStyle
(
fontSize:
12
)),
title:
const
Text
(
''
),
isActive:
_currentStep
>=
1
,
content:
OrderForm
(
),
)
content:
OrderForm
(),
),
],
controlsBuilder:
(
context
,
details
)
{
return
Column
(
...
...
@@ -1971,12 +2367,12 @@ class _AddorderScreenState extends State<AddorderScreen> {
:
()
{
print
(
_currentStep
);
if
(
provider
.
validateForm4
())
{
if
(
provider
.
productRows
.
isNotEmpty
){
if
(
provider
.
productRows
.
isNotEmpty
)
{
provider
.
submitClicked
=
true
;
var
order_prod_data
=
pr
ovider
.
getFormData
();
print
(
order_prod_data
);
print
(
order_prod_data
[
'orders'
]
);
pr
int
(
"Encoded Products :
${provider.getJsonEncodedProducts()}
"
,
);
provider
.
getCurrentLocation
();
provider
...
...
@@ -1987,7 +2383,8 @@ class _AddorderScreenState extends State<AddorderScreen> {
provider
.
selectedAccountID
,
provider
.
selectedDispatchDistrictId
,
provider
.
selectedDispatchSubLocID
,
provider
.
selectedDispatchSubLocID
,
provider
.
selectedUnloadingScope
,
provider
.
selectedFreightScope
,
provider
.
selectedErectionScope
,
...
...
@@ -1996,14 +2393,15 @@ class _AddorderScreenState extends State<AddorderScreen> {
provider
.
selectedBillingStateID
,
provider
.
selectedBillingDistrictId
,
provider
.
selectedBillingSubLocID
,
provider
.
selectedBillingSubLocID
,
provider
.
selectedTpcAgentID
,
order_prod_data
[
'orders'
],
provider
.
getJsonEncodedProducts
(),
);
}
else
{
}
else
{
toast
(
context
,
"Add min. 1 product"
);
}
}
else
{
provider
.
submitClicked
=
false
;
}
...
...
@@ -2038,19 +2436,18 @@ class _AddorderScreenState extends State<AddorderScreen> {
onTap:
()
{
setState
(()
{
if
(
_currentStep
==
0
)
{
if
(
provider
.
validateForm1
()){
if
(
provider
.
validateForm1
())
{
_currentStep
=
1
;
}
}
else
if
(
_currentStep
==
1
)
{
if
(
provider
.
validateForm2
())
{
_currentStep
=
2
;
}
}
else
if
(
_currentStep
==
2
)
{
}
else
if
(
_currentStep
==
2
)
{
if
(
provider
.
validateForm3
())
{
_currentStep
=
3
;
}
}
else
{
}
else
{
_currentStep
=
0
;
}
});
...
...
@@ -3646,9 +4043,7 @@ class _AddorderScreenState extends State<AddorderScreen> {
?
null
:
()
{
provider
.
submitClicked
=
true
;
var
order_prod_data
=
provider
.
getFormData
();
print
(
order_prod_data
);
print
(
order_prod_data
[
'orders'
]);
// var order_prod_data = provider.getFormData();
///[{"product_id":"1","qty":"1","price":"500","cgst_p":"9","sgst_p":"9","igst_p":"0","total_price":"500"},
///{"product_id":"2","qty":"1","price":"1000","cgst_p":"9","sgst_p":"9","igst_p":"0","total_price":"1000"}]
...
...
@@ -3658,18 +4053,18 @@ class _AddorderScreenState extends State<AddorderScreen> {
widget
.
mode
,
provider
.
selectedEmployeeID
,
provider
.
selectedAccountID
,
provider
.
selectedDispatchStateID
,
provider
.
selectedDispatchDistrictId
,
provider
.
selectedDispatchSubLocID
,
provider
.
selectedUnloadingScope
,
provider
.
selectedFreightScope
,
provider
.
selectedErectionScope
,
provider
.
selectedTpcStatus
,
provider
.
selectedTpcStatus
,
provider
.
selectedBillingStateID
,
provider
.
selectedBillingDistrictId
,
provider
.
selectedBillingSubLocID
,
provider
.
selectedTpcAgentID
,
order_prod_data
[
'orders'
]
,
{}
,
);
},
child:
Container
(
...
...
@@ -3818,14 +4213,8 @@ class OrderForm extends StatelessWidget {
var
res
=
await
Navigator
.
push
(
context
,
MaterialPageRoute
(
builder:
(
context
)
=>
Addorderaddproduct
(
type:
"Add"
,
),
settings:
RouteSettings
(
name:
'Addorderaddproduct'
,
),
builder:
(
context
)
=>
Addorderaddproduct
(
type:
"Add"
),
settings:
RouteSettings
(
name:
'Addorderaddproduct'
),
),
);
if
(
res
!=
null
)
{
...
...
@@ -3857,28 +4246,22 @@ class OrderForm extends StatelessWidget {
if
(
provider
.
productRows
.
isNotEmpty
)
...[
const
SizedBox
(
height:
10
),
SizedBox
(
height:
2
00
,
height:
2
15
,
child:
ListView
.
builder
(
scrollDirection:
Axis
.
horizontal
,
itemCount:
provider
.
productRows
.
length
,
itemBuilder:
(
context
,
index
)
{
final
product
=
provider
.
productRows
[
index
];
final
product
=
provider
.
productRows
[
index
];
final
productName
=
provider
.
saleProducts
.
firstWhere
(
(
p
)
=>
p
.
id
==
product
[
'product_id'
],
(
p
)
=>
p
.
id
==
product
[
'product_id'
],
orElse:
()
=>
SaleProducts
(
id:
''
,
prodName:
'Unknown'
,
),
()
=>
SaleProducts
(
id:
''
,
prodName:
'Unknown'
),
)
.
prodName
;
final
prodPrice
=
product
[
'price'
]
??
'-'
;
final
prodPrice
=
product
[
'price'
]
??
'-'
;
final
prodQty
=
product
[
'qty'
]
??
'-'
;
final
totalPrice
=
product
[
'total_price'
]
??
'-'
;
final
cgstPercent
=
product
[
'cgst_p'
]
??
'-'
;
...
...
@@ -3891,15 +4274,11 @@ class OrderForm extends StatelessWidget {
context
,
MaterialPageRoute
(
builder:
(
context
)
=>
Addorderaddproduct
(
(
context
)
=>
Addorderaddproduct
(
type:
"Edit"
,
editIndex:
index
,
),
settings:
RouteSettings
(
name:
'Addorderaddproduct'
,
),
settings:
RouteSettings
(
name:
'Addorderaddproduct'
),
),
);
if
(
res
!=
null
)
{
...
...
@@ -3907,21 +4286,11 @@ class OrderForm extends StatelessWidget {
}
},
child:
Container
(
width:
MediaQuery
.
of
(
context
,
).
size
.
width
*
0.8
,
width:
MediaQuery
.
of
(
context
).
size
.
width
*
0.8
,
margin:
EdgeInsets
.
only
(
left:
index
==
0
?
10
:
5
,
right:
index
==
provider
.
productRows
.
length
-
1
?
10
:
5
,
index
==
provider
.
productRows
.
length
-
1
?
10
:
5
,
bottom:
5
,
),
padding:
EdgeInsets
.
symmetric
(
...
...
@@ -3930,16 +4299,13 @@ class OrderForm extends StatelessWidget {
),
decoration:
BoxDecoration
(
color:
Color
(
0xFFE6F6FF
),
borderRadius:
BorderRadius
.
circular
(
14
),
borderRadius:
BorderRadius
.
circular
(
14
),
),
child:
Column
(
children:
[
Row
(
mainAxisAlignment:
MainAxisAlignment
.
start
,
crossAxisAlignment:
CrossAxisAlignment
.
start
,
mainAxisAlignment:
MainAxisAlignment
.
start
,
crossAxisAlignment:
CrossAxisAlignment
.
start
,
children:
[
Expanded
(
flex:
1
,
...
...
@@ -3952,46 +4318,33 @@ class OrderForm extends StatelessWidget {
flex:
6
,
child:
Column
(
crossAxisAlignment:
CrossAxisAlignment
.
start
,
mainAxisAlignment:
MainAxisAlignment
.
start
,
CrossAxisAlignment
.
start
,
mainAxisAlignment:
MainAxisAlignment
.
start
,
children:
[
Row
(
children:
[
Expanded
(
flex:
4
,
child:
Text
(
productName
??
"-"
,
productName
??
"-"
,
maxLines:
2
,
overflow:
TextOverflow
.
ellipsis
,
overflow:
TextOverflow
.
ellipsis
,
style:
TextStyle
(
fontFamily:
"JakartaMedium"
,
fontFamily:
"JakartaMedium"
,
fontSize:
14
,
color:
AppColors
.
semi_black
,
color:
AppColors
.
semi_black
,
),
),
),
Expanded
(
flex:
3
,
child:
Text
(
textAlign:
TextAlign
.
right
,
textAlign:
TextAlign
.
right
,
"₹
$prodPrice
"
,
style:
TextStyle
(
fontFamily:
"JakartaMedium"
,
fontFamily:
"JakartaMedium"
,
fontSize:
14
,
color:
AppColors
.
semi_black
,
color:
AppColors
.
semi_black
,
),
),
),
...
...
@@ -4000,25 +4353,19 @@ class OrderForm extends StatelessWidget {
Text
(
"x
$prodQty
"
,
style:
TextStyle
(
fontFamily:
"JakartaMedium"
,
fontFamily:
"JakartaMedium"
,
fontSize:
14
,
color:
AppColors
.
grey_semi
,
color:
AppColors
.
grey_semi
,
),
),
SizedBox
(
height:
5
),
],
),
),
],
),
Container
(
padding:
EdgeInsets
.
symmetric
(
vertical:
3
,
),
padding:
EdgeInsets
.
symmetric
(
vertical:
2
),
child:
Row
(
children:
[
Expanded
(
...
...
@@ -4046,24 +4393,21 @@ class OrderForm extends StatelessWidget {
),
...
List
.
generate
(
4
,
(
j
)
{
final
heads
=
[
"Total Price"
,
"CGST"
,
"SGST"
,
"IGST"
,
"Total Amount"
,
];
final
subHeads
=
[
"₹
$totalPrice
"
,
"
$cgstPercent
%"
,
"
$sgstPercent
%"
,
"
$igstPerecent
%"
,
"₹
$totalPrice
"
,
];
return
Container
(
padding:
EdgeInsets
.
symmetric
(
vertical:
3
,
),
padding:
EdgeInsets
.
symmetric
(
vertical:
3
),
child:
Row
(
crossAxisAlignment:
CrossAxisAlignment
.
start
,
crossAxisAlignment:
CrossAxisAlignment
.
start
,
children:
[
Expanded
(
child:
Text
(
...
...
@@ -4079,9 +4423,7 @@ class OrderForm extends StatelessWidget {
Expanded
(
child:
Text
(
textAlign:
TextAlign
.
right
,
subHeads
[
j
]
==
""
?
"-"
:
subHeads
[
j
],
subHeads
[
j
]
==
""
?
"-"
:
subHeads
[
j
],
style:
TextStyle
(
fontSize:
14
,
color:
Color
(
0xFF818181
),
...
...
@@ -4100,8 +4442,8 @@ class OrderForm extends StatelessWidget {
),
),
],
if
(
provider
.
productsEmptyError
!=
null
)...[
errorWidget
(
context
,
provider
.
productsEmptyError
)
if
(
provider
.
productsEmptyError
!=
null
)
...[
errorWidget
(
context
,
provider
.
productsEmptyError
)
,
],
// Product Rows (Horizontal ListView)
// if (provider.ProductControllers.isNotEmpty) ...[
...
...
lib/screens/order/addTpcAgent.dart
View file @
12aa06e4
...
...
@@ -123,7 +123,9 @@ class _AddtpcagentScreenState extends State<AddtpcagentScreen> {
false
,
FilteringTextInputFormatter
.
digitsOnly
,
focusNodes
[
1
],
focusNodes
[
2
],
TextInputAction
.
next
,
10
focusNodes
[
2
],
TextInputAction
.
next
,
10
),
if
(
provider
.
tpcMobileNumberError
!=
null
)
...[
errorWidget
(
context
,
provider
.
tpcMobileNumberError
),
...
...
lib/screens/order/editOrderAccountDetails.dart
View file @
12aa06e4
...
...
@@ -63,11 +63,12 @@ class _EditorderaccountdetailsState extends State<Editorderaccountdetails> {
child:
Scaffold
(
resizeToAvoidBottomInset:
true
,
backgroundColor:
AppColors
.
white
,
appBar:
appbar2
(
appBar:
appbar2
New
(
context
,
"
${widget.pageTitleName}
"
,
provider
.
resetForm
,
SizedBox
(
width:
0
),
0xFFFFFFFF
),
body:
Container
(
padding:
EdgeInsets
.
symmetric
(
horizontal:
10
),
...
...
@@ -538,7 +539,7 @@ class _EditorderaccountdetailsState extends State<Editorderaccountdetails> {
),
),
onWillPop:
()
async
{
provider
.
resetForm
();
return
_onBackPressed
(
context
);
},
);
...
...
lib/screens/order/orderModuleDashboard.dart
View file @
12aa06e4
...
...
@@ -146,7 +146,7 @@ class _OrdermoduledashboardState extends State<Ordermoduledashboard> {
image:
AssetImage
(
"assets/svg/order/main_dashboard.png"
,
),
fit:
BoxFit
.
contain
,
fit:
BoxFit
.
fitWidth
,
),
gradient:
LinearGradient
(
colors:
[
...
...
@@ -158,117 +158,117 @@ class _OrdermoduledashboardState extends State<Ordermoduledashboard> {
),
),
),
if
(
provider
.
ordersgain
.
length
>
0
)
...[
Container
(
padding:
EdgeInsets
.
symmetric
(
horizontal:
10
,
vertical:
5
,
),
margin:
EdgeInsets
.
only
(
bottom:
10
),
decoration:
BoxDecoration
(
color:
Colors
.
white
,
borderRadius:
BorderRadius
.
vertical
(
bottom:
Radius
.
circular
(
16
),
),
),
height:
MediaQuery
.
of
(
context
).
size
.
height
*
0.25
,
child:
GridView
.
builder
(
padding:
EdgeInsets
.
symmetric
(
horizontal:
0
,
vertical:
5
,
),
itemCount:
provider
.
ordersgain
.
length
,
shrinkWrap:
true
,
scrollDirection:
Axis
.
horizontal
,
physics:
AlwaysScrollableScrollPhysics
(),
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount
(
crossAxisCount:
2
,
crossAxisSpacing:
10
,
mainAxisSpacing:
10
,
childAspectRatio:
55
/
100
,
),
itemBuilder:
(
context
,
jndex
)
{
final
icons
=
[
"comm_ic_1"
,
"comm_ic_2"
];
final
leadTitles
=
[
'Order Gain'
,
'Dispatched'
,
'Pending Tasks'
,
'Quotation Generated'
,
];
final
assetNames
=
[
"assets/svg/crm/open_leads_ic.svg"
,
"assets/svg/crm/today_visits_ic.svg"
,
"assets/svg/crm/pending_tasks_ic.svg"
,
"assets/svg/crm/quotes_generated_ic.svg"
,
];
final
colors
=
[
0xFFE7FFE5
,
0xFFFFFCD5
,
0xFFEEF1FF
,
0xFFF3EDFF
,
];
final
textcolors
=
[
0xFF0D9C00
,
0xFF605C00
,
0xFF6563FF
,
0xFF493272
,
];
return
InkResponse
(
child:
Container
(
padding:
EdgeInsets
.
symmetric
(
horizontal:
13
,
),
decoration:
BoxDecoration
(
color:
Color
(
colors
[
jndex
]),
borderRadius:
BorderRadius
.
circular
(
20
),
),
child:
Column
(
crossAxisAlignment:
CrossAxisAlignment
.
start
,
mainAxisAlignment:
MainAxisAlignment
.
center
,
children:
[
Text
(
provider
.
ordersgain
[
jndex
].
count
.
toString
(),
style:
TextStyle
(
fontSize:
20
,
fontFamily:
"JakartaMedium"
,
color:
Color
(
textcolors
[
jndex
]),
),
),
Row
(
children:
[
Expanded
(
flex:
3
,
child:
Text
(
leadTitles
[
jndex
],
style:
TextStyle
(
fontSize:
14
,
fontFamily:
"JakartaRegular"
,
color:
AppColors
.
semi_black
,
),
),
),
Expanded
(
flex:
1
,
child:
SvgPicture
.
asset
(
assetNames
[
jndex
],
),
),
],
),
],
),
),
);
},
),
),
],
//
if (provider.ordersgain.length > 0) ...[
//
Container(
//
padding: EdgeInsets.symmetric(
//
horizontal: 10,
//
vertical: 5,
//
),
//
margin: EdgeInsets.only(bottom: 10),
//
decoration: BoxDecoration(
//
color: Colors.white,
//
borderRadius: BorderRadius.vertical(
//
bottom: Radius.circular(16),
//
),
//
),
//
height: MediaQuery.of(context).size.height * 0.25,
//
child: GridView.builder(
//
padding: EdgeInsets.symmetric(
//
horizontal: 0,
//
vertical: 5,
//
),
//
itemCount: provider.ordersgain.length,
//
shrinkWrap: true,
//
scrollDirection: Axis.horizontal,
//
physics: AlwaysScrollableScrollPhysics(),
//
gridDelegate:
//
SliverGridDelegateWithFixedCrossAxisCount(
//
crossAxisCount: 2,
//
crossAxisSpacing: 10,
//
mainAxisSpacing: 10,
//
childAspectRatio: 55 / 100,
//
),
//
itemBuilder: (context, jndex) {
//
final icons = ["comm_ic_1", "comm_ic_2"];
//
final leadTitles = [
//
'Order Gain',
//
'Dispatched',
//
'Pending Tasks',
//
'Quotation Generated',
//
];
//
final assetNames = [
//
"assets/svg/crm/open_leads_ic.svg",
//
"assets/svg/crm/today_visits_ic.svg",
//
"assets/svg/crm/pending_tasks_ic.svg",
//
"assets/svg/crm/quotes_generated_ic.svg",
//
];
//
//
final colors = [
//
0xFFE7FFE5,
//
0xFFFFFCD5,
//
0xFFEEF1FF,
//
0xFFF3EDFF,
//
];
//
final textcolors = [
//
0xFF0D9C00,
//
0xFF605C00,
//
0xFF6563FF,
//
0xFF493272,
//
];
//
//
return InkResponse(
//
child: Container(
//
padding: EdgeInsets.symmetric(
//
horizontal: 13,
//
),
//
decoration: BoxDecoration(
//
color: Color(colors[jndex]),
//
borderRadius: BorderRadius.circular(20),
//
),
//
child: Column(
//
crossAxisAlignment:
//
CrossAxisAlignment.start,
//
mainAxisAlignment:
//
MainAxisAlignment.center,
//
children: [
//
Text(
//
provider.ordersgain[jndex].count
//
.toString(),
//
style: TextStyle(
//
fontSize: 20,
//
fontFamily: "JakartaMedium",
//
color: Color(textcolors[jndex]),
//
),
//
),
//
Row(
//
children: [
//
Expanded(
//
flex: 3,
//
child: Text(
//
leadTitles[jndex],
//
style: TextStyle(
//
fontSize: 14,
//
fontFamily: "JakartaRegular",
//
color: AppColors.semi_black,
//
),
//
),
//
),
//
Expanded(
//
flex: 1,
//
child: SvgPicture.asset(
//
assetNames[jndex],
//
),
//
),
//
],
//
),
//
],
//
),
//
),
//
);
//
},
//
),
//
),
//
],
],
),
),
...
...
lib/screens/order/ordersDetailsByModes.dart
View file @
12aa06e4
...
...
@@ -7,6 +7,7 @@ import 'package:flutter/services.dart';
import
'package:flutter_svg/svg.dart'
;
import
'package:generp/Notifiers/ordersProvider/dispatchOrderProvider.dart'
;
import
'package:generp/Notifiers/ordersProvider/pagesDashboardProvider.dart'
;
import
'package:generp/Utils/GlobalConstants.dart'
;
import
'package:generp/Utils/dropdownTheme.dart'
;
import
'package:generp/screens/screensExports.dart'
;
import
'package:provider/provider.dart'
;
...
...
@@ -344,14 +345,14 @@ class _OrdersdetailsbymodesState extends State<Ordersdetailsbymodes> {
"Account Name"
,
"Sales Person Name"
,
"Order Received Date"
,
"OTP"
,
//
"OTP",
];
final
subHeadings2
=
[
provider
.
orderDetails
.
orderNumber
??
"-"
,
provider
.
orderDetails
.
accountName
??
"-"
,
provider
.
orderDetails
.
salesPersonEmpName
??
"-"
,
provider
.
orderDetails
.
orderReceivedDate
??
"-"
,
provider
.
orderDetails
.
otp
??
"-"
,
//
provider.orderDetails.otp ?? "-",
];
final
headings3
=
[
...
...
@@ -503,17 +504,11 @@ class _OrdersdetailsbymodesState extends State<Ordersdetailsbymodes> {
],
];
return
WillPopScope
(
child:
SafeArea
(
top:
false
,
bottom:
Platform
.
isIOS
?
false
:
true
,
child:
Scaffold
(
return
Scaffold
(
resizeToAvoidBottomInset:
true
,
appBar:
appbar2New
(
context
,
widget
.
mode
==
""
?
"Order Details"
:
"Order Details (
${widget.mode}
)"
,
"Order Details"
,
provider
.
resetAll
,
SizedBox
.
shrink
(),
0xFFFFFFFF
,
...
...
@@ -601,7 +596,7 @@ class _OrdersdetailsbymodesState extends State<Ordersdetailsbymodes> {
Text
(
orderDetails
.
balanceAmount
==
""
?
"-"
:
"
₹
${orderDetails.balanceAmount}
"
,
:
"
${orderDetails.balanceAmount}
"
,
style:
TextStyle
(
fontFamily:
"JakartaRegular"
,
fontSize:
14
,
...
...
@@ -654,16 +649,14 @@ class _OrdersdetailsbymodesState extends State<Ordersdetailsbymodes> {
mode:
widget
.
mode
,
pageTitleName:
"Edit Order"
,
orderID:
provider
.
orderDetails
.
id
,
widget
.
orderId
,
),
settings:
RouteSettings
(
name:
'Editorderaccountdetails'
,
),
),
);
if
(
r
es
==
true
)
{
if
(
r
outeSettingName
==
'Editorderaccountdetails'
)
{
provider
.
ordersDetailsByModeAPIFunction
(
context
,
widget
.
orderId
,
...
...
@@ -1948,7 +1941,7 @@ class _OrdersdetailsbymodesState extends State<Ordersdetailsbymodes> {
SizedBox
(
width:
10
),
],
if
([
"admin"
].
contains
(
widget
.
mode
)
)
...[
if
(
widget
.
mode
==
"admin"
)
...[
SvgPicture
.
asset
(
"assets/svg/crm/vertical_line_ic.svg"
,
),
...
...
@@ -2035,12 +2028,6 @@ class _OrdersdetailsbymodesState extends State<Ordersdetailsbymodes> {
),
),
),
),
),
onWillPop:
()
{
return
onBackPressed
(
context
);
},
);
},
);
...
...
lib/screens/order/ordersListByModes.dart
View file @
12aa06e4
...
...
@@ -3,6 +3,7 @@ import 'dart:io';
import
'package:dropdown_button2/dropdown_button2.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter_svg/svg.dart'
;
import
'package:generp/Utils/GlobalConstants.dart'
;
import
'package:generp/screens/order/ordersDetailsByModes.dart'
;
import
'package:provider/provider.dart'
;
...
...
@@ -228,7 +229,7 @@ class _OrderslistbyModesState extends State<OrderslistbyModes> {
itemCount:
ordersList
.
length
,
shrinkWrap:
true
,
physics:
NeverScrollableScrollPhysics
(),
itemBuilder:
(
context
,
index
)
{
itemBuilder:
(
context
,
ol
)
{
if
(
ordersList
.
isEmpty
)
{
return
SizedBox
(
child:
Center
(
child:
Text
(
"No Data Available"
)),
...
...
@@ -243,12 +244,13 @@ class _OrderslistbyModesState extends State<OrderslistbyModes> {
builder:
(
context
)
=>
Ordersdetailsbymodes
(
pageTitleName:
widget
.
pageTitleName
,
orderId:
ordersList
[
index
].
orderId
,
orderId:
ordersList
[
ol
].
orderId
,
mode:
widget
.
mode
,
),
settings:
RouteSettings
(
name:
"Ordersdetailsbymodes"
)
),
);
if
(
r
es
==
true
)
{
if
(
r
outeSettingName
==
"Ordersdetailsbymodes"
)
{
provider
.
ordersListByModeFilterAPIFunction
(
context
,
widget
.
mode
,
...
...
@@ -303,21 +305,21 @@ class _OrderslistbyModesState extends State<OrderslistbyModes> {
padding:
EdgeInsets
.
all
(
8.0
),
decoration:
BoxDecoration
(
color:
getDecorationColor
(
ordersList
[
index
].
status
,
ordersList
[
ol
].
status
,
),
shape:
BoxShape
.
circle
,
),
child:
Center
(
child:
Text
(
getText
(
ordersList
[
index
].
status
,
ordersList
[
ol
].
status
,
),
style:
TextStyle
(
color:
getTextColor
(
ordersList
[
index
].
status
,
ordersList
[
ol
].
status
,
),
fontSize:
getSize
(
ordersList
[
index
].
status
,
ordersList
[
ol
].
status
,
),
fontFamily:
"JakartaBold"
,
),
...
...
@@ -334,7 +336,7 @@ class _OrderslistbyModesState extends State<OrderslistbyModes> {
CrossAxisAlignment
.
start
,
children:
[
Text
(
ordersList
[
index
]
ordersList
[
ol
]
.
accountName
!,
maxLines:
1
,
overflow:
...
...
@@ -347,7 +349,7 @@ class _OrderslistbyModesState extends State<OrderslistbyModes> {
),
),
Text
(
ordersList
[
index
]
ordersList
[
ol
]
.
orderNumber
!,
style:
TextStyle
(
fontSize:
14
,
...
...
@@ -370,7 +372,7 @@ class _OrderslistbyModesState extends State<OrderslistbyModes> {
child:
Container
(
child:
Text
(
"₹"
"
${ordersList[
index
].balanceAmount}
"
,
"
${ordersList[
ol
].balanceAmount}
"
,
textAlign:
TextAlign
.
right
,
style:
TextStyle
(
fontFamily:
"JakartaMedium"
,
...
...
lib/screens/order/tpcAgentDetailsByMode.dart
View file @
12aa06e4
...
...
@@ -46,6 +46,7 @@ class _TpcagentdetailsbymodeState extends State<Tpcagentdetailsbymode> {
WidgetsBinding
.
instance
.
addPostFrameCallback
((
timeStamp
)
{
var
provider
=
Provider
.
of
<
Tpcagentsprovider
>(
context
,
listen:
false
);
provider
.
TPCAgentsDetailsAPIFunction
(
context
,
widget
.
tpcAgentId
);
provider
.
showMoreDetails
=
false
;
});
}
...
...
@@ -128,11 +129,7 @@ class _TpcagentdetailsbymodeState extends State<Tpcagentdetailsbymode> {
"subHeadings"
:
subHeadings2
,
},
];
return
WillPopScope
(
child:
SafeArea
(
top:
false
,
bottom:
Platform
.
isIOS
?
false
:
true
,
child:
Scaffold
(
return
Scaffold
(
resizeToAvoidBottomInset:
true
,
appBar:
appbar2New
(
context
,
...
...
@@ -298,9 +295,7 @@ class _TpcagentdetailsbymodeState extends State<Tpcagentdetailsbymode> {
)
{
if
(
headings
[
j
]
==
"ID Proof"
&&
tpcAgentDetails
.
idProofDirFilePath
!
.
trim
()
.
isEmpty
)
{
.
idProofDirFilePath
==
""
)
{
return
SizedBox
.
shrink
();
}
return
Container
(
...
...
@@ -500,6 +495,7 @@ class _TpcagentdetailsbymodeState extends State<Tpcagentdetailsbymode> {
),
margin:
EdgeInsets
.
symmetric
(
horizontal:
5
,
vertical:
5
),
child:
Column
(
...
...
@@ -728,12 +724,6 @@ class _TpcagentdetailsbymodeState extends State<Tpcagentdetailsbymode> {
],
),
),
),
),
onWillPop:
()
{
return
onBackPressed
(
context
);
},
);
},
);
...
...
@@ -825,6 +815,7 @@ class _TpcagentdetailsbymodeState extends State<Tpcagentdetailsbymode> {
),
Divider
(
thickness:
0.5
,
color:
Color
(
0xFFD7D7D7
)),
...
List
.
generate
(
provider
.
subHeadings
.
length
,
(
j
)
{
return
Container
(
padding:
EdgeInsets
.
symmetric
(
vertical:
7
),
child:
Row
(
...
...
lib/screens/order/tpcAgentIssueList.dart
View file @
12aa06e4
...
...
@@ -69,7 +69,7 @@ class _TpcagentissuelistState extends State<Tpcagentissuelist> {
?
Platform
.
isAndroid
?
WillPopScope
(
onWillPop:
()
{
Provider
.
of
<
Tpcagentsprovider
>(
context
).
resetAll
();
Provider
.
of
<
Tpcagentsprovider
>(
context
,
listen:
false
).
resetAll
();
return
onBackPressed
(
context
);
},
child:
SafeArea
(
...
...
@@ -87,15 +87,7 @@ class _TpcagentissuelistState extends State<Tpcagentissuelist> {
return
Consumer
<
Tpcagentsprovider
>(
builder:
(
context
,
provider
,
child
)
{
final
tpcAgentsIssueList
=
provider
.
tpcAgentsIssueList
;
return
WillPopScope
(
onWillPop:
()
{
provider
.
resetAll
();
return
onBackPressed
(
context
);
},
child:
SafeArea
(
top:
false
,
bottom:
Platform
.
isIOS
?
false
:
true
,
child:
Scaffold
(
return
Scaffold
(
resizeToAvoidBottomInset:
true
,
appBar:
appbar2New
(
context
,
...
...
@@ -244,8 +236,6 @@ class _TpcagentissuelistState extends State<Tpcagentissuelist> {
],
),
)
:
Emptywidget
(
context
),
),
),
);
},
);
...
...
lib/screens/order/tpcAgentIssueListDetails.dart
View file @
12aa06e4
...
...
@@ -351,11 +351,7 @@ class _TpcagentissuelistdetailsState extends State<Tpcagentissuelistdetails> {
],
];
return
WillPopScope
(
child:
SafeArea
(
top:
false
,
bottom:
Platform
.
isIOS
?
false
:
true
,
child:
Scaffold
(
return
Scaffold
(
resizeToAvoidBottomInset:
true
,
appBar:
appbar2New
(
context
,
widget
.
pageTitleName
,
provider
.
resetAll
,
SizedBox
.
shrink
(),
...
...
@@ -672,7 +668,7 @@ class _TpcagentissuelistdetailsState extends State<Tpcagentissuelistdetails> {
SizedBox
(
width:
double
.
infinity
,
height:
30
0
,
height:
26
0
,
child:
ListView
.
builder
(
physics:
AlwaysScrollableScrollPhysics
(),
shrinkWrap:
true
,
...
...
@@ -684,7 +680,7 @@ class _TpcagentissuelistdetailsState extends State<Tpcagentissuelistdetails> {
itemCount:
productsHistory
.
length
,
itemBuilder:
(
context
,
lp
)
{
return
Container
(
height:
30
0
,
height:
26
0
,
width:
MediaQuery
.
of
(
context
).
size
.
width
*
0.9
,
decoration:
BoxDecoration
(
...
...
@@ -747,11 +743,11 @@ class _TpcagentissuelistdetailsState extends State<Tpcagentissuelistdetails> {
),
),
Expanded
(
flex:
2
,
flex:
3
,
child:
Text
(
textAlign:
TextAlign
.
right
,
"₹
${productsHistory[lp].
unit
Price ?? "-"}
"
,
"₹
${productsHistory[lp].
total
Price ?? "-"}
"
,
style:
TextStyle
(
fontFamily:
"JakartaMedium"
,
...
...
@@ -772,7 +768,7 @@ class _TpcagentissuelistdetailsState extends State<Tpcagentissuelistdetails> {
color:
AppColors
.
grey_semi
,
),
),
SizedBox
(
height:
5
),
// DottedLine(
// dashGapLength: 4,
// dashGapColor: Colors.white,
...
...
@@ -941,13 +937,13 @@ class _TpcagentissuelistdetailsState extends State<Tpcagentissuelistdetails> {
],
),
),
...
List
.
generate
(
2
,
(
j
)
{
...
List
.
generate
(
1
,
(
j
)
{
final
heads
=
[
"Unit Price"
,
//
"Unit Price",
"Total Price"
];
final
subHeads
=
[
"₹
${productsHistory[lp].unitPrice ?? "-"}
"
,
//
"₹ ${productsHistory[lp].unitPrice ?? "-"}",
"₹
${productsHistory[lp].totalPrice ?? "-"}
"
,
];
return
Container
(
...
...
@@ -1107,6 +1103,7 @@ class _TpcagentissuelistdetailsState extends State<Tpcagentissuelistdetails> {
margin:
EdgeInsets
.
symmetric
(
horizontal:
5
),
child:
Column
(
crossAxisAlignment:
CrossAxisAlignment
.
start
,
children:
[
Row
(
mainAxisAlignment:
...
...
@@ -1144,6 +1141,8 @@ class _TpcagentissuelistdetailsState extends State<Tpcagentissuelistdetails> {
feedbackHistory
[
lp
]
.
employeNaem
??
"-"
,
maxLines:
2
,
overflow:
TextOverflow
.
ellipsis
,
style:
TextStyle
(
fontFamily:
"JakartaMedium"
,
...
...
@@ -1170,7 +1169,7 @@ class _TpcagentissuelistdetailsState extends State<Tpcagentissuelistdetails> {
),
),
Expanded
(
flex:
2
,
flex:
4
,
child:
Container
(
decoration:
BoxDecoration
(
borderRadius:
...
...
@@ -1694,12 +1693,6 @@ class _TpcagentissuelistdetailsState extends State<Tpcagentissuelistdetails> {
),
),
),
),
onWillPop:
()
{
return
onBackPressed
(
context
);
},
);
},
);
...
...
lib/screens/order/tpcAgentListByMode.dart
View file @
12aa06e4
...
...
@@ -71,7 +71,7 @@ class _TpcagentlistbymodeState extends State<Tpcagentlistbymode> {
?
Platform
.
isAndroid
?
WillPopScope
(
onWillPop:
()
{
Provider
.
of
<
Tpcagentsprovider
>(
context
).
resetAll
();
Provider
.
of
<
Tpcagentsprovider
>(
context
,
listen:
false
).
resetAll
();
return
onBackPressed
(
context
);
},
child:
SafeArea
(
...
...
@@ -89,15 +89,7 @@ class _TpcagentlistbymodeState extends State<Tpcagentlistbymode> {
return
Consumer
<
Tpcagentsprovider
>(
builder:
(
context
,
provider
,
child
)
{
final
tpcAgentsLists
=
provider
.
tpcAgentsList
;
return
WillPopScope
(
onWillPop:
()
{
provider
.
resetAll
();
return
onBackPressed
(
context
);
},
child:
SafeArea
(
top:
false
,
bottom:
Platform
.
isIOS
?
false
:
true
,
child:
Scaffold
(
return
Scaffold
(
resizeToAvoidBottomInset:
true
,
appBar:
appbar2New
(
context
,
...
...
@@ -250,8 +242,6 @@ class _TpcagentlistbymodeState extends State<Tpcagentlistbymode> {
],
),
)
:
Emptywidget
(
context
),
),
),
);
},
);
...
...
lib/services/api_calling.dart
View file @
12aa06e4
...
...
@@ -2463,7 +2463,7 @@ class ApiCalling {
'billing_state'
:
billing_state
.
toString
(),
'billing_district'
:
billing_district
.
toString
(),
'billing_sub_locality'
:
billing_sub_locality
.
toString
(),
'order_products'
:
jsonEncode
(
order_products
).
toString
(),
'order_products'
:
(
order_products
).
toString
(),
'lead_id'
:
lead_id
.
toString
(),
'feedback'
:
feedback
.
toString
(),
'in_time'
:
in_time
.
toString
(),
...
...
pubspec.lock
View file @
12aa06e4
...
...
@@ -289,6 +289,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.3.9"
dropdown_search:
dependency: "direct main"
description:
name: dropdown_search
sha256: c29b3e5147a82a06a4a08b3b574c51cb48cc17ad89893d53ee72a6f86643622e
url: "https://pub.dev"
source: hosted
version: "6.0.2"
equatable:
dependency: transitive
description:
...
...
pubspec.yaml
View file @
12aa06e4
...
...
@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix.
version
:
1.0.97+10
5
version
:
1.0.97+10
6
environment
:
sdk
:
^3.7.2
...
...
@@ -85,6 +85,7 @@ dependencies:
flutter_staggered_grid_view
:
^0.7.0
dotted_line
:
^3.2.3
flutter_slidable
:
^4.0.0
dropdown_search
:
^6.0.2
dev_dependencies
:
flutter_test
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment