master
Sneha 2 months ago
parent 44ccc525fb
commit 8dbe16261b

@ -139,6 +139,8 @@ class AppSettings{
static String verifyPhnUrl = host + 'phone'; static String verifyPhnUrl = host + 'phone';
static String uploadPicUrl = host + 'uploads-user'; static String uploadPicUrl = host + 'uploads-user';
static String getOrderRequestsFromUsersUrl = host + 'getuserRequestbookingsforsupplier'; static String getOrderRequestsFromUsersUrl = host + 'getuserRequestbookingsforsupplier';
static String acceptOrderRequestsUrl = host + 'request-booking-with-charges';
static String formDouble(dynamic s) { static String formDouble(dynamic s) {
var comma = NumberFormat('#,##,###.##', 'en_IN'); var comma = NumberFormat('#,##,###.##', 'en_IN');
@ -223,6 +225,13 @@ class AppSettings{
return _headers; return _headers;
} }
//request headers without content type
static Future<Map<String, String>> buildPutRequestHeaders() async {
Map<String, String> _headers = new Map<String, String>();
_headers['Authorization'] = accessToken;
return _headers;
}
/*Apis Starts here*/ /*Apis Starts here*/
static Future<bool> login(payload) async { static Future<bool> login(payload) async {
@ -380,6 +389,30 @@ class AppSettings{
} }
} }
static Future<bool> acceptOrderRequests(payload,dbId) async {
var uri = Uri.parse(acceptOrderRequestsUrl+'/'+dbId+'/supplier/quote');
var response = await http.post(uri, body: json.encode(payload), headers: await buildRequestHeaders());
if (response.statusCode == 200) {
return true;
} else if (response.statusCode == 401) {
bool status = await AppSettings.resetToken();
if (status) {
response = await http.post(uri,body: json.encode(payload), headers: await buildRequestHeaders());
if (response.statusCode == 200) {
return true;
} else {
return false;
}
} else {
return false;
}
} else {
return false;
}
}
/*Apis ends here*/ /*Apis ends here*/

@ -5,28 +5,27 @@ import 'package:supplier_new/orders/edit_order_requests.dart';
class AcceptOrderRequests extends StatefulWidget { class AcceptOrderRequests extends StatefulWidget {
var order; var order;
var status; var status;
AcceptOrderRequests({this.order,this.status}); AcceptOrderRequests({this.order, this.status});
@override @override
State<AcceptOrderRequests> createState() => _AcceptOrderRequestsState(); State<AcceptOrderRequests> createState() => _AcceptOrderRequestsState();
} }
class _AcceptOrderRequestsState extends State<AcceptOrderRequests> { class _AcceptOrderRequestsState extends State<AcceptOrderRequests> {
double advancePayable=0.0; int advancePayable = 0;
double advance=0.0; int advance =0;
double amountToPayAfterDelivery=0.0; double amountToPayAfterDelivery = 0.0;
double totalFare=0.0; double totalFare = 0.0;
@override @override
void initState() { void initState() {
// TODO: implement initState // TODO: implement initState
super.initState(); super.initState();
advance=150; advance = 150;
advancePayable = advance; advancePayable = advance;
totalFare=advance+double.parse(widget.order.quoted_amount); totalFare = advance + double.parse(widget.order.quoted_amount);
amountToPayAfterDelivery = totalFare - advancePayable; amountToPayAfterDelivery = totalFare - advancePayable;
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@ -65,14 +64,13 @@ class _AcceptOrderRequestsState extends State<AcceptOrderRequests> {
}, },
child: Padding( child: Padding(
padding: padding:
const EdgeInsets.fromLTRB(8, 8, 8, 8), // Add padding if needed const EdgeInsets.fromLTRB(8, 8, 8, 8), // Add padding if needed
child: Image.asset( child: Image.asset(
'images/backbutton_appbar.png', // Replace with your image path 'images/backbutton_appbar.png', // Replace with your image path
fit: BoxFit.contain, fit: BoxFit.contain,
color: Color(0XFFFFFFFF), color: Color(0XFFFFFFFF),
height: 24, height: 24,
width: 24, width: 24,
), ),
), ),
), ),
@ -123,9 +121,10 @@ class _AcceptOrderRequestsState extends State<AcceptOrderRequests> {
children: [ children: [
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Container( Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), padding: const EdgeInsets.symmetric(
horizontal: 8, vertical: 4),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Color(0XFFFFFFFF), color: Color(0XFFFFFFFF),
borderRadius: BorderRadius.circular(4), borderRadius: BorderRadius.circular(4),
@ -134,26 +133,30 @@ class _AcceptOrderRequestsState extends State<AcceptOrderRequests> {
width: 0.5, width: 0.5,
), ),
), ),
child: Text( child: Text(widget.status.status,
widget.status.status, style: fontTextStyle(
style: fontTextStyle(12, widget.status.statusColor, FontWeight.w500) 12,
), widget.status.statusColor,
FontWeight.w500)),
), ),
Text( Text(
widget.order.building_name, widget.order.building_name,
style: fontTextStyle(20, const Color(0XFF2D2E30), FontWeight.w600), style: fontTextStyle(
20, const Color(0XFF2D2E30), FontWeight.w600),
), ),
SizedBox(height: 4), SizedBox(height: 4),
Text( Text(
widget.order.displayAddress, widget.order.displayAddress,
style: fontTextStyle(12, const Color(0XFF939495), FontWeight.w400), style: fontTextStyle(
12, const Color(0XFF939495), FontWeight.w400),
), ),
], ],
), ),
const Spacer(), const Spacer(),
Text( Text(
widget.order.distanceInKm.toString()+'Km', widget.order.distanceInKm.toString() + 'Km',
style: fontTextStyle(12, const Color(0XFF939495), FontWeight.w400), style: fontTextStyle(
12, const Color(0XFF939495), FontWeight.w400),
), ),
], ],
), ),
@ -161,93 +164,137 @@ class _AcceptOrderRequestsState extends State<AcceptOrderRequests> {
), ),
], ],
), ),
SizedBox(height:MediaQuery.of(context).size.height * .08,), SizedBox(
height: MediaQuery.of(context).size.height * .08,
),
/// 🔹 Order Details /// 🔹 Order Details
Padding( Padding(
padding: EdgeInsets.fromLTRB(16,0,16,0), padding: EdgeInsets.fromLTRB(16, 0, 16, 0),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
"ORDER DETAILS", "ORDER DETAILS",
style: fontTextStyle(10, const Color(0XFF2D2E30), FontWeight.w600), style: fontTextStyle(
10, const Color(0XFF2D2E30), FontWeight.w600),
),
SizedBox(
height: MediaQuery.of(context).size.height * .011,
), ),
SizedBox(height:MediaQuery.of(context).size.height * .011,),
_detailTwoRow( _detailTwoRow(
"Tanker Price", "${AppSettings.formDouble(widget.order.quoted_amount) ?? ''}","images/financialsBottomIcon.png", "Tanker Price",
"", "","" "${AppSettings.formDouble(widget.order.quoted_amount) ?? ''}",
"images/financialsBottomIcon.png",
"",
"",
""),
SizedBox(
height: MediaQuery.of(context).size.height * .02,
), ),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
_detailTwoRow( _detailTwoRow(
"Water Type", "${widget.order.type_of_water}","images/water.png", "Water Type",
"Date of Delivery", "${widget.order.time}","images/calendar_appbar.png", "${widget.order.type_of_water}",
"images/water.png",
"Date of Delivery",
"${widget.order.time}",
"images/calendar_appbar.png",
),
SizedBox(
height: MediaQuery.of(context).size.height * .02,
), ),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
_detailTwoRow( _detailTwoRow(
"Capacity", "${widget.order.capacity}","images/capacity.png", "Capacity",
"Time of Delivery", "${widget.order.averageTime}","images/time.png", "${widget.order.capacity}",
"images/capacity.png",
"Time of Delivery",
"${widget.order.averageTime}",
"images/time.png",
),
SizedBox(
height: MediaQuery.of(context).size.height * .02,
), ),
SizedBox(height:MediaQuery.of(context).size.height * .02,),
_detailTwoRow( _detailTwoRow(
"Quantity", "${widget.order.quantity}","images/quantity.png", "Quantity",
"Booking Charges", advance.toString(),"images/advance.png", "${widget.order.quantity}",
"images/quantity.png",
"Booking Charges",
advance.toString(),
"images/advance.png",
), ),
], ],
), ),
), ),
SizedBox(height:MediaQuery.of(context).size.height * .008,), SizedBox(
height: MediaQuery.of(context).size.height * .008,
),
/// 🔹 Additional Details /// 🔹 Additional Details
Padding( Padding(
padding: EdgeInsets.fromLTRB(16,0,16,16), padding: EdgeInsets.fromLTRB(16, 0, 16, 16),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
"ADDITIONAL DETAILS", "ADDITIONAL DETAILS",
style: fontTextStyle(10, const Color(0XFF2D2E30), FontWeight.w600), style: fontTextStyle(
), 10, const Color(0XFF2D2E30), FontWeight.w600),
SizedBox(height:MediaQuery.of(context).size.height * .011,), ),
Text( SizedBox(
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, " height: MediaQuery.of(context).size.height * .011,
"sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " ),
"Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut " Text(
"aliquip ex ea commodo consequat.", "Lorem ipsum dolor sit amet, consectetur adipiscing elit, "
style: fontTextStyle(12, const Color(0XFF646566), FontWeight.w400), "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. "
), "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut "
], "aliquip ex ea commodo consequat.",
) style: fontTextStyle(
12, const Color(0XFF646566), FontWeight.w400),
),
), ],
)),
/// 🔹 Payment Summary /// 🔹 Payment Summary
Padding( Padding(
padding: EdgeInsets.fromLTRB(16,0,16,16), padding: EdgeInsets.fromLTRB(16, 0, 16, 16),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
"PAYMENT SUMMARY", "PAYMENT SUMMARY",
style: fontTextStyle(10, const Color(0XFF2D2E30), FontWeight.w600), style: fontTextStyle(
10, const Color(0XFF2D2E30), FontWeight.w600),
), ),
SizedBox(height:MediaQuery.of(context).size.height * .011,), SizedBox(
_detailRow("Tanker Price", "${AppSettings.formDouble(widget.order.quoted_amount) ?? ''}"), height: MediaQuery.of(context).size.height * .011,
SizedBox(height:MediaQuery.of(context).size.height * .004,), ),
_detailRow("Booking Charges", ""+advance.toString()), _detailRow("Tanker Price",
SizedBox(height:MediaQuery.of(context).size.height * .004,), "${AppSettings.formDouble(widget.order.quoted_amount) ?? ''}"),
_detailRow("Total Amount", ""+totalFare.toString()), SizedBox(
SizedBox(height:MediaQuery.of(context).size.height * .004,), height: MediaQuery.of(context).size.height * .004,
Divider(color: Color(0XFF646566), ),
thickness: 0.3,), _detailRow("Booking Charges", "" + advance.toString()),
SizedBox(height:MediaQuery.of(context).size.height * .004,), SizedBox(
_detailRow("Booking Charges Payable",'${AppSettings.formDouble(advancePayable.toString()) ?? ''}' height: MediaQuery.of(context).size.height * .004,
),
), _detailRow("Total Amount", "" + totalFare.toString()),
SizedBox(height:MediaQuery.of(context).size.height * .004,), SizedBox(
_detailRow("Amount to Pay (After Delivery)", '${AppSettings.formDouble(amountToPayAfterDelivery.toString()) ?? ''}' height: MediaQuery.of(context).size.height * .004,
), ),
Divider(
color: Color(0XFF646566),
thickness: 0.3,
),
SizedBox(
height: MediaQuery.of(context).size.height * .004,
),
_detailRow("Booking Charges Payable",
'${AppSettings.formDouble(advancePayable.toString()) ?? ''}'),
SizedBox(
height: MediaQuery.of(context).size.height * .004,
),
_detailRow("Amount to Pay (After Delivery)",
'${AppSettings.formDouble(amountToPayAfterDelivery.toString()) ?? ''}'),
], ],
), ),
), ),
@ -259,104 +306,164 @@ class _AcceptOrderRequestsState extends State<AcceptOrderRequests> {
/// 🔹 Bottom Action Buttons /// 🔹 Bottom Action Buttons
bottomNavigationBar: Container( bottomNavigationBar: Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Color(0XFFFFFFFF), color: Color(0XFFFFFFFF),
border: Border(top: BorderSide(color: Color(0XFFF5F6F6))), border: Border(top: BorderSide(color: Color(0XFFF5F6F6))),
), ),
child: Row( child: Row(
children: [ children: [
Expanded( Expanded(
child: OutlinedButton( child: OutlinedButton(
style: OutlinedButton.styleFrom( style: OutlinedButton.styleFrom(
foregroundColor: Color(0XFF000000), foregroundColor: Color(0XFF000000),
backgroundColor: Color(0xFFF1F1F1), backgroundColor: Color(0xFFF1F1F1),
side: BorderSide(color: Color(0xFFF1F1F1)), side: BorderSide(color: Color(0xFFF1F1F1)),
padding: EdgeInsets.symmetric(vertical: 10), // uniform height padding:
), EdgeInsets.symmetric(vertical: 10), // uniform height
onPressed: () { ),
Navigator.push( onPressed: () {
context, Navigator.push(
MaterialPageRoute( context,
builder: (_) => EditOrderRequests( MaterialPageRoute(
order: widget.order, builder: (_) => EditOrderRequests(
advance: advance.toString(), order: widget.order,
status: widget.status, advance: advance.toString(),
status: widget.status,
),
), ),
), );
); },
}, child: Row(
child: Row( mainAxisAlignment: MainAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center, children: [
children: [ Image.asset('images/edit.png', height: 20, width: 20),
Image.asset('images/edit.png', height: 20, width: 20), SizedBox(width: 4),
SizedBox(width: 4), Text(
Text( "Edit Order",
"Edit Order", style: fontTextStyle(
style: fontTextStyle(14, const Color(0XFF000000), FontWeight.w400), 14, const Color(0XFF000000), FontWeight.w400),
), ),
], ],
),
), ),
), ),
), SizedBox(width: 8),
Expanded(
SizedBox(width: 8), child: OutlinedButton(
style: OutlinedButton.styleFrom(
Expanded( foregroundColor: Color(0XFFE2483D),
child: OutlinedButton( backgroundColor: Colors.white,
style: OutlinedButton.styleFrom( side: BorderSide(color: Color(0XFFE2483D)),
foregroundColor: Color(0XFFE2483D), padding: EdgeInsets.symmetric(vertical: 10),
backgroundColor: Colors.white, ),
side: BorderSide(color: Color(0XFFE2483D)), onPressed: ()async {
padding: EdgeInsets.symmetric(vertical: 10), AppSettings.preLoaderDialog(context);
),
onPressed: () {}, bool isOnline = await AppSettings.internetConnectivity();
child: Row(
mainAxisAlignment: MainAxisAlignment.center, if (isOnline) {
children: [ var payload = new Map<String, dynamic>();
Image.asset('images/cross.png', height: 20, width: 20), payload["supplierId"] = AppSettings.supplierId;
SizedBox(width: 4), payload["amount"] = int.parse(widget.order.quoted_amount);
Text( payload["delivery_charges"] = advance;
"Reject", payload["action"] = 'reject';
style: fontTextStyle(14, const Color(0XFF000000), FontWeight.w400),
), bool status = await AppSettings.acceptOrderRequests(
], payload, widget.order.dbId);
try {
if (status) {
Navigator.of(context,rootNavigator: true).pop();
AppSettings.longSuccessToast("Order request rejected Successfully");
Navigator.pop(context, true);
}
else{
Navigator.of(context,rootNavigator: true).pop();
AppSettings.longFailedToast("reject of order request Failed");
}
} catch (e) {
Navigator.of(context,rootNavigator: true).pop();
print(e);
}
}
else{
Navigator.of(context,rootNavigator: true).pop();
AppSettings.longFailedToast("Please Check internet");
}
},
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset('images/cross.png', height: 20, width: 20),
SizedBox(width: 4),
Text(
"Reject",
style: fontTextStyle(
14, const Color(0XFF000000), FontWeight.w400),
),
],
),
), ),
), ),
), SizedBox(width: 8),
Expanded(
SizedBox(width: 8), child: ElevatedButton(
style: ElevatedButton.styleFrom(
Expanded( backgroundColor: Color(0XFF0A9E04),
child: ElevatedButton( foregroundColor: Color(0XFFFFFFFF),
style: ElevatedButton.styleFrom( padding: EdgeInsets.symmetric(vertical: 10),
backgroundColor: Color(0XFF0A9E04), ),
foregroundColor: Color(0XFFFFFFFF), onPressed: () async {
padding: EdgeInsets.symmetric(vertical: 10), AppSettings.preLoaderDialog(context);
),
onPressed: () { bool isOnline = await AppSettings.internetConnectivity();
if (isOnline) {
var payload = new Map<String, dynamic>();
}, payload["supplierId"] = AppSettings.supplierId;
child: Row( payload["amount"] = int.parse(widget.order.quoted_amount);
mainAxisAlignment: MainAxisAlignment.center, payload["delivery_charges"] = advance;
children: [ payload["action"] = 'accept';
Image.asset('images/rite.png', height: 20, width: 20),
SizedBox(width: 4), bool status = await AppSettings.acceptOrderRequests(
Text( payload, widget.order.dbId);
"Accept",
style: fontTextStyle(14, const Color(0XFFFFFFFF), FontWeight.w400), try {
), if (status) {
], Navigator.of(context,rootNavigator: true).pop();
Navigator.pop(context, true);
}
else{
Navigator.of(context,rootNavigator: true).pop();
AppSettings.longFailedToast("Accept of order request Failed");
}
} catch (e) {
Navigator.of(context,rootNavigator: true).pop();
print(e);
}
}
else{
Navigator.of(context,rootNavigator: true).pop();
AppSettings.longFailedToast("Please Check internet");
}
},
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset('images/rite.png', height: 20, width: 20),
SizedBox(width: 4),
Text(
"Accept",
style: fontTextStyle(
14, const Color(0XFFFFFFFF), FontWeight.w400),
),
],
),
), ),
), ),
), ],
], )),
)
),
); );
} }
@ -367,24 +474,28 @@ class _AcceptOrderRequestsState extends State<AcceptOrderRequests> {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text(title, Text(
style: fontTextStyle(12, const Color(0XFF646566), FontWeight.w400),), title,
Text(value, style: fontTextStyle(12, const Color(0XFF646566), FontWeight.w400),
style: fontTextStyle(12, const Color(0XFF2D2E30), FontWeight.w500),), ),
Text(
value,
style: fontTextStyle(12, const Color(0XFF2D2E30), FontWeight.w500),
),
], ],
), ),
); );
} }
Widget _detailTwoRow( Widget _detailTwoRow(
String title1, String title1,
String value1, String value1,
String path1, String path1,
String title2, String title2,
String value2, String value2,
String path2, { String path2, {
EdgeInsetsGeometry padding = const EdgeInsets.symmetric(vertical: 6), EdgeInsetsGeometry padding = const EdgeInsets.symmetric(vertical: 6),
}) { }) {
final titleStyle = fontTextStyle(12, Color(0XFF646566), FontWeight.w400); final titleStyle = fontTextStyle(12, Color(0XFF646566), FontWeight.w400);
final valueStyle = fontTextStyle(12, Color(0XFF343637), FontWeight.w500); final valueStyle = fontTextStyle(12, Color(0XFF343637), FontWeight.w500);
@ -408,8 +519,14 @@ class _AcceptOrderRequestsState extends State<AcceptOrderRequests> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text(t, style: titleStyle, maxLines: 1, overflow: TextOverflow.ellipsis), Text(t,
Text(v, style: valueStyle, maxLines: 1, overflow: TextOverflow.ellipsis), style: titleStyle,
maxLines: 1,
overflow: TextOverflow.ellipsis),
Text(v,
style: valueStyle,
maxLines: 1,
overflow: TextOverflow.ellipsis),
], ],
), ),
) )
@ -430,7 +547,4 @@ class _AcceptOrderRequestsState extends State<AcceptOrderRequests> {
), ),
); );
} }
} }

