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,515 @@
-- DROP TABLE IF EXISTS tmp_Shop_Supplier_Purchase_Order_Product_Link;
-- DROP TABLE IF EXISTS tmp_Msg_Error;
CREATE OR REPLACE PROCEDURE p_shop_save_supplier_purchase_order (
IN a_guid UUID,
IN a_id_user INTEGER,
IN a_comment UUID,
IN a_id_order INTEGER,
IN a_id_supplier_ordered INTEGER,
IN a_id_currency_cost INTEGER,
IN a_active BOOLEAN
)
AS $$
DECLARE
v_guid UUID;
v_id_user INTEGER;
v_comment VARCHAR(4000);
v_id_order INTEGER;
v_id_supplier_ordered INTEGER;
v_id_currency_cost INTEGER;
v_active BOOLEAN;
v_id_error_type_bad_data INTEGER;
v_code_error_type_bad_data VARCHAR(50);
v_id_error_type_no_permission INTEGER;
v_code_error_type_no_permission VARCHAR(50);
v_guid_permission UUID;
-- v_id_user VARCHAR(100);
v_id_permission_supplier_purchase_order INTEGER;
v_id_access_level_EDIT INTEGER;
v_ids_product VARCHAR(4000);
v_ids_product_no_permission VARCHAR(4000);
-- v_id_order_new INTEGER;
v_id_change_set INTEGER;
v_is_new_supplier_purchase_order BOOLEAN;
-- result_orders REFCURSOR;
-- result_order_product_links REFCURSOR;
-- result_errors REFCURSOR;
BEGIN
-- SET SESSION sql_mode = sys.list_drop(@@session.sql_mode, 'ONLY_FULL_GROUP_BY');
v_guid := COALESCE(a_guid, gen_random_uuid());
v_id_user := TRIM(COALESCE(a_id_user, ''));
v_comment := TRIM(COALESCE(a_comment, ''));
v_id_order := COALESCE(a_id_order, -1);
v_id_supplier_ordered := a_id_supplier_ordered;
v_id_currency_cost := a_id_currency_cost;
v_active := COALESCE(a_active, FALSE);
v_code_error_type_bad_data = 'BAD_DATA';
v_id_error_type_bad_data := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_error_type_bad_data LIMIT 1);
v_code_error_type_no_permission = 'NO_PERMISSION';
v_id_error_type_no_permission := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_error_type_no_permission LIMIT 1);
v_guid_permission = gen_random_uuid();
-- v_id_user = CURRENT_USER;
v_id_permission_supplier_purchase_order := (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_SUPPLIER_PURCHASE_ORDER' LIMIT 1);
v_id_access_level_EDIT := (SELECT id_access_level FROM Shop_Access_Level WHERE code = 'EDIT');
v_is_new_supplier_purchase_order := CASE WHEN v_id_order <= 0 THEN TRUE ELSE FALSE END;
-- Temporary tables
/*
CREATE TABLE tmp_Shop_Supplier_Purchase_Order (
id_order INTEGER NOT NULL PRIMARY KEY,
id_supplier_ordered INTEGER 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 REAL NOT NULL,
id_currency_cost INTEGER NOT NULL
);
*/
CREATE TABLE tmp_Shop_Supplier_Purchase_Order_Product_Link (
id_link INTEGER NOT NULL PRIMARY KEY,
id_order INTEGER 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 INTEGER 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 REAL NOT NULL,
id_currency_cost INTEGER NOT NULL,
quantity_ordered REAL NOT NULL,
id_unit_quantity INTEGER 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 REAL NULL,
latency_delivery_days INTEGER NOT NULL,
display_order INTEGER NOT NULL,
active BOOLEAN NOT NULL,
name_error VARCHAR(200) NOT NULL
);
/*
CREATE TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
guid UUID NOT NULL,
id_type INTEGER 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 Shop_User WHERE id_user = v_id_user) THEN
RAISE EXCEPTION 'Invalid User ID: %', COALESCE(v_id_user, 'NULL')
USING ERRCODE = '22000'
;
END IF;
-- Order ID
IF ((v_id_order > 0) AND NOT EXISTS (SELECT * FROM Shop_Supplier_Purchase_Order WHERE id_order = v_id_order)) THEN
RAISE EXCEPTION 'Invalid Supplier Purchase Order ID: %', COALESCE(v_id_order, 'NULL')
USING ERRCODE = '22000'
;
END IF;
-- Supplier ID
IF ISNULL(v_id_supplier_ordered) OR NOT EXISTS (SELECT * FROM Shop_Supplier WHERE id_supplier = v_id_supplier_ordered) THEN
RAISE EXCEPTION 'Invalid Supplier ID: %', COALESCE(v_id_supplier_ordered, 'NULL')
USING ERRCODE = '22000'
;
END IF;
-- Currency ID
IF ISNULL(v_id_currency_cost) OR NOT EXISTS (SELECT * FROM Shop_Currency WHERE id_currency = v_id_currency_cost) THEN
RAISE EXCEPTION 'Invalid currency ID: %', COALESCE(v_id_currency, 'NULL')
USING ERRCODE = '22000'
;
END IF;
-- Comment
IF v_comment = '' THEN
RAISE EXCEPTION 'A comment must be provided.'
USING ERRCODE = '22000'
;
END IF;
-- Get data from Temp table
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
)
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,
CAST(PP.id_permutation AS VARCHAR(10)) || ' - ' || COALESCE(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 = v_guid
;
DELETE FROM Shop_Supplier_Purchase_Order_Product_Link_Temp SPOPL_T
WHERE SPOPL_T.GUID = v_guid
;
/*
UPDATE tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL
cost_total_local
*/
-- Invalid quantity ordered
IF EXISTS (
SELECT *
FROM tmp_Shop_Supplier_Purchase_Order_Product_Link
WHERE
NOT ISNULL(quantity_ordered)
AND quantity_ordered < 0
) THEN
RAISE EXCEPTION 'Invalid quantity ordered property for the following permutations: %', (
SELECT STRING_AGG(t_SPOPL.name_error, ', ')
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
)
USING ERRCODE = '22000'
;
END IF;
-- Duplicates
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
RAISE EXCEPTION 'Duplicate records: %', || (
SELECT STRING_AGG(t_SPOPLC.name_error, ', ')
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
)
USING ERRCODE = '22000'
;
END IF;
-- Permissions
v_ids_product := (
SELECT STRING_AGG(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
);
CALL p_shop_user_eval(v_guid_permission, v_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;
*/
/*
v_has_permission := (
SELECT can_edit
FROM Shop_User_Eval_Temp
WHERE
GUID = v_guid_permission
AND can_edit = 0
);
IF v_has_permission = FALSE THEN
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
v_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;
*/
v_ids_product_no_permission := (
SELECT STRING_AGG(PT.id_product, ',')
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
RAISE EXCEPTION 'You do not have permission to edit the following product IDs: %', v_ids_product_no_permission
USING ERRCODE = '42501'
;
END IF;
DELETE FROM Shop_User_Eval_Temp
WHERE GUID = v_guid;
-- Transaction
START TRANSACTION;
INSERT INTO Shop_Sales_And_Purchasing_Change_Set (
comment,
updated_last_by,
updated_last_on
)
VALUES (
'Save '
|| CASE WHEN v_is_new_supplier_purchase_order = TRUE THEN 'new ' ELSE '' END
|| 'Supplier Purchase Order - '
|| v_comment,
v_id_user,
CURRENT_TIMESTAMP
);
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
v_id_supplier_ordered,
SUM(t_SPOPL.cost_total_local),
v_id_currency_cost,
v_id_user,
v_id_change_set,
v_active
FROM tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL
;
-- v_id_order_new
v_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
v_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,
v_id_user,
v_id_change_set
FROM tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL
;
ELSE
UPDATE Shop_Supplier_Purchase_Order SPO
SET
SPO.id_supplier_ordered = v_id_supplier_ordered,
SPO.cost_total_local = SUM(t_SPOPL.cost_total_local),
SPO.id_currency = v_id_currency_cost,
SPO.id_change_set = v_id_change_set,
SPO.active = v_active
FROM Shop_Supplier_Purchase_Order SPO
INNER JOIN tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL ON SPO.id_order = t_SPOPL.id_order
WHERE SPO.id_order = v_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
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
FROM 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
;
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,
v_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;
COMMIT;
/*
IF EXISTS (SELECT * FROM tmp_Msg_Error) THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
*/
-- Returns
-- v_now = CURRENT_TIMESTAMP;
/*
-- Supplier Purchase Orders
OPEN result_orders FOR
SELECT *
FROM Shop_Supplier_Purchase_Order
WHERE id_order = v_id_order
;
-- RETURN NEXT result_orders;
-- Supplier Purchase Order Product Links
OPEN result_order_product_links FOR
SELECT *
FROM Shop_Supplier_Purchase_Order_Product_Link
WHERE id_order = v_id_order
;
-- RETURN NEXT result_order_product_links;
*/
-- Errors
/*
OPEN result_errors FOR
SELECT *
FROM tmp_Msg_Error
;
-- RETURN NEXT result_errors;
*/
-- DROP TABLE tmp_Shop_Supplier_Purchase_Order;
DROP TABLE tmp_Shop_Supplier_Purchase_Order_Product_Link;
DROP TABLE tmp_Msg_Error;
END;
$$ LANGUAGE plpgsql;
/*
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;
*/