diff --git a/grocy.openapi.json b/grocy.openapi.json
index 7506b89c..ee661c4c 100644
--- a/grocy.openapi.json
+++ b/grocy.openapi.json
@@ -2181,12 +2181,6 @@
"default": 0,
"description": "The manual entered amount"
},
- "amount_autoadded": {
- "type": "integer",
- "minimum": 0,
- "default": 0,
- "description": "The automatically added amount based on defined minimum stock amounts"
- },
"row_created_timestamp": {
"type": "string",
"format": "date-time"
diff --git a/migrations/0048.sql b/migrations/0048.sql
new file mode 100644
index 00000000..566edf99
--- /dev/null
+++ b/migrations/0048.sql
@@ -0,0 +1,73 @@
+ALTER TABLE shopping_list RENAME TO shopping_list_old;
+
+CREATE TABLE shopping_list (
+ id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
+ product_id INTEGER,
+ note TEXT,
+ amount INTEGER NOT NULL DEFAULT 0,
+ row_created_timestamp DATETIME DEFAULT (datetime('now', 'localtime'))
+);
+
+INSERT INTO shopping_list
+ (product_id, amount, note, row_created_timestamp)
+SELECT product_id, amount + amount_autoadded, note, row_created_timestamp
+FROM shopping_list_old;
+
+DROP TABLE shopping_list_old;
+
+DROP VIEW recipes_fulfillment;
+CREATE VIEW recipes_fulfillment
+AS
+SELECT
+ r.id AS recipe_id,
+ rp.id AS recipe_pos_id,
+ rp.product_id AS product_id,
+ rp.amount AS recipe_amount,
+ IFNULL(sc.amount, 0) AS stock_amount,
+ CASE WHEN IFNULL(sc.amount, 0) >= CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) END THEN 1 ELSE 0 END AS need_fulfilled,
+ CASE WHEN IFNULL(sc.amount, 0) - CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) END < 0 THEN ABS(IFNULL(sc.amount, 0) - CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) END) ELSE 0 END AS missing_amount,
+ IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock AS amount_on_shopping_list,
+ CASE WHEN IFNULL(sc.amount, 0) + (IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock) >= CASE WHEN rp.only_check_single_unit_in_stock = 1 THEN 1 ELSE IFNULL(rp.amount, 0) END THEN 1 ELSE 0 END AS need_fulfilled_with_shopping_list,
+ rp.qu_id
+FROM recipes r
+JOIN recipes_pos rp
+ ON r.id = rp.recipe_id
+JOIN products p
+ ON rp.product_id = p.id
+LEFT JOIN (
+ SELECT product_id, SUM(amount) AS amount
+ FROM shopping_list
+ GROUP BY product_id) sl
+ ON rp.product_id = sl.product_id
+LEFT JOIN stock_current sc
+ ON rp.product_id = sc.product_id
+WHERE rp.not_check_stock_fulfillment = 0
+
+UNION
+
+-- Just add all recipe positions which should not be checked against stock with fulfilled need
+
+SELECT
+ r.id AS recipe_id,
+ rp.id AS recipe_pos_id,
+ rp.product_id AS product_id,
+ rp.amount AS recipe_amount,
+ IFNULL(sc.amount, 0) AS stock_amount,
+ 1 AS need_fulfilled,
+ 0 AS missing_amount,
+ IFNULL(sl.amount, 0) * p.qu_factor_purchase_to_stock AS amount_on_shopping_list,
+ 1 AS need_fulfilled_with_shopping_list,
+ rp.qu_id
+FROM recipes r
+JOIN recipes_pos rp
+ ON r.id = rp.recipe_id
+JOIN products p
+ ON rp.product_id = p.id
+LEFT JOIN (
+ SELECT product_id, SUM(amount) AS amount
+ FROM shopping_list
+ GROUP BY product_id) sl
+ ON rp.product_id = sl.product_id
+LEFT JOIN stock_current sc
+ ON rp.product_id = sc.product_id
+WHERE rp.not_check_stock_fulfillment = 1;
diff --git a/services/StockService.php b/services/StockService.php
index 20a7ce4e..f1365f4d 100644
--- a/services/StockService.php
+++ b/services/StockService.php
@@ -360,20 +360,23 @@ class StockService extends BaseService
foreach ($missingProducts as $missingProduct)
{
$product = $this->Database->products()->where('id', $missingProduct->id)->fetch();
- $amount = ceil($missingProduct->amount_missing / $product->qu_factor_purchase_to_stock);
+ $amountToAdd = ceil($missingProduct->amount_missing / $product->qu_factor_purchase_to_stock);
$alreadyExistingEntry = $this->Database->shopping_list()->where('product_id', $missingProduct->id)->fetch();
if ($alreadyExistingEntry) // Update
{
- $alreadyExistingEntry->update(array(
- 'amount_autoadded' => $amount
- ));
+ if ($alreadyExistingEntry->amount < $amountToAdd)
+ {
+ $alreadyExistingEntry->update(array(
+ 'amount' => $amountToAdd
+ ));
+ }
}
else // Insert
{
$shoppinglistRow = $this->Database->shopping_list()->createRow(array(
'product_id' => $missingProduct->id,
- 'amount_autoadded' => $amount
+ 'amount' => $amountToAdd
));
$shoppinglistRow->save();
}
diff --git a/views/shoppinglist.blade.php b/views/shoppinglist.blade.php
index 28495176..73a2cf89 100644
--- a/views/shoppinglist.blade.php
+++ b/views/shoppinglist.blade.php
@@ -73,7 +73,7 @@
- product_id)) data-toggle="tooltip" title="{{ $L('Add #3 #1 of #2 to stock', Pluralize($listItem->amount + $listItem->amount_autoadded, FindObjectInArrayByPropertyValue($quantityunits, 'id', FindObjectInArrayByPropertyValue($products, 'id', $listItem->product_id)->qu_id_purchase)->name, FindObjectInArrayByPropertyValue($quantityunits, 'id', FindObjectInArrayByPropertyValue($products, 'id', $listItem->product_id)->qu_id_purchase)->name_plural), FindObjectInArrayByPropertyValue($products, 'id', $listItem->product_id)->name, $listItem->amount + $listItem->amount_autoadded) }}" @endif>
+ product_id)) data-toggle="tooltip" title="{{ $L('Add #3 #1 of #2 to stock', Pluralize($listItem->amount, FindObjectInArrayByPropertyValue($quantityunits, 'id', FindObjectInArrayByPropertyValue($products, 'id', $listItem->product_id)->qu_id_purchase)->name, FindObjectInArrayByPropertyValue($quantityunits, 'id', FindObjectInArrayByPropertyValue($products, 'id', $listItem->product_id)->qu_id_purchase)->name_plural), FindObjectInArrayByPropertyValue($products, 'id', $listItem->product_id)->name, $listItem->amount) }}" @endif>
@@ -81,7 +81,7 @@
@if(!empty($listItem->product_id)) {{ FindObjectInArrayByPropertyValue($products, 'id', $listItem->product_id)->name }}
@endif{!! nl2br($listItem->note) !!}