import 'dart:async'; import 'package:cheminova/controller/product_stock_controller.dart'; import 'package:cheminova/models/place_order_list_model.dart'; import 'package:cheminova/models/product_stock_model.dart'; import 'package:cheminova/screens/opening%20Inventory/update_stock_screen.dart'; import 'package:cheminova/screens/order_management/order_management_detail_screen.dart'; import 'package:cheminova/widgets/input_field.dart'; import 'package:cheminova/widgets/my_drawer.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:get/get.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; import '../../controller/cart_controller.dart'; import '../../controller/get_order_placed_controller.dart'; import '../../models/product_model1.dart'; class OpeningInventoryManagementScreen extends StatefulWidget { final ProductStockModel? productModel; // PlacedOrderList? placeOrder; OpeningInventoryManagementScreen({super.key, this.productModel,}); @override State createState() => _OpeningInventoryManagementScreenState(); } class _OpeningInventoryManagementScreenState extends State { final _searchController = TextEditingController(); //final List _filterList = ["Order Status", "Date Range"]; final ProductStockController _getProductStockController = Get.put(ProductStockController()); final CartController _cartController = Get.put(CartController()); final GlobalKey _refreshIndicatorKey = GlobalKey(); @override void initState() { super.initState(); getOrder1(); // Fetch orders when the screen initializes } Future _onRefresh() async { await getOrder1(); await Future.delayed(Duration(seconds: 1)); } // Fetches orders from the API Future getOrder1() async { await _getProductStockController.fetchProductStock(); print("Opening order Inventory fetched successfully"); } // Capitalizes the first letter of the string String capitalizeFirstLetter(String text) { if (text.isEmpty) return text; return text[0].toUpperCase() + text.substring(1).toLowerCase(); } // Formats the date received from the API String formatDate(String apiDate) { DateTime parsedDate = DateTime.parse(apiDate); String formattedDate = DateFormat('dd-MMM-yyyy').format(parsedDate); return formattedDate; } @override Widget build(BuildContext context) { return Scaffold( extendBodyBehindAppBar: true, appBar: AppBar( centerTitle: true, backgroundColor: Colors.transparent, elevation: 0, leading: Builder( builder: (context) { return GestureDetector( onTap: () => Scaffold.of(context).openDrawer(), child: Padding( padding: const EdgeInsets.all(16.0), child: SvgPicture.asset('assets/svg/menu.svg'), ), ); }, ), actions: [ GestureDetector( onTap: () => Get.back(), child: Padding( padding: const EdgeInsets.all(8.0), child: SvgPicture.asset('assets/svg/back_arrow.svg'), ), ), ], title: const Text("Opening Inventory "), ), drawer: MyDrawer(), body: Stack( fit: StackFit.expand, children: [ Image.asset('assets/images/image_1.png', fit: BoxFit.cover), SafeArea( child: SingleChildScrollView( child: Padding( padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), child: RefreshIndicator( key: _refreshIndicatorKey, onRefresh: _onRefresh, color: Colors.black, backgroundColor: Colors.white, child: Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, children: [ InputField( hintText: "Search Order", labelText: "Search Order", controller: _searchController, onChanged: (value) { //searchOrder(value);// Call search function with input value }, ), SizedBox(height: Get.height * 0.035), Card( margin: const EdgeInsets.symmetric(horizontal: 18), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(19), side: const BorderSide(color: Color(0xFFFDFDFD)), ), color: const Color(0xFFB4D1E5).withOpacity(0.9), child: Padding( padding: const EdgeInsets.all(12.0), child: Column( mainAxisSize: MainAxisSize.min, children: [ // SizedBox( // height: Get.height * 0.05, // child: ListView.builder( // shrinkWrap: true, // scrollDirection: Axis.horizontal, // itemCount: _filterList.length, // itemBuilder: (context, index) => Padding( // padding: const EdgeInsets.symmetric(horizontal: 4), // child: Chip( // label: Text( // _filterList[index], // style: GoogleFonts.roboto(fontSize: 14, fontWeight: FontWeight.w500), // ), // ), // ), // ), // ), SizedBox( height: Get.height * 0.6, child: Obx(() { // Use a set to keep track of unique order IDs final Set uniqueOrderIds = {}; final List uniqueOrders = []; // Loop through the fetched orders to filter unique orders for (var order in _getProductStockController.productStockList) { if (uniqueOrderIds.add(order.productid)) { uniqueOrders.add(order); } } // Displaying unique orders in a ListView return ListView.builder( padding: EdgeInsets.zero, shrinkWrap: true, itemCount: uniqueOrders.length, itemBuilder: (context, index) { final order = uniqueOrders[index]; // Combine product names into a single string // final productNames = order.name // .map((item) => capitalizeFirstLetter(item.name)) // .join(', '); return Padding( padding: const EdgeInsets.symmetric(vertical: 8), child: Card( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.fromLTRB(16, 8, 8, 0), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Text("Product ID: ", style: GoogleFonts.roboto(fontSize: 14, fontWeight: FontWeight.bold)), Text("${order.productid}") ], ), ), Padding( padding: const EdgeInsets.fromLTRB(16, 8, 8, 0), child: Row( crossAxisAlignment: CrossAxisAlignment.start, // Aligns the Column to the top of the Text children: [ Text( "Product Names: ", style: GoogleFonts.roboto( fontSize: 14, fontWeight: FontWeight.bold, ), ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, // Aligns text to the right within the Column children: [ Text( '${order.name}', // Adds index and trims whitespace textAlign: TextAlign.left, // Aligns text to the right style: GoogleFonts.roboto( fontSize: 14, ), ), ], ), ), ], ), ), Padding( padding: const EdgeInsets.fromLTRB(16, 8, 8, 0), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Text("SKU: ", style: GoogleFonts.roboto(fontSize: 14, fontWeight: FontWeight.bold)), Text("${order.sku}") ], ), ), Padding( padding: const EdgeInsets.fromLTRB(16, 8, 8, 0), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Text("Opening Inventory: ", style: GoogleFonts.roboto(fontSize: 14, fontWeight: FontWeight.bold)), Text("${order.openingInventory}") ], ), ), SizedBox( width: Get.width * 0.5, child: Padding( padding: const EdgeInsets.all(8.0), child: ElevatedButton( onPressed: (){ Get.to(InventoryUpdateStockScreen(products: _getProductStockController.productStockList, selectedProductId: _getProductStockController.productStockList[index].productid,)); }, // Navigate to detail screen style: ElevatedButton.styleFrom( foregroundColor: Colors.white, backgroundColor: const Color(0xFF004791), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10)), ), child: Text("Update Inventory", style: GoogleFonts.roboto(fontSize: 14, fontWeight: FontWeight.w400)), ), ), ) ], ), ), ); }, ); }), ) ], ), ), ), ], ), ), ), ), ), ], ), ); } }