516 lines
15 KiB
PL/PgSQL
516 lines
15 KiB
PL/PgSQL
|
|
|
|
|
|
-- 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_calc_user(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_Calc_User_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_Calc_User_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_Calc_User_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_Calc_User_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;
|
|
|
|
|
|
*/
|
|
|