From 2ff5faacc0f1e83e752ed0a6745d48c896f45a7a Mon Sep 17 00:00:00 2001 From: Bernd Bestel Date: Sun, 18 Nov 2018 13:35:21 +0100 Subject: [PATCH] Prevent opening more products than are unopened in stock --- migrations/0046.sql | 12 +++++++++++- public/viewjs/consume.js | 11 ++++++++++- public/viewjs/stockoverview.js | 8 +++++++- services/StockService.php | 4 ++-- views/stockoverview.blade.php | 2 +- 5 files changed, 31 insertions(+), 6 deletions(-) diff --git a/migrations/0046.sql b/migrations/0046.sql index 57aaf9e9..ffb44566 100644 --- a/migrations/0046.sql +++ b/migrations/0046.sql @@ -25,4 +25,14 @@ SELECT MIN(s.best_before_date) AS best_before_date, IFNULL((SELECT SUM(amount) FROM stock WHERE product_id = s.product_id AND open = 1), 0) AS amount_opened FROM stock s -GROUP BY s.product_id; +GROUP BY s.product_id + +UNION + +SELECT + id, + 0, + null, + 0 +FROM stock_missing_products +WHERE is_partly_in_stock = 0; diff --git a/public/viewjs/consume.js b/public/viewjs/consume.js index 3b57b69e..4b3fe233 100644 --- a/public/viewjs/consume.js +++ b/public/viewjs/consume.js @@ -119,7 +119,7 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) Grocy.Components.ProductCard.Refresh(productId); Grocy.Api.Get('stock/get-product-details/' + productId, - function (productDetails) + function(productDetails) { $('#amount').attr('max', productDetails.stock_amount); $('#amount_qu_unit').text(productDetails.quantity_unit_stock.name); @@ -137,6 +137,15 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) Grocy.FrontendHelpers.ValidateForm('consume-form'); $('#amount').focus(); } + + if (productDetails.stock_amount == productDetails.stock_amount_opened) + { + $("#save-mark-as-open-button").addClass("disabled"); + } + else + { + $("#save-mark-as-open-button").removeClass("disabled"); + } }, function(xhr) { diff --git a/public/viewjs/stockoverview.js b/public/viewjs/stockoverview.js index 25e48c80..74017812 100644 --- a/public/viewjs/stockoverview.js +++ b/public/viewjs/stockoverview.js @@ -133,7 +133,7 @@ $(document).on('click', '.product-consume-button', function(e) $(this).text(result.next_best_before_date).fadeIn(500); }); $('#product-' + productId + '-next-best-before-date-timeago').attr('datetime', result.next_best_before_date); - } + } toastr.success(L('Removed #1 #2 of #3 from stock', consumeAmount, productQuName, productName)); RefreshContextualTimeago(); @@ -163,6 +163,7 @@ $(document).on('click', '.product-open-button', function(e) var productId = $(e.currentTarget).attr('data-product-id'); var productName = $(e.currentTarget).attr('data-product-name'); var productQuName = $(e.currentTarget).attr('data-product-qu-name'); + var button = $(e.currentTarget); Grocy.Api.Get('stock/open-product/' + productId + '/1', function() @@ -199,6 +200,11 @@ $(document).on('click', '.product-open-button', function(e) $(this).text(L('#1 opened', result.stock_amount_opened)).fadeIn(500); }); + if (result.stock_amount == result.stock_amount_opened) + { + button.addClass("disabled"); + } + toastr.success(L('Marked #1 #2 of #3 as opened', 1, productQuName, productName)); RefreshContextualTimeago(); RefreshStatistics(); diff --git a/services/StockService.php b/services/StockService.php index bcf96b62..20a7ce4e 100644 --- a/services/StockService.php +++ b/services/StockService.php @@ -265,11 +265,11 @@ class StockService extends BaseService throw new \Exception('Product does not exist'); } - $productStockAmount = $this->Database->stock()->where('product_id', $productId)->sum('amount'); + $productStockAmountUnopened = $this->Database->stock()->where('product_id = :1 AND open = 0', $productId)->sum('amount'); $potentialStockEntries = $this->GetProductStockEntries($productId, true); $product = $this->Database->products($productId); - if ($amount > $productStockAmount) + if ($amount > $productStockAmountUnopened) { return false; } diff --git a/views/stockoverview.blade.php b/views/stockoverview.blade.php index 76be1792..a69f4ebd 100644 --- a/views/stockoverview.blade.php +++ b/views/stockoverview.blade.php @@ -97,7 +97,7 @@ data-consume-amount="{{ $currentStockEntry->amount }}"> {{ $L('All') }} -