From ff065bdc1691a0ee8febd272caa8b937bb1606a2 Mon Sep 17 00:00:00 2001 From: saritabirare Date: Tue, 22 Oct 2024 10:36:49 +0530 Subject: [PATCH] 1) annaucement api integration done 2)Billto and shipTo api integration --- lib/controller/annaucement_service.dart | 58 ++- lib/controller/notification_api_service.dart | 66 +-- lib/controller/notification_controller.dart | 51 +-- lib/controller/product_service.dart | 5 +- lib/controller/rd_processing_service.dart | 7 +- lib/controller/shiptoandbillto_service.dart | 39 ++ lib/controller/shiptobilltoController.dart | 99 +++++ lib/models/annauncement_model.dart | 92 +++- lib/models/notification_model.dart | 72 ++- lib/models/shiping_billing_address_model.dart | 62 +++ lib/screens/annauncement/annauncement.dart | 41 +- .../notification/notification_screen.dart | 96 +++- .../rd orders/partial_pending_dialog.dart | 10 +- .../partial_processing_dialog_screen.dart | 12 +- .../rd_delivered_details_screen.dart | 322 ++++++-------- .../rd orders/rd_delivered_screen.dart | 73 +++- .../rd_dispatched_details_screen.dart | 359 +++++++-------- .../rd orders/rd_dispatched_scree.dart | 76 +++- .../rd orders/rd_order_details_update.dart | 19 +- lib/screens/rd orders/rd_order_screen.dart | 3 +- lib/screens/rd orders/rd_pending_deatils.dart | 411 +++++++++--------- lib/screens/rd orders/rd_pending_screen.dart | 13 +- .../rd orders/rd_processing_details.dart | 331 +++++--------- .../rd orders/rd_processing_screen.dart | 3 +- lib/utils/api_urls.dart | 7 +- lib/utils/common_api_service.dart | 1 + lib/widgets/common_appbar.dart | 4 +- 27 files changed, 1293 insertions(+), 1039 deletions(-) create mode 100644 lib/controller/shiptoandbillto_service.dart create mode 100644 lib/controller/shiptobilltoController.dart create mode 100644 lib/models/shiping_billing_address_model.dart diff --git a/lib/controller/annaucement_service.dart b/lib/controller/annaucement_service.dart index 7da95a1..a5562b2 100644 --- a/lib/controller/annaucement_service.dart +++ b/lib/controller/annaucement_service.dart @@ -2,25 +2,59 @@ import 'package:cheminova/utils/api_urls.dart'; import 'package:dio/dio.dart'; import '../models/annauncement_model.dart'; +import '../utils/common_api_service.dart'; class AnnouncementService { final Dio _dio = Dio(); - Future> fetchAnnouncements(String token) async { - final String url = ApiUrls.AnnaouncementUrl; + + Future?> fetchAnnouncements(String token) async { try { - _dio.options.headers['Authorization'] = 'Bearer $token'; - final Response response = await _dio.get(url); + String url = ApiUrls.AnnaouncementUrl; // Base URL to fetch product manuals - if (response.statusCode == 200) { - - List data = response.data; - return data.map((announcement) => AnnouncementModel.fromJson(announcement)).toList(); - } else { - throw Exception('Failed to load announcements'); - } + final response = await commonApiService>( + method: "GET", + url: url, + additionalHeaders: { // Pass the token here + 'Authorization': 'Bearer $token', + }, + fromJson: (json) { + if (json['announcements'] != null) { + // If the productManuals key is present, map the response to a list of ProductManualModel objects + final List productManuals = (json['announcements'] as List) + .map((manualJson) => AnnouncementModel.fromJson(manualJson)) + .toList(); + return productManuals; // Return the list of product manuals + } else { + return []; + } + }, + ); + return response; } catch (e) { - throw Exception('Error occurred while fetching announcements: $e'); + + print("fkfgghgh ,${e.toString()}"); + //print(e.toString()); + return null; } } + + +// Future> fetchAnnouncements(String token) async { + // final String url = ApiUrls.AnnaouncementUrl; + // try { + // _dio.options.headers['Authorization'] = 'Bearer $token'; + // final Response response = await _dio.get(url); + // + // if (response.statusCode == 200) { + // + // List data = response.data; + // return data.map((announcement) => AnnouncementModel.fromJson(announcement)).toList(); + // } else { + // throw Exception('Failed to load announcements'); + // } + // } catch (e) { + // throw Exception('Error occurred while fetching announcements: $e'); + // } + // } } diff --git a/lib/controller/notification_api_service.dart b/lib/controller/notification_api_service.dart index 6802341..343b7d1 100644 --- a/lib/controller/notification_api_service.dart +++ b/lib/controller/notification_api_service.dart @@ -1,38 +1,46 @@ +import 'package:dio/dio.dart'; import 'package:cheminova/models/notification_model.dart'; -import 'package:cheminova/utils/api_urls.dart'; -import '../utils/common_api_service.dart'; +import '../utils/api_urls.dart'; + +class NotificationService { + final Dio _dio = Dio(); + + Future?> fetchNotifications(String token, String date) async { + final String url = ApiUrls.getNotificationUrl; -class NotificationApiService { - // Function to fetch notifications from the API - Future?> getNotification(String token) async { try { - // Set the URL for fetching notifications - String url =ApiUrls.getNotificationUrl; // Base URL to fetch product manuals - // Make a GET request to the notification API - final response = await commonApiService>( - method: "GET", - url: url, - additionalHeaders: { // Pass the token here - 'Authorization': 'Bearer $token', - }, - fromJson: (json) { - if (json['notifications'] != null) { - // If notifications are present in the response, map them to NotificationModel objects - final List notification = (json['notifications'] as List) - .map((manualJson) => NotificationModel.fromJson(manualJson as Map)) - .toList(); - return notification; - } else { - return []; - } - }, + final response = await _dio.get( + url, + options: Options( + headers: { + 'Authorization': 'Bearer $token', + }, + ), + queryParameters: {'Date': date}, ); - return response; - } catch (e) { - print(e.toString()); - return null; + // Ensure the response is not void and contains expected data + if (response.statusCode == 200 && response.data != null) { + final Map data = response.data as Map; + + if (data.containsKey('success') && data['success'] == true) { + List notifications = data['notifications'] ?? []; + List notificationModels = notifications.map((notification) { + return NotificationModel.fromJson(notification); + }).toList(); + + return notificationModels; // Return the list of NotificationModel + } else { + print('Failed to fetch notifications: ${data['message'] ?? 'Unknown error'}'); + } + } else { + print('Unexpected response: ${response.statusCode}'); + } + } catch (e) { + print('Exception occurred: $e'); } + + return null; // Return null if fetching fails } } diff --git a/lib/controller/notification_controller.dart b/lib/controller/notification_controller.dart index 1c602f1..161eb68 100644 --- a/lib/controller/notification_controller.dart +++ b/lib/controller/notification_controller.dart @@ -1,50 +1,39 @@ -import 'package:cheminova/controller/notification_api_service.dart'; -import 'package:cheminova/controller/product_mannual_service.dart'; import 'package:cheminova/models/notification_model.dart'; -import 'package:cheminova/notification_service.dart'; import 'package:get/get.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import '../models/product_mannual_model.dart'; // Your model import -// Your service import +import 'notification_api_service.dart'; class NotificationController extends GetxController { - + var isLoading = false.obs; var notificationList = [].obs; - // Service to fetch data - final NotificationApiService notificationApiService = NotificationApiService(); + final NotificationService _notificationApiService = NotificationService(); - // Loading state - var isLoading = false.obs; - - // Method to fetch product manuals from the service - void fetchNotificationApiService() async { + // Function to fetch notifications from the API with the selected date + void fetchNotificationApiService(String date) async { try { - // Set loading to true - isLoading.value = true; + isLoading(true); + // Retrieve token from a secure source SharedPreferences prefs = await SharedPreferences.getInstance(); String? token = prefs.getString('token'); - var manuals = await notificationApiService.getNotification(token!); - // If data is returned, update the list - if (manuals != null) { - notificationList .value = manuals; + if (token == null) { + print("Token is null"); + return; + } + + // Fetch notifications by date + List? notifications = await _notificationApiService.fetchNotifications(token, date); + + if (notifications != null && notifications.isNotEmpty) { + notificationList.value = notifications; } else { - notificationList.value = []; // If no data, set an empty list + notificationList.clear(); } } catch (e) { - // Handle error here, for example logging or showing an error message - print("Error fetching product manuals: $e"); + print("Error fetching notifications: $e"); } finally { - // Set loading to false - isLoading.value = false; + isLoading(false); } } - - @override - void onInit() { - // Fetch product manuals when the controller is initialized - fetchNotificationApiService(); - super.onInit(); - } } diff --git a/lib/controller/product_service.dart b/lib/controller/product_service.dart index 29ffb7f..67f5f65 100644 --- a/lib/controller/product_service.dart +++ b/lib/controller/product_service.dart @@ -11,8 +11,9 @@ class ProductService { String url; // Determine the URL based on the presence of a category filter if (category != null && category.isNotEmpty) { - url = "${ApiUrls.getCategoryUrl}?page=$page&category=$category"; - } else { + url = "${ApiUrls.getallProductUrl}?page=$page&category=$category"; + } + else { url = "${ApiUrls.getallProductUrl}?page=$page"; // URL without category filter } // Make the API call using the common API service diff --git a/lib/controller/rd_processing_service.dart b/lib/controller/rd_processing_service.dart index 1760b35..0874553 100644 --- a/lib/controller/rd_processing_service.dart +++ b/lib/controller/rd_processing_service.dart @@ -28,11 +28,12 @@ class RDOrderPlacedService { ); //logger.w("Status code,${response.statusCode}"); if (response.statusCode != 200) { + showSnackbar("stock not Available"); throw Exception('Failed to RD place order'); } - else if(response.statusCode != 200 && response.statusCode == 400){ - showSnackbar("stock not Available"); - } + // else if(response.statusCode != 200 && response.statusCode == 400){ + // showSnackbar("stock not Available"); + // } } Future RDOrderCancel(String token, String orderId, String reason) async { diff --git a/lib/controller/shiptoandbillto_service.dart b/lib/controller/shiptoandbillto_service.dart new file mode 100644 index 0000000..6d0b872 --- /dev/null +++ b/lib/controller/shiptoandbillto_service.dart @@ -0,0 +1,39 @@ +import '../models/shiping_billing_address_model.dart'; +import '../utils/api_urls.dart'; +import '../utils/common_api_service.dart'; + +class ShiptoandbilltoService { + + + Future?> fetchshiptobillAddress(String token) async { + try { + String url = ApiUrls + .ShiptoandBilltoAddressUrl; // Base URL to fetch product manuals + + final response = await commonApiService>( + method: "GET", + url: url, + additionalHeaders: { // Pass the token here + 'Authorization': 'Bearer $token', + }, + fromJson: (json) { + if (json['UserShippingAddress'] != null) { + // If the productManuals key is present, map the response to a list of ProductManualModel objects + final List< + UserShippingAddress> productManuals = (json['UserShippingAddress'] as List) + .map((manualJson) => UserShippingAddress.fromJson(manualJson)) + .toList(); + return productManuals; // Return the list of product manuals + } else { + return []; + } + }, + ); + return response; + } catch (e) { + print("fkfgghgh ,${e.toString()}"); + //print(e.toString()); + return null; + } + } +} diff --git a/lib/controller/shiptobilltoController.dart b/lib/controller/shiptobilltoController.dart new file mode 100644 index 0000000..15220e0 --- /dev/null +++ b/lib/controller/shiptobilltoController.dart @@ -0,0 +1,99 @@ +// import 'package:cheminova/controller/shiptoandbillto_service.dart'; +// import 'package:cheminova/models/shiping_billing_address_model.dart'; +// import 'package:get/get.dart'; +// import 'package:shared_preferences/shared_preferences.dart'; +// +// class AddressController extends GetxController { +// final ShiptoandbilltoService _productService = ShiptoandbilltoService(); +// +// var addressList = [].obs; // Observable list of addresses +// var selectedShippingAddressId = ''.obs; +// var selectedBillingAddressId = ''.obs; +// +// @override +// void onInit() { +// super.onInit(); +// _loadAddresses(); +// } +// +// void _loadAddresses() async { +// try { +// SharedPreferences prefs = await SharedPreferences.getInstance(); +// String? token = prefs.getString('token'); +// final response = await _productService.fetchshiptobillAddress(token!); +// addressList.assignAll(response as Iterable); +// +// // Load previously selected addresses +// selectedShippingAddressId.value = prefs.getString('selectedShippingAddress') ?? ''; +// selectedBillingAddressId.value = prefs.getString('selectedBillingAddress') ?? ''; +// +// // Set the default selection to the first address if available +// if (addressList.isNotEmpty) { +// if (selectedShippingAddressId.value.isEmpty) { +// selectedShippingAddressId.value = addressList.first.id; +// } +// if (selectedBillingAddressId.value.isEmpty) { +// selectedBillingAddressId.value = addressList.first.id; +// } +// } +// } catch (e) { +// print("Exception: $e"); +// } +// } +// +// void _saveSelectedAddress() async { +// SharedPreferences prefs = await SharedPreferences.getInstance(); +// await prefs.setString('selectedShippingAddress', selectedShippingAddressId.value); +// await prefs.setString('selectedBillingAddress', selectedBillingAddressId.value); +// } +// +// void onShippingAddressChanged(String? value) { +// if (value != null) { +// selectedShippingAddressId.value = value; +// _saveSelectedAddress(); +// } +// } +// +// void onBillingAddressChanged(String? value) { +// if (value != null) { +// selectedBillingAddressId.value = value; +// _saveSelectedAddress(); +// } +// } +// } + + +import 'package:cheminova/controller/shiptoandbillto_service.dart'; +import 'package:get/get_rx/src/rx_types/rx_types.dart'; +import 'package:get/get_state_manager/src/simple/get_controllers.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import '../models/shiping_billing_address_model.dart'; + +class AddressController extends GetxController { + RxList addressList = [].obs; + RxString selectedShippingAddressId = ''.obs; + RxString selectedBillingAddressId = ''.obs; + Rx selectedShippingAddress = Rx(null); + Rx selectedBillingAddress = Rx(null); + + void fetchAddresses() async { + // Fetch the addresses from the API + SharedPreferences prefs = await SharedPreferences.getInstance(); + String? token = prefs.getString('token'); + var response = await ShiptoandbilltoService().fetchshiptobillAddress(token!); + if (response!= null) { + addressList.value = response; + } + } + + void onShippingAddressChanged(String? value) { + selectedShippingAddressId.value = value ?? ''; + selectedShippingAddress.value = addressList.firstWhere((address) => address.id == value); + } + + void onBillingAddressChanged(String? value) { + selectedBillingAddressId.value = value ?? ''; + selectedBillingAddress.value = addressList.firstWhere((address) => address.id == value,); + } +} diff --git a/lib/models/annauncement_model.dart b/lib/models/annauncement_model.dart index 0ab22d6..925b1b6 100644 --- a/lib/models/annauncement_model.dart +++ b/lib/models/annauncement_model.dart @@ -1,28 +1,84 @@ +// class AnnouncementModel { +// List? announcements; +// int? totalAnnouncements; +// +// AnnouncementModel({this.announcements, this.totalAnnouncements}); +// +// // Factory constructor to create an instance from a JSON map +// factory AnnouncementModel.fromJson(Map json) { +// return AnnouncementModel( +// announcements: json['announcements'] != null +// ? List.from(json['announcements'].map((item) => Announcement.fromJson(item))) +// : null, +// totalAnnouncements: json['totalAnnouncements']?.toString() != null +// ? int.tryParse(json['totalAnnouncements'].toString()) +// : 1, +// ); +// } +// +// // Method to convert an instance to a JSON map +// Map toJson() { +// return { +// 'announcements': announcements?.map((item) => item.toJson()).toList(), +// 'totalAnnouncements': totalAnnouncements, +// }; +// } +// +// // Overriding the toString() method for debugging purposes +// @override +// String toString() { +// return 'AnnouncementModel(announcements: $announcements, totalAnnouncements: $totalAnnouncements)'; +// } +// } + class AnnouncementModel { - final String id; - final String uniqueId; - final List sentTo; - final String message; - final DateTime createdAt; - final DateTime updatedAt; + String? id; + List? sentTo; + String? message; + String? createdAt; + String? updatedAt; + String? uniqueId; + int? version; AnnouncementModel({ - required this.id, - required this.uniqueId, - required this.sentTo, - required this.message, - required this.createdAt, - required this.updatedAt, + this.id, + this.sentTo, + this.message, + this.createdAt, + this.updatedAt, + this.uniqueId, + this.version, }); + // Factory constructor to create an instance from a JSON map factory AnnouncementModel.fromJson(Map json) { return AnnouncementModel( - id: json['_id']??"", - uniqueId: json['uniqueId']??"", - sentTo: List.from(json['sentTo']), - message: json['message']??"", - createdAt: DateTime.parse(json['createdAt']), - updatedAt: DateTime.parse(json['updatedAt']), + id: json['_id']?.toString(), + sentTo: json['sentTo'] != null ? List.from(json['sentTo']) : null, + message: json['message']?.toString(), + createdAt: json['createdAt']?.toString(), + updatedAt: json['updatedAt']?.toString(), + uniqueId: json['uniqueId']?.toString(), + version: json['__v']?.toString() != null ? int.tryParse(json['__v'].toString()) : null, ); } + + // Method to convert an instance to a JSON map + Map toJson() { + return { + '_id': id, + 'sentTo': sentTo, + 'message': message, + 'createdAt': createdAt, + 'updatedAt': updatedAt, + 'uniqueId': uniqueId, + '__v': version, + }; + } + + // Overriding the toString() method for debugging purposes + @override + String toString() { + return 'Announcement(id: $id, sentTo: $sentTo, message: $message, createdAt: $createdAt, updatedAt: $updatedAt, uniqueId: $uniqueId, version: $version)'; + } } diff --git a/lib/models/notification_model.dart b/lib/models/notification_model.dart index d39c8e2..61810b9 100644 --- a/lib/models/notification_model.dart +++ b/lib/models/notification_model.dart @@ -1,67 +1,47 @@ class NotificationModel { - String? id; - String? title; - String? msg; - String? addedFor; - String? createdAt; - String? updatedAt; - int? v; + final String id; // Notification ID + final String title; // Title of the notification + final String message; // Message of the notification + final String addedFor; // ID of the user/recipient + final DateTime createdAt; // Timestamp when created + final DateTime updatedAt; // Timestamp when updated NotificationModel({ - this.id, - this.title, - this.msg, - this.addedFor, - this.createdAt, - this.updatedAt, - this.v, + required this.id, + required this.title, + required this.message, + required this.addedFor, + required this.createdAt, + required this.updatedAt, }); + // Factory method to create a NotificationModel from JSON factory NotificationModel.fromJson(Map json) { return NotificationModel( - id: json['_id'], - title: json['title'], - msg: json['msg'], + id: json['_id'].toString(), + title: json['title'].toString(), + message: json['msg'].toString(), addedFor: json['added_for'], - createdAt: json['createdAt'], - updatedAt: json['updatedAt'], - v: json['__v'], + createdAt: DateTime.parse(json['createdAt'] as String), + updatedAt: DateTime.parse(json['updatedAt']as String), ); } + // Method to convert a NotificationModel to JSON Map toJson() { return { '_id': id, 'title': title, - 'msg': msg, + 'msg': message, 'added_for': addedFor, - 'createdAt': createdAt, - 'updatedAt': updatedAt, - '__v': v, + 'createdAt': createdAt.toIso8601String(), + 'updatedAt': updatedAt.toIso8601String(), }; } -} -class NotificationResponse { - String? returnMessage; - List? notifications; - - NotificationResponse({this.returnMessage, this.notifications}); - - factory NotificationResponse.fromJson(Map json) { - return NotificationResponse( - returnMessage: json['return_message'], - notifications: json['notifications'] != null - ? List.from(json['notifications'] - .map((notification) => NotificationModel.fromJson(notification))) - : null, - ); - } - - Map toJson() { - return { - 'return_message': returnMessage, - 'notifications': notifications?.map((notification) => notification.toJson()).toList(), - }; + // Override toString method for better readability + @override + String toString() { + return 'NotificationModel{id: $id, title: $title, message: $message, addedFor: $addedFor, createdAt: $createdAt, updatedAt: $updatedAt}'; } } diff --git a/lib/models/shiping_billing_address_model.dart b/lib/models/shiping_billing_address_model.dart new file mode 100644 index 0000000..9d5583e --- /dev/null +++ b/lib/models/shiping_billing_address_model.dart @@ -0,0 +1,62 @@ +class UserShippingAddress { + final String id; + final String street; + final String city; + final String state; + final String postalCode; + final String country; + String? panNumber; + final String tradeName; + String? gstNumber; + bool? isDefault; + + UserShippingAddress({ + required this.id, + required this.street, + required this.city, + required this.state, + required this.postalCode, + required this.country, + this.panNumber, + required this.tradeName, + this.gstNumber, + this.isDefault, + }); + + factory UserShippingAddress.fromJson(Map json) { + return UserShippingAddress( + id: json['_id'], + street: json['street'], + city: json['city'], + state: json['state'], + postalCode: json['postalCode'], + country: json['country'], + panNumber: json['panNumber'], + tradeName: json['tradeName'], + gstNumber: json['gstNumber'], + isDefault: json['isDefault'], + ); + } + + Map toJson() { + return { + '_id': id, + 'street': street, + 'city': city, + 'state': state, + 'postalCode': postalCode, + 'country': country, + 'panNumber': panNumber, + 'tradeName': tradeName, + 'gstNumber': gstNumber, + 'isDefault': isDefault, + }; + } + + +// Utility method in UserShippingAddress model to get full address as a string + //extension UserShippingAddressExtensions on UserShippingAddress { + String toStringFullAddress() { + return "$street, $city, $state, $postalCode, $country"; + } +} diff --git a/lib/screens/annauncement/annauncement.dart b/lib/screens/annauncement/annauncement.dart index 2a15e31..4cfb502 100644 --- a/lib/screens/annauncement/annauncement.dart +++ b/lib/screens/annauncement/annauncement.dart @@ -77,24 +77,33 @@ class _AnnouncementScreenState extends State { return ListView.builder( itemCount: _announcementController.announcements.length, itemBuilder: (context, index) { + final announcementList = _announcementController.announcements[index]; + print("asdf,${announcementList}"); + return Column( + children: [ + Card( + child: ListTile( + //leading:Text(_announcementController.announcements[index].id), + title: Row( + + children: [ + Text("Message :",style: TextStyle(fontWeight: FontWeight.bold,fontSize: 14),), + Text(announcementList.message.toString(),style: TextStyle(fontSize: 12),), + + ], + ), + subtitle: Row( + children: [ + Text("UniqueID :" , style: TextStyle(fontWeight: FontWeight.bold),), + Text(announcementList.uniqueId.toString()), + ], + ), + trailing: Text(formatDate(announcementList.createdAt.toString()),style: TextStyle(fontSize: 10),), + ), - return Card( - child: ListTile( - //leading:Text(_announcementController.announcements[index].id), - title: Row( - children: [ - Text("Message :",style: TextStyle(fontWeight: FontWeight.bold),), - Text(_announcementController.announcements[index].message), - ], ), - subtitle: Row( - children: [ - Text("UniqueID :" , style: TextStyle(fontWeight: FontWeight.bold),), - Text(_announcementController.announcements[index].uniqueId), - ], - ), - trailing: Text(formatDate(_announcementController.announcements[index].createdAt.toIso8601String())), - ), + + ], ); }, ); diff --git a/lib/screens/notification/notification_screen.dart b/lib/screens/notification/notification_screen.dart index 42b5fb8..990b98d 100644 --- a/lib/screens/notification/notification_screen.dart +++ b/lib/screens/notification/notification_screen.dart @@ -17,9 +17,6 @@ class NotificationScreen extends StatelessWidget { @override Widget build(BuildContext context) { - // Fetch notifications when the screen is first built - notificationController.fetchNotificationApiService(); - return CommonBackground( child: Scaffold( backgroundColor: Colors.transparent, @@ -33,14 +30,41 @@ class NotificationScreen extends StatelessWidget { padding: const EdgeInsets.only(right: 20), ), ], - title: const Text('Notification', - style: TextStyle( - fontSize: 20, - color: Colors.black, - fontWeight: FontWeight.w400, - fontFamily: 'Anek')), + title: const Text( + 'Notification', + style: TextStyle( + fontSize: 20, + color: Colors.black, + fontWeight: FontWeight.w400, + fontFamily: 'Anek', + ), + ), backgroundColor: Colors.transparent, elevation: 0, + // Add the date picker button in the app bar + bottom: PreferredSize( + preferredSize: Size.fromHeight(80), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: TextButton( + onPressed: () { + _selectDate(context); + }, + child: + Row( + children: [ + Text("Select Date: ",style: TextStyle(fontWeight: FontWeight.bold,fontSize: 18),), + IconButton( + icon: const Icon(Icons.calendar_today), + onPressed: () { + _selectDate(context); + }, + ), + ], + ), + ), + ), + ), ), drawer: MyDrawer(), body: Obx(() { @@ -58,6 +82,23 @@ class NotificationScreen extends StatelessWidget { ), ); } + + // Function to show date picker + Future _selectDate(BuildContext context) async { + DateTime? selectedDate = await showDatePicker( + context: context, + initialDate: DateTime.now(), + firstDate: DateTime(2020), // Adjust the start date as needed + lastDate: DateTime.now(), + ); + + if (selectedDate != null) { + // Format the date to dd/MM/yyyy + String formattedDate = DateFormat('dd/MM/yyyy').format(selectedDate); + // Call the API with the selected date + notificationController.fetchNotificationApiService(formattedDate); + } + } } class MyListView extends StatelessWidget { @@ -74,7 +115,7 @@ class MyListView extends StatelessWidget { // Ensure that 'notifications' is not null if (notification != null) { String date = DateFormat("dd MMM yyyy") - .format(DateTime.parse(notification.createdAt ?? '')); + .format(DateTime.parse(notification.createdAt.toString() ?? '')); if (!groupedNotifications.containsKey(date)) { groupedNotifications[date] = []; } @@ -94,15 +135,30 @@ class MyListView extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - // Display the date once - Padding( - padding: const EdgeInsets.only(bottom: 8.0), - child: Text( - date, - style: const TextStyle( - fontSize: 16, fontWeight: FontWeight.bold), + // Display the date card + Card( + elevation: 3, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + child: Padding( + padding: const EdgeInsets.all(10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + // Display the selected date + Text( + date, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ], + ), ), ), + const SizedBox(height: 10), // Display notifications for the date ...notificationsForDate.map( (notification) { @@ -115,9 +171,11 @@ class MyListView extends StatelessWidget { title: Text( notification.title ?? 'No title', style: const TextStyle( - fontSize: 17, fontWeight: FontWeight.w500), + fontSize: 17, + fontWeight: FontWeight.w500, + ), ), - subtitle: Text(notification.msg ?? 'No message'), + subtitle: Text(notification.message ?? 'No message'), ), ); }, diff --git a/lib/screens/rd orders/partial_pending_dialog.dart b/lib/screens/rd orders/partial_pending_dialog.dart index 2e03f28..2a17c73 100644 --- a/lib/screens/rd orders/partial_pending_dialog.dart +++ b/lib/screens/rd orders/partial_pending_dialog.dart @@ -4,6 +4,7 @@ import 'package:cheminova/models/rd_order_item_model.dart'; import 'package:cheminova/models/rd_placed_order_model.dart'; import 'package:cheminova/screens/order/checkout_screen.dart'; import 'package:cheminova/screens/rd%20orders/rd_pending_screen.dart'; +import 'package:cheminova/screens/rd%20orders/rd_processing_screen.dart'; import 'package:cheminova/widgets/my_drawer.dart'; import 'package:cheminova/widgets/product_card.dart'; import 'package:cheminova/widgets/product_card1.dart'; @@ -97,10 +98,11 @@ class _PartialPendingDialogScreenState extends State await controller.placeRDOrder(); showSnackbar("Partial order processed successfully."); - Future.delayed(const Duration(seconds: 1), () { - Get.to(RdOrderPendingScreen()); - //Navigator.of(context).pop(); - }); + // Close the dialog before navigating to another screen + Navigator.of(context).pop(); + + // Navigate to the pending screen + Get.to(RdOrderProcessingScreen()); setState(() {}); }, diff --git a/lib/screens/rd orders/partial_processing_dialog_screen.dart b/lib/screens/rd orders/partial_processing_dialog_screen.dart index 2fc4c61..b9aa64b 100644 --- a/lib/screens/rd orders/partial_processing_dialog_screen.dart +++ b/lib/screens/rd orders/partial_processing_dialog_screen.dart @@ -358,14 +358,12 @@ class _PartialProcessingDialogScreenState extends State createState() => @@ -419,211 +421,16 @@ class _RdDeliveredDetailsScreenState const SizedBox(height: 8), SizedBox( height: Get.height* 0.19, - child: Card( - child: Column( - children: [ - SizedBox( - width: Get.width, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Text( - "Customer Details", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.05, - fontWeight: FontWeight.w500, - ), - ), - ), - ), - SizedBox( - width: Get.width, - //height: Get.height*0.09, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Row( - children: [ - Text( - "Name: ", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.04, - fontWeight: FontWeight.bold, - ), - ), - Text("${"Roshan Garg"}",maxLines: 4, - overflow:TextOverflow.ellipsis,) - , ], - ) - ), - ), - SizedBox( - width: Get.width, - // height: Get.height*0.09, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Row( - children: [ - Text( - "Email: ", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.04, - fontWeight: FontWeight.bold, - ), - ), - Text("${"roshangarg28@gmail.com"}",maxLines: 4, - overflow:TextOverflow.ellipsis,) - , ], - ) - ), - ), - SizedBox( - width: Get.width, - // height: Get.height*0.09, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Row( - children: [ - Text( - "Mobile Number: ", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.04, - fontWeight: FontWeight.bold, - ), - ), - Text("${"8876785448"}",maxLines: 4, - overflow:TextOverflow.ellipsis,) - , ], - ) - ), - ) + child:_buildCustomerDetails(), - ], - ), - ), ), const SizedBox(height: 8), - Card( - child: Column( - children: [ - SizedBox( - width: Get.width, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Text( - "Billing Information", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.05, - fontWeight: FontWeight.w500, - ), - ), - ), - ), - SizedBox( - width: Get.width, - height: Get.height*0.06, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Wrap( - crossAxisAlignment: WrapCrossAlignment.start, - children: [ - Text( - "Address: ", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.04, - fontWeight: FontWeight.bold, - ), - ), - Text("${"456, Park Street, Kolkata, West Bengal - 700016"}",maxLines: 4, - overflow:TextOverflow.ellipsis,) - ], - ), - ), - ), + _buildBillingInfo(), - ], - ), - ), const SizedBox(height: 8), - // Card for displaying shipping information - Card( - child: Column( - children: [ - SizedBox( - width: Get.width, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Text( - "Shipping Information", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.05, - fontWeight: FontWeight.w500, - ), - ), - ), - ), - SizedBox( - width: Get.width, - height: Get.height*0.06, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Wrap( - crossAxisAlignment: WrapCrossAlignment.start, - children: [ - Text( - "Address: ", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.04, - fontWeight: FontWeight.bold, - ), - ), - Text("${"456, Park Street, Kolkata, West Bengal - 700016"}",maxLines: 4, - overflow:TextOverflow.ellipsis,) - ], - ), - ), - ), - - ], - ), - ), + _buildShippingInfo(), const SizedBox(height: 8), - Card( - child: Column( - children: [ - SizedBox( - width: Get.width, - height: Get.height*0.05, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Row( - children: [ - Text( - "Payment Mode : ", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.04, - fontWeight: FontWeight.w500, - ), - ), - Text(capitalizeFirstLetter("online-transfer")), - // Text("${widget.placedOrderList!.paymentMode}",maxLines: 4, - // overflow:TextOverflow.ellipsis,) - ], - ), - ), - ), - - - ], - ), - ), + _buildPaymentInfo(), const SizedBox(height: 8), Card( child: Column( @@ -740,4 +547,119 @@ class _RdDeliveredDetailsScreenState ), ); } + + + Widget _buildCustomerDetails() { + return Card( + child: Column( + children: [ + _buildSectionTitle("Customer Details"), + _buildRow("Name:", widget.placedInvoiceList!.orderId!.addedBy!.name.toString(), Get.width * 0.04), + _buildRow("Email:", widget.placedInvoiceList!.orderId!.addedBy!.email.toString(), Get.width * 0.04), + _buildRow("Mobile Number:", widget.placedInvoiceList!.orderId!.addedBy!.mobileNumber.toString(), Get.width * 0.04), + ], + ), + ); + } + + Widget _buildBillingInfo() { + return Card( + child: Column( + children: [ + _buildSectionTitle("Billing Information"), + _buildInfoRow("Address", widget.placedInvoiceList!.orderId!.billTo.toString(), Get.width * 0.04), + ], + ), + ); + } + + Widget _buildShippingInfo() { + return Card( + child: Column( + children: [ + _buildSectionTitle("Shipping Information"), + _buildInfoRow("Address", widget.placedInvoiceList!.orderId!.shipTo.toString(), Get.width * 0.04), + ], + ), + ); + } + + Widget _buildPaymentInfo() { + return Card( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Text( + "Payment Mode: ", + style: GoogleFonts.roboto( + fontSize: Get.width * 0.04, + fontWeight: FontWeight.w500, + ), + ), + Text(capitalizeFirstLetter(widget.placedInvoiceList!.orderId!.paymentMode.toString())), + ], + ), + ), + ); + } + + +} + + + + + +Widget _buildSectionTitle(String title) { + return SizedBox( + width: Get.width, + child: Padding( + padding: const EdgeInsets.fromLTRB(8, 8, 8, 0), + child: Text( + title, + style: GoogleFonts.roboto(fontSize: Get.width * 0.05, fontWeight: FontWeight.bold), + ), + ), + ); +} + +Widget _buildRow(String label, String value, double fontSize) { + return Padding( + padding: const EdgeInsets.fromLTRB(8, 2, 8, 2), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + label, + style: GoogleFonts.roboto(fontSize: fontSize,fontWeight: FontWeight.bold), + ), + Text( + value, + style: GoogleFonts.roboto(fontSize: fontSize), + ), + ], + ), + ); +} + +Widget _buildInfoRow(String label, String value, double fontSize) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "$label: ", + style: GoogleFonts.roboto(fontSize: fontSize, fontWeight: FontWeight.w500), + ), + Expanded( + child: Text( + value, + style: GoogleFonts.roboto(fontSize: fontSize), + ), + ), + ], + ), + ); } diff --git a/lib/screens/rd orders/rd_delivered_screen.dart b/lib/screens/rd orders/rd_delivered_screen.dart index 627153e..a251850 100644 --- a/lib/screens/rd orders/rd_delivered_screen.dart +++ b/lib/screens/rd orders/rd_delivered_screen.dart @@ -1,5 +1,6 @@ import 'package:cheminova/controller/get_delivered_controller.dart'; +import 'package:cheminova/controller/get_delivered_service.dart'; import 'package:cheminova/controller/rd_get_order_controller.dart'; import 'package:cheminova/models/get_delivered_model.dart'; import 'package:cheminova/models/rd_get_order_model.dart'; @@ -16,7 +17,9 @@ import 'package:flutter_svg/svg.dart'; import 'package:get/get.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import '../../controller/get_single_invoice_Service.dart'; import '../order_management/order_management_detail_screen.dart'; class RdDeliveredScreen extends StatefulWidget { @@ -70,11 +73,68 @@ class _RdDeliveredScreenState extends State { DateTime parsedDate = DateTime.parse(apiDate).toLocal(); // Convert to local time // Format the date and time according to your specified format - String formattedDate = DateFormat('EEE MMM dd yyyy').format(parsedDate); + String formattedDate = DateFormat('EEE MMM dd yyyy hh:mm a').format(parsedDate); + return formattedDate; // Return the formatted date string } + + + void onOrderTap(int index) async { + try { + // Fetch orders and ensure you wait for it to complete + await _getRdProductController.getRDDeliveredInvoiceProduct(); + + // Log the count of fetched orders + print('Fetched orders count: ${_getRdProductController.productProcessingRDList.length}'); + + // Check if the productRDList is populated + if (_getRdProductController.productProcessingRDList.isNotEmpty) { + // Ensure the index is valid + if (index >= 0 && index < _getRdProductController.productProcessingRDList.length) { + // Get the order ID from the list based on the index + final orderId = _getRdProductController.productProcessingRDList[index].id; + final orderId1 = _getRdProductController.productProcessingRDList[index].id; + // 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 GetSingleInvoiceService().fetchInvoice(token, orderId); + final invoiceOrder = await GetDeliveredService().getRDDeliveredProduct(token); + // Check if the single order was fetched successfully + if (singleOrder != null) { + // Navigate to the details screen with the fetched order + Get.to(() => RdDeliveredDetailsScreen( + placedOrderList: invoiceOrder![index], + placedInvoiceList: singleOrder, + )); + } else { + // Handle the case where the single order could not be fetched + Get.snackbar("Error", "Unable to fetch order details."); + } + } else { + // Handle the case where the token is null + Get.snackbar("Error", "User not authenticated."); + } + } else { + // Handle the case when the index is out of bounds + Get.snackbar("Error", "Invalid order selection."); + } + } else { + // Handle the case when the list is empty + Get.snackbar("Error", "No orders available to display."); + } + } catch (e) { + // Log any errors that occur during the process + print('Error in onOrderTap: $e'); + Get.snackbar("Error", "An unexpected error occurred."); + } + } + @override Widget build(BuildContext context) { return Scaffold( @@ -329,10 +389,13 @@ class _RdDeliveredScreenState extends State { child: Padding( padding: const EdgeInsets.all(8.0), child: ElevatedButton( - onPressed: ()=> - Get.to(() => - RdDeliveredDetailsScreen( - placedOrderList: uniqueOrders[index])), // Navigate to detail screen + onPressed: (){ + onOrderTap(index); + }, + //=> + // Get.to(() => + // RdDeliveredDetailsScreen( + // placedOrderList: uniqueOrders[index])), // Navigate to detail screen style: ElevatedButton.styleFrom( foregroundColor: Colors.white, backgroundColor: const Color(0xFF004791), diff --git a/lib/screens/rd orders/rd_dispatched_details_screen.dart b/lib/screens/rd orders/rd_dispatched_details_screen.dart index a299c2a..343ae18 100644 --- a/lib/screens/rd orders/rd_dispatched_details_screen.dart +++ b/lib/screens/rd orders/rd_dispatched_details_screen.dart @@ -1,11 +1,13 @@ import 'package:auto_size_text/auto_size_text.dart'; import 'package:cheminova/controller/get_dispatch_controller.dart'; import 'package:cheminova/controller/get_order_placed_controller.dart'; +import 'package:cheminova/controller/get_single_invoice_controller.dart'; import 'package:cheminova/models/get_dispatch_model.dart'; import 'package:cheminova/models/oder_place_model.dart'; import 'package:cheminova/models/order_item_model.dart'; import 'package:cheminova/models/place_order_list_model.dart'; import 'package:cheminova/models/rd_get_order_model.dart'; +import 'package:cheminova/screens/rd%20orders/rd_delivered_screen.dart'; import 'package:cheminova/utils/show_snackbar.dart'; import 'package:flutter/cupertino.dart'; @@ -17,6 +19,7 @@ import 'package:intl/intl.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../controller/cart_controller.dart'; +import '../../models/get_invoice_model.dart'; import '../../models/product_model1.dart'; class RdDispatchedDetailsDetailScreen extends StatefulWidget { @@ -24,8 +27,9 @@ class RdDispatchedDetailsDetailScreen extends StatefulWidget { // PlacedOrderList and PlacedOrderModel are optional parameters passed to this screen GetDispatchModel? placedOrderList; PlacedOrderModel? placedOrderModel; + GetInvoiceModel? placedInvoiceList; // Constructor for initializing the screen with placed order details - RdDispatchedDetailsDetailScreen({super.key,this.placedOrderList,this.placedOrderModel}); + RdDispatchedDetailsDetailScreen({super.key,this.placedOrderList,this.placedOrderModel,this.placedInvoiceList}); @override State createState() => @@ -38,6 +42,7 @@ class _RdDispatchedDetailsDetailScreenState // Controllers for managing cart and placed orders final CartController _cartController = Get.put(CartController()); final GetDispatchController _getPlacedOrderController = Get.put(GetDispatchController()); + final GetSingleInvoiceController _getSingleInvoiceController = Get.put(GetSingleInvoiceController()); final GetDispatchController _getDispatchController = Get.put(GetDispatchController()); final List statusOptions = [ "new", @@ -180,6 +185,7 @@ class _RdDispatchedDetailsDetailScreenState // Call your API method here await _getDispatchController.RDDispatchToDeliveredProduct(widget.placedOrderList!.id); showSnackbar("Order Status updated Order Delivered"); + } else { // Show a message if the status is not "Delivered" ScaffoldMessenger.of(context).showSnackBar( @@ -504,7 +510,7 @@ class _RdDispatchedDetailsDetailScreenState shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10)), ), - child: Text(widget.placedOrderList!.courierStatus, style: GoogleFonts.roboto(fontSize: 14, fontWeight: FontWeight.w400)), + child: Text(capitalizeFirstLetter(widget.placedOrderList!.courierStatus), style: GoogleFonts.roboto(fontSize: 14, fontWeight: FontWeight.w400)), ), //Text("₹ ${widget.placedOrderList!.gstTotal}"), ], @@ -516,214 +522,50 @@ class _RdDispatchedDetailsDetailScreenState ), + const SizedBox(height: 8), const SizedBox(height: 8), SizedBox( height: Get.height* 0.19, - child: Card( - child: Column( - children: [ - SizedBox( - width: Get.width, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Text( - "Customer Details", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.05, - fontWeight: FontWeight.w500, - ), - ), - ), - ), - SizedBox( - width: Get.width, - //height: Get.height*0.09, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Row( - children: [ - Text( - "Name: ", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.04, - fontWeight: FontWeight.bold, - ), - ), - Text("${"Roshan Garg"}",maxLines: 4, - overflow:TextOverflow.ellipsis,) - , ], - ) - ), - ), - SizedBox( - width: Get.width, - // height: Get.height*0.09, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Row( - children: [ - Text( - "Email: ", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.04, - fontWeight: FontWeight.bold, - ), - ), - Text("${"roshangarg28@gmail.com"}",maxLines: 4, - overflow:TextOverflow.ellipsis,) - , ], - ) - ), - ), - SizedBox( - width: Get.width, - // height: Get.height*0.09, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Row( - children: [ - Text( - "Mobile Number: ", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.04, - fontWeight: FontWeight.bold, - ), - ), - Text("${"8876785448"}",maxLines: 4, - overflow:TextOverflow.ellipsis,) - , ], - ) - ), - ) + child:_buildCustomerDetails(), - ], - ), - ), ), const SizedBox(height: 8), - Card( - child: Column( - children: [ - SizedBox( - width: Get.width, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Text( - "Billing Information", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.05, - fontWeight: FontWeight.w500, - ), - ), - ), - ), - SizedBox( - width: Get.width, - height: Get.height*0.06, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Wrap( - crossAxisAlignment: WrapCrossAlignment.start, - children: [ - Text( - "Address: ", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.04, - fontWeight: FontWeight.bold, - ), - ), - Text("${"456, Park Street, Kolkata, West Bengal - 700016"}",maxLines: 4, - overflow:TextOverflow.ellipsis,) - ], - ), - ), - ), + _buildBillingInfo(), - ], - ), - ), const SizedBox(height: 8), - // Card for displaying shipping information - Card( - child: Column( - children: [ - SizedBox( - width: Get.width, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Text( - "Shipping Information", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.05, - fontWeight: FontWeight.w500, - ), - ), - ), - ), - SizedBox( - width: Get.width, - height: Get.height*0.06, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Wrap( - crossAxisAlignment: WrapCrossAlignment.start, - children: [ - Text( - "Address: ", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.04, - fontWeight: FontWeight.bold, - ), - ), - Text("${"456, Park Street, Kolkata, West Bengal - 700016"}",maxLines: 4, - overflow:TextOverflow.ellipsis,) - ], - ), - ), - ), - - ], - ), - ), + _buildShippingInfo(), const SizedBox(height: 8), - Card( - child: Column( - children: [ - SizedBox( - width: Get.width, - height: Get.height*0.05, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Row( - children: [ - Text( - "Payment Mode : ", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.04, - fontWeight: FontWeight.w500, - ), - ), - Text(capitalizeFirstLetter("Cheque")), - // Text("${widget.placedOrderList!.paymentMode}",maxLines: 4, - // overflow:TextOverflow.ellipsis,) - ], - ), - ), - ), - - - ], - ), - ), + _buildPaymentInfo(), + // Card( + // child: Column( + // children: [ + // SizedBox( + // width: Get.width, + // height: Get.height*0.05, + // child: Padding( + // padding: + // const EdgeInsets.fromLTRB(8, 8, 8, 0), + // child: Row( + // children: [ + // Text( + // "Payment Mode : ", + // style: GoogleFonts.roboto( + // fontSize: Get.width * 0.04, + // fontWeight: FontWeight.w500, + // ), + // ), + // Text(capitalizeFirstLetter("Cheque")), + // // Text("${widget.placedOrderList!.paymentMode}",maxLines: 4, + // // overflow:TextOverflow.ellipsis,) + // ], + // ), + // ), + // ), + // + // + // ], + // ), + // ), const SizedBox(height: 8), Card( child: Column( @@ -835,4 +677,119 @@ class _RdDispatchedDetailsDetailScreenState ), ); } + + + Widget _buildCustomerDetails() { + return Card( + child: Column( + children: [ + _buildSectionTitle("Customer Details"), + _buildRow("Name:", widget.placedInvoiceList!.orderId!.addedBy!.name.toString(), Get.width * 0.04), + _buildRow("Email:", widget.placedInvoiceList!.orderId!.addedBy!.email.toString(), Get.width * 0.04), + _buildRow("Mobile Number:", widget.placedInvoiceList!.orderId!.addedBy!.mobileNumber.toString(), Get.width * 0.04), + ], + ), + ); + } + + Widget _buildBillingInfo() { + return Card( + child: Column( + children: [ + _buildSectionTitle("Billing Information"), + _buildInfoRow("Address", widget.placedInvoiceList!.orderId!.billTo.toString(), Get.width * 0.04), + ], + ), + ); + } + + Widget _buildShippingInfo() { + return Card( + child: Column( + children: [ + _buildSectionTitle("Shipping Information"), + _buildInfoRow("Address", widget.placedInvoiceList!.orderId!.shipTo.toString(), Get.width * 0.04), + ], + ), + ); + } + + Widget _buildPaymentInfo() { + return Card( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Text( + "Payment Mode: ", + style: GoogleFonts.roboto( + fontSize: Get.width * 0.04, + fontWeight: FontWeight.w500, + ), + ), + Text(capitalizeFirstLetter(widget.placedInvoiceList!.orderId!.paymentMode.toString())), + ], + ), + ), + ); + } + + } + + + +Widget _buildSectionTitle(String title) { + return SizedBox( + width: Get.width, + child: Padding( + padding: const EdgeInsets.fromLTRB(8, 8, 8, 0), + child: Text( + title, + style: GoogleFonts.roboto(fontSize: Get.width * 0.05, fontWeight: FontWeight.bold), + ), + ), + ); +} + +Widget _buildRow(String label, String value, double fontSize) { + return Padding( + padding: const EdgeInsets.fromLTRB(8, 2, 8, 2), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + label, + style: GoogleFonts.roboto(fontSize: fontSize,fontWeight: FontWeight.bold), + ), + Text( + value, + style: GoogleFonts.roboto(fontSize: fontSize), + ), + ], + ), + ); +} + +Widget _buildInfoRow(String label, String value, double fontSize) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "$label: ", + style: GoogleFonts.roboto(fontSize: fontSize, fontWeight: FontWeight.w500), + ), + Expanded( + child: Text( + value, + style: GoogleFonts.roboto(fontSize: fontSize), + ), + ), + ], + ), + ); +} + + diff --git a/lib/screens/rd orders/rd_dispatched_scree.dart b/lib/screens/rd orders/rd_dispatched_scree.dart index 9cf5b45..1f278aa 100644 --- a/lib/screens/rd orders/rd_dispatched_scree.dart +++ b/lib/screens/rd orders/rd_dispatched_scree.dart @@ -1,4 +1,6 @@ +import 'package:cheminova/controller/get_dispatch_service.dart'; +import 'package:cheminova/controller/get_single_invoice_Service.dart'; import 'package:cheminova/controller/rd_get_order_controller.dart'; import 'package:cheminova/models/get_dispatch_model.dart'; import 'package:cheminova/models/rd_get_order_model.dart'; @@ -13,8 +15,10 @@ import 'package:flutter_svg/svg.dart'; import 'package:get/get.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import '../../controller/get_dispatch_controller.dart'; +import '../../controller/get_single_invoice_controller.dart'; import '../order_management/order_management_detail_screen.dart'; class RdDispatchedScreen extends StatefulWidget { @@ -36,6 +40,7 @@ class _RdDispatchedScreenState extends State { "delivered",]; int _selectedIndex = 0; final GetDispatchController _getRdProductController = Get.put(GetDispatchController()); + final GetSingleInvoiceController _getSingleInvoiceController = Get.put(GetSingleInvoiceController()); final GlobalKey _refreshIndicatorKey = GlobalKey(); @override @@ -58,6 +63,62 @@ class _RdDispatchedScreenState extends State { } } + + + void onOrderTap(int index) async { + try { + // Fetch orders and ensure you wait for it to complete + await _getRdProductController.getRDDispatchInvoiceProduct(); + + // Log the count of fetched orders + print('Fetched orders count: ${_getRdProductController.productProcessingRDList.length}'); + + // Check if the productRDList is populated + if (_getRdProductController.productProcessingRDList.isNotEmpty) { + // Ensure the index is valid + if (index >= 0 && index < _getRdProductController.productProcessingRDList.length) { + // Get the order ID from the list based on the index + final orderId = _getRdProductController.productProcessingRDList[index].id; + final orderId1 = _getRdProductController.productProcessingRDList[index].id; + // 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 GetSingleInvoiceService().fetchInvoice(token, orderId); + final invoiceOrder = await GetDispatchService().getRDDispatchedProduct(token); + // Check if the single order was fetched successfully + if (singleOrder != null) { + // Navigate to the details screen with the fetched order + Get.to(() => RdDispatchedDetailsDetailScreen( + placedOrderList: invoiceOrder![index], + placedInvoiceList: singleOrder, + )); + } else { + // Handle the case where the single order could not be fetched + Get.snackbar("Error", "Unable to fetch order details."); + } + } else { + // Handle the case where the token is null + Get.snackbar("Error", "User not authenticated."); + } + } else { + // Handle the case when the index is out of bounds + Get.snackbar("Error", "Invalid order selection."); + } + } else { + // Handle the case when the list is empty + Get.snackbar("Error", "No orders available to display."); + } + } catch (e) { + // Log any errors that occur during the process + print('Error in onOrderTap: $e'); + Get.snackbar("Error", "An unexpected error occurred."); + } + } + String capitalizeFirstLetter(String text) { if (text.isEmpty) return text; return text[0].toUpperCase() + text.substring(1).toLowerCase(); @@ -68,7 +129,8 @@ class _RdDispatchedScreenState extends State { DateTime parsedDate = DateTime.parse(apiDate).toLocal(); // Convert to local time // Format the date and time according to your specified format - String formattedDate = DateFormat('EEE MMM dd yyyy').format(parsedDate); + String formattedDate = DateFormat('EEE MMM dd yyyy hh:mm a').format(parsedDate); + return formattedDate; // Return the formatted date string } @@ -336,10 +398,14 @@ class _RdDispatchedScreenState extends State { child: Padding( padding: const EdgeInsets.all(8.0), child: ElevatedButton( - onPressed: ()=> - Get.to(() => - RdDispatchedDetailsDetailScreen( - placedOrderList: uniqueOrders[index])), // Navigate to detail screen + onPressed: (){ + onOrderTap(index); + }, + // Get.to(() => + // RdDispatchedDetailsDetailScreen( + // placedOrderList: uniqueOrders[index], + // + // )), // Navigate to detail screen style: ElevatedButton.styleFrom( foregroundColor: Colors.white, backgroundColor: const Color(0xFF004791), diff --git a/lib/screens/rd orders/rd_order_details_update.dart b/lib/screens/rd orders/rd_order_details_update.dart index d1f79d9..b10e881 100644 --- a/lib/screens/rd orders/rd_order_details_update.dart +++ b/lib/screens/rd orders/rd_order_details_update.dart @@ -458,6 +458,9 @@ class _RdOrderDetailUpdateScreenState itemCount: widget.placedOrderList!.orderItem!.length ?? 0, itemBuilder: (context, index) { final orderItem = widget.placedOrderList!.orderItem![index]; + final subTotalProcesssItem = orderItem.price! * orderItem.quantity!.toInt(); + final GstTotalAmounProcessItem = (orderItem.price! * orderItem.quantity!.toInt()) *(orderItem.gst!/100 ); + final grandTotalProcessItem = subTotalProcesssItem + GstTotalAmounProcessItem; return orderItem != null ? Card( margin: const EdgeInsets.symmetric(vertical: 5.0), @@ -486,9 +489,17 @@ class _RdOrderDetailUpdateScreenState fontWeight: FontWeight.bold, ), ), - Text("Quantity: ${orderItem.quantity}"), - Text("Price: ₹${orderItem.price}"), - Text("GST: ${orderItem.gst}%"), + Text( + "Quantity: ${orderItem.quantity}", + style: GoogleFonts.roboto( + fontSize: Get.width * 0.03, + ), + ), + Text("Price: ${orderItem.price}"), + Text("Subtotal : ${subTotalProcesssItem}"), + Text("GST : ${orderItem.gst}%"), + Text("GST Amount (₹) : ${GstTotalAmounProcessItem}"), + Text("Total Amount : ${grandTotalProcessItem}"), ], ), ), @@ -667,7 +678,7 @@ class _RdOrderDetailUpdateScreenState children: [ Text( label, - style: GoogleFonts.roboto(fontSize: fontSize), + style: GoogleFonts.roboto(fontSize: fontSize,fontWeight: FontWeight.bold), ), Text( value, diff --git a/lib/screens/rd orders/rd_order_screen.dart b/lib/screens/rd orders/rd_order_screen.dart index 617755f..4e65794 100644 --- a/lib/screens/rd orders/rd_order_screen.dart +++ b/lib/screens/rd orders/rd_order_screen.dart @@ -87,7 +87,8 @@ class _RdOrderScreenState extends State { DateTime.parse(apiDate).toLocal(); // Convert to local time // Format the date and time according to your specified format - String formattedDate = DateFormat('EEE MMM dd yyyy').format(parsedDate); + String formattedDate = DateFormat('EEE MMM dd yyyy hh:mm a').format(parsedDate); + return formattedDate; // Return the formatted date string } diff --git a/lib/screens/rd orders/rd_pending_deatils.dart b/lib/screens/rd orders/rd_pending_deatils.dart index 0cabc3f..9594c7b 100644 --- a/lib/screens/rd orders/rd_pending_deatils.dart +++ b/lib/screens/rd orders/rd_pending_deatils.dart @@ -10,6 +10,7 @@ import 'package:cheminova/models/rd_get_order_model.dart'; import 'package:cheminova/models/single_get_order_model.dart'; import 'package:cheminova/screens/rd%20orders/partial_pending_dialog.dart'; import 'package:cheminova/screens/rd%20orders/partial_processing_dialog_screen.dart'; +import 'package:cheminova/screens/rd%20orders/rd_cancelled_screen.dart'; import 'package:cheminova/screens/rd%20orders/rd_processing_screen.dart'; import 'package:flutter/cupertino.dart'; @@ -128,6 +129,11 @@ class _RdOrderPendingScreenDetailScreenState .map((item) => (item.quantity)) .join(', '); } + + + + + @override void initState() { // TODO: implement initState @@ -136,6 +142,7 @@ class _RdOrderPendingScreenDetailScreenState selectedStatus= widget.placedOrderList?.status ?? 'new'; } + // Future getOrder1() async { // await _getSingleInvoiceController.fetchInvoice(widget.placedOrderList!.id); // if (_getSingleInvoiceController.invoice.isEmpty) { @@ -207,7 +214,7 @@ class _RdOrderPendingScreenDetailScreenState // Notify user about successful cancellation showSnackbar("Order cancelled successfully"); - + Get.to(RdCancelledScreen()); // Update the status in your UI or backend to reflect the cancelled state setState(() {}); @@ -216,7 +223,7 @@ class _RdOrderPendingScreenDetailScreenState Navigator.of(context).pop(); // Close the dialog }); - return; // Exit here to prevent further processing + } if (selectedStatus == "partial processing") { @@ -303,10 +310,21 @@ class _RdOrderPendingScreenDetailScreenState ); } - + Color _getCourierStatusColor(String status) { + switch (status.toLowerCase()) { + case 'processing': + return Colors.orange; + case 'dispatched': + return Colors.lightBlue; + case 'delivered': + return Colors.green; + default: + return Colors.grey; // Default color for unknown statuses + } + } @override Widget build(BuildContext context) { - int remainingQuantity = (widget.placedOrderList!.orderItem![0].quantity)! -(widget.placedOrderList!.orderItem![0].remainingQuantity!.toInt()); + // int remainingQuantity = (widget.placedOrderList!.orderItem![0].quantity)! -(widget.placedOrderList!.orderItem![0].remainingQuantity!.toInt()); return Scaffold( extendBodyBehindAppBar: true, appBar: AppBar( @@ -397,7 +415,7 @@ class _RdOrderPendingScreenDetailScreenState fontWeight: FontWeight.bold, ), ), - Text(widget.placedOrderList!.uniqueId.toString()), + Text(widget.placeInvoiceList!.invoiceId.toString()), // Text(widget.placedOrderList!.uniqueId), ], ), @@ -420,7 +438,7 @@ class _RdOrderPendingScreenDetailScreenState ), SizedBox(height: 10), // Add spacing between the title and the list of items Column( - children: widget.placedOrderList!.orderItem!.map((item) { + children: widget.placeInvoiceList!.items!.map((item) { return Padding( padding: const EdgeInsets.symmetric(vertical: 4.0), // Add some spacing between items @@ -436,7 +454,7 @@ class _RdOrderPendingScreenDetailScreenState overflow: TextOverflow.ellipsis, // Handle long text ), ), - Text("x ${remainingQuantity.toString()}"), + Text("x ${item.processQuantity.toString()}"), ], ), ); @@ -461,32 +479,13 @@ class _RdOrderPendingScreenDetailScreenState fontWeight: FontWeight.bold, ), ), - Text("₹ ${widget.placedOrderList!.subtotal}"), + 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.placedOrderList!.orderItem[0].gst}%"), - // ], - // ), - // ), - // ), + SizedBox( width: Get.width, child: Padding( @@ -502,7 +501,7 @@ class _RdOrderPendingScreenDetailScreenState fontWeight: FontWeight.bold, ), ), - Text("₹ ${widget.placedOrderList!.gstTotal}"), + Text("₹ ${widget.placeInvoiceList!.gstTotal}"), ], ), ), @@ -522,7 +521,7 @@ class _RdOrderPendingScreenDetailScreenState fontWeight: FontWeight.bold, ), ), - Text("₹ ${widget.placedOrderList!.grandTotal}"), + Text("₹ ${widget.placeInvoiceList!.invoiceAmount}"), ], ), ), @@ -549,19 +548,20 @@ class _RdOrderPendingScreenDetailScreenState // placedOrderList: uniqueOrders[index])), // Navigate to detail screen style: ElevatedButton.styleFrom( foregroundColor: Colors.white, - backgroundColor: Colors.orange, + backgroundColor:_getCourierStatusColor(widget.placeInvoiceList!.courierStatus.toString()), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10)), ), - child: Text("Processing"), + 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}"), - ], + )], ), ), ), + ], ), ), @@ -594,6 +594,9 @@ class _RdOrderPendingScreenDetailScreenState itemCount: widget.placedOrderList?.orderItem!.length ?? 0, itemBuilder: (context, index) { final orderItem = widget.placedOrderList!.orderItem![index]; + final subTotal = orderItem.price * orderItem.quantity!.toInt(); + 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), @@ -613,10 +616,11 @@ class _RdOrderPendingScreenDetailScreenState const SizedBox(width: 10), Expanded( child: Column( + crossAxisAlignment: CrossAxisAlignment.end, children: [ Text( - capitalizeFirstLetter(orderItem.name), + capitalizeFirstLetter(orderItem.name.toString()), style: GoogleFonts.roboto( fontSize: Get.width * 0.04, fontWeight: FontWeight.bold, @@ -628,11 +632,12 @@ class _RdOrderPendingScreenDetailScreenState fontSize: Get.width * 0.03, ), ), + Text("Price: ${orderItem.price}"), - Text("Subtotal: ${widget.placedOrderList!.subtotal}"), - Text("Gst: ${orderItem.gst}%"), - Text("GST Total: ${widget.placedOrderList!.gstTotal}"), - Text("Total Amount: ${widget.placedOrderList!.grandTotal}"), + Text("Subtotal: ${subTotal}"), + Text("GSt: ${orderItem.gst}%"), + Text("GST Amount (₹): ${GstTotalAmount}"), + Text("Total Amount (₹): ${grandTotal}"), ], ), ), @@ -677,12 +682,17 @@ class _RdOrderPendingScreenDetailScreenState ?.where((item) => item.remainingQuantity! > 0) .length ?? 0, itemBuilder: (context, index) { + + // Filter items with non-zero quantities final filteredItems = widget.placedOrderList!.orderItem! .where((item) => item.remainingQuantity! > 0) .toList(); final orderItem = filteredItems[index]; + final subTotalProcesssItem = orderItem.price! * orderItem.remainingQuantity!.toInt(); + final GstTotalAmounProcessItem = (orderItem.price! * orderItem.remainingQuantity!.toInt()) *(orderItem.gst!/100 ); + final grandTotalProcessItem = subTotalProcesssItem + GstTotalAmounProcessItem; return Card( margin: const EdgeInsets.symmetric(vertical: 5.0), @@ -705,7 +715,7 @@ class _RdOrderPendingScreenDetailScreenState crossAxisAlignment: CrossAxisAlignment.end, children: [ Text( - capitalizeFirstLetter(orderItem.name), + capitalizeFirstLetter(orderItem.name.toString()), style: GoogleFonts.roboto( fontSize: Get.width * 0.04, fontWeight: FontWeight.bold, @@ -713,10 +723,10 @@ class _RdOrderPendingScreenDetailScreenState ), Text("Quantity: ${orderItem.remainingQuantity}"), Text("Price: ${orderItem.price}"), - Text("Subtotal: ${widget.placedOrderList!.subtotal}"), + Text("Subtotal: ${subTotalProcesssItem}"), Text("Gst: ${orderItem.gst}%"), - Text("GST Total: ${widget.placedOrderList!.gstTotal}"), - Text("Total Amount: ${widget.placedOrderList!.grandTotal}"), + Text("GST Total: ${GstTotalAmounProcessItem}"), + Text("Total Amount: ${grandTotalProcessItem}"), ], ), ), @@ -737,180 +747,15 @@ class _RdOrderPendingScreenDetailScreenState const SizedBox(height: 8), SizedBox( height: Get.height* 0.19, - child: Card( - child: Column( - children: [ - SizedBox( - width: Get.width, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Text( - "Customer Details", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.05, - fontWeight: FontWeight.w500, - ), - ), - ), - ), - SizedBox( - width: Get.width, - //height: Get.height*0.09, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Row( - children: [ - Text( - "Name: ", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.04, - fontWeight: FontWeight.bold, - ), - ), - Text("${"Roshan Garg"}",maxLines: 4, - overflow:TextOverflow.ellipsis,) - , ], - ) - ), - ), - SizedBox( - width: Get.width, - // height: Get.height*0.09, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Row( - children: [ - Text( - "Email: ", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.04, - fontWeight: FontWeight.bold, - ), - ), - Text("${"roshangarg28@gmail.com"}",maxLines: 4, - overflow:TextOverflow.ellipsis,) - , ], - ) - ), - ), - SizedBox( - width: Get.width, - // height: Get.height*0.09, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Row( - children: [ - Text( - "Mobile Number: ", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.04, - fontWeight: FontWeight.bold, - ), - ), - Text("${"8876785448"}",maxLines: 4, - overflow:TextOverflow.ellipsis,) - , ], - ) - ), - ) + child:_buildCustomerDetails(), - ], - ), - ), ), const SizedBox(height: 8), - Card( - child: Column( - children: [ - SizedBox( - width: Get.width, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Text( - "Billing Information", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.05, - fontWeight: FontWeight.w500, - ), - ), - ), - ), - SizedBox( - width: Get.width, - height: Get.height*0.06, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Wrap( - crossAxisAlignment: WrapCrossAlignment.start, - children: [ - Text( - "Address: ", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.04, - fontWeight: FontWeight.bold, - ), - ), - Text("${widget.placedOrderList!.billTo}",maxLines: 4, - overflow:TextOverflow.ellipsis,) - ], - ), - ), - ), + _buildBillingInfo(), - ], - ), - ), const SizedBox(height: 8), - // Card for displaying shipping information - Card( - child: Column( - children: [ - SizedBox( - width: Get.width, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Text( - "Shipping Information", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.05, - fontWeight: FontWeight.w500, - ), - ), - ), - ), - SizedBox( - width: Get.width, - height: Get.height*0.06, - child: Padding( - padding: - const EdgeInsets.fromLTRB(8, 8, 8, 0), - child: Wrap( - crossAxisAlignment: WrapCrossAlignment.start, - children: [ - Text( - "Address: ", - style: GoogleFonts.roboto( - fontSize: Get.width * 0.04, - fontWeight: FontWeight.bold, - ), - ), - Text("${widget.placedOrderList!.shipTo}",maxLines: 4, - overflow:TextOverflow.ellipsis,) - ], - ), - ), - ), + _buildShippingInfo(), - ], - ), - ), const SizedBox(height: 8), Card( child: Column( @@ -930,7 +775,7 @@ class _RdOrderPendingScreenDetailScreenState fontWeight: FontWeight.w500, ), ), - Text(capitalizeFirstLetter(widget.placedOrderList!.paymentMode.toString())), + Text(capitalizeFirstLetter(widget.placeInvoiceList!.orderId!.paymentMode.toString())), // Text("${widget.placedOrderList!.paymentMode}",maxLines: 4, // overflow:TextOverflow.ellipsis,) ], @@ -963,7 +808,7 @@ class _RdOrderPendingScreenDetailScreenState ), SizedBox(width: Get.width*0.01,), //Text(capitalizeFirstLetter(widget.placedOrderList!.status)), - Text("${widget.placedOrderList!.status}",maxLines: 4, + Text(capitalizeFirstLetter(widget.placedOrderList!.status.toString()),maxLines: 4, overflow:TextOverflow.ellipsis,) ], ), @@ -1053,4 +898,146 @@ class _RdOrderPendingScreenDetailScreenState ), ); } + + + + Widget _buildBillingInfo() { + return Card( + child: Column( + children: [ + _buildSectionTitle("Billing Information"), + _buildInfoRow("Address", widget.placedOrderList!.billTo.toString(), Get.width * 0.04), + ], + ), + ); + } + + Widget _buildShippingInfo() { + return Card( + child: Column( + children: [ + _buildSectionTitle("Shipping Information"), + _buildInfoRow("Address", widget.placedOrderList!.shipTo.toString(), Get.width * 0.04), + ], + ), + ); + } + + Widget _buildCustomerDetails() { + return Card( + child: Column( + children: [ + _buildSectionTitle("Customer Details"), + _buildRow("Name:", widget.placedOrderList!.addedBy!.name, Get.width * 0.04), + _buildRow("Email:", widget.placedOrderList!.addedBy!.email, Get.width * 0.04), + _buildRow("Mobile Number:", widget.placedOrderList!.addedBy!.mobileNumber, Get.width * 0.04), + ], + ), + ); + } +} + + + +Widget _buildInfoRow(String label, String value, double fontSize) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "$label: ", + style: GoogleFonts.roboto(fontSize: fontSize, fontWeight: FontWeight.w500), + ), + Expanded( + child: Text( + value, + style: GoogleFonts.roboto(fontSize: fontSize), + ), + ), + ], + ), + ); +} + +Widget _buildRow(String label, String value, double fontSize) { + return Padding( + padding: const EdgeInsets.fromLTRB(8, 2, 8, 2), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + label, + style: GoogleFonts.roboto(fontSize: fontSize,fontWeight: FontWeight.bold), + ), + Text( + value, + style: GoogleFonts.roboto(fontSize: fontSize), + ), + ], + ), + ); +} + +Widget _buildSectionTitle(String title) { + return SizedBox( + width: Get.width, + child: Padding( + padding: const EdgeInsets.fromLTRB(8, 8, 8, 0), + child: Text( + title, + style: GoogleFonts.roboto(fontSize: Get.width * 0.05, fontWeight: FontWeight.bold), + ), + ), + ); +} + + +class simple extends State { + @override + Widget build(BuildContext context) { + return 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: () {}, + style: ElevatedButton.styleFrom( + foregroundColor: Colors.white, + backgroundColor: _getCourierStatusColor(widget.placeInvoiceList!.courierStatus.toString()), // Call the method here + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + ), + child: Text(widget.placeInvoiceList!.courierStatus.toString()), + ), + ], + ), + ), + ); + } + + // Method to get the color based on the status + Color _getCourierStatusColor(String status) { + switch (status.toLowerCase()) { + case 'processing': + return Colors.orange; // Orange for processing + case 'dispatched': + return Colors.lightBlue; // Light blue for dispatched + case 'delivered': + return Colors.green; // Green for delivered + default: + return Colors.grey; // Default color if status doesn't match + } + } } diff --git a/lib/screens/rd orders/rd_pending_screen.dart b/lib/screens/rd orders/rd_pending_screen.dart index 9a2f584..f11d957 100644 --- a/lib/screens/rd orders/rd_pending_screen.dart +++ b/lib/screens/rd orders/rd_pending_screen.dart @@ -1,6 +1,7 @@ import 'package:cheminova/controller/get_rd_pending_controller.dart'; 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/screens/rd%20orders/rd_order_details_screen.dart'; @@ -16,6 +17,7 @@ import 'package:intl/intl.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../controller/get_single_invoice_Service.dart'; +import '../../controller/get_single_invoice_controller.dart'; import '../../controller/rd_get_single_service.dart'; import '../order_management/order_management_detail_screen.dart'; @@ -38,6 +40,8 @@ class _RdOrderPendingScreenState extends State { "delivered",]; int _selectedIndex = 0; final GetRdPendingController _getRdPendingController = Get.put(GetRdPendingController()); + final GetSingleInvoiceController _getSingleInvoiceController = Get.put(GetSingleInvoiceController()); + final GetRDProcessingInvoiceController _getRDProcessingInvoiceController = Get.put(GetRDProcessingInvoiceController()); // final GetProductRDController _getRdProductController = // Get.put(GetProductRDController()); final GlobalKey _refreshIndicatorKey = GlobalKey(); @@ -73,7 +77,7 @@ class _RdOrderPendingScreenState extends State { DateTime parsedDate = DateTime.parse(apiDate).toLocal(); // Convert to local time // Format the date and time according to your specified format - String formattedDate = DateFormat('EEE MMM dd yyyy').format(parsedDate); + String formattedDate = DateFormat('EEE MMM dd yyyy hh:mm a').format(parsedDate); return formattedDate; // Return the formatted date string } @@ -84,6 +88,9 @@ class _RdOrderPendingScreenState extends State { // 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}'); @@ -93,7 +100,7 @@ class _RdOrderPendingScreenState extends State { 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]; // Retrieve the token from SharedPreferences SharedPreferences prefs = await SharedPreferences.getInstance(); String? token = prefs.getString('token'); @@ -102,7 +109,7 @@ class _RdOrderPendingScreenState extends State { 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, orderId); + final singleInvoice = await GetSingleInvoiceService().fetchInvoice(token, invoiceId.toString()); // Check if the single order was fetched successfully if (singleOrder != null) { // Navigate to the details screen with the fetched order diff --git a/lib/screens/rd orders/rd_processing_details.dart b/lib/screens/rd orders/rd_processing_details.dart index 36042bb..5c06d68 100644 --- a/lib/screens/rd orders/rd_processing_details.dart +++ b/lib/screens/rd orders/rd_processing_details.dart @@ -1,3 +1,4 @@ +import 'package:cheminova/screens/rd%20orders/rd_dispatched_scree.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:get/get.dart'; @@ -122,6 +123,7 @@ class _RdOrderProcessingDetailScreenState extends State { DateTime parsedDate = DateTime.parse(apiDate).toLocal(); // Convert to local time // Format the date and time according to your specified format - String formattedDate = DateFormat('EEE MMM dd yyyy').format(parsedDate); + String formattedDate = DateFormat('EEE MMM dd yyyy hh:mm a').format(parsedDate); + return formattedDate; // Return the formatted date string } diff --git a/lib/utils/api_urls.dart b/lib/utils/api_urls.dart index 8081fce..6883dcf 100644 --- a/lib/utils/api_urls.dart +++ b/lib/utils/api_urls.dart @@ -33,7 +33,7 @@ class ApiUrls { //============================== Notification Details ==============================// - static const String getNotificationUrl = '/api/get-notification-pd'; + static const String getNotificationUrl = '${baseUrl}/api/get-notification-pd/'; //============================== Kyc Details ==============================// static const String getKycUrl = '${baseUrl}/api/kyc/getAll'; @@ -78,7 +78,8 @@ class ApiUrls { //============================== Annaouncement Details ==============================// - static const String AnnaouncementUrl = '${baseUrl}/api/announcement/PDs'; - + static const String AnnaouncementUrl = '/api/announcement/PDs'; + //============================== Annaouncement Details ==============================// + static const String ShiptoandBilltoAddressUrl = '/api/shipping/address/user/address'; } diff --git a/lib/utils/common_api_service.dart b/lib/utils/common_api_service.dart index 31ce75f..393c373 100644 --- a/lib/utils/common_api_service.dart +++ b/lib/utils/common_api_service.dart @@ -13,6 +13,7 @@ Future commonApiService({ File? imageFile, // Optional image file for upload bool isformData = true, Map? additionalHeaders, // Additional headers for the request + Map? queryParameters, // Optional query parameters required BodyType Function(Map) fromJson,// Function to parse the response data }) async { try { diff --git a/lib/widgets/common_appbar.dart b/lib/widgets/common_appbar.dart index a7895eb..4315848 100644 --- a/lib/widgets/common_appbar.dart +++ b/lib/widgets/common_appbar.dart @@ -4,7 +4,7 @@ import 'package:flutter_svg/svg.dart'; class CommonAppBar extends StatelessWidget implements PreferredSizeWidget { final Widget title; final List? actions; - final TabBar? bottom; + final PreferredSizeWidget? bottom; // Changed to PreferredSizeWidget? const CommonAppBar({super.key, required this.title, this.actions, required Color backgroundColor, required int elevation, this.bottom}); @@ -28,5 +28,5 @@ class CommonAppBar extends StatelessWidget implements PreferredSizeWidget { } @override - Size get preferredSize => const Size.fromHeight(kToolbarHeight); + Size get preferredSize => Size.fromHeight(kToolbarHeight + (bottom?.preferredSize.height ?? 0)); // Adjusted to account for the bottom height }