Files
daily_mobileapp_customer/lib/modules/orders/getcustomerorders.dart
2026-05-26 18:01:57 +05:30

223 lines
7.0 KiB
Dart

class OrderResponse {
final List<Order> orders;
OrderResponse({required this.orders});
factory OrderResponse.fromJson(Map<String, dynamic> json) {
return OrderResponse(
orders: (json['orders'] as List? ?? [])
.map((e) => Order.fromJson(e))
.toList(),
);
}
}
class Order {
final int orderheaderid;
final String orderid;
final String orderstatus;
final DateTime? orderdate;
final String? ordernotes;
final String? deliverytime;
final String? pending;
final String? processing;
final String? ready;
final String? delivered;
final String? cancelled;
final double? deliverycharge;
final String? kms;
final String? pickupaddress;
final String? pickupcustomer;
final String? pickupcontactno;
final String? pickupcity;
final String? deliveryaddress;
final String? deliverylat;
final String? deliverylong;
final String? deliverycustomer;
final String? deliverycontactno;
// ✅ Flat tenant fields (used directly in UI)
final String? tenantname;
final String? tenanttoken;
final String? tenantcontactno;
final String? tenantpostcode;
final String? tenantsuburb;
final String? tenantcity;
final String? tenantimage;
final String? registrationno;
final String? gstno;
// ✅ Flat tenant location fields
final String? locationname;
final String? locationcontactno;
final String? locationpostcode;
final String? locationsuburb;
final String? locationcity;
// ✅ App location
final String? applocationname;
// ✅ Financial
final double? totaltaxamount;
// ✅ Order details as a LIST (UI iterates over this)
final List<OrderDetail>? orderdetails;
Order({
required this.orderheaderid,
required this.orderid,
required this.orderstatus,
this.orderdate,
this.ordernotes,
this.deliverytime,
this.pending,
this.processing,
this.ready,
this.delivered,
this.cancelled,
this.deliverycharge,
this.kms,
this.pickupaddress,
this.pickupcustomer,
this.pickupcontactno,
this.pickupcity,
this.deliveryaddress,
this.deliverylat,
this.deliverylong,
this.deliverycustomer,
this.deliverycontactno,
this.tenantname,
this.tenanttoken,
this.tenantcontactno,
this.tenantpostcode,
this.tenantsuburb,
this.tenantcity,
this.tenantimage,
this.registrationno,
this.gstno,
this.locationname,
this.locationcontactno,
this.locationpostcode,
this.locationsuburb,
this.locationcity,
this.applocationname,
this.totaltaxamount,
this.orderdetails,
});
factory Order.fromJson(Map<String, dynamic> json) {
// ✅ Safely extract nested objects if present
final tenant = json['tenant'] as Map<String, dynamic>? ?? {};
final tenantlocation = json['tenantlocation'] as Map<String, dynamic>? ?? {};
final applocation = json['applocation'] as Map<String, dynamic>? ?? {};
// ✅ Parse orderdate safely
DateTime? parsedDate;
final rawDate = json['orderdate'];
if (rawDate != null && rawDate.toString().isNotEmpty) {
try {
parsedDate = DateTime.parse(rawDate.toString());
} catch (_) {
parsedDate = null;
}
}
// ✅ Safe parser — API may return orderdetails as {}, [], or null
List<OrderDetail> parseOrderDetails(dynamic raw) {
if (raw == null) return [];
if (raw is List) return raw.map((e) => OrderDetail.fromJson(e as Map<String, dynamic>)).toList();
if (raw is Map<String, dynamic>) return [OrderDetail.fromJson(raw)];
return [];
}
return Order(
orderheaderid: json['orderheaderid'] ?? 0,
orderid: json['orderid'] ?? '',
orderstatus: json['orderstatus'] ?? 'pending',
orderdate: parsedDate,
ordernotes: json['ordernotes'],
deliverytime: json['deliverytime'],
pending: json['pending'],
processing: json['processing'],
ready: json['ready'],
delivered: json['delivered'],
cancelled: json['cancelled'],
deliverycharge: (json['deliverycharge'] ?? 0).toDouble(),
kms: json['kms'],
pickupaddress: json['pickupaddress'] ?? '',
pickupcustomer: json['pickupcustomer'] ?? '',
pickupcontactno: json['pickupcontactno'] ?? '',
pickupcity: json['pickupcity'] ?? '',
deliveryaddress: json['deliveryaddress'] ?? '',
deliverylat: json['deliverylat']?.toString(),
deliverylong: json['deliverylong']?.toString(),
deliverycustomer: json['deliverycustomer'] ?? '',
deliverycontactno: json['deliverycontactno'] ?? '',
// ✅ Try flat field first, fallback to nested tenant object
tenantname: json['tenantname'] ?? tenant['tenantname'] ?? 'Unknown Store',
tenanttoken: json['tenanttoken'] ?? tenant['tenanttoken'] ?? '',
tenantcontactno: json['tenantcontactno'] ?? tenant['tenantcontactno'] ?? '',
tenantpostcode: json['tenantpostcode'] ?? tenant['tenantpostcode'] ?? '',
tenantsuburb: json['tenantsuburb'] ?? tenant['tenantsuburb'] ?? '',
tenantcity: json['tenantcity'] ?? tenant['tenantcity'] ?? '',
tenantimage: json['tenantimage'] ?? tenant['tenantimage'],
registrationno: json['registrationno'] ?? tenant['registrationno'] ?? '',
gstno: json['gstno'] ?? tenant['gstno'] ?? '',
locationname: json['locationname'] ?? tenantlocation['locationname'] ?? '',
locationcontactno: json['locationcontactno'] ?? tenantlocation['locationcontactno'] ?? '',
locationpostcode: json['locationpostcode'] ?? tenantlocation['locationpostcode'] ?? '',
locationsuburb: json['locationsuburb'] ?? tenantlocation['locationsuburb'] ?? '',
locationcity: json['locationcity'] ?? tenantlocation['locationcity'] ?? '',
applocationname: json['applocationname'] ?? applocation['locationname'] ?? '',
totaltaxamount: (json['totaltaxamount'] ?? 0).toDouble(),
// ✅ Handles Map {}, List [], or null safely
orderdetails: parseOrderDetails(json['orderdetails']),
);
}
}
class OrderDetail {
final int orderdetailid;
final String? productname;
final int? orderqty;
final double? price;
final double? productsumprice; // ✅ used for total amount calculation in UI
final double? discountamount; // ✅ used in OrderDetailsPage
final String? productimage; // ✅ used in OrderDetailsPage
OrderDetail({
required this.orderdetailid,
this.productname,
this.orderqty,
this.price,
this.productsumprice,
this.discountamount,
this.productimage,
});
factory OrderDetail.fromJson(Map<String, dynamic> json) {
return OrderDetail(
orderdetailid: json['orderdetailid'] ?? 0,
productname: json['productname'] ?? 'Unknown Product',
orderqty: json['orderqty'] ?? 0,
price: (json['price'] ?? 0).toDouble(),
// ✅ fallback to price if productsumprice not in response
productsumprice: (json['productsumprice'] ?? json['price'] ?? 0).toDouble(),
discountamount: (json['discountamount'] ?? 0).toDouble(),
productimage: json['productimage'] ?? json['image'],
);
}
}