@ -212,8 +212,40 @@ class _EditOrderRequestsState extends State<EditOrderRequests> {
borderRadius: BorderRadius.circular(24), // <-- radius here borderRadius: BorderRadius.circular(24), // <-- radius here
), ),
), ),
onPressed: () { onPressed: () async{
AppSettings.preLoaderDialog(context);
bool isOnline = await AppSettings.internetConnectivity();
if (isOnline) {
var payload = new Map<String, dynamic>();
payload["supplierId"] = AppSettings.supplierId;
payload["amount"] = int.parse(widget.order.quoted_amount);
payload["delivery_charges"] = widget.advance;
payload["action"] = 'accept';
bool status = await AppSettings.acceptOrderRequests(
payload, widget.order.dbId);
try {
if (status) {
Navigator.of(context,rootNavigator: true).pop();
Navigator.pop(context, true);
Navigator.pop(context, true);
}
else{
Navigator.of(context,rootNavigator: true).pop();
AppSettings.longFailedToast("Accept of order request Failed");
}
} catch (e) {
Navigator.of(context,rootNavigator: true).pop();
print(e);
}
}
else{
Navigator.of(context,rootNavigator: true).pop();
AppSettings.longFailedToast("Please Check internet");
}
}, },
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,

@ -43,11 +43,25 @@ class _OrderRequestsPageState extends State<OrderRequestsPage> {
} }
/// 🔹 Helper to get status based on order time /// 🔹 Helper to get status based on order time
Map<String, dynamic> getOrderStatus(String orderTimeStr) { Map<String, dynamic> getOrderStatus(String orderTimeStr, String dbStatus) {
String status = "Invalid time"; String status = "Invalid time";
Color color = Colors.grey; Color color = Colors.grey;
if (orderTimeStr.isEmpty) return {"status": status, "color": color}; final dbLower = (dbStatus ?? "").toLowerCase().trim();
// Statuses that ignore time
if (dbLower == "reject") return {"status": "Rejected", "color": const Color(0XFFE2483D)};
if (dbLower == "accept") return {"status": "Accepted", "color": const Color(0XFF0A9E04)};
if (dbLower == "delivered") return {"status": "Delivered", "color": const Color(0XFF2E7D32)};
if (dbLower == "cancelled" || dbLower == "cancelled_by_user" || dbLower == "cancelled_by_supplier") {
return {"status": "Cancelled", "color": const Color(0XFF757575)};
}
// Time-based status (only if not rejected/accepted/etc.)
if (orderTimeStr.isEmpty) {
// fallback for pending without time
return {"status": "Pending", "color": const Color(0XFFE56910)};
}
try { try {
final format = DateFormat("dd-MM-yyyy HH:mm"); final format = DateFormat("dd-MM-yyyy HH:mm");
@ -55,29 +69,30 @@ class _OrderRequestsPageState extends State<OrderRequestsPage> {
final now = DateTime.now(); final now = DateTime.now();
final difference = now.difference(orderTime); final difference = now.difference(orderTime);
if (difference.inHours < 2) { if (difference.inMinutes < 2) {
status = "New"; status = "New";
color = const Color(0XFF1D7AFC); // Blue color = const Color(0XFF1D7AFC); // Blue
} else if (difference.inHours < 240) { } else if (difference.inMinutes < 30) {
int remaining = 240 - difference.inHours; final remaining = 30 - difference.inMinutes;
status = "Expires in ${remaining}h"; status = "Expires in ${remaining}m"; // show time for pending
if (difference.inHours < 6) { color = difference.inMinutes < 10
color = const Color(0XFFE56910); // Less urgent ? const Color(0XFFE56910)
} else { : const Color(0XFFE2483D);
color = const Color(0XFFE2483D); // More urgent } else {
} // Expired overrides pending
}
else {
status = "Expired"; status = "Expired";
color = const Color(0XFF757575); // Grey color = const Color(0XFF757575);
} }
} catch (e) { } catch (e) {
debugPrint("⚠️ Error parsing time: $e"); debugPrint("⚠️ Error parsing time: $e");
status = "Invalid time";
color = Colors.grey;
} }
return {"status": status, "color": color}; return {"status": status, "color": color};
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@ -100,7 +115,7 @@ class _OrderRequestsPageState extends State<OrderRequestsPage> {
itemCount: orderRequestsList.length, itemCount: orderRequestsList.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final order = orderRequestsList[index]; final order = orderRequestsList[index];
final statusMap = getOrderStatus(order.time ?? ""); final statusMap = getOrderStatus(order.time ?? "", order.status ?? "");
final status = statusMap['status']; final status = statusMap['status'];
final color = statusMap['color']; final color = statusMap['color'];
@ -113,20 +128,26 @@ class _OrderRequestsPageState extends State<OrderRequestsPage> {
price: "${AppSettings.formDouble(order.quoted_amount) ?? ''}", price: "${AppSettings.formDouble(order.quoted_amount) ?? ''}",
); );
final isExpired = status.toLowerCase() == "expired"; final noNavigateStatuses = ["expired", "rejected", "accepted", "delivered", "cancelled"];
final disableNavigation = noNavigateStatuses.contains(status.toLowerCase());
final card = OrderCard(order: cardModel); final card = OrderCard(order: cardModel);
return isExpired return disableNavigation
? card ? card // just show the card, no tap
: GestureDetector( : GestureDetector(
onTap: () { onTap: () async {
Navigator.push( final result = await Navigator.push(
context, context,
MaterialPageRoute( MaterialPageRoute(
builder: (_) => AcceptOrderRequests(order: order,status:cardModel), builder: (context) => AcceptOrderRequests(order: order, status: cardModel),
), ),
); );
// If result indicates API reload
if (result == true) {
_fetchOrders();
}
}, },
child: card, child: card,
); );

@ -16,6 +16,8 @@ class OrderRequestsModel {
double lng=0; double lng=0;
double distanceInMeters=0; double distanceInMeters=0;
double distanceInKm=0.0; double distanceInKm=0.0;
String dbId = '';
String status='';
OrderRequestsModel(); OrderRequestsModel();
@ -23,13 +25,18 @@ class OrderRequestsModel {
OrderRequestsModel rtvm = new OrderRequestsModel(); OrderRequestsModel rtvm = new OrderRequestsModel();
rtvm.building_name = json['customer_details']['buildingName'] ?? ''; rtvm.building_name = json['customer_details']['buildingName'] ?? '';
rtvm.dbId = json['_id']?? '';
rtvm.address = json['customer_details']['profile']['address1'] ?? ''; rtvm.address = json['customer_details']['profile']['address1'] ?? '';
rtvm.type_of_water = json['type_of_water'] ?? ''; rtvm.type_of_water = json['type_of_water'] ?? '';
rtvm.capacity = json['capacity'] ?? ''; rtvm.capacity = json['capacity'] ?? '';
rtvm.quantity = json['quantity']?? ''; rtvm.quantity = json['quantity']?? '';
rtvm.averageTime = json['time'] ?? ''; rtvm.averageTime = json['time'] ?? '';
rtvm.time = json['my_supplier_entry']['time'] ?? ''; rtvm.time = json['my_supplier_entry']['time'] ?? '';
rtvm.status = json['my_supplier_entry']['status'] ?? '';
rtvm.quoted_amount = json['my_supplier_entry']['quoted_amount'].toString() ?? ''; rtvm.quoted_amount = json['my_supplier_entry']['quoted_amount'].toString() ?? '';
rtvm.lng=json['customer_details']['longitude'] ?? 0.0;
rtvm.lat=json['customer_details']['latitude'] ?? 0.0;
// Split and trim // Split and trim
List<String> parts = rtvm.address.split(',').map((e) => e.trim()).toList(); List<String> parts = rtvm.address.split(',').map((e) => e.trim()).toList();
@ -37,13 +44,20 @@ class OrderRequestsModel {
if (parts.length >= 2) { if (parts.length >= 2) {
rtvm.displayAddress = parts[parts.length -4]; // "Banjara Hills" rtvm.displayAddress = parts[parts.length -4]; // "Banjara Hills"
} }
rtvm.distanceInMeters = double.parse((Geolocator.distanceBetween( // Distance in meters
rtvm.distanceInMeters = double.parse(
Geolocator.distanceBetween(
rtvm.lat, rtvm.lat,
rtvm.lng, rtvm.lng,
AppSettings.supplierLatitude, AppSettings.supplierLatitude,
AppSettings.supplierLongitude AppSettings.supplierLongitude,
) / 1000).toStringAsFixed(2)); ).toStringAsFixed(2),
rtvm.distanceInKm = double.parse(( rtvm.distanceInMeters / 1000).toStringAsFixed(1)); );
// Distance in km
rtvm.distanceInKm = double.parse(
(rtvm.distanceInMeters / 1000).toStringAsFixed(2),
);
return rtvm; return rtvm;
} }

Loading…
Cancel
Save