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') }}
-