diff --git a/lib/barcode.dart b/lib/barcode.dart index ce03cce8..2beaad2f 100644 --- a/lib/barcode.dart +++ b/lib/barcode.dart @@ -339,6 +339,40 @@ class _QRViewState extends State { } +class StockItemScanIntoLocationHandler extends BarcodeHandler { + /** + * Barcode handler for scanning a provided StockItem into a scanned StockLocation + */ + + final InvenTreeStockItem item; + + StockItemScanIntoLocationHandler(this.item); + + @override + Future onBarcodeMatched(Map data) { + // If the barcode points to a 'stocklocation', great! + if (!data.containsKey('stocklocation')) { + showErrorDialog( + _context, + "Invalid Barcode", + "Barcode does not match a Stock Location", + onDismissed: _controller.resumeCamera, + ); + } else { + // Extract location information + int location = data['stocklocation']['pk'] as int; + + // Transfer stock to specified location + item.transferStock(location).then((response) { + print("Response: ${response.statusCode}"); + _controller.dispose(); + Navigator.of(_context).pop(); + }); + } + } +} + + Future scanQrCode(BuildContext context) async { Navigator.push(context, MaterialPageRoute(builder: (context) => InvenTreeQRView(BarcodeScanHandler()))); diff --git a/lib/inventree/stock.dart b/lib/inventree/stock.dart index 1899cb48..c174e048 100644 --- a/lib/inventree/stock.dart +++ b/lib/inventree/stock.dart @@ -379,20 +379,26 @@ class InvenTreeStockItem extends InvenTreeModel { }); } - Future transferStock(double q, int location, {String notes}) async { + Future transferStock(int location, {double quantity, String notes}) async { + if (quantity == null) {} else + if ((quantity < 0) || (quantity > this.quantity)) { + quantity = this.quantity; + } - if ((q == null) || (q > quantity)) q = quantity; - - return api.post("/stock/transfer/", body: { + Map data = { "item": { "pk": "${pk}", - "quantity": "${q}", - }, + }, "location": "${location}", "notes": notes ?? '', - }); - } + }; + if (quantity != null) { + data["item"]["quantity"] = "${quantity}"; + } + + return api.post("/stock/transfer/", body: data); + } } diff --git a/lib/widget/stock_detail.dart b/lib/widget/stock_detail.dart index c769788b..46b83764 100644 --- a/lib/widget/stock_detail.dart +++ b/lib/widget/stock_detail.dart @@ -253,7 +253,7 @@ class _StockItemDisplayState extends RefreshableState { _quantityController.clear(); _notesController.clear(); - var response = await item.transferStock(quantity, location.pk, notes: notes); + var response = await item.transferStock(location.pk, quantity: quantity, notes: notes); // TODO - Error handling (potentially return false?) refresh(); @@ -525,6 +525,10 @@ class _StockItemDisplayState extends RefreshableState { leading: FaIcon(FontAwesomeIcons.exchangeAlt), trailing: FaIcon(FontAwesomeIcons.qrcode), onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => InvenTreeQRView(StockItemScanIntoLocationHandler(item))) + ); }, ) );