Simplified stock entry label printing options (on purchase) (references #1647)

This commit is contained in:
Bernd Bestel 2021-11-13 18:26:01 +01:00
parent 89b87156de
commit fc413a05d1
No known key found for this signature in database
GPG Key ID: 71BD34C0D4891300
6 changed files with 183 additions and 87 deletions

View File

@ -2095,6 +2095,9 @@ msgstr ""
msgid "Print on label printer" msgid "Print on label printer"
msgstr "" msgstr ""
msgid "Default stock entry label"
msgstr ""
msgid "Stock entry label" msgid "Stock entry label"
msgstr "" msgstr ""
@ -2107,12 +2110,6 @@ msgstr ""
msgid "Label per unit" msgid "Label per unit"
msgstr "" msgstr ""
msgid "Allow label printing per unit"
msgstr ""
msgid "Allow printing of one label per unit on purchase (after conversion) - e.g. 1 purchased pack adding 10 pieces of stock would print 10 labels"
msgstr ""
msgid "Error while executing WebHook" msgid "Error while executing WebHook"
msgstr "" msgstr ""
@ -2244,3 +2241,6 @@ msgstr ""
msgid "Are you sure to empty the shopping list?" msgid "Are you sure to empty the shopping list?"
msgstr "" msgstr ""
msgid "This is the default which will be prefilled on purchase"
msgstr ""

158
migrations/0155.sql Normal file
View File

@ -0,0 +1,158 @@
PRAGMA legacy_alter_table = ON;
ALTER TABLE products RENAME TO products_old;
-- Remove allow_label_per_unit column
CREATE TABLE products (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
name TEXT NOT NULL UNIQUE,
description TEXT,
product_group_id INTEGER,
active TINYINT NOT NULL DEFAULT 1 CHECK(active IN (0, 1)),
location_id INTEGER NOT NULL,
shopping_location_id INTEGER,
qu_id_purchase INTEGER NOT NULL,
qu_id_stock INTEGER NOT NULL,
qu_factor_purchase_to_stock REAL NOT NULL,
min_stock_amount INTEGER NOT NULL DEFAULT 0,
default_best_before_days INTEGER NOT NULL DEFAULT 0,
default_best_before_days_after_open INTEGER NOT NULL DEFAULT 0,
default_best_before_days_after_freezing INTEGER NOT NULL DEFAULT 0,
default_best_before_days_after_thawing INTEGER NOT NULL DEFAULT 0,
picture_file_name TEXT,
enable_tare_weight_handling TINYINT NOT NULL DEFAULT 0,
tare_weight REAL NOT NULL DEFAULT 0,
not_check_stock_fulfillment_for_recipes TINYINT DEFAULT 0,
parent_product_id INT,
calories INTEGER,
cumulate_min_stock_amount_of_sub_products TINYINT DEFAULT 0,
due_type TINYINT NOT NULL DEFAULT 1 CHECK(due_type IN (1, 2)),
quick_consume_amount REAL NOT NULL DEFAULT 1,
hide_on_stock_overview TINYINT NOT NULL DEFAULT 0 CHECK(hide_on_stock_overview IN (0, 1)),
default_print_stock_label INTEGER NOT NULL DEFAULT 0,
should_not_be_frozen TINYINT NOT NULL DEFAULT 0 CHECK(should_not_be_frozen IN (0, 1)),
row_created_timestamp DATETIME DEFAULT (datetime('now', 'localtime'))
);
INSERT INTO products
(id, name, description, product_group_id, active, location_id, shopping_location_id, qu_id_purchase, qu_id_stock, qu_factor_purchase_to_stock, min_stock_amount, default_best_before_days, default_best_before_days_after_open, default_best_before_days_after_freezing, default_best_before_days_after_thawing, picture_file_name, enable_tare_weight_handling, tare_weight, not_check_stock_fulfillment_for_recipes, parent_product_id, calories, cumulate_min_stock_amount_of_sub_products, due_type, quick_consume_amount, hide_on_stock_overview, default_print_stock_label, should_not_be_frozen, row_created_timestamp)
SELECT id, name, description, product_group_id, active, location_id, shopping_location_id, qu_id_purchase, qu_id_stock, qu_factor_purchase_to_stock, min_stock_amount, default_best_before_days, default_best_before_days_after_open, default_best_before_days_after_freezing, default_best_before_days_after_thawing, picture_file_name, enable_tare_weight_handling, tare_weight, not_check_stock_fulfillment_for_recipes, parent_product_id, calories, cumulate_min_stock_amount_of_sub_products, due_type, quick_consume_amount, hide_on_stock_overview, default_print_stock_label, should_not_be_frozen, row_created_timestamp
FROM products_old;
DROP TABLE products_old;
CREATE TRIGGER prevent_qu_stock_change_after_first_purchase AFTER UPDATE ON products
BEGIN
SELECT CASE WHEN((
SELECT 1
FROM stock_log
WHERE product_id = NEW.id
AND NEW.qu_id_stock != OLD.qu_id_stock
) NOTNULL) THEN RAISE(ABORT, "qu_id_stock cannot be changed when the product was once added to stock") END;
END;
CREATE TRIGGER enforce_parent_product_id_null_when_empty_INS AFTER INSERT ON products
BEGIN
UPDATE products
SET parent_product_id = NULL
WHERE id = NEW.id
AND IFNULL(parent_product_id, '') = '';
END;
CREATE TRIGGER enforce_parent_product_id_null_when_empty_UPD AFTER UPDATE ON products
BEGIN
UPDATE products
SET parent_product_id = NULL
WHERE id = NEW.id
AND IFNULL(parent_product_id, '') = '';
END;
CREATE TRIGGER cascade_product_removal AFTER DELETE ON products
BEGIN
DELETE FROM stock
WHERE product_id = OLD.id;
DELETE FROM stock_log
WHERE product_id = OLD.id;
DELETE FROM product_barcodes
WHERE product_id = OLD.id;
DELETE FROM quantity_unit_conversions
WHERE product_id = OLD.id;
DELETE FROM recipes_pos
WHERE product_id = OLD.id;
UPDATE recipes
SET product_id = NULL
WHERE product_id = OLD.id;
DELETE FROM meal_plan
WHERE product_id = OLD.id
AND type = 'product';
DELETE FROM shopping_list
WHERE product_id = OLD.id;
END;
CREATE TRIGGER enfore_product_nesting_level BEFORE UPDATE ON products
BEGIN
-- Currently only 1 level is supported
SELECT CASE WHEN((
SELECT 1
FROM products p
WHERE IFNULL(NEW.parent_product_id, '') != ''
AND IFNULL(parent_product_id, '') = NEW.id
) NOTNULL) THEN RAISE(ABORT, "Unsupported product nesting level detected (currently only 1 level is supported)") END;
END;
CREATE TRIGGER enforce_min_stock_amount_for_cumulated_childs_INS AFTER INSERT ON products
BEGIN
/*
When a parent product has cumulate_min_stock_amount_of_sub_products enabled,
the child should not have any min_stock_amount
*/
UPDATE products
SET min_stock_amount = 0
WHERE id IN (
SELECT
p_child.id
FROM products p_parent
JOIN products p_child
ON p_child.parent_product_id = p_parent.id
WHERE p_parent.id = NEW.id
AND IFNULL(p_parent.cumulate_min_stock_amount_of_sub_products, 0) = 1
)
AND min_stock_amount > 0;
END;
CREATE TRIGGER enforce_min_stock_amount_for_cumulated_childs_UPD AFTER UPDATE ON products
BEGIN
/*
When a parent product has cumulate_min_stock_amount_of_sub_products enabled,
the child should not have any min_stock_amount
*/
UPDATE products
SET min_stock_amount = 0
WHERE id IN (
SELECT
p_child.id
FROM products p_parent
JOIN products p_child
ON p_child.parent_product_id = p_parent.id
WHERE p_parent.id = NEW.id
AND IFNULL(p_parent.cumulate_min_stock_amount_of_sub_products, 0) = 1
)
AND min_stock_amount > 0;
END;
CREATE INDEX ix_products_performance1 ON products (
parent_product_id
);
CREATE INDEX ix_products_performance2 ON products (
CASE WHEN parent_product_id IS NULL THEN id ELSE parent_product_id END,
active
);

View File

@ -405,22 +405,6 @@ $('#qu_id_stock').change(function(e)
} }
}); });
$('#allow_label_per_unit').on('change', function()
{
if (this.checked)
{
$('#label-option-per-unit').prop("disabled", false);
}
else
{
if ($('#default_print_stock_label').val() == "2")
{
$("#default_print_stock_label").val("0");
}
$('#label-option-per-unit').prop("disabled", true);
}
});
$(window).on("message", function(e) $(window).on("message", function(e)
{ {
var data = e.originalEvent.data; var data = e.originalEvent.data;

View File

@ -185,6 +185,10 @@ $('#save-purchase-button').on('click', function(e)
} }
Grocy.Components.ProductPicker.GetInputElement().focus(); Grocy.Components.ProductPicker.GetInputElement().focus();
Grocy.Components.ProductCard.Refresh(jsonForm.product_id); Grocy.Components.ProductCard.Refresh(jsonForm.product_id);
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_LABEL_PRINTER)
{
$("#print_stock_label").val(0);
}
$('#price-hint').text(""); $('#price-hint').text("");
var priceTypeUnitPrice = $("#price-type-unit-price"); var priceTypeUnitPrice = $("#price-type-unit-price");
@ -291,18 +295,6 @@ if (Grocy.Components.ProductPicker !== undefined)
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_LABEL_PRINTER) if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_LABEL_PRINTER)
{ {
$("#print_stock_label").val(productDetails.product.default_print_stock_label); $("#print_stock_label").val(productDetails.product.default_print_stock_label);
if (productDetails.product.allow_label_per_unit)
{
if ($('#default_print_stock_label').val() == "2")
{
$("#default_print_stock_label").val("0");
}
$('#label-option-per-unit').prop("disabled", true);
}
else
{
$('#label-option-per-unit').prop("disabled", false);
}
} }
$("#display_amount").focus(); $("#display_amount").focus();

