1. View, filter, and save Product Permutation. \n 2. Synchronised with Product Category page and all common functionality moved into base and base table css, js, and python files.

This commit is contained in:
2024-09-24 23:25:52 +01:00
parent 2954b2050c
commit 45ac0405b4
243 changed files with 6596 additions and 4460 deletions

View File

@@ -1,605 +0,0 @@
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_save_permutation;
DROP TABLE IF EXISTS tmp_Shop_Manufacturing_Purchase_Order_Product_Link;
DROP TABLE IF EXISTS tmp_Msg_Error;
DELIMITER //
CREATE PROCEDURE p_shop_save_permutation (
IN a_guid VARCHAR(500),
IN a_id_user INT,
IN a_id_order INT,
-- IN a_id_supplier_ordered INT,
IN a_id_currency_cost INT,
IN a_active BIT,
IN a_comment VARCHAR(500)
)
BEGIN
DECLARE v_id_error_type_bad_data INT;
DECLARE v_code_error_type_bad_data VARCHAR(50);
DECLARE v_id_error_type_no_permission INT;
DECLARE v_code_error_type_no_permission VARCHAR(50);
DECLARE v_guid_permission BINARY(36);
-- DECLARE v_id_user VARCHAR(100);
DECLARE v_id_permission_manufacturing_purchase_order INT;
DECLARE v_id_access_level_EDIT INT;
DECLARE v_ids_product VARCHAR(4000);
DECLARE v_ids_product_no_permission VARCHAR(4000);
-- DECLARE v_id_order_new INT;
DECLARE v_id_change_set INT;
DECLARE v_is_new_manufacturing_purchase_order BIT;
SET SESSION sql_mode = sys.list_drop(@@session.sql_mode, 'ONLY_FULL_GROUP_BY');
SET v_code_error_type_bad_data = 'BAD_DATA';
SET v_id_error_type_bad_data := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_error_type_bad_data LIMIT 1);
SET v_code_error_type_no_permission = 'NO_PERMISSION';
SET v_id_error_type_no_permission := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_error_type_no_permission LIMIT 1);
SET v_guid_permission = UUID();
-- SET v_id_user = CURRENT_USER();
SET v_id_permission_manufacturing_purchase_order := (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_MANUFACTURING_PURCHASE_ORDER' LIMIT 1);
SET v_id_access_level_EDIT := (SELECT id_access_level FROM Shop_Access_Level WHERE code = 'EDIT');
-- Argument default values
IF a_guid IS NULL THEN
SET a_guid = UUID();
END IF;
IF a_active IS NULL THEN
SET a_active = 0;
END IF;
-- Temporary tables
/*
CREATE TABLE tmp_Shop_Supplier_Purchase_Order (
id_order INT NOT NULL PRIMARY KEY,
id_supplier_ordered INT NOT NULL,
CONSTRAINT FK_tmp_Shop_Supplier_Purchase_Order_id_supplier_ordered
FOREIGN KEY (id_supplier_ordered)
REFERENCES Shop_Supplier(id_supplier),
cost_total_local FLOAT NOT NULL,
id_currency_cost INT NOT NULL
);
*/
CREATE TABLE tmp_Shop_Manufacturing_Purchase_Order_Product_Link (
id_link INT NOT NULL PRIMARY KEY,
id_order INT NOT NULL,
/*
CONSTRAINT FK_tmp_Supplier_Purchase_Order_Product_Link_id_order
FOREIGN KEY (id_order)
REFERENCES Shop_Manufacturing_Purchase_Order(id_order),
*/
id_permutation INT NOT NULL,
CONSTRAINT FK_tmp_Manuf_Purch_Order_Product_Link_id_permutation
FOREIGN KEY (id_permutation)
REFERENCES Shop_Product_Permutation(id_permutation),
cost_total_local FLOAT NOT NULL,
id_currency_cost INT NOT NULL,
value_produced_total_local FLOAT NOT NULL,
quantity_used FLOAT NOT NULL,
id_unit_quantity INT NOT NULL,
CONSTRAINT FK_tmp_Manuf_Purch_Order_Product_Link_id_unit_quantity
FOREIGN KEY (id_unit_quantity)
REFERENCES Shop_Unit_Measurement(id_unit_measurement),
quantity_produced FLOAT NULL,
latency_manufacture_days INT NOT NULL,
display_order INT NOT NULL,
active BIT NOT NULL,
name_error VARCHAR(200) NOT NULL
);
CREATE TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
guid BINARY(36) NOT NULL,
id_type INT NOT NULL,
CONSTRAINT FK_tmp_Msg_Error_id_type
FOREIGN KEY (id_type)
REFERENCES Shop_Msg_Error_Type (id_type),
code VARCHAR(50) NOT NULL,
msg VARCHAR(4000) NOT NULL
);
-- Argument validation
# User ID
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
IF ISNULL(a_id_user) OR NOT EXISTS (SELECT * FROM Shop_User WHERE id_user = a_id_user) THEN
INSERT INTO tmp_Msg_Error (
guid, id_type, code, msg
)
VALUES
(a_guid, v_id_error_type_bad_data, v_code_error_type_bad_data, CONCAT('Invalid User ID: ', IFNULL(a_id_user, 'NULL')))
;
END IF;
END IF;
# Order ID
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
IF ISNULL(a_id_order) OR ((a_id_order > 0) AND NOT EXISTS (SELECT * FROM Shop_Manufacturing_Purchase_Order WHERE id_order = a_id_order)) THEN
INSERT INTO tmp_Msg_Error (
guid, id_type, code, msg
)
VALUES
(a_guid, v_id_error_type_bad_data, v_code_error_type_bad_data, CONCAT('Invalid Manufacturing Purchase Order ID: ', IFNULL(a_id_order, 'NULL')))
;
END IF;
END IF;
/*
# Supplier ID
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
IF ISNULL(a_id_supplier_ordered) OR NOT EXISTS (SELECT * FROM Shop_Supplier WHERE id_supplier = a_id_supplier_ordered) THEN
INSERT INTO tmp_Msg_Error (
guid, id_type, code, msg
)
VALUES
(a_guid, v_id_error_type_bad_data, v_code_error_type_bad_data, CONCAT('Invalid supplier ID: ', IFNULL(a_id_supplier_ordered, 'NULL')))
;
END IF;
END IF;
*/
# Currency ID
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
IF ISNULL(a_id_currency_cost) OR NOT EXISTS (SELECT * FROM Shop_Currency WHERE id_currency = a_id_currency_cost) THEN
INSERT INTO tmp_Msg_Error (
guid, id_type, code, msg
)
VALUES
(a_guid, v_id_error_type_bad_data, v_code_error_type_bad_data, CONCAT('Invalid currency ID: ', IFNULL(a_id_currency, 'NULL')))
;
END IF;
END IF;
# Comment
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
IF ISNULL(a_comment) OR TRIM(a_comment) = '' THEN
INSERT INTO tmp_Msg_Error (
guid, id_type, code, msg
)
VALUES
(a_guid, v_id_error_type_bad_data, v_code_error_type_bad_data, 'A comment must be provided.')
;
END IF;
END IF;
-- Get data from Temp table
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
SET v_is_new_manufacturing_purchase_order := CASE WHEN a_id_order <= 0 THEN 1 ELSE 0 END;
INSERT INTO tmp_Shop_Manufacturing_Purchase_Order_Product_Link (
id_link,
id_order,
id_permutation,
cost_total_local,
id_currency_cost,
quantity_used,
id_unit_quantity,
quantity_produced,
value_produced_total_local,
latency_manufacture_days,
display_order,
active,
name_error
)
/*
VALUES
(a_id_supplier, a_name_company, a_name_contact, a_department_contact, a_id_address, a_phone_number, a_fax, a_email, a_website, a_id_currency, a_active)
*/
SELECT
MPOPL_T.id_link,
MPOPL_T.id_order,
MPOPL_T.id_permutation,
PP.cost_local * MPOPL_T.quantity_used AS cost_total_local,
MPOPL_T.id_currency_cost,
MPOPL_T.quantity_used,
MPOPL_T.id_unit_quantity,
MPOPL_T.quantity_produced,
(PP.cost_local + PP.profit_local_min) * MPOPL_T.quantity_produced AS value_produced_total_local,
MPOPL_T.latency_manufacture_days,
MPOPL_T.display_order,
MPOPL_T.active,
CONCAT(PP.id_permutation, ' - ', IFNULL(P.name ,'')) AS name_error
FROM Shop_Manufacturing_Purchase_Order_Product_Link_Temp MPOPL_T
INNER JOIN Shop_Product_Permutation PP ON MPOPL_T.id_permutation = PP.id_permutation
INNER JOIN Shop_Product P ON PP.id_product = P.id_product
WHERE MPOPL_T.GUID = a_guid
-- GROUP BY MPOPL_T.id_order, name_error, MPOPL_T.id_link
/*
group by
MPOPL_T.id_link,
MPOPL_T.id_order,
MPOPL_T.id_permutation,
cost_total_local,
MPOPL_T.id_currency_cost,
MPOPL_T.quantity_used,
MPOPL_T.id_unit_quantity,
MPOPL_T.quantity_produced,
value_produced_total_local,
MPOPL_T.latency_manufacture_days,
MPOPL_T.display_order,
MPOPL_T.active,
name_error
*/
-- GROUP BY id_link, P.id_product, PP.id_permutation
-- GROUP BY name_error, ID_LINK, cost_total_local, value_produced_total_local
;
DELETE MPOPL_T
FROM Shop_Manufacturing_Purchase_Order_Product_Link_Temp MPOPL_T
WHERE MPOPL_T.GUID = a_guid
;
END IF;
-- Invalid quantity used
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
IF EXISTS (
SELECT *
FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link
WHERE
NOT ISNULL(quantity_used)
AND quantity_used < 0
) THEN
INSERT INTO tmp_Msg_Error (
guid, id_type, code, msg
)
SELECT
a_guid,
v_id_error_type_bad_data,
v_code_error_type_bad_data,
CONCAT('Invalid quantity used property for the following permutations: ', GROUP_CONCAT(t_MPOPL.name_error SEPARATOR ', '))
FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL
WHERE t_MPOPL.quantity_used < 0
;
END IF;
END IF;
-- Invalid quantity produced
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
IF EXISTS (
SELECT *
FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link
WHERE
NOT ISNULL(quantity_produced)
AND quantity_produced < 0
) THEN
INSERT INTO tmp_Msg_Error (
guid, id_type, code, msg
)
SELECT
a_guid,
v_id_error_type_bad_data,
v_code_error_type_bad_data,
CONCAT('Invalid quantity produced property for the following permutations: ', GROUP_CONCAT(t_MPOPL.name_error SEPARATOR ', '))
FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL
WHERE t_MPOPL.quantity_produced < 0
;
END IF;
END IF;
-- Duplicates
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
IF EXISTS (SELECT id_permutation, name_error, COUNT(*) FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL GROUP BY id_permutation HAVING COUNT(*) > 1) THEN
INSERT INTO tmp_Msg_Error (
guid, id_type, code, msg
)
SELECT
a_guid,
v_id_error_type_bad_data,
v_code_error_type_bad_data,
CONCAT('Duplicate records: ', GROUP_CONCAT(t_MPOPLC.name_error SEPARATOR ', '))
FROM (SELECT id_permutation, name_error, COUNT(*) FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL GROUP BY id_permutation HAVING COUNT(*) > 1) t_MPOPLC
;
END IF;
END IF;
-- Permissions
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
SET v_ids_product := (
SELECT GROUP_CONCAT(G.id_product SEPARATOR ',')
FROM (
SELECT DISTINCT PP.id_product
FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPO
INNER JOIN Shop_Product_Permutation PP ON t_MPO.id_permutation = PP.id_permutation
) G
);
CALL p_shop_user_eval(v_guid_permission, a_id_user, 0, v_id_permission_manufacturing_purchase_order, v_id_access_level_edit, v_ids_product);
/*
UPDATE tmp_Shop_Supplier t_S
INNER JOIN Shop_User_Eval_Temp TP
ON TP.GUID = v_guid_permission
SET tP.can_view = TP.can_view,
tP.can_edit = TP.can_edit,
tP.can_admin = TP.can_admin;
*/
/*
SET v_has_permission := (
SELECT can_edit
FROM Shop_User_Eval_Temp
WHERE
GUID = v_guid_permission
AND can_edit = 0
);
IF v_has_permission = 0 THEN
SET v_id_error_type_no_permission := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION');
INSERT INTO tmp_Msg_Error (
guid, id_type, msg
)
SELECT
a_guid,
v_id_error_type_no_permission,
CONCAT('You do not have ', name, ' permissions.')
FROM Shop_Permission
WHERE id_permission = v_id_permission_manufacturing_purchase_order
;
END IF;
*/
SET v_ids_product_no_permission := (
SELECT GROUP_CONCAT(PT.id_product SEPARATOR ',')
FROM Shop_User_Eval_Temp PT
WHERE
PT.can_edit = 0
AND NOT ISNULL(PT.id_product)
);
IF NOT ISNULL(v_ids_product_no_permission) THEN
INSERT INTO tmp_Msg_Error (
guid, id_type, code, msg
)
VALUES (
a_guid,
v_id_error_type_no_permission,
v_code_error_type_no_permission,
CONCAT('You do not have permission to edit the following product IDs: ', v_ids_product_no_permission)
)
;
END IF;
END IF;
-- Transaction
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
START TRANSACTION;
INSERT INTO Shop_Sales_And_Purchasing_Change_Set (
comment,
updated_last_by,
updated_last_on
)
VALUES (
CONCAT(
'Save ',
CASE WHEN v_is_new_manufacturing_purchase_order = 1 THEN 'new ' ELSE '' END,
'Manufacturing Purchase Order - ',
a_comment
),
a_id_user,
CURRENT_TIME()
);
SET v_id_change_set := (SELECT id_change_set FROM Shop_Sales_And_Purchasing_Change_Set ORDER BY id_change_set DESC LIMIT 1);
IF (v_is_new_manufacturing_purchase_order = 1) THEN
INSERT INTO Shop_Manufacturing_Purchase_Order (
-- id_supplier_ordered,
cost_total_local,
id_currency_cost,
value_produced_total_local,
created_by,
id_change_set,
active
)
SELECT
-- a_id_supplier_ordered,
SUM(t_MPOPL.cost_total_local),
a_id_currency_cost,
SUM(t_MPOPL.value_produced_total_local),
a_id_user,
v_id_change_set,
a_active
FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL
;
-- SET v_id_order_new
SET a_id_order := (SELECT id_order FROM Shop_Manufacturing_Purchase_Order ORDER BY id_order DESC LIMIT 1);
INSERT INTO Shop_Manufacturing_Purchase_Order_Product_Link (
id_order,
id_permutation,
cost_total_local,
value_produced_total_local,
id_currency_cost,
quantity_used,
id_unit_quantity,
quantity_produced,
latency_manufacture_days,
display_order,
active,
created_by,
id_change_set
)
SELECT
a_id_order, -- v_id_order_new,
id_permutation,
cost_total_local,
value_produced_total_local,
id_currency_cost,
quantity_used,
id_unit_quantity,
quantity_produced,
latency_manufacture_days,
display_order,
active,
a_id_user,
v_id_change_set
FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL
;
ELSE
UPDATE Shop_Manufacturing_Purchase_Order MPO
INNER JOIN tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL ON MPO.id_order = t_MPOPL.id_order
SET
-- MPO.id_supplier_ordered = a_id_supplier_ordered,
MPO.cost_total_local = SUM(t_MPOPL.cost_total_local),
MPO.value_produced_total_local = SUM(t_MPOPL.value_produced_total_local),
MPO.id_currency = a_id_currency_cost,
MPO.id_change_set = v_id_change_set,
MPO.active = a_active
WHERE MPO.id_order = a_id_order
;
IF EXISTS (SELECT * FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL INNER JOIN Shop_Manufacturing_Purchase_Order_Product_Link MPOPL ON t_MPOPL.id_link = MPOPL.id_link) THEN
UPDATE Shop_Manufacturing_Purchase_Order_Product_Link MPOPL
INNER JOIN tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL
ON MPOPL.id_link = t_MPOPL.id_link
SET
MPOPL.id_order = t_MPOPL.id_order,
MPOPL.id_permutation = t_MPOPL.id_permutation,
MPOPL.cost_total_local = t_MPOPL.cost_total_local,
MPOPL.value_produced_total_local = t_MPOPL.value_produced_total_local,
MPOPL.id_currency_cost = t_MPOPL.id_currency_cost,
MPOPL.quantity_used = t_MPOPL.quantity_used,
MPOPL.id_unit_quantity = t_MPOPL.id_unit_quantity,
MPOPL.quantity_produced = t_MPOPL.quantity_produced,
MPOPL.latency_manufacture_days = t_MPOPL.latency_manufacture_days,
MPOPL.display_order = t_MPOPL.display_order,
MPOPL.active = t_MPOPL.active,
MPOPL.id_change_set = v_id_change_set
;
ELSE
INSERT INTO Shop_Manufacturing_Purchase_Order_Product_Link (
id_order,
id_permutation,
cost_total_local,
value_produced_total_local,
id_currency_cost,
quantity_used,
id_unit_quantity,
quantity_produced,
latency_manufacture_days,
display_order,
active,
created_by,
id_change_set
)
SELECT
id_order,
id_permutation,
cost_total_local,
value_produced_total_local,
id_currency_cost,
quantity_used,
id_unit_quantity,
quantity_produced,
latency_manufacture_days,
display_order,
active,
a_id_user,
v_id_change_set
FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL
WHERE t_MPOPL.id_link < 0
;
END IF;
END IF;
IF EXISTS (SELECT * FROM tmp_Msg_Error) THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END IF;
-- Returns
# SET v_now = NOW();
# Manufacturing Purchase Orders
SELECT *
FROM Shop_Manufacturing_Purchase_Order
WHERE
id_order = a_id_order
-- GUID = a_guid
;
# Manufacturing Purchase Order Product Links
SELECT *
FROM Shop_Manufacturing_Purchase_Order_Product_Link
WHERE
id_order = a_id_order
-- GUID = a_guid
;
# Errors
SELECT *
FROM tmp_Msg_Error
;
# DROP TABLE tmp_Shop_Manufacturing_Purchase_Order;
DROP TABLE tmp_Shop_Manufacturing_Purchase_Order_Product_Link;
DROP TABLE tmp_Msg_Error;
END //
DELIMITER ;;
/*
DELETE FROM Shop_Manufacturing_Purchase_Order_Product_Link_Audit;
DELETE FROM Shop_Manufacturing_Purchase_Order_Product_Link;
DELETE FROM Shop_Manufacturing_Purchase_Order_Product_Link_Temp;
DELETE FROM Shop_Manufacturing_Purchase_Order_Audit;
DELETE FROM Shop_Manufacturing_Purchase_Order;
INSERT INTO Shop_Manufacturing_Purchase_Order_Product_Link_Temp (
guid,
id_link,
id_order,
id_permutation,
cost_total_local,
id_currency_cost,
quantity_used,
id_unit_quantity,
quantity_produced,
latency_manufacture_days,
display_order,
active
)
VALUES
(
'NIPS', # guid
-1, # id_link,
-1, # id_order,
1, # id_permutation,
100, # cost_total_local,
1, # id_currency_cost,
1, # quantity_used,
1, # id_unit_quantity,
1, # quantity_produced,
14, # latency_manufacture_days ,
1, # display_order
1 # active
)
;
SELECT * FROM Shop_Manufacturing_Purchase_Order_Product_Link_Temp;
CALL p_shop_save_manufacturing_purchase_order (
'NIPS', # a_guid
'auth0|6582b95c895d09a70ba10fef', # a_id_user
-1, # a_id_order
1, # a_id_currency_cost
1, # a_active
'Initial data' # a_comment
);
SELECT * FROM Shop_Manufacturing_Purchase_Order_Product_Link_Temp;
DELETE FROM Shop_Manufacturing_Purchase_Order_Product_Link_Audit;
DELETE FROM Shop_Manufacturing_Purchase_Order_Product_Link;
DELETE FROM Shop_Manufacturing_Purchase_Order_Product_Link_Temp;
DELETE FROM Shop_Manufacturing_Purchase_Order_Audit;
DELETE FROM Shop_Manufacturing_Purchase_Order;
*/