From 5391d953a742decfe68a04b8e64db3a1b7d10888 Mon Sep 17 00:00:00 2001 From: kratikpal Date: Wed, 14 Aug 2024 16:56:38 +0530 Subject: [PATCH] inventory update --- lib/models/product_model.dart | 4 ++ lib/provider/product_provider.dart | 35 ++++++++++++++ lib/screens/add_products_screen.dart | 69 +++++++++++++++++----------- lib/services/api_urls.dart | 1 + 4 files changed, 82 insertions(+), 27 deletions(-) diff --git a/lib/models/product_model.dart b/lib/models/product_model.dart index d92262d..e661208 100644 --- a/lib/models/product_model.dart +++ b/lib/models/product_model.dart @@ -47,6 +47,8 @@ class Product { final DateTime createdAt; final DateTime updatedAt; final int v; + int? sale; + int? inventory; Product({ required this.id, @@ -63,6 +65,8 @@ class Product { required this.createdAt, required this.updatedAt, required this.v, + this.sale, + this.inventory, }); factory Product.fromJson(Map json) { diff --git a/lib/provider/product_provider.dart b/lib/provider/product_provider.dart index 5db3785..421e9b6 100644 --- a/lib/provider/product_provider.dart +++ b/lib/provider/product_provider.dart @@ -12,11 +12,14 @@ class ProductProvider extends ChangeNotifier { final _apiClient = ApiClient(); ProductResponse? productResponse; List productList = []; + final List _selectedProducts = []; bool _isLoading = false; bool get isLoading => _isLoading; + List get selectedProducts => _selectedProducts; + void setLoading(bool loading) { _isLoading = loading; notifyListeners(); @@ -37,4 +40,36 @@ class ProductProvider extends ChangeNotifier { print("Error: $e"); } } + + Future submitSelectedProducts( + String addedFor, String addedForId) async { + setLoading(true); + try { + final data = { + "products": selectedProducts.map((product) { + return { + "SKU": product.SKU, + "ProductName": product.name, + "Sale": product.sale, + "Inventory": product.inventory, + }; + }).toList(), + "addedFor": addedFor, + "addedForId": addedForId, + }; + + Response response = + await _apiClient.post(ApiUrls.submitProducts, data: data); + setLoading(false); + if (response.statusCode == 201) { + return true; + } else { + return false; + } + } catch (e) { + setLoading(false); + print("Error: $e"); + return false; + } + } } diff --git a/lib/screens/add_products_screen.dart b/lib/screens/add_products_screen.dart index 75f3876..6fe4fa4 100644 --- a/lib/screens/add_products_screen.dart +++ b/lib/screens/add_products_screen.dart @@ -16,7 +16,6 @@ class AddProductsScreen extends StatefulWidget { } class _AddProductsScreenState extends State { - List selectedProducts = []; List filteredProducts = []; final searchController = TextEditingController(); late ProductProvider provider; @@ -28,7 +27,7 @@ class _AddProductsScreenState extends State { } Future loadProducts() async { - final provider = Provider.of(context, listen: false); + provider = Provider.of(context, listen: false); await provider.getProducts(); setState(() { filteredProducts = provider.productList; @@ -87,20 +86,19 @@ class _AddProductsScreenState extends State { children: [ Column( children: [ - if (selectedProducts.isNotEmpty) + if (provider.selectedProducts.isNotEmpty) Expanded( child: ListView.builder( - itemCount: selectedProducts.length, + itemCount: provider.selectedProducts.length, itemBuilder: (context, index) { - return ProductBlock( - product: selectedProducts[index]); + return ProductBlock(index: index); }, ), ), ], ), Align( - alignment: selectedProducts.isEmpty + alignment: provider.selectedProducts.isEmpty ? Alignment.center : Alignment.bottomCenter, child: Padding( @@ -146,9 +144,10 @@ class _AddProductsScreenState extends State { filteredProducts.length, itemBuilder: (context, index) { bool isAlreadySelected = - selectedProducts.contains( - filteredProducts[ - index]); + provider.selectedProducts + .contains( + filteredProducts[ + index]); return Card( child: ListTile( title: Text( @@ -173,8 +172,9 @@ class _AddProductsScreenState extends State { ? null : () { setState(() { - selectedProducts.add( - filteredProducts[ + provider + .selectedProducts + .add(filteredProducts[ index]); }); Navigator.pop( @@ -202,7 +202,7 @@ class _AddProductsScreenState extends State { style: TextStyle(color: Colors.black), ), ), - if (selectedProducts.isNotEmpty) ...[ + if (provider.selectedProducts.isNotEmpty) ...[ const SizedBox(height: 16.0), CommonElevatedButton( borderRadius: 30, @@ -211,13 +211,19 @@ class _AddProductsScreenState extends State { text: 'SUBMIT', backgroundColor: const Color(0xff004791), onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - const DataSubmitSuccessfull(), - ), - ); + provider + .submitSelectedProducts("PrincipalDistributor", "66a0e19c981736b70ed4e34e") + .then((value) { + if (value) { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + const DataSubmitSuccessfull(), + ), + ); + } + }); }, ), ], @@ -235,9 +241,9 @@ class _AddProductsScreenState extends State { } class ProductBlock extends StatefulWidget { - final Product product; + final int index; - const ProductBlock({super.key, required this.product}); + const ProductBlock({super.key, required this.index}); @override _ProductBlockState createState() => _ProductBlockState(); @@ -247,13 +253,15 @@ class _ProductBlockState extends State { final saleController = TextEditingController(); final inventoryController = TextEditingController(); String? errorMessage; + late ProductProvider provider; @override void initState() { super.initState(); + provider = Provider.of(context, listen: false); } - void validateInput() { + bool validateInput() { setState(() { if (saleController.text.isNotEmpty && inventoryController.text.isNotEmpty) { @@ -268,6 +276,7 @@ class _ProductBlockState extends State { errorMessage = null; } }); + return errorMessage == null; } @override @@ -281,9 +290,9 @@ class _ProductBlockState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text('Product: ${widget.product.name}', + Text('Product: ${provider.selectedProducts[widget.index].name}', style: const TextStyle(fontSize: 16)), - Text('SKU: ${widget.product.SKU}', + Text('SKU: ${provider.selectedProducts[widget.index].SKU}', style: const TextStyle(fontSize: 15)), const SizedBox(height: 8), TextField( @@ -292,7 +301,10 @@ class _ProductBlockState extends State { keyboardType: TextInputType.number, // enabled: widget.product.isPurchased, enabled: true, - onChanged: (_) => validateInput(), + onChanged: (_) => validateInput() + ? provider.selectedProducts[widget.index].sale = + int.parse(saleController.text) + : null, ), TextField( controller: inventoryController, @@ -300,7 +312,10 @@ class _ProductBlockState extends State { keyboardType: TextInputType.number, // enabled: widget.product.isPurchased, enabled: true, - onChanged: (_) => validateInput(), + onChanged: (_) => validateInput() + ? provider.selectedProducts[widget.index].inventory = + int.parse(inventoryController.text) + : null, ), if (errorMessage != null) Padding( diff --git a/lib/services/api_urls.dart b/lib/services/api_urls.dart index 8ef1b52..d216f5e 100644 --- a/lib/services/api_urls.dart +++ b/lib/services/api_urls.dart @@ -14,4 +14,5 @@ class ApiUrls { static const String getProducts = '${baseUrl}product/getAll/user/'; static const String getPdRdUrl = 'inventory/distributors-TM/RetailDistributor'; + static const String submitProducts = 'inventory/add-TM'; }