class OrderResponse { final List orders; OrderResponse({required this.orders}); factory OrderResponse.fromJson(Map 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? 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 json) { // ✅ Safely extract nested objects if present final tenant = json['tenant'] as Map? ?? {}; final tenantlocation = json['tenantlocation'] as Map? ?? {}; final applocation = json['applocation'] as Map? ?? {}; // ✅ 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 parseOrderDetails(dynamic raw) { if (raw == null) return []; if (raw is List) return raw.map((e) => OrderDetail.fromJson(e as Map)).toList(); if (raw is Map) 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 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'], ); } }