Files
partsERP/static/MySQL/7206_p_shop_save_permutation.sql

606 lines
19 KiB
SQL

-- 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;
*/