View File

@ -447,60 +447,23 @@
@if(GROCY_FEATURE_FLAG_LABEL_PRINTER) @if(GROCY_FEATURE_FLAG_LABEL_PRINTER)
<div class="form-group"> <div class="form-group">
<div class="custom-control custom-checkbox"> <label for="default_print_stock_label">{{ $__t('Default stock entry label') }}</label>
<input @if($mode=='edit' <i class="fas fa-question-circle text-muted"
&&
$product->allow_label_per_unit == 1) checked @endif class="form-check-input custom-control-input" type="checkbox" id="allow_label_per_unit" name="allow_label_per_unit" value="1">
<label class="form-check-label custom-control-label"
for="allow_label_per_unit">{{ $__t('Allow label printing per unit') }}&nbsp;<i class="fas fa-question-circle text-muted"
data-toggle="tooltip" data-toggle="tooltip"
data-trigger="hover click" data-trigger="hover click"
title="{{ $__t('Allow printing of one label per unit on purchase (after conversion) - e.g. 1 purchased pack adding 10 pieces of stock would print 10 labels') }}"></i> title="{{ $__t('This is the default which will be prefilled on purchase') }}"></i>
</label>
</div>
</div>
@php
$no_label = "";
$single_label = "";
$per_unit_label = "";
$disable_per_unit = "";
if($mode == 'edit') {
switch($product->default_print_stock_label) {
case 0: $no_label = "selected"; break;
case 1: $single_label = "selected"; break;
case 2: $per_unit_label = "selected"; break;
default: break; // yolo
}
if($product->allow_label_per_unit == 0) {
$disable_per_unit="disabled";
$per_unit_label = "";
}
}
@endphp
<div class="form-group">
<label for="default_print_stock_label">{{ $__t('Stock entry label') }}</label>
<select class="form-control" <select class="form-control"
id="default_print_stock_label" id="default_print_stock_label"
name="default_print_stock_label"> name="default_print_stock_label">
<option value="0" <option @if($mode=='edit'
{{ &&
$no_label intval($product->default_print_stock_label) == 0 ) selected="selected" @endif value="0">{{ $__t('No label') }}</option>
}}>{{ $__t('No label') }}</option> <option @if($mode=='edit'
<option value="1" &&
{{ intval($product->default_print_stock_label) == 1 ) selected="selected" @endif value="1">{{ $__t('Single label') }}</option>
$single_label <option @if($mode=='edit'
}}>{{ $__t('Single label') }}</option> &&
<option value="2" intval($product->default_print_stock_label) == 2 ) selected="selected" @endif value="2">{{ $__t('Label per unit') }}</option>
{{
$per_unit_label
}}
{{
$disable_per_unit
}}
id="label-option-per-unit">{{ $__t('Label per unit') }}</option>
</select> </select>
</div> </div>
@endif @endif

View File

@ -156,8 +156,7 @@
name="print_stock_label"> name="print_stock_label">
<option value="0">{{ $__t('No label') }}</option> <option value="0">{{ $__t('No label') }}</option>
<option value="1">{{ $__t('Single label') }}</option> <option value="1">{{ $__t('Single label') }}</option>
<option value="2" <option value="2">{{ $__t('Label per unit') }}</option>
id="label-option-per-unit">{{ $__t('Label per unit') }}</option>
</select> </select>
<div class="invalid-feedback">{{ $__t('A quantity unit is required') }}</div> <div class="invalid-feedback">{{ $__t('A quantity unit is required') }}</div>
</div> </div>