Compare commits

...

1 Commits
rita ... main

Author SHA1 Message Date
4ff7b02d84 1)pending file changes 2024-10-22 15:45:48 +05:30
3 changed files with 627 additions and 310 deletions

View File

@ -1,72 +1,345 @@
// import 'package:cheminova/models/rd_order_item_model.dart';
//
// class SingleGetOrderModel {
// final String id;
// String? paymentMode;
// String? shipTo;
// String? billTo;
// List<RDOrderItem>? orderItem;
// double? subtotal;
// double? gstTotal;
// double? grandTotal;
// String? status;
// List<dynamic>? invoices;
// AddedBy? addedBy;
// String? pd;
// bool? isCancelled;
// bool? isDelivered;
// String? deliveredDate;
// DateTime? statusUpdatedAt;
// String? uniqueId;
// DateTime? createdAt;
// DateTime? updatedAt;
//
// SingleGetOrderModel({
// required this.id,
// this.paymentMode,
// this.shipTo,
// this.billTo,
// this.orderItem,
// this.subtotal,
// this.gstTotal,
// this.grandTotal,
// this.status,
// this.invoices,
// this.addedBy,
// this.pd,
// this.isCancelled,
// this.isDelivered,
// this.deliveredDate,
// this.statusUpdatedAt,
// this.uniqueId,
// this.createdAt,
// this.updatedAt,
// });
//
// factory SingleGetOrderModel.fromJson(Map<String, dynamic> json) {
// return SingleGetOrderModel(
// id: json['_id'] ?? '',
// paymentMode: json['paymentMode'] ?? '',
// shipTo: json['shipTo'] ?? '',
// billTo: json['billTo'] ?? '',
// orderItem: (json['orderItem'] as List<dynamic>?)
// ?.map((item) => RDOrderItem.fromJson(item))
// .toList() ??
// [],
// subtotal: (json['subtotal'] as num?)?.toDouble() ?? 0.0,
// gstTotal: (json['gstTotal'] as num?)?.toDouble() ?? 0.0,
// grandTotal: (json['grandTotal'] as num?)?.toDouble() ?? 0.0,
// status: json['status'] ?? '',
// invoices: json['invoices'] ?? [],
// addedBy: AddedBy.fromJson(json['addedBy'] ?? {}),
// pd: json['pd'] ?? '',
// isCancelled: json['iscancelled'] ?? false,
// isDelivered: json['isDelivered'] ?? false,
// deliveredDate: json['DeliveredDate'] ?? '',
// statusUpdatedAt: DateTime.parse(json['statusUpdatedAt'] ?? DateTime.now().toString()),
// uniqueId: json['uniqueId'] ?? '',
// createdAt: DateTime.parse(json['createdAt'] ?? DateTime.now().toString()),
// updatedAt: DateTime.parse(json['updatedAt'] ?? DateTime.now().toString()),
// );
// }
//
// Map<String, dynamic> toJson() {
// return {
// '_id': id,
// 'paymentMode': paymentMode,
// 'shipTo': shipTo,
// 'billTo': billTo,
// 'orderItem': orderItem?.map((item) => item.toJson()).toList(),
// 'subtotal': subtotal,
// 'gstTotal': gstTotal,
// 'grandTotal': grandTotal,
// 'status': status,
// 'invoices': invoices,
// 'addedBy': addedBy?.toJson(),
// 'pd': pd,
// 'iscancelled': isCancelled,
// 'isDelivered': isDelivered,
// 'DeliveredDate': deliveredDate,
// 'statusUpdatedAt': statusUpdatedAt?.toIso8601String(),
// 'uniqueId': uniqueId,
// 'createdAt': createdAt?.toIso8601String(),
// 'updatedAt': updatedAt?.toIso8601String(),
// };
// }
//
// @override
// String toString() {
// return 'SingleGetOrderModel(id: $id, paymentMode: $paymentMode, shipTo: $shipTo, billTo: $billTo, '
// 'orderItem: $orderItem, subtotal: $subtotal, gstTotal: $gstTotal, grandTotal: $grandTotal, '
// 'status: $status, invoices: $invoices, addedBy: $addedBy, pd: $pd, '
// 'isCancelled: $isCancelled, isDelivered: $isDelivered, deliveredDate: $deliveredDate, '
// 'statusUpdatedAt: $statusUpdatedAt, uniqueId: $uniqueId, createdAt: $createdAt, updatedAt: $updatedAt)';
// }
// }
//
// class OrderItem {
// final String productId;
// final String sku;
// final String name;
// final String categoryName;
// final String brandName;
// final int price; // Use int for price
// final int gst; // Use int for GST
// final int hsnCode; // Use int for HSN Code
// final String description;
// final List<String> image; // Assuming images are stored as a list of strings
// final int quantity;
// final int remainingQuantity;
// int? processQuantity;
// final String id; // Use String for _id
//
// OrderItem({
// required this.productId,
// required this.sku,
// required this.name,
// required this.categoryName,
// required this.brandName,
// required this.price,
// required this.gst,
// required this.hsnCode,
// required this.description,
// required this.image,
// required this.quantity,
// required this.remainingQuantity,
// this.processQuantity = 1,
// required this.id,
// });
//
// factory OrderItem.fromJson(Map<String, dynamic> json) {
// return OrderItem(
// productId: json['productId'] ?? '',
// sku: json['SKU'] ?? '',
// name: json['name'] ?? '',
// categoryName: json['categoryName'] ?? '',
// brandName: json['brandName'] ?? '',
// price: (json['price'] as num?)?.toInt() ?? 0, // Handle as num
// gst: (json['GST'] as num?)?.toInt() ?? 0, // Handle as num
// hsnCode: (json['HSN_Code'] as num?)?.toInt() ?? 0, // Handle as num
// description: json['description'] ?? '',
// image: List<String>.from(json['image'] ?? []),
// quantity: (json['quantity'] as num?)?.toInt() ?? 0, // Handle as num
// remainingQuantity: (json['remainingQuantity'] as num?)?.toInt() ?? 0, // Handle as num
// processQuantity: (json['processQuantity']as num?)?.toInt()??0,
// id: json['_id'] ?? '',
// );
// }
//
// Map<String, dynamic> toJson() {
// return {
// 'productId': productId,
// 'SKU': sku,
// 'name': name,
// 'categoryName': categoryName,
// 'brandName': brandName,
// 'price': price,
// 'GST': gst,
// 'HSN_Code': hsnCode,
// 'description': description,
// 'image': image,
// 'quantity': quantity,
// 'remainingQuantity': remainingQuantity,
// '_id': id,
// };
// }
//
// @override
// String toString() {
// return 'OrderItem(productId: $productId, SKU: $sku, name: $name, categoryName: $categoryName, '
// 'brandName: $brandName, price: $price, GST: $gst, HSN_Code: $hsnCode, '
// 'description: $description, image: $image, quantity: $quantity, '
// 'remainingQuantity: $remainingQuantity, id: $id)';
// }
// }
//
// class AddedBy {
// final String id;
// final String designation;
// final String name;
// final String email;
// final String mobileNumber;
// final String principalDistributor;
// final String addedBy;
// final String userType;
// final String kyc;
// String? fcmToken;
// final DateTime createdAt;
// final DateTime updatedAt;
// final String mappedSC;
// final String uniqueId;
// final String mappedTM;
//
// AddedBy({
// required this.id,
// required this.designation,
// required this.name,
// required this.email,
// required this.mobileNumber,
// required this.principalDistributor,
// required this.addedBy,
// required this.userType,
// required this.kyc,
// this.fcmToken,
// required this.createdAt,
// required this.updatedAt,
// required this.mappedSC,
// required this.uniqueId,
// required this.mappedTM,
// });
//
// factory AddedBy.fromJson(Map<String, dynamic> json) {
// return AddedBy(
// id: json['_id'] ?? '',
// designation: json['designation'] ?? '',
// name: json['name'] ?? '',
// email: json['email'] ?? '',
// mobileNumber: json['mobile_number'] ?? '',
// principalDistributor: json['principal_distributer'] ?? '',
// addedBy: json['addedBy'] ?? '',
// userType: json['userType'] ?? '',
// kyc: json['kyc'] ?? '',
// fcmToken: json['fcm_token']?.toString(), // Handle null safely
// createdAt: DateTime.parse(json['createdAt'] ?? DateTime.now().toString()),
// updatedAt: DateTime.parse(json['updatedAt'] ?? DateTime.now().toString()),
// mappedSC: json['mappedSC'] ?? '',
// uniqueId: json['uniqueId'] ?? '',
// mappedTM: json['mappedTM'] ?? '',
// );
// }
//
// Map<String, dynamic> toJson() {
// return {
// '_id': id,
// 'designation': designation,
// 'name': name,
// 'email': email,
// 'mobile_number': mobileNumber,
// 'principal_distributer': principalDistributor,
// 'addedBy': addedBy,
// 'userType': userType,
// 'kyc': kyc,
// 'fcm_token': fcmToken,
// 'createdAt': createdAt.toIso8601String(),
// 'updatedAt': updatedAt.toIso8601String(),
// 'mappedSC': mappedSC,
// 'uniqueId': uniqueId,
// 'mappedTM': mappedTM,
// };
// }
//
// @override
// String toString() {
// return 'AddedBy(id: $id, designation: $designation, name: $name, email: $email, '
// 'mobileNumber: $mobileNumber, principalDistributor: $principalDistributor, '
// 'addedBy: $addedBy, userType: $userType, kyc: $kyc, '
// 'fcmToken: $fcmToken, createdAt: $createdAt, updatedAt: $updatedAt, '
// 'mappedSC: $mappedSC, uniqueId: $uniqueId, mappedTM: $mappedTM)';
// }
// }
import 'dart:convert';
import 'package:cheminova/models/rd_order_item_model.dart';
// Main model for the order
class SingleGetOrderModel {
final String id;
String? paymentMode;
String? shipTo;
String? billTo;
List<RDOrderItem>? orderItem;
double? subtotal;
double? gstTotal;
double? grandTotal;
String? status;
List<dynamic>? invoices;
AddedBy? addedBy;
String? pd;
bool? isCancelled;
bool? isDelivered;
String? deliveredDate;
DateTime? statusUpdatedAt;
String? uniqueId;
DateTime? createdAt;
DateTime? updatedAt;
String id;
String paymentMode;
String shipTo;
String billTo;
List<RDOrderItem> orderItem;
double subtotal;
double gstTotal;
double grandTotal;
String status;
List<Invoice> invoices;
AddedBy addedBy;
String pd;
bool isCancelled;
bool isDelivered;
String deliveredDate;
String statusUpdatedAt;
String uniqueId;
String createdAt;
String updatedAt;
SingleGetOrderModel({
required this.id,
this.paymentMode,
this.shipTo,
this.billTo,
this.orderItem,
this.subtotal,
this.gstTotal,
this.grandTotal,
this.status,
this.invoices,
this.addedBy,
this.pd,
this.isCancelled,
this.isDelivered,
this.deliveredDate,
this.statusUpdatedAt,
this.uniqueId,
this.createdAt,
this.updatedAt,
required this.paymentMode,
required this.shipTo,
required this.billTo,
required this.orderItem,
required this.subtotal,
required this.gstTotal,
required this.grandTotal,
required this.status,
required this.invoices,
required this.addedBy,
required this.pd,
required this.isCancelled,
required this.isDelivered,
required this.deliveredDate,
required this.statusUpdatedAt,
required this.uniqueId,
required this.createdAt,
required this.updatedAt,
});
factory SingleGetOrderModel.fromJson(Map<String, dynamic> json) {
return SingleGetOrderModel(
id: json['_id'] ?? '',
paymentMode: json['paymentMode'] ?? '',
shipTo: json['shipTo'] ?? '',
billTo: json['billTo'] ?? '',
orderItem: (json['orderItem'] as List<dynamic>?)
?.map((item) => RDOrderItem.fromJson(item))
.toList() ??
[],
subtotal: (json['subtotal'] as num?)?.toDouble() ?? 0.0,
gstTotal: (json['gstTotal'] as num?)?.toDouble() ?? 0.0,
grandTotal: (json['grandTotal'] as num?)?.toDouble() ?? 0.0,
status: json['status'] ?? '',
invoices: json['invoices'] ?? [],
addedBy: AddedBy.fromJson(json['addedBy'] ?? {}),
pd: json['pd'] ?? '',
isCancelled: json['iscancelled'] ?? false,
isDelivered: json['isDelivered'] ?? false,
deliveredDate: json['DeliveredDate'] ?? '',
statusUpdatedAt: DateTime.parse(json['statusUpdatedAt'] ?? DateTime.now().toString()),
uniqueId: json['uniqueId'] ?? '',
createdAt: DateTime.parse(json['createdAt'] ?? DateTime.now().toString()),
updatedAt: DateTime.parse(json['updatedAt'] ?? DateTime.now().toString()),
id: json['_id']??"1",
paymentMode: json['paymentMode']??"2343",
shipTo: json['shipTo']??"abc",
billTo: json['billTo']??"xyz",
orderItem: (json['orderItem'] as List)
.map((i) => RDOrderItem.fromJson(i))
.toList(),
subtotal: json['subtotal'].toDouble(),
gstTotal: json['gstTotal'].toDouble(),
grandTotal: json['grandTotal'].toDouble(),
status: json['status'],
invoices: (json['invoices'] as List)
.map((i) => Invoice.fromJson(i))
.toList(),
addedBy: AddedBy.fromJson(json['addedBy']??""),
pd: json['pd']??"",
isCancelled: json['iscancelled']??"",
isDelivered: json['isDelivered']??"",
deliveredDate: json['DeliveredDate']??"",
statusUpdatedAt: json['statusUpdatedAt']??"",
uniqueId: json['uniqueId']??"",
createdAt: json['createdAt']??"",
updatedAt: json['updatedAt']??"",
);
}
@ -76,51 +349,109 @@ class SingleGetOrderModel {
'paymentMode': paymentMode,
'shipTo': shipTo,
'billTo': billTo,
'orderItem': orderItem?.map((item) => item.toJson()).toList(),
'orderItem': orderItem.map((i) => i.toJson()).toList(),
'subtotal': subtotal,
'gstTotal': gstTotal,
'grandTotal': grandTotal,
'status': status,
'invoices': invoices,
'addedBy': addedBy?.toJson(),
'invoices': invoices.map((i) => i.toJson()).toList(),
'addedBy': addedBy.toJson(),
'pd': pd,
'iscancelled': isCancelled,
'isDelivered': isDelivered,
'DeliveredDate': deliveredDate,
'statusUpdatedAt': statusUpdatedAt?.toIso8601String(),
'statusUpdatedAt': statusUpdatedAt,
'uniqueId': uniqueId,
'createdAt': createdAt?.toIso8601String(),
'updatedAt': updatedAt?.toIso8601String(),
'createdAt': createdAt,
'updatedAt': updatedAt,
};
}
@override
String toString() {
return 'SingleGetOrderModel(id: $id, paymentMode: $paymentMode, shipTo: $shipTo, billTo: $billTo, '
'orderItem: $orderItem, subtotal: $subtotal, gstTotal: $gstTotal, grandTotal: $grandTotal, '
'status: $status, invoices: $invoices, addedBy: $addedBy, pd: $pd, '
'isCancelled: $isCancelled, isDelivered: $isDelivered, deliveredDate: $deliveredDate, '
'statusUpdatedAt: $statusUpdatedAt, uniqueId: $uniqueId, createdAt: $createdAt, updatedAt: $updatedAt)';
}
}
class OrderItem {
final String productId;
final String sku;
final String name;
final String categoryName;
final String brandName;
final int price; // Use int for price
final int gst; // Use int for GST
final int hsnCode; // Use int for HSN Code
final String description;
final List<String> image; // Assuming images are stored as a list of strings
final int quantity;
final int remainingQuantity;
int? processQuantity;
final String id; // Use String for _id
// Model for individual order items
OrderItem({
// Model for invoices
class Invoice {
Map<String, String> courierStatusTimeline;
String id;
String invoiceId;
String orderId;
List<InvoiceItem> items;
double subtotal;
double gstTotal;
double invoiceAmount;
String courierStatus;
int v;
String courierName;
String courierTrackingId;
Invoice({
required this.courierStatusTimeline,
required this.id,
required this.invoiceId,
required this.orderId,
required this.items,
required this.subtotal,
required this.gstTotal,
required this.invoiceAmount,
required this.courierStatus,
required this.v,
required this.courierName,
required this.courierTrackingId,
});
factory Invoice.fromJson(Map<String, dynamic> json) {
return Invoice(
courierStatusTimeline: Map<String, String>.from(json['courierstatus_timeline']??""),
id: json['_id']??"",
invoiceId: json['invoiceId']??"",
orderId: json['orderId']??"",
items: (json['items'] as List)
.map((i) => InvoiceItem.fromJson(i))
.toList(),
subtotal: json['subtotal'].toDouble(),
gstTotal: json['gstTotal'].toDouble(),
invoiceAmount: json['invoiceAmount'].toDouble(),
courierStatus: json['courierStatus'],
v: json['__v'],
courierName: json['courier_name']??"",
courierTrackingId: json['courier_tracking_id']??"",
);
}
Map<String, dynamic> toJson() {
return {
'courierstatus_timeline': courierStatusTimeline,
'_id': id,
'invoiceId': invoiceId,
'orderId': orderId,
'items': items.map((i) => i.toJson()).toList(),
'subtotal': subtotal,
'gstTotal': gstTotal,
'invoiceAmount': invoiceAmount,
'courierStatus': courierStatus,
'__v': v,
'courier_name': courierName,
'courier_tracking_id': courierTrackingId,
};
}
}
// Model for items in an invoice
class InvoiceItem {
String productId;
String sku;
String name;
String categoryName;
String brandName;
double price;
double gst;
int hsnCode;
int processQuantity;
String id;
InvoiceItem({
required this.productId,
required this.sku,
required this.name,
@ -129,30 +460,22 @@ class OrderItem {
required this.price,
required this.gst,
required this.hsnCode,
required this.description,
required this.image,
required this.quantity,
required this.remainingQuantity,
this.processQuantity = 1,
required this.processQuantity,
required this.id,
});
factory OrderItem.fromJson(Map<String, dynamic> json) {
return OrderItem(
productId: json['productId'] ?? '',
sku: json['SKU'] ?? '',
name: json['name'] ?? '',
categoryName: json['categoryName'] ?? '',
brandName: json['brandName'] ?? '',
price: (json['price'] as num?)?.toInt() ?? 0, // Handle as num
gst: (json['GST'] as num?)?.toInt() ?? 0, // Handle as num
hsnCode: (json['HSN_Code'] as num?)?.toInt() ?? 0, // Handle as num
description: json['description'] ?? '',
image: List<String>.from(json['image'] ?? []),
quantity: (json['quantity'] as num?)?.toInt() ?? 0, // Handle as num
remainingQuantity: (json['remainingQuantity'] as num?)?.toInt() ?? 0, // Handle as num
processQuantity: (json['processQuantity']as num?)?.toInt()??0,
id: json['_id'] ?? '',
factory InvoiceItem.fromJson(Map<String, dynamic> json) {
return InvoiceItem(
productId: json['productId']??"",
sku: json['SKU']??"",
name: json['name']??"",
categoryName: json['categoryName']??"",
brandName: json['brandName']??"",
price: json['price'].toDouble(),
gst: json['GST'].toDouble(),
hsnCode: json['HSN_Code']??"",
processQuantity: json['processquantity']??"",
id: json['_id']??"",
);
}
@ -166,23 +489,13 @@ class OrderItem {
'price': price,
'GST': gst,
'HSN_Code': hsnCode,
'description': description,
'image': image,
'quantity': quantity,
'remainingQuantity': remainingQuantity,
'processquantity': processQuantity,
'_id': id,
};
}
@override
String toString() {
return 'OrderItem(productId: $productId, SKU: $sku, name: $name, categoryName: $categoryName, '
'brandName: $brandName, price: $price, GST: $gst, HSN_Code: $hsnCode, '
'description: $description, image: $image, quantity: $quantity, '
'remainingQuantity: $remainingQuantity, id: $id)';
}
}
//Model for the user who added the order
class AddedBy {
final String id;
final String designation;
@ -229,7 +542,8 @@ class AddedBy {
addedBy: json['addedBy'] ?? '',
userType: json['userType'] ?? '',
kyc: json['kyc'] ?? '',
fcmToken: json['fcm_token']?.toString(), // Handle null safely
fcmToken: json['fcm_token']?.toString(),
// Handle null safely
createdAt: DateTime.parse(json['createdAt'] ?? DateTime.now().toString()),
updatedAt: DateTime.parse(json['updatedAt'] ?? DateTime.now().toString()),
mappedSC: json['mappedSC'] ?? '',
@ -267,3 +581,8 @@ class AddedBy {
'mappedSC: $mappedSC, uniqueId: $uniqueId, mappedTM: $mappedTM)';
}
}
// Function to parse the JSON string and create a SingleOrder object
SingleGetOrderModel parseSingleOrder(String jsonString) {
final jsonData = json.decode(jsonString);
return SingleGetOrderModel.fromJson(jsonData);
}

View File

@ -33,14 +33,14 @@ import '../../utils/show_snackbar.dart';
class RdOrderPendingScreenDetailScreen extends StatefulWidget {
//final Product? productModel;
// PlacedOrderList and PlacedOrderModel are optional parameters passed to this screen
SingleGetOrderModel? placedOrderList;
GetRdPendingModel? productpendingModel;
final SingleGetOrderModel? placedOrderList;
// GetRdPendingModel? productpendingModel;
final String orderId;
GetInvoiceModel? placeInvoiceList;
// GetInvoiceModel? placeInvoiceList;
// PlacedOrderModel? placedOrderModel;
// Constructor for initializing the screen with placed order details
RdOrderPendingScreenDetailScreen({super.key,this.placedOrderList,required this.orderId,this.placeInvoiceList});
RdOrderPendingScreenDetailScreen({super.key,this.placedOrderList,required this.orderId});
@override
State<RdOrderPendingScreenDetailScreen> createState() =>
@ -214,7 +214,7 @@ class _RdOrderPendingScreenDetailScreenState
// Notify user about successful cancellation
showSnackbar("Order cancelled successfully");
Get.to(RdCancelledScreen());
Get.to(RdCancelledScreen());
// Update the status in your UI or backend to reflect the cancelled state
setState(() {});
@ -279,8 +279,8 @@ class _RdOrderPendingScreenDetailScreenState
// Place the order and catch any errors
await controller.placeRDOrder();
showSnackbar("Order processed and invoice created successfully");
Get.to(RdOrderProcessingScreen());
showSnackbar("Order processed and invoice created successfully");
Get.to(RdOrderProcessingScreen());
//Navigator.of(context).pop();
// Close the dialog after a short delay
@ -324,7 +324,28 @@ class _RdOrderPendingScreenDetailScreenState
}
@override
Widget build(BuildContext context) {
// int remainingQuantity = (widget.placedOrderList!.orderItem![0].quantity)! -(widget.placedOrderList!.orderItem![0].remainingQuantity!.toInt());
if (widget.placedOrderList == null) {
return Center(child: Text('No order details available'));
}
// Safely get the order and invoice list
final order = widget.placedOrderList!;
final invoices = order.invoices;
// Check if the invoices list contains at least 4 items
List<String>? invoiceIds;
if (invoices.isNotEmpty) {
// Ensure there are at least 4 invoices
if (invoices.length >= 4) {
// Get the ID of the 4th invoice (index 3)
invoiceIds = [invoices[3].invoiceId!]; // Assuming invoiceId is a String
} else {
invoiceIds = []; // Fallback if not enough invoices
}
} else {
invoiceIds = []; // Fallback if no invoices available
}
//int remainingQuantity = (widget.placedOrderList!.orderItem![0].quantity)! -(widget.placedOrderList!.orderItem![0].remainingQuantity!.toInt());
return Scaffold(
extendBodyBehindAppBar: true,
appBar: AppBar(
@ -384,13 +405,13 @@ class _RdOrderPendingScreenDetailScreenState
children: [
Card(
child: Column(
child:
Column(
children: [
SizedBox(
width: Get.width,
child: Padding(
padding:
const EdgeInsets.fromLTRB(8, 8, 8, 0),
padding: const EdgeInsets.fromLTRB(8, 8, 8, 0),
child: Text(
"Invoices",
style: GoogleFonts.roboto(
@ -400,171 +421,149 @@ class _RdOrderPendingScreenDetailScreenState
),
),
),
SizedBox(
width: Get.width,
child: Padding(
padding:
const EdgeInsets.fromLTRB(8, 8, 8, 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"Invoice ID:",
style: GoogleFonts.roboto(
fontSize: Get.width * 0.04,
fontWeight: FontWeight.bold,
),
),
Text(widget.placeInvoiceList!.invoiceId.toString()),
// Text(widget.placedOrderList!.uniqueId),
],
),
),
),
SizedBox(
width: Get.width,
child: Padding(
padding: const EdgeInsets.fromLTRB(8, 8, 8, 0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Displaying each invoice in a separate card
if (widget.placedOrderList!.invoices.isNotEmpty)
...widget.placedOrderList!.invoices.map((invoice) {
return Card(
margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 8),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Invoice ID
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"Invoice ID:",
style: GoogleFonts.roboto(
fontSize: Get.width * 0.04,
fontWeight: FontWeight.bold,
),
),
Text(invoice.invoiceId.toString()),
],
),
const SizedBox(height: 10), // Add spacing
Text(
"Items: ",
style: GoogleFonts.roboto(
fontSize: Get.width * 0.04,
fontWeight: FontWeight.bold,
),
),
SizedBox(height: 10), // Add spacing between the title and the list of items
Column(
children: widget.placeInvoiceList!.items!.map((item) {
// Items for this invoice
Text(
"Items: ",
style: GoogleFonts.roboto(
fontSize: Get.width * 0.04,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 10), // Add spacing between title and items
return Padding(
padding: const EdgeInsets.symmetric(vertical: 4.0), // Add some spacing between items
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text(
"${item.name.toString()} (${item.sku.toString()})",
style: GoogleFonts.roboto(
fontSize: Get.width * 0.03,
// List of items in this invoice
Column(
children: invoice.items!.map((item) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 4.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text(
"${item.name.toString()} (${item.sku.toString()})",
style: GoogleFonts.roboto(
fontSize: Get.width * 0.03,
),
overflow: TextOverflow.ellipsis,
),
),
overflow: TextOverflow.ellipsis, // Handle long text
Text("x ${item.processQuantity.toString()}"),
],
),
);
}).toList(),
),
const SizedBox(height: 10), // Add spacing between sections
// Sub Total
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"Sub Total:",
style: GoogleFonts.roboto(
fontSize: Get.width * 0.04,
fontWeight: FontWeight.bold,
),
),
Text("${invoice.subtotal}"),
],
),
// GST
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"GST:",
style: GoogleFonts.roboto(
fontSize: Get.width * 0.04,
fontWeight: FontWeight.bold,
),
),
Text("${invoice.gstTotal}"),
],
),
// Invoice Amount
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"Invoice Amount:",
style: GoogleFonts.roboto(
fontSize: Get.width * 0.04,
fontWeight: FontWeight.bold,
),
),
Text("${invoice.invoiceAmount}"),
],
),
// Courier Status
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"Courier Status:",
style: GoogleFonts.roboto(
fontSize: Get.width * 0.04,
fontWeight: FontWeight.bold,
),
),
ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
foregroundColor: Colors.white,
backgroundColor: _getCourierStatusColor(invoice.courierStatus.toString()),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
),
Text("x ${item.processQuantity.toString()}"),
],
),
);
}).toList(),
child: Text(
capitalizeFirstLetter(invoice.courierStatus.toString()),
),
),
],
),
],
),
],
),
),
),
SizedBox(
width: Get.width,
child: Padding(
padding:
const EdgeInsets.fromLTRB(8, 8, 8, 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"Sub Total : ",
style: GoogleFonts.roboto(
fontSize: Get.width * 0.04,
fontWeight: FontWeight.bold,
),
),
Text("${widget.placeInvoiceList!.subtotal}"),
],
),
),
),
SizedBox(
width: Get.width,
child: Padding(
padding:
const EdgeInsets.fromLTRB(8, 8, 8, 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"GST : ",
style: GoogleFonts.roboto(
fontSize: Get.width * 0.04,
fontWeight: FontWeight.bold,
),
),
Text("${widget.placeInvoiceList!.gstTotal}"),
],
),
),
),
SizedBox(
width: Get.width,
child: Padding(
padding:
const EdgeInsets.fromLTRB(8, 8, 8, 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"Invoice Amount: ",
style: GoogleFonts.roboto(
fontSize: Get.width * 0.04,
fontWeight: FontWeight.bold,
),
),
Text("${widget.placeInvoiceList!.invoiceAmount}"),
],
),
),
),
SizedBox(
width: Get.width,
child: Padding(
padding:
const EdgeInsets.fromLTRB(8, 8, 8, 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"Courier Status : ",
style: GoogleFonts.roboto(
fontSize: Get.width * 0.04,
fontWeight: FontWeight.bold,
),
),
ElevatedButton(
onPressed: (){},
// Get.to(() =>
// RdOrderDetailScreen(
// placedOrderList: uniqueOrders[index])), // Navigate to detail screen
style: ElevatedButton.styleFrom(
foregroundColor: Colors.white,
backgroundColor:_getCourierStatusColor(widget.placeInvoiceList!.courierStatus.toString()),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10)),
),
child: Text(capitalizeFirstLetter(widget.placeInvoiceList!.courierStatus.toString()),
// Text(widget.placedOrderList!.status.toString())
//Text(widget.placedOrderList!.status, style: GoogleFonts.roboto(fontSize: 14, fontWeight: FontWeight.w400)),
),
//Text("${widget.placedOrderList!.gstTotal}"),
)],
),
),
),
),
);
}).toList(),
],
),
),
const SizedBox(height: 8),
const SizedBox(height: 8),
@ -591,12 +590,12 @@ class _RdOrderPendingScreenDetailScreenState
Expanded(
child: ListView.builder(
padding: EdgeInsets.zero,
itemCount: widget.placedOrderList?.orderItem!.length ?? 0,
itemCount: order.orderItem!.length ?? 0,
itemBuilder: (context, index) {
final orderItem = widget.placedOrderList!.orderItem![index];
final orderItem =order.orderItem![index];
final subTotal = orderItem.price * orderItem.quantity!.toInt();
final GstTotalAmount = (orderItem.price * orderItem.quantity!.toInt()) *(orderItem.gst/100 );
final grandTotal = subTotal + GstTotalAmount;
final GstTotalAmount = (orderItem.price * orderItem.quantity!.toInt()) *(orderItem.gst/100 );
final grandTotal = subTotal + GstTotalAmount;
return orderItem != null
? Card(
margin: const EdgeInsets.symmetric(vertical: 5.0),
@ -678,14 +677,14 @@ class _RdOrderPendingScreenDetailScreenState
Expanded(
child: ListView.builder(
padding: EdgeInsets.zero,
itemCount: widget.placedOrderList?.orderItem
itemCount: order.orderItem
?.where((item) => item.remainingQuantity! > 0)
.length ?? 0,
itemBuilder: (context, index) {
// Filter items with non-zero quantities
final filteredItems = widget.placedOrderList!.orderItem!
final filteredItems =order!.orderItem!
.where((item) => item.remainingQuantity! > 0)
.toList();
@ -775,7 +774,7 @@ class _RdOrderPendingScreenDetailScreenState
fontWeight: FontWeight.w500,
),
),
Text(capitalizeFirstLetter(widget.placeInvoiceList!.orderId!.paymentMode.toString())),
Text(capitalizeFirstLetter(widget.placedOrderList!.paymentMode.toString())),
// Text("${widget.placedOrderList!.paymentMode}",maxLines: 4,
// overflow:TextOverflow.ellipsis,)
],
@ -808,7 +807,7 @@ class _RdOrderPendingScreenDetailScreenState
),
SizedBox(width: Get.width*0.01,),
//Text(capitalizeFirstLetter(widget.placedOrderList!.status)),
Text(capitalizeFirstLetter(widget.placedOrderList!.status.toString()),maxLines: 4,
Text(capitalizeFirstLetter(order!.status.toString()),maxLines: 4,
overflow:TextOverflow.ellipsis,)
],
),
@ -1014,12 +1013,12 @@ class simple extends State<RdOrderPendingScreenDetailScreen> {
onPressed: () {},
style: ElevatedButton.styleFrom(
foregroundColor: Colors.white,
backgroundColor: _getCourierStatusColor(widget.placeInvoiceList!.courierStatus.toString()), // Call the method here
backgroundColor: _getCourierStatusColor(widget.placedOrderList!.invoices[0]!.courierStatus.toString()), // Call the method here
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
),
child: Text(widget.placeInvoiceList!.courierStatus.toString()),
child: Text(widget.placedOrderList!.invoices[0]!.courierStatus.toString()),
),
],
),

View File

@ -4,6 +4,7 @@ import 'package:cheminova/controller/rd_get_order_controller.dart';
import 'package:cheminova/controller/rd_processing_invoice_controller.dart';
import 'package:cheminova/models/get_rd_pennding_model.dart';
import 'package:cheminova/models/rd_get_order_model.dart';
import 'package:cheminova/models/single_get_order_model.dart';
import 'package:cheminova/screens/rd%20orders/rd_order_details_screen.dart';
import 'package:cheminova/screens/rd%20orders/rd_order_details_update.dart';
import 'package:cheminova/screens/rd%20orders/rd_pending_deatils.dart';
@ -88,9 +89,6 @@ class _RdOrderPendingScreenState extends State<RdOrderPendingScreen> {
// Fetch orders and ensure you wait for it to complete
await _getRdPendingController.getRDPendingProduct();
// await _getRDProcessingInvoiceController.getRDProcessingInvoiceProduct();
// await _getSingleInvoiceController.fetchInvoice(_getRDProcessingInvoiceController.productProcessingRDList[0].id);
// Log the count of fetched orders
print('Fetched orders count: ${_getRdPendingController.productRDList.length}');
@ -100,23 +98,23 @@ class _RdOrderPendingScreenState extends State<RdOrderPendingScreen> {
if (index >= 0 && index < _getRdPendingController.productRDList.length) {
// Get the order ID from the list based on the index
final orderId = _getRdPendingController.productRDList[index].id;
final invoiceId = _getRdPendingController.productRDList[index].invoices[0];
final invoiceId = _getRdPendingController.productRDList[index].invoices[0];
// Retrieve the token from SharedPreferences
SharedPreferences prefs = await SharedPreferences.getInstance();
String? token = prefs.getString('token');
// Check if the token is not null
if (token != null) {
// Fetch the single order using the order ID, and avoid caching issues
final singleOrder = await GetSingleProductService().getSingleOrder(token, orderId);
final singleInvoice = await GetSingleInvoiceService().fetchInvoice(token, invoiceId.toString());
// Fetch the single order using the order ID
final SingleGetOrderModel? singleOrder = await GetSingleProductService().getSingleOrder(token, orderId);
// Check if the single order was fetched successfully
if (singleOrder != null) {
// Navigate to the details screen with the fetched order
Get.to(() => RdOrderPendingScreenDetailScreen(
placedOrderList: singleOrder,
placedOrderList: singleOrder, // Pass the single order instance
orderId: orderId,
placeInvoiceList: singleInvoice,
));
} else {
@ -144,6 +142,7 @@ class _RdOrderPendingScreenState extends State<RdOrderPendingScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(