1. PostgreSQL copy of all MySQL created and tested.\n 2. Purchase Orders and Sales Orders and stock level management added to MySQL, PostgreSQL, and server and front end code.

This commit is contained in:
2024-07-05 20:34:11 +01:00
parent 3a2a164213
commit 6f4e329258
3049 changed files with 535753 additions and 3022 deletions

View File

@@ -0,0 +1,555 @@
USE PARTSLTD_PROD;
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_save_supplier_purchase_order;
DROP TABLE IF EXISTS tmp_Shop_Supplier_Purchase_Order_Product_Link;
DROP TABLE IF EXISTS tmp_Msg_Error;
DELIMITER //
CREATE PROCEDURE p_shop_save_supplier_purchase_order (
IN a_guid VARCHAR(500),
IN a_id_user VARCHAR(200),
IN a_comment VARCHAR(500),
IN a_id_order INT,
IN a_id_supplier_ordered INT,
IN a_id_currency_cost INT
-- IN a_active BIT
)
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 VARCHAR(36);
-- DECLARE v_id_user VARCHAR(100);
DECLARE v_id_permission_supplier_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_supplier_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_supplier_purchase_order := (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_SUPPLIER_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_Supplier_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_Supplier_Purchase_Order(id_order),
*/
id_permutation INT NOT NULL,
CONSTRAINT FK_tmp_Supplier_Purchase_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,
quantity_ordered FLOAT NOT NULL,
id_unit_quantity INT NOT NULL,
CONSTRAINT FK_tmp_Supplier_Purchase_Order_Product_Link_id_unit_quantity
FOREIGN KEY (id_unit_quantity)
REFERENCES Shop_Unit_Measurement(id_unit_measurement),
quantity_received FLOAT NULL,
latency_delivery_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 VARCHAR(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_Supplier_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 Supplier 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_supplier_purchase_order := CASE WHEN a_id_order <= 0 THEN 1 ELSE 0 END;
INSERT INTO tmp_Shop_Supplier_Purchase_Order_Product_Link (
id_link,
id_order,
id_permutation,
cost_total_local,
id_currency_cost,
quantity_ordered,
id_unit_quantity,
quantity_received,
latency_delivery_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
SPOPL_T.id_link,
SPOPL_T.id_order,
SPOPL_T.id_permutation,
PP.cost_local * quantity_ordered AS cost_total_local,
SPOPL_T.id_currency_cost,
SPOPL_T.quantity_ordered,
SPOPL_T.id_unit_quantity,
SPOPL_T.quantity_received,
SPOPL_T.latency_delivery_days,
SPOPL_T.display_order,
SPOPL_T.active,
CONCAT(PP.id_permutation, ' - ', IFNULL(PP.name ,'')) AS name_error
FROM Shop_Supplier_Purchase_Order_Product_Link_Temp SPOPL_T
INNER JOIN Shop_Product_Permutation PP ON SPOPL_T.id_permutation = PP.id_permutation
WHERE SPOPL_T.GUID = a_guid
;
DELETE FROM Shop_Supplier_Purchase_Order_Product_Link_Temp SPOPL_T
WHERE SPOPL_T.GUID = a_guid
;
/*
UPDATE tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL
SET
cost_total_local
*/
END IF;
-- Invalid quantity ordered
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
IF EXISTS (
SELECT *
FROM tmp_Shop_Supplier_Purchase_Order_Product_Link
WHERE
NOT ISNULL(quantity_ordered)
AND quantity_ordered < 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 ordered property for the following permutations: ', GROUP_CONCAT(t_SPOPL.name_error SEPARATOR ', '))
FROM tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL
-- INNER JOIN Shop_Product_Permutation PP ON t_SPOPL.id_permutation = PP.id_permutation
WHERE t_SPOPL.quantity_ordered < 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_Supplier_Purchase_Order_Product_Link t_SPOPL 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_SPOPLC.name_error SEPARATOR ', '))
FROM (SELECT id_permutation, name_error, COUNT(*) FROM tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL GROUP BY id_permutation HAVING COUNT(*) > 1) t_SPOPLC
;
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_Supplier_Purchase_Order_Product_Link t_SPO
INNER JOIN Shop_Product_Permutation PP ON t_SPO.id_permutation = PP.id_permutation
) G
);
CALL p_shop_user_eval(v_guid_permission, a_id_user, 0, v_id_permission_supplier_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_supplier_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;
DELETE FROM Shop_User_Eval_Temp
WHERE GUID = a_guid;
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_supplier_purchase_order = 1 THEN 'new ' ELSE '' END,
'Supplier 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_supplier_purchase_order = 1) THEN
INSERT INTO Shop_Supplier_Purchase_Order (
id_supplier_ordered,
cost_total_local,
id_currency_cost,
created_by,
id_change_set,
active
)
SELECT
a_id_supplier_ordered,
SUM(t_SPOPL.cost_total_local),
a_id_currency_cost,
a_id_user,
v_id_change_set,
a_active
FROM tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL
;
-- SET v_id_order_new
SET a_id_order := (SELECT id_order FROM Shop_Supplier_Purchase_Order ORDER BY id_order DESC LIMIT 1);
INSERT INTO Shop_Supplier_Purchase_Order_Product_Link (
id_order,
id_permutation,
cost_total_local,
id_currency_cost,
quantity_ordered,
id_unit_quantity,
quantity_received,
latency_delivery_days,
display_order,
active,
created_by,
id_change_set
)
SELECT
a_id_order, -- v_id_order_new,
id_permutation,
cost_total_local,
id_currency_cost,
quantity_ordered,
id_unit_quantity,
quantity_received,
latency_delivery_days,
display_order,
active,
a_id_user,
v_id_change_set
FROM tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL
;
ELSE
UPDATE Shop_Supplier_Purchase_Order SPO
INNER JOIN tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL ON SPO.id_order = t_SPOPL.id_order
SET
SPO.id_supplier_ordered = a_id_supplier_ordered,
SPO.cost_total_local = SUM(t_SPOPL.cost_total_local),
SPO.id_currency = a_id_currency_cost,
SPO.id_change_set = v_id_change_set,
SPO.active = a_active
WHERE SPO.id_order = a_id_order
;
IF EXISTS (SELECT * FROM tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL INNER JOIN Shop_Supplier_Purchase_Order_Product_Link SPOPL ON t_SPOPL.id_link = SPOPL.id_link) THEN
UPDATE Shop_Supplier_Purchase_Order_Product_Link SPOPL
INNER JOIN tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL
ON SPOPL.id_link = t_SPOPL.id_link
SET
SPOPL.id_order = t_SPOPL.id_order,
SPOPL.id_permutation = t_SPOPL.id_permutation,
SPOPL.cost_total_local = t_SPOPL.cost_total_local,
SPOPL.id_currency_cost = t_SPOPL.id_currency_cost,
SPOPL.quantity_ordered = t_SPOPL.quantity_ordered,
SPOPL.id_unit_quantity = t_SPOPL.id_unit_quantity,
SPOPL.quantity_received = t_SPOPL.quantity_received,
SPOPL.latency_delivery_days = t_SPOPL.latency_delivery_days,
SPOPL.display_order = t_SPOPL.display_order,
SPOPL.active = t_SPOPL.active,
SPOPL.id_change_set = v_id_change_set
;
ELSE
INSERT INTO Shop_Supplier_Purchase_Order_Product_Link (
id_order,
id_permutation,
cost_total_local,
id_currency_cost,
quantity_ordered,
id_unit_quantity,
quantity_received,
latency_delivery_days,
display_order,
active,
created_by,
id_change_set
)
SELECT
id_order,
id_permutation,
cost_total_local,
id_currency_cost,
quantity_ordered,
id_unit_quantity,
quantity_received,
latency_delivery_days,
display_order,
active,
a_id_user,
v_id_change_set
FROM tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL
WHERE t_SPOPL.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();
# Supplier Purchase Orders
SELECT *
FROM Shop_Supplier_Purchase_Order
WHERE id_order = a_id_order
;
# Supplier Purchase Order Product Links
SELECT *
FROM Shop_Supplier_Purchase_Order_Product_Link
WHERE id_order = a_id_order
;
# Errors
SELECT *
FROM tmp_Msg_Error
;
# DROP TABLE tmp_Shop_Supplier_Purchase_Order;
DROP TABLE tmp_Shop_Supplier_Purchase_Order_Product_Link;
DROP TABLE tmp_Msg_Error;
END //
DELIMITER ;
/*
DELETE FROM Shop_Supplier_Purchase_Order_Product_Link_Audit;
DELETE FROM Shop_Supplier_Purchase_Order_Product_Link;
DELETE FROM Shop_Supplier_Purchase_Order_Product_Link_Temp;
DELETE FROM Shop_Supplier_Purchase_Order_Audit;
DELETE FROM Shop_Supplier_Purchase_Order;
INSERT INTO Shop_Supplier_Purchase_Order_Product_Link_Temp (
guid,
id_link,
id_order,
id_permutation,
cost_total_local,
id_currency_cost,
quantity_ordered,
id_unit_quantity,
quantity_received,
latency_delivery_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_ordered,
1, # id_unit_quantity,
1, # quantity_received,
14, # latency_delivery_days ,
1, # display_order
1 # active
)
;
SELECT * FROM Shop_Supplier_Purchase_Order_Product_Link_Temp;
CALL p_shop_save_supplier_purchase_order (
'NIPS', # a_guid
'auth0|6582b95c895d09a70ba10fef', # a_id_user
-1, # a_id_order
1, # a_id_supplier_ordered
1 # a_id_currency_cost
);
SELECT * FROM Shop_Supplier_Purchase_Order_Product_Link_Temp;
DELETE FROM Shop_Supplier_Purchase_Order_Product_Link_Audit;
DELETE FROM Shop_Supplier_Purchase_Order_Product_Link;
DELETE FROM Shop_Supplier_Purchase_Order_Product_Link_Temp;
DELETE FROM Shop_Supplier_Purchase_Order_Audit;
DELETE FROM Shop_Supplier_Purchase_Order;
*/