Files
partsERP/static/MySQL/0000_combine.sql

21302 lines
629 KiB
SQL

/* Clear Store DataBase */
# Drop dependencies
DROP TABLE IF EXISTS tmp_Shop_Calc_User;
DROP TABLE IF EXISTS tmp_Product_Calc_User;
DROP TABLE IF EXISTS tmp_Product_p_Shop_User_Eval;
DROP TABLE IF EXISTS tmp_Msg_Error;
DROP TABLE IF EXISTS tmp_Currency;
DROP TABLE IF EXISTS tmp_Delivery_Option;
DROP TABLE IF EXISTS tmp_Delivery_Region;
DROP TABLE IF EXISTS tmp_Region;
DROP TABLE IF EXISTS tmp_Price;
DROP TABLE IF EXISTS tmp_Shop_User;
DROP TABLE IF EXISTS tmp_Shop_Order;
DROP TABLE IF EXISTS tmp_Shop_Product;
DROP TABLE IF EXISTS tmp_Product;
DROP TABLE IF EXISTS tmp_Product_Permutation;
DROP TABLE IF EXISTS tmp_Permutation_Variation_Link;
DROP TABLE IF EXISTS tmp_Permutation;
DROP TABLE IF EXISTS tmp_Shop_Product_p_shop_calc_user;
DROP TABLE IF EXISTS tmp_Shop_Product_p_Shop_Calc_User;
DROP TABLE IF EXISTS tmp_Shop_Image;
DROP TABLE IF EXISTS tmp_Image;
DROP TABLE IF EXISTS tmp_Product_Image;
DROP TABLE IF EXISTS tmp_Shop_Variation;
DROP TABLE IF EXISTS tmp_Variation;
DROP TABLE IF EXISTS tmp_Variation_Type;
DROP TABLE IF EXISTS tmp_Shop_Discount;
DROP TABLE IF EXISTS tmp_Discount;
DROP TABLE IF EXISTS tmp_Shop_Category;
DROP TABLE IF EXISTS tmp_Category;
DROP TABLE IF EXISTS tmp_Shop_Product_Category;
DROP TABLE IF EXISTS tmp_Product_Category;
DROP TABLE IF EXISTS tmp_Shop_Product_Currency_Region_Link;
DROP TABLE IF EXISTS tmp_Shop_Product_Currency_Link;
DROP TABLE IF EXISTS tmp_User_Role_Link;
DROP TABLE IF EXISTS tmp_Shop_Basket;
DROP TABLE IF EXISTS tmp_Shop_Supplier_Purchase_Order_Product_Link;
DROP TABLE IF EXISTS tmp_Supplier_Purchase_Order_Product_Link;
DROP TABLE IF EXISTS tmp_Shop_Supplier_Purchase_Order;
DROP TABLE IF EXISTS tmp_Supplier_Purchase_Order;
DROP TABLE IF EXISTS tmp_Shop_Supplier;
DROP TABLE IF EXISTS tmp_Supplier;
DROP TABLE IF EXISTS tmp_Supplier_Address;
DROP TABLE IF EXISTS tmp_Shop_Manufacturing_Purchase_Order_Product_Link;
DROP TABLE IF EXISTS tmp_Manufacturing_Purchase_Order_Product_Link;
DROP TABLE IF EXISTS tmp_Shop_Manufacturing_Purchase_Order;
DROP TABLE IF EXISTS tmp_Manufacturing_Purchase_Order;
DROP TABLE IF EXISTS tmp_Shop_Customer;
DROP TABLE IF EXISTS tmp_Shop_Customer_Sale_Order_Product_Link;
DROP TABLE IF EXISTS tmp_Shop_Customer_Sale_Order;
DROP TABLE IF EXISTS tmp_Get_Variation_From_Csv_Variations;
# Delete old tables
DROP TABLE IF EXISTS Split_Temp;
DROP TABLE IF EXISTS Split_Key_Value_Pair_Csv_Temp;
DROP TABLE IF EXISTS Split_Key_Value_Pair_Temp;
DROP TABLE IF EXISTS Shop_User_Eval_Temp;
DROP TABLE IF EXISTS Shop_Calc_User_Temp;
DROP TABLE IF EXISTS Shop_Customer_Sales_Order_Product_Link_Temp;
DROP TABLE IF EXISTS Shop_Customer_Sales_Order_Product_Link_Audit;
DROP TABLE IF EXISTS Shop_Customer_Sales_Order_Product_Link;
DROP TABLE IF EXISTS Shop_Customer_Sales_Order_Audit;
DROP TABLE IF EXISTS Shop_Customer_Sales_Order;
DROP TABLE IF EXISTS Shop_Customer_Temp;
DROP TABLE IF EXISTS Shop_Customer_Audit;
DROP TABLE IF EXISTS Shop_Customer;
DROP TABLE IF EXISTS Shop_Manufacturing_Purchase_Order_Product_Link_Temp;
DROP TABLE IF EXISTS Shop_Manufacturing_Purchase_Order_Product_Link_Audit;
DROP TABLE IF EXISTS Shop_Manufacturing_Purchase_Order_Product_Link;
DROP TABLE IF EXISTS Shop_Manufacturing_Purchase_Order_Temp;
DROP TABLE IF EXISTS Shop_Manufacturing_Purchase_Order_Audit;
DROP TABLE IF EXISTS Shop_Manufacturing_Purchase_Order;
DROP TABLE IF EXISTS Shop_Supplier_Purchase_Order_Product_Link_Temp;
DROP TABLE IF EXISTS Shop_Supplier_Purchase_Order_Product_Link_Audit;
DROP TABLE IF EXISTS Shop_Supplier_Purchase_Order_Product_Link;
DROP TABLE IF EXISTS Shop_Supplier_Purchase_Order_Temp;
DROP TABLE IF EXISTS Shop_Supplier_Purchase_Order_Audit;
DROP TABLE IF EXISTS Shop_Supplier_Purchase_Order;
DROP TABLE IF EXISTS Shop_Supplier_Address_Temp;
DROP TABLE IF EXISTS Shop_Supplier_Address_Audit;
DROP TABLE IF EXISTS Shop_Supplier_Address;
DROP TABLE IF EXISTS Shop_Supplier_Temp;
DROP TABLE IF EXISTS Shop_Supplier_Audit;
DROP TABLE IF EXISTS Shop_Supplier;
DROP TABLE IF EXISTS Shop_User_Order_Product_Link_Audit;
DROP TABLE IF EXISTS Shop_User_Order_Product_Link;
DROP TABLE IF EXISTS Shop_User_Order_Audit;
DROP TABLE IF EXISTS Shop_User_Order;
DROP TABLE IF EXISTS Shop_User_Order_Status_Audit;
DROP TABLE IF EXISTS Shop_User_Order_Status;
DROP TABLE IF EXISTS Shop_User_Basket_Audit;
DROP TABLE IF EXISTS Shop_User_Basket;
DROP TABLE IF EXISTS Shop_User_Address_Audit;
DROP TABLE IF EXISTS Shop_User_Address;
DROP TABLE IF EXISTS Shop_User_Role_Link_Audit;
DROP TABLE IF EXISTS Shop_User_Role_Link;
DROP TABLE IF EXISTS Shop_User_Audit;
DROP TABLE IF EXISTS Shop_User;
DROP TABLE IF EXISTS Shop_Role_Permission_Link_Audit;
DROP TABLE IF EXISTS Shop_Role_Permission_Link;
DROP TABLE IF EXISTS Shop_Role_Audit;
DROP TABLE IF EXISTS Shop_Role;
DROP TABLE IF EXISTS Shop_Permission_Audit;
DROP TABLE IF EXISTS Shop_Permission;
DROP TABLE IF EXISTS Shop_Permission_Group_Audit;
DROP TABLE IF EXISTS Shop_Permission_Group;
DROP TABLE IF EXISTS Shop_Discount_Region_Currency_Link_Audit;
DROP TABLE IF EXISTS Shop_Discount_Region_Currency_Link;
DROP TABLE IF EXISTS Shop_Discount_Audit;
DROP TABLE IF EXISTS Shop_Discount;
DROP TABLE IF EXISTS Shop_Product_Permutation_Delivery_Option_Link_Audit;
DROP TABLE IF EXISTS Shop_Product_Permutation_Delivery_Option_Link;
DROP TABLE IF EXISTS Shop_Product_Delivery_Option_Link_Audit;
DROP TABLE IF EXISTS Shop_Product_Delivery_Option_Link;
DROP TABLE IF EXISTS Shop_Delivery_Option_Audit;
DROP TABLE IF EXISTS Shop_Delivery_Option;
DROP TABLE IF EXISTS Shop_Product_Image_Audit;
DROP TABLE IF EXISTS Shop_Product_Image;
DROP TABLE IF EXISTS Shop_Image_Audit;
DROP TABLE IF EXISTS Shop_Image;
DROP TABLE IF EXISTS Shop_Product_Price_Temp;
DROP TABLE IF EXISTS Shop_Product_Price_Audit;
DROP TABLE IF EXISTS Shop_Product_Price;
DROP TABLE IF EXISTS Shop_Stock_Item_Temp;
DROP TABLE IF EXISTS Shop_Stock_Item_Audit;
DROP TABLE IF EXISTS Shop_Stock_Item;
DROP TABLE IF EXISTS Shop_Product_Currency_Region_Link_Audit;
DROP TABLE IF EXISTS Shop_Product_Currency_Region_Link;
DROP TABLE IF EXISTS Shop_Product_Currency_Link_Audit;
DROP TABLE IF EXISTS Shop_Product_Currency_Link;
DROP TABLE IF EXISTS Shop_Product_Variation_Link_Audit;
DROP TABLE IF EXISTS Shop_Product_Variation_Link;
DROP TABLE IF EXISTS Shop_Product_Permutation_Variation_Link_Temp;
DROP TABLE IF EXISTS Shop_Product_Permutation_Variation_Link_Audit;
DROP TABLE IF EXISTS Shop_Product_Permutation_Variation_Link;
DROP TABLE IF EXISTS Shop_Variation_Temp;
DROP TABLE IF EXISTS Shop_Variation_Audit;
DROP TABLE IF EXISTS Shop_Variation;
DROP TABLE IF EXISTS Shop_Product_Variation_Type_Link_Audit;
DROP TABLE IF EXISTS Shop_Product_Variation_Type_Link;
DROP TABLE IF EXISTS Shop_Product_Variation_Temp;
DROP TABLE IF EXISTS Shop_Product_Variation;
DROP TABLE IF EXISTS Shop_Variation_Type_Temp;
DROP TABLE IF EXISTS Shop_Variation_Type_Audit;
DROP TABLE IF EXISTS Shop_Variation_Type;
DROP TABLE IF EXISTS Shop_Product_Variation_Type_Temp;
DROP TABLE IF EXISTS Shop_Product_Variation_Type;
DROP TABLE IF EXISTS Shop_Product_Permutation_Temp;
DROP TABLE IF EXISTS Shop_Product_Permutation_Audit;
DROP TABLE IF EXISTS Shop_Product_Permutation;
DROP TABLE IF EXISTS Shop_Interval_Recurrence_Audit;
DROP TABLE IF EXISTS Shop_Interval_Recurrence;
DROP TABLE IF EXISTS Shop_Product_Audit;
DROP TABLE IF EXISTS Shop_Product;
DROP TABLE IF EXISTS Shop_Product_Temp;
DROP TABLE IF EXISTS Shop_Product_Category_Temp;
DROP TABLE IF EXISTS Shop_Product_Category_Audit;
DROP TABLE IF EXISTS Shop_Product_Category;
DROP TABLE IF EXISTS Shop_Category_Audit;
DROP TABLE IF EXISTS Shop_Category;
DROP TABLE IF EXISTS Shop_Tax_Or_Surcharge_Temp;
DROP TABLE IF EXISTS Shop_Tax_Or_Surcharge_Audit;
DROP TABLE IF EXISTS Shop_Tax_Or_Surcharge;
DROP TABLE IF EXISTS Shop_Currency_Temp;
DROP TABLE IF EXISTS Shop_Currency_Audit;
DROP TABLE IF EXISTS Shop_Currency;
DROP TABLE IF EXISTS Shop_Storage_Location_Branch_Temp;
DROP TABLE IF EXISTS Shop_Storage_Location_Branch_Audit;
DROP TABLE IF EXISTS Shop_Storage_Location_Branch;
DROP TABLE IF EXISTS Shop_Storage_Location_Temp;
DROP TABLE IF EXISTS Shop_Storage_Location_Audit;
DROP TABLE IF EXISTS Shop_Storage_Location;
DROP TABLE IF EXISTS Shop_Plant_Temp;
DROP TABLE IF EXISTS Shop_Plant_Audit;
DROP TABLE IF EXISTS Shop_Plant;
DROP TABLE IF EXISTS Shop_Address_Audit;
DROP TABLE IF EXISTS Shop_Address;
DROP TABLE IF EXISTS Shop_Delivery_Region_Branch_Audit;
DROP TABLE IF EXISTS Shop_Delivery_Region_Branch;
DROP TABLE IF EXISTS Shop_Region_Branch_Temp;
DROP TABLE IF EXISTS Shop_Region_Branch_Audit;
DROP TABLE IF EXISTS Shop_Region_Branch;
DROP TABLE IF EXISTS Shop_Delivery_Region_Audit;
DROP TABLE IF EXISTS Shop_Delivery_Region;
DROP TABLE IF EXISTS Shop_Region_Temp;
DROP TABLE IF EXISTS Shop_Region_Audit;
DROP TABLE IF EXISTS Shop_Region;
DROP TABLE IF EXISTS Shop_Unit_Measurement_Conversion_Audit;
DROP TABLE IF EXISTS Shop_Unit_Measurement_Conversion;
DROP TABLE IF EXISTS Shop_Unit_Measurement_Audit;
DROP TABLE IF EXISTS Shop_Unit_Measurement;
DROP TABLE IF EXISTS Shop_Image_Type_Audit;
DROP TABLE IF EXISTS Shop_Image_Type;
DROP TABLE IF EXISTS Shop_General_Audit;
DROP TABLE IF EXISTS Shop_General;
DROP TABLE IF EXISTS File_Type_Audit;
DROP TABLE IF EXISTS File_Type;
DROP TABLE IF EXISTS Msg_Error_Type;
DROP TABLE IF EXISTS Shop_Msg_Error_Type;
DROP TABLE IF EXISTS Shop_Access_Level_Audit;
DROP TABLE IF EXISTS Shop_Access_Level;
DROP TABLE IF EXISTS Shop_Sales_And_Purchasing_Change_Set;
DROP TABLE IF EXISTS Shop_User_Change_Set;
DROP TABLE IF EXISTS Shop_Product_Change_Set;
-- Procedures
DROP PROCEDURE IF EXISTS p_split;
DROP PROCEDURE IF EXISTS p_clear_split_temp;
DROP PROCEDURE IF EXISTS p_split_key_value_pair_csv;
DROP PROCEDURE IF EXISTS p_clear_split_key_value_csv_temp;
DROP PROCEDURE IF EXISTS p_clear_split_key_value_pair_csv_temp;
DROP PROCEDURE IF EXISTS p_debug_timing_reporting;
DROP PROCEDURE IF EXISTS p_validate_guid;
DROP PROCEDURE IF EXISTS p_validate_guid_test;
DROP FUNCTION IF EXISTS fn_shop_get_product_permutation_name;
DROP PROCEDURE IF EXISTS p_shop_calc_user;
DROP PROCEDURE IF EXISTS p_shop_calc_user;
DROP PROCEDURE IF EXISTS p_shop_clear_user_eval_temp;
DROP PROCEDURE IF EXISTS p_shop_clear_calc_user;
DROP PROCEDURE IF EXISTS p_shop_get_many_access_level;
DROP PROCEDURE IF EXISTS p_shop_get_many_unit_measurement;
DROP PROCEDURE IF EXISTS p_shop_get_many_region;
DROP PROCEDURE IF EXISTS p_shop_get_many_plant;
DROP PROCEDURE IF EXISTS p_shop_get_many_storage_location;
DROP PROCEDURE IF EXISTS p_shop_get_many_currency;
DROP PROCEDURE IF EXISTS p_shop_save_category;
DROP PROCEDURE IF EXISTS p_shop_save_category_test;
DROP PROCEDURE IF EXISTS p_shop_save_product_category;
DROP PROCEDURE IF EXISTS p_shop_save_product_category_test;
DROP PROCEDURE IF EXISTS p_shop_save_product;
DROP PROCEDURE IF EXISTS p_shop_save_product_test;
DROP PROCEDURE IF EXISTS p_shop_calc_product_permutation;
DROP PROCEDURE IF EXISTS p_shop_clear_calc_product_permutation;
DROP PROCEDURE IF EXISTS p_shop_get_many_product;
DROP PROCEDURE IF EXISTS p_shop_get_many_stripe_product_new;
DROP PROCEDURE IF EXISTS p_shop_save_permutation;
DROP PROCEDURE IF EXISTS p_shop_save_product_permutation;
DROP PROCEDURE IF EXISTS p_shop_save_product_permutation_test;
DROP PROCEDURE IF EXISTS p_shop_save_product_variation;
DROP PROCEDURE IF EXISTS p_shop_save_product_variation_test;
DROP PROCEDURE IF EXISTS p_shop_get_many_product_variation;
DROP FUNCTION IF EXISTS fn_shop_get_id_product_permutation_from_variation_csv_list;
DROP FUNCTION IF EXISTS fn_shop_get_product_variations_from_id_csv_list;
DROP FUNCTION IF EXISTS fn_shop_get_product_permutation_variations_csv;
DROP PROCEDURE IF EXISTS p_shop_save_stock_item;
DROP PROCEDURE IF EXISTS p_shop_save_stock_item_test;
DROP PROCEDURE IF EXISTS p_shop_get_many_stock_item;
DROP PROCEDURE IF EXISTS p_shop_get_many_product_price_and_discount_and_delivery_option;
DROP PROCEDURE IF EXISTS p_shop_get_many_product_price_and_discount_and_delivery_option;
DROP PROCEDURE IF EXISTS p_shop_get_many_stripe_price_new;
DROP PROCEDURE IF EXISTS p_shop_save_user;
DROP PROCEDURE IF EXISTS p_shop_edit_user;
DROP PROCEDURE IF EXISTS p_shop_get_many_user;
DROP PROCEDURE IF EXISTS p_get_many_user;
DROP PROCEDURE IF EXISTS p_shop_get_many_user_basket;
DROP PROCEDURE IF EXISTS p_shop_edit_user_basket;
DROP PROCEDURE IF EXISTS p_shop_save_supplier;
DROP PROCEDURE IF EXISTS p_shop_save_supplier_test;
DROP PROCEDURE IF EXISTS p_shop_get_many_supplier;
DROP PROCEDURE IF EXISTS p_shop_save_supplier_purchase_order;
DROP PROCEDURE IF EXISTS p_shop_save_supplier_purchase_order_test;
DROP PROCEDURE IF EXISTS p_shop_get_many_supplier_purchase_order;
DROP PROCEDURE IF EXISTS p_shop_save_manufacturing_purchase_order;
DROP PROCEDURE IF EXISTS p_shop_save_manufacturing_purchase_order_test;
DROP PROCEDURE IF EXISTS p_shop_get_many_manufacturing_purchase_order;
DROP PROCEDURE IF EXISTS p_shop_save_customer;
DROP PROCEDURE IF EXISTS p_shop_get_many_customer;
DROP PROCEDURE IF EXISTS p_shop_save_customer_sales_order;
DROP PROCEDURE IF EXISTS p_shop_get_many_customer_sales_order;
# Product Change Sets
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product_Change_Set';
CREATE TABLE Shop_Product_Change_Set (
id_change_set INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
comment VARCHAR(500),
updated_last_on DATETIME,
updated_last_by VARCHAR(100)
);
# Split Staging
-- USE partsltd_prod;
-- DROP TABLE IF EXISTS Split_Temp;
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Split_Temp';
CREATE TABLE Split_Temp (
guid BINARY(36) NOT NULL
, display_order INT NOT NULL
, substring VARCHAR(4000) NOT NULL
);
# User Change Sets
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_User_Change_Set';
CREATE TABLE IF NOT EXISTS Shop_User_Change_Set (
id_change_set INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
comment VARCHAR(500),
updated_last_on DATETIME,
updated_last_by VARCHAR(100)
);
# Split Key Value Pair CSV Staging
-- USE partsltd_prod;
-- DROP TABLE IF EXISTS Split_Temp;
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Split_Key_Value_Pair_Csv_Temp';
CREATE TABLE Split_Key_Value_Pair_Csv_Temp (
guid BINARY(36) NOT NULL
, id INT NOT NULL
, key_column VARCHAR(4000) NULL
, value_column VARCHAR(4000) NULL
);
# Sales And Purchasing Change Sets
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Sales_And_Purchasing_Change_Set';
CREATE TABLE Shop_Sales_And_Purchasing_Change_Set (
id_change_set INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
comment VARCHAR(500),
updated_last_on DATETIME,
updated_last_by VARCHAR(100)
);
# Access Levels
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Access_Level';
CREATE TABLE IF NOT EXISTS Shop_Access_Level (
id_access_level INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(50),
name VARCHAR(255),
priority INT NOT NULL,
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Access_Level_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
);
# Access Level Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Access_Level_Audit';
CREATE TABLE IF NOT EXISTS Shop_Access_Level_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_access_level INT NOT NULL,
CONSTRAINT FK_Shop_Access_Level_Audit_id_access_level
FOREIGN KEY (id_access_level)
REFERENCES Shop_Access_Level(id_access_level)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Access_Level_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
);
# Error Message Type
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Msg_Error_Type';
CREATE TABLE IF NOT EXISTS Shop_Msg_Error_Type (
id_type INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(50) NOT NULL,
name VARCHAR(500) NOT NULL,
description VARCHAR(1000)
);
# File Types
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'File_Type';
CREATE TABLE IF NOT EXISTS File_Type (
id_type INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(50),
name VARCHAR(100),
extension VARCHAR(50),
created_on DATETIME,
created_by INT,
updated_last_on DATETIME,
updated_last_by VARCHAR(100)
);
# File Type Audit
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'File_Type_Audit';
CREATE TABLE IF NOT EXISTS File_Type_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_type INT NOT NULL,
CONSTRAINT FK_File_Type_Audit_id_type
FOREIGN KEY (id_type)
REFERENCES File_Type(id_type)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
created_on DATETIME,
created_by INT,
updated_last_on DATETIME,
updated_last_by VARCHAR(100)
);
# Generic / shared properties
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_General';
CREATE TABLE IF NOT EXISTS Shop_General (
id_general INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
quantity_max FLOAT,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT CHK_Shop_General_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Shop General Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_General_Audit';
CREATE TABLE IF NOT EXISTS Shop_General_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_general INT NOT NULL,
CONSTRAINT FK_Shop_General_Audit_id_general
FOREIGN KEY (id_general)
REFERENCES Shop_General(id_general)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_General_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Image Types
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Image_Type';
CREATE TABLE IF NOT EXISTS Shop_Image_Type (
id_type INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
/*
id_type_file INT NOT NULL,
CONSTRAINT FK_Shop_Image_Type_id_type_file
FOREIGN KEY (id_type_file)
REFERENCES File_Type(id_type),
*/
code VARCHAR(50),
name VARCHAR(255),
name_plural VARCHAR(256),
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Image_Type_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Image Type Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Image_Type_Audit';
CREATE TABLE IF NOT EXISTS Shop_Image_Type_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_type INT NOT NULL,
CONSTRAINT FK_Shop_Image_Type_Audit_id_type
FOREIGN KEY (id_type)
REFERENCES Shop_Image_Type(id_type)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Image_Type_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Regions
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Region';
CREATE TABLE IF NOT EXISTS Shop_Region (
id_region INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(50) NOT NULL,
name VARCHAR(200) NOT NULL,
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Region_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Region Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Region_Audit';
CREATE TABLE IF NOT EXISTS Shop_Region_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_region INT NOT NULL,
CONSTRAINT FK_Shop_Region_Audit_id_region
FOREIGN KEY (id_region)
REFERENCES Shop_Region(id_region)
ON UPDATE RESTRICT,
name_field VARCHAR(64) NOT NULL,
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Region_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Region Temp
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Region_Temp';
CREATE TABLE IF NOT EXISTS Shop_Region_Temp (
id_region INT NOT NULL PRIMARY KEY,
code VARCHAR(50) NOT NULL,
name VARCHAR(200) NOT NULL,
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Region_Temp_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Region Branchs
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Region_Branch';
CREATE TABLE IF NOT EXISTS Shop_Region_Branch (
id_branch INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_region_parent INT NOT NULL,
CONSTRAINT FK_Shop_Region_Branch_id_region_parent
FOREIGN KEY (id_region_parent)
REFERENCES Shop_Region(id_region)
ON UPDATE RESTRICT,
id_region_child INT NOT NULL,
CONSTRAINT FK_Shop_Region_Branch_id_region_child
FOREIGN KEY (id_region_child)
REFERENCES Shop_Region(id_region)
ON UPDATE RESTRICT,
-- depth INT NOT NULL,
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Region_Branch_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Region Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Region_Branch_Audit';
CREATE TABLE IF NOT EXISTS Shop_Region_Branch_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_branch INT NOT NULL,
CONSTRAINT FK_Shop_Region_Branch_Audit_id_branch
FOREIGN KEY (id_branch)
REFERENCES Shop_Region_Branch(id_branch)
ON UPDATE RESTRICT,
name_field VARCHAR(64) NOT NULL,
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Region_Branch_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Region Branch Temp
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Region_Branch_Temp';
CREATE TABLE IF NOT EXISTS Shop_Region_Branch_Temp (
id_branch INT NOT NULL PRIMARY KEY,
id_region_parent INT NOT NULL,
id_region_child INT NOT NULL,
-- depth INT NOT NULL,
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL
);
# Addresses
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Address';
CREATE TABLE Shop_Address (
id_address INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, id_region INT NOT NULL
, CONSTRAINT FK_Shop_Address_id_region
FOREIGN KEY (id_region)
REFERENCES partsltd_prod.Shop_Region(id_region)
/*
, id_supplier INT NULL
, CONSTRAINT FK_Shop_Address_id_supplier
FOREIGN KEY (id_supplier)
REFERENCES partsltd_prod.Shop_Supplier(id_supplier)
*/
, postcode VARCHAR(20) NOT NULL
, address_line_1 VARCHAR(256) NOT NULL
, address_line_2 VARCHAR(256) NOT NULL
, city VARCHAR(256) NOT NULL
, county VARCHAR(256) NOT NULL
, active BIT NOT NULL DEFAULT 1
, created_on DATETIME
, created_by INT
, id_change_set INT
, CONSTRAINT FK_Shop_Address_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES partsltd_prod.Shop_User_Change_Set(id_change_set)
);
# Plant
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Plant';
CREATE TABLE IF NOT EXISTS Shop_Plant (
id_plant INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(50) NOT NULL,
name VARCHAR(500) NOT NULL,
id_address INT NOT NULL,
CONSTRAINT FK_Shop_Plant_id_address
FOREIGN KEY (id_address)
REFERENCES Shop_Address(id_address),
id_user_manager INT NOT NULL,
active BIT NOT NULL DEFAULT 1,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Plant_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Address Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Address_Audit';
CREATE TABLE IF NOT EXISTS Shop_Address_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_address INT NOT NULL,
CONSTRAINT FK_Shop_Address_Audit_id_address
FOREIGN KEY (id_address)
REFERENCES Shop_Address(id_address)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Address_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
ON UPDATE RESTRICT
);
# Plant Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Plant_Audit';
CREATE TABLE IF NOT EXISTS Shop_Plant_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_plant INT NOT NULL,
CONSTRAINT FK_Shop_Plant_Audit_id_plant
FOREIGN KEY (id_plant)
REFERENCES Shop_Plant(id_plant)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Plant_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Plant Temp
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Plant_Temp';
CREATE TABLE IF NOT EXISTS Shop_Plant_Temp (
id_plant INT NOT NULL PRIMARY KEY
, code VARCHAR(50) NOT NULL
, name VARCHAR(500) NOT NULL
, id_address INT NOT NULL
, id_user_manager INT NOT NULL
, active BIT NOT NULL DEFAULT 1
, guid BINARY(36) NOT NULL
);
# Storage Location
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Storage_Location';
CREATE TABLE IF NOT EXISTS Shop_Storage_Location (
id_location INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_plant INT NOT NULL,
CONSTRAINT FK_Shop_Storage_Location_id_plant
FOREIGN KEY (id_plant)
REFERENCES Shop_Plant(id_plant),
code VARCHAR(50) NOT NULL,
name VARCHAR(500) NOT NULL,
active BIT NOT NULL DEFAULT 1,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Storage_Location_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Storage Location Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Storage_Location_Audit';
CREATE TABLE IF NOT EXISTS Shop_Storage_Location_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_location INT NOT NULL,
CONSTRAINT FK_Shop_Storage_Location_Audit_id_location
FOREIGN KEY (id_location)
REFERENCES Shop_Storage_Location(id_location)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Storage_Location_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Storage Location Temp
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Storage_Location_Temp';
CREATE TABLE IF NOT EXISTS Shop_Storage_Location (
id_location INT NOT NULL PRIMARY KEY,
code VARCHAR(50) NOT NULL,
name VARCHAR(500) NOT NULL,
active BIT NOT NULL DEFAULT 1
);
# Storage Location Branch
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Storage_Location_Branch';
CREATE TABLE IF NOT EXISTS Shop_Storage_Location_Branch (
id_branch INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_location_parent INT NOT NULL,
CONSTRAINT FK_Shop_Storage_Location_Branch_id_location_parent
FOREIGN KEY (id_location_parent)
REFERENCES Shop_Storage_Location(id_location)
ON UPDATE RESTRICT,
id_location_child INT NOT NULL,
CONSTRAINT FK_Shop_Storage_Location_Branch_id_location_child
FOREIGN KEY (id_location_child)
REFERENCES Shop_Storage_Location(id_location)
ON UPDATE RESTRICT,
-- depth INT NOT NULL,
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Storage_Location_Branch_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Storage Location Branch Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Storage_Location_Branch_Audit';
CREATE TABLE IF NOT EXISTS Shop_Storage_Location_Branch_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_branch INT NOT NULL,
CONSTRAINT FK_Shop_Storage_Location_Branch_Audit_id_branch
FOREIGN KEY (id_branch)
REFERENCES Shop_Storage_Location_Branch(id_branch)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Storage_Location_Branch_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Storage Location Branch Temp
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Storage_Location_Branch_Temp';
CREATE TABLE IF NOT EXISTS Shop_Storage_Location_Branch_Temp (
id_branch INT NOT NULL PRIMARY KEY,
id_location_parent INT NOT NULL,
id_location_child INT NOT NULL,
-- depth INT NOT NULL,
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL
);
# Currencies
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Currency';
CREATE TABLE IF NOT EXISTS Shop_Currency (
id_currency INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(50) NOT NULL,
name VARCHAR(255) NOT NULL,
symbol VARCHAR(50) NOT NULL,
factor_from_GBP FLOAT NOT NULL,
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Currency_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
ON UPDATE RESTRICT
);
# Currency Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Currency_Audit';
CREATE TABLE IF NOT EXISTS Shop_Currency_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_currency INT NOT NULL,
CONSTRAINT FK_Shop_Currency_Audit_id_currency
FOREIGN KEY (id_currency)
REFERENCES Shop_Currency(id_currency)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Currency_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
ON UPDATE RESTRICT
);
# Currency Temp
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Currency_Temp';
CREATE TABLE IF NOT EXISTS Shop_Currency_Temp (
id_currency INT NOT NULL PRIMARY KEY,
code VARCHAR(50) NOT NULL,
name VARCHAR(255) NOT NULL,
symbol VARCHAR(1) NOT NULL,
factor_from_GBP FLOAT NOT NULL,
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL
);
# Taxes and Surcharges
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Tax_Or_Surcharge';
CREATE TABLE Shop_Tax_Or_Surcharge (
id_tax INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(50) NOT NULL,
name VARCHAR(200) NOT NULL,
id_region_buyer INT NOT NULL,
CONSTRAINT FK_Shop_Tax_Or_Surcharge_id_region_buyer
FOREIGN KEY (id_region_buyer)
REFERENCES Shop_Region(id_region),
id_region_seller INT NOT NULL,
CONSTRAINT FK_Shop_Tax_Or_Surcharge_id_region_seller
FOREIGN KEY (id_region_seller)
REFERENCES Shop_Region(id_region),
id_currency INT,
CONSTRAINT FK_Shop_Tax_Or_Surcharge_id_currency
FOREIGN KEY (id_currency)
REFERENCES Shop_Currency(id_currency)
ON UPDATE RESTRICT,
fixed_fee FLOAT NOT NULL DEFAULT 0,
multiplier FLOAT NOT NULL DEFAULT 1 CHECK (multiplier > 0),
apply_fixed_fee_before_multiplier BIT DEFAULT 1,
quantity_min FLOAT NOT NULL DEFAULT 0,
quantity_max FLOAT NOT NULL,
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Tax_Or_Surcharge_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Tax Or Surcharge Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Tax_Or_Surcharge_Audit';
CREATE TABLE IF NOT EXISTS Shop_Tax_Or_Surcharge_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_tax INT NOT NULL,
CONSTRAINT FK_Shop_Tax_Or_Surcharge_Audit_id_discount
FOREIGN KEY (id_tax)
REFERENCES Shop_Tax_Or_Surcharge(id_tax)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Tax_Or_Surcharge_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
ON UPDATE RESTRICT
);
# Taxes and Surcharges Temp
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Tax_Or_Surcharge_Temp';
CREATE TABLE Shop_Tax_Or_Surcharge_Temp (
id_tax INT NOT NULL PRIMARY KEY,
code VARCHAR(50) NOT NULL,
name VARCHAR(200) NOT NULL,
id_region_buyer INT NOT NULL,
id_region_seller INT NOT NULL,
id_currency INT,
fixed_fee FLOAT NOT NULL DEFAULT 0,
multiplier FLOAT NOT NULL DEFAULT 1 CHECK (multiplier > 0),
apply_fixed_fee_before_multiplier BIT DEFAULT 1,
quantity_min FLOAT NOT NULL DEFAULT 0,
quantity_max FLOAT NOT NULL,
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL
);
# Unit of Measurement
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Unit_Measurement';
CREATE TABLE IF NOT EXISTS Shop_Unit_Measurement (
id_unit_measurement INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name_singular VARCHAR(255) NOT NULL,
name_plural VARCHAR(256) NOT NULL,
symbol VARCHAR(50) NOT NULL,
symbol_is_suffix_not_prefix BIT NOT NULL DEFAULT 1,
is_base_unit BIT NOT NULL DEFAULT 0,
is_unit_of_distance BIT NOT NULL DEFAULT 0,
is_unit_of_mass BIT NOT NULL DEFAULT 0,
is_unit_of_time BIT NOT NULL DEFAULT 0,
is_unit_of_volume BIT NOT NULL DEFAULT 0,
active BIT NOT NULL DEFAULT 1,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Unit_Measurement_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Unit of Measurement Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Unit_Measurement_Audit';
CREATE TABLE IF NOT EXISTS Shop_Unit_Measurement_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_unit_measurement INT NOT NULL,
CONSTRAINT FK_Shop_Unit_Measurement_Audit_id_unit_measurement
FOREIGN KEY (id_unit_measurement)
REFERENCES Shop_Unit_Measurement(id_unit_measurement)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Unit_Measurement_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Unit of Measurement Conversion
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Unit_Measurement_Conversion';
CREATE TABLE IF NOT EXISTS Shop_Unit_Measurement_Conversion (
id_conversion INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
id_unit_derived INT NOT NULL,
id_unit_base INT NOT NULL,
multiplier_unit_base FLOAT NOT NULL,
increment_unit_base FLOAT NOT NULL,
apply_multiplier_before_increment BIT NOT NULL DEFAULT 1,
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Unit_Measurement_Conversion_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Unit of Measurement Conversion Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Unit_Measurement_Conversion_Audit';
CREATE TABLE IF NOT EXISTS Shop_Unit_Measurement_Conversion_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_conversion INT NOT NULL,
CONSTRAINT FK_Shop_Unit_Measurement_Conversion_Audit_id_conversion
FOREIGN KEY (id_conversion)
REFERENCES Shop_Unit_Measurement_Conversion(id_conversion)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Unit_Measurement_Conversion_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Categories
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product_Category';
CREATE TABLE IF NOT EXISTS Shop_Product_Category (
id_category INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, code VARCHAR(50)
, name VARCHAR(255)
, description VARCHAR(4000)
, active BIT NOT NULL DEFAULT 1
, display_order INT NOT NULL
, id_access_level_required INT NOT NULL
, CONSTRAINT FK_Shop_Product_Category_id_access_level_required
FOREIGN KEY (id_access_level_required)
REFERENCES Shop_Access_Level(id_access_level)
, created_on DATETIME
, created_by INT NOT NULL
, id_change_set INT
, CONSTRAINT FK_Shop_Product_Category_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Category Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product_Category_Audit';
CREATE TABLE IF NOT EXISTS Shop_Product_Category_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_category INT NOT NULL,
CONSTRAINT FK_Shop_Product_Category_Audit_id_category
FOREIGN KEY (id_category)
REFERENCES Shop_Product_Category(id_category)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Product_Category_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Categories Temp
-- DROP TABLE Shop_Product_Category_Temp;
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product_Category_Temp';
CREATE TABLE IF NOT EXISTS Shop_Product_Category_Temp (
id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_category INT NOT NULL
, code VARCHAR(50) NOT NULL
, name VARCHAR(255) NOT NULL
, description VARCHAR(4000) NULL
, id_access_level_required INT NOT NULL DEFAULT 1
, display_order INT NOT NULL
, active BIT NULL
, can_view BIT NULL
, can_edit BIT NULL
, can_admin BIT NULL
, guid BINARY(36) NOT NULL
);
# Products
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product';
CREATE TABLE IF NOT EXISTS Shop_Product (
id_product INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
-- description VARCHAR(4000),
id_category INT NOT NULL,
has_variations BIT NOT NULL,
/*
price_GBP_full FLOAT,
price_GBP_min FLOAT,
# ratio_discount_overall FLOAT NOT NULL DEFAULT 0,
CONSTRAINT FK_Shop_Product_id_category
FOREIGN KEY (id_category)
REFERENCES Shop_Product_Category(id_category)
ON UPDATE RESTRICT,
latency_manuf INT,
quantity_min FLOAT,
quantity_max FLOAT,
quantity_step FLOAT,
quantity_stock FLOAT,
is_subscription BIT,
id_unit_measurement_interval_recurrence INT,
CONSTRAINT FK_Shop_Product_id_unit_measurement_interval_recurrence
FOREIGN KEY (id_unit_measurement_interval_recurrence)
REFERENCES Shop_Interval_Recurrence(id_interval),
count_interval_recurrence INT,
*/
id_access_level_required INT NOT NULL,
CONSTRAINT FK_Shop_Product_id_access_level_required
FOREIGN KEY (id_access_level_required)
REFERENCES Shop_Access_Level(id_access_level),
# id_stripe_product VARCHAR(100),
# id_stripe_price VARCHAR(100) NOT NULL,
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL,
created_on DATETIME NOT NULL,
created_by INT NOT NULL,
id_change_set INT,
CONSTRAINT FK_Shop_Product_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Products
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product_Audit';
CREATE TABLE IF NOT EXISTS Shop_Product_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_product INT NOT NULL,
CONSTRAINT FK_Shop_Product_Audit_id_product
FOREIGN KEY (id_product)
REFERENCES Shop_Product(id_product)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Product_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Products Temp
-- DROP TABLE IF EXISTS Shop_Product_Temp;
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product_Temp';
CREATE TABLE IF NOT EXISTS Shop_Product_Temp (
id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_product INT NOT NULL
, name VARCHAR(255) NOT NULL
, id_category INT NOT NULL
, has_variations BIT NOT NULL
, id_access_level_required INT NOT NULL
, display_order INT NOT NULL
, active BIT NOT NULL DEFAULT 1
, can_view BIT NULL DEFAULT NULL
, can_edit BIT NULL DEFAULT NULL
, can_admin BIT NULL DEFAULT NULL
, guid BINARY(36) NOT NULL
);
# Product Permutation
-- DROP TABLE partsltd_prod.Shop_Product_Permutation;
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product_Permutation';
CREATE TABLE IF NOT EXISTS Shop_Product_Permutation (
id_permutation INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_permutation_temp INT NOT NULL,
id_product INT NOT NULL,
CONSTRAINT FK_Shop_Product_Permutation_id_product
FOREIGN KEY (id_product)
REFERENCES Shop_Product(id_product)
ON UPDATE RESTRICT,
-- name VARCHAR(255) NOT NULL,
description VARCHAR(4000) NOT NULL,
cost_local_VAT_excl FLOAT NULL,
cost_local_VAT_incl FLOAT NULL,
id_currency_cost INT NOT NULL,
profit_local_min FLOAT NULL,
-- id_currency_profit_min INT NOT NULL,
latency_manufacture INT NOT NULL,
id_unit_measurement_quantity INT NOT NULL,
CONSTRAINT FK_Shop_Product_Permutation_id_unit_quantity
FOREIGN KEY (id_unit_measurement_quantity)
REFERENCES Shop_Unit_Measurement(id_unit_measurement),
count_unit_measurement_per_quantity_step FLOAT NOT NULL,
quantity_min FLOAT NULL,
quantity_max FLOAT NULL,
quantity_stock FLOAT NOT NULL,
is_subscription BIT NOT NULL,
id_unit_measurement_interval_recurrence INT,
CONSTRAINT FK_Shop_Product_Permutation_id_unit_interval_recurrence
FOREIGN KEY (id_unit_measurement_interval_recurrence)
REFERENCES Shop_Unit_Measurement(id_unit_measurement),
/*
CONSTRAINT CHECK_FK_Shop_Product_Permutation_id_unit_measurement_interval_recurrence
CHECK (id_unit_measurement_interval_recurrence IN (SELECT id_unit_measurement FROM Shop_Unit_Measurement WHERE is_unit_of_time = 1)),
*/
count_interval_recurrence INT,
id_stripe_product VARCHAR(100) NULL,
does_expire_faster_once_unsealed BIT NOT NULL DEFAULT 0,
id_unit_measurement_interval_expiration_unsealed INT,
CONSTRAINT FK_Shop_Product_Permutation_id_unit_interval_expiration_unsealed
FOREIGN KEY (id_unit_measurement_interval_expiration_unsealed)
REFERENCES Shop_Unit_Measurement(id_unit_measurement),
/*
CONSTRAINT CHECK_FK_Shop_Product_Permutation_id_interval_expiration_unsealed
CHECK (id_interval_expiration_unsealed IN (SELECT id_unit_measurement FROM Shop_Unit_Measurement WHERE is_unit_of_time = 1)),
*/
count_interval_expiration_unsealed INT,
active BIT NOT NULL DEFAULT 1,
-- display_order INT NOT NULL,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Product_Permutation_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Product Permutation Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product_Permutation_Audit';
CREATE TABLE IF NOT EXISTS Shop_Product_Permutation_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_permutation INT NOT NULL,
CONSTRAINT FK_Shop_Product_Permutation_Audit_id_permutation
FOREIGN KEY (id_permutation)
REFERENCES Shop_Product_Permutation(id_permutation)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Product_Permutation_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
ON UPDATE RESTRICT
);
# Product Permutation Temp
-- DROP TABLE IF EXISTS Shop_Product_Permutation_Temp;
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product_Permutation_Temp';
CREATE TABLE IF NOT EXISTS Shop_Product_Permutation_Temp (
id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_permutation INT NOT NULL
, id_product INT NOT NULL
, csv_id_pairs_variation VARCHAR(4000) NOT NULL
, description VARCHAR(4000) NOT NULL
, cost_local_VAT_excl FLOAT NULL
, cost_local_VAT_incl FLOAT NULL
, id_currency_cost INT NOT NULL
, profit_local_min FLOAT NULL
, latency_manufacture INT NOT NULL
, id_unit_measurement_quantity INT NOT NULL
, count_unit_measurement_per_quantity_step FLOAT NOT NULL
, quantity_min FLOAT NULL
, quantity_max FLOAT NULL
, quantity_stock FLOAT NULL
, is_subscription BIT NOT NULL
, id_unit_measurement_interval_recurrence INT
, count_interval_recurrence INT
, id_stripe_product VARCHAR(100) NULL
, does_expire_faster_once_unsealed BIT NOT NULL DEFAULT 0
, id_unit_measurement_interval_expiration_unsealed INT
, count_interval_expiration_unsealed INT
, active BIT NOT NULL DEFAULT 1
-- display_order INT NOT NULL
, guid BINARY(36)
, can_view BIT NULL DEFAULT NULL
, can_edit BIT NULL DEFAULT NULL
, can_admin BIT NULL DEFAULT NULL
);
# Variation Types
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Variation_Type';
CREATE TABLE IF NOT EXISTS Shop_Variation_Type (
id_type INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, id_type_temp INT NULL
, code VARCHAR(50)
, name VARCHAR(255)
, name_plural VARCHAR(256)
, active BIT NOT NULL DEFAULT 1
, display_order INT NOT NULL
, created_on DATETIME
, created_by INT
, id_change_set INT
, CONSTRAINT FK_Shop_Variation_Type_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Variation Type Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Variation_Type_Audit';
CREATE TABLE IF NOT EXISTS Shop_Variation_Type_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_type INT NOT NULL,
CONSTRAINT FK_Shop_Variation_Type_Audit_id_type
FOREIGN KEY (id_type)
REFERENCES Shop_Variation_Type(id_type)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Variation_Type_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Variation Types Temp
-- DROP TABLE partsltd_prod.Shop_Variation_Type_Temp;
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Variation_Type_Temp';
CREATE TABLE IF NOT EXISTS Shop_Variation_Type_Temp (
id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NOT NULL
-- , id_type_temp INT NOT NULL
, code VARCHAR(50)
, name VARCHAR(255)
, name_plural VARCHAR(256)
, active BIT NULL
, display_order INT NOT NULL
, created_on DATETIME
, created_by INT
, guid BINARY(36) NOT NULL
);
# Variations
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Variation';
CREATE TABLE Shop_Variation (
id_variation INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, id_type INT NOT NULL
, CONSTRAINT FK_Shop_Variation_id_type
FOREIGN KEY (id_type)
REFERENCES partsltd_prod.Shop_Variation_Type(id_type)
ON UPDATE RESTRICT
, id_unit_measurement INT NULL
, CONSTRAINT FK_Shop_Unit_Measurement_id_unit_measurement
FOREIGN KEY (id_unit_measurement)
REFERENCES partsltd_prod.Shop_Unit_Measurement(id_unit_measurement)
, count_unit_measurement INT NULL
, code VARCHAR(50)
, name VARCHAR(255)
, active BIT NOT NULL DEFAULT 1
, display_order INT NOT NULL
, created_on DATETIME
, created_by INT
, id_change_set INT
, CONSTRAINT FK_Shop_Variation_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES partsltd_prod.Shop_Product_Change_Set(id_change_set)
);
# Variation Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Variation_Audit';
CREATE TABLE IF NOT EXISTS Shop_Variation_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_variation INT NOT NULL,
CONSTRAINT FK_Shop_Variation_Audit_id_variation
FOREIGN KEY (id_variation)
REFERENCES Shop_Variation(id_variation)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Variation_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Variations Temp
-- DROP TABLE partsltd_prod.Shop_Variation_Temp;
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Variation_Temp';
CREATE TABLE Shop_Variation_Temp (
id_temp INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_variation INT NOT NULL
, id_type INT NOT NULL
, id_unit_measurement INT NULL
, count_unit_measurement INT NULL
, code VARCHAR(50)
, name VARCHAR(255)
, active BIT
, display_order INT NOT NULL
, created_on DATETIME
, created_by INT
, guid BINARY(36)
);
# Product Permutation Variation Link
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product_Permutation_Variation_Link';
CREATE TABLE IF NOT EXISTS Shop_Product_Permutation_Variation_Link (
id_link INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_permutation INT NOT NULL,
CONSTRAINT FK_Shop_Product_Permutation_Variation_Link_id_permutation
FOREIGN KEY (id_permutation)
REFERENCES Shop_Product_Permutation(id_permutation)
ON UPDATE RESTRICT,
id_variation INT NOT NULL,
CONSTRAINT FK_Shop_Product_Permutation_Variation_Link_id_variation
FOREIGN KEY (id_variation)
REFERENCES Shop_Variation(id_variation)
ON UPDATE RESTRICT,
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Product_Permutation_Variation_Link_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Product Permutation Variation Link Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product_Permutation_Variation_Link_Audit';
CREATE TABLE IF NOT EXISTS Shop_Product_Permutation_Variation_Link_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_link INT NOT NULL,
CONSTRAINT FK_Shop_Product_Permutation_Variation_Link_Audit_id_link
FOREIGN KEY (id_link)
REFERENCES Shop_Product_Permutation_Variation_Link(id_link)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Product_Permutation_Variation_Link_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
ON UPDATE RESTRICT
);
# Product Permutation Variation Link
-- DROP TABLE IF EXISTS Shop_Product_Permutation_Variation_Link_Temp;
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product_Permutation_Variation_Link_Temp';
CREATE TABLE IF NOT EXISTS Shop_Product_Permutation_Variation_Link_Temp (
id_temp INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, id_link INT NOT NULL
, id_permutation INT NOT NULL
, id_variation INT NOT NULL
, active BIT NOT NULL
, display_order INT NOT NULL
, GUID BINARY(36)
);
# Stock Stock Item
-- DROP TABLE IF EXISTS Shop_Stock_Item;
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Stock_Item';
CREATE TABLE IF NOT EXISTS Shop_Stock_Item (
id_stock INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_permutation INT NOT NULL,
CONSTRAINT FK_Shop_Stock_Item_id_permutation
FOREIGN KEY (id_permutation)
REFERENCES Shop_Product_Permutation(id_permutation),
date_purchased DATETIME NOT NULL,
date_received DATETIME NULL,
id_location_storage INT NOT NULL,
CONSTRAINT FK_Shop_Stock_Item_id_location_storage
FOREIGN KEY (id_location_storage)
REFERENCES Shop_Storage_Location(id_location),
id_currency_cost INT NOT NULL,
CONSTRAINT FK_Shop_Stock_Item_id_currency
FOREIGN KEY (id_currency_cost)
REFERENCES Shop_Currency(id_currency),
cost_local_VAT_incl FLOAT NULL,
cost_local_VAT_excl FLOAT NULL,
is_sealed BIT NOT NULL DEFAULT 1,
date_unsealed DATETIME NULL,
date_expiration DATETIME NOT NULL,
is_consumed BIT NOT NULL DEFAULT 0,
date_consumed DATETIME NULL,
active BIT NOT NULL DEFAULT 1,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Stock_Item_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Stock Item Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Stock_Item_Audit';
CREATE TABLE IF NOT EXISTS Shop_Stock_Item_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_stock INT NOT NULL,
CONSTRAINT FK_Shop_Stock_Item_Audit_id_stock
FOREIGN KEY (id_stock)
REFERENCES Shop_Stock_Item(id_stock)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Stock_Item_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
ON UPDATE RESTRICT
);
# Stock Stock Item Temp
DROP TABLE IF EXISTS Shop_Stock_Item_Temp;
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Stock_Item_Temp';
CREATE TABLE IF NOT EXISTS Shop_Stock_Item_Temp (
id_stock INT NULL
-- , id_category INT NULL
, id_product INT NOT NULL
, id_permutation INT NULL
, id_pairs_variations VARCHAR(4000) NULL
, date_purchased DATETIME NOT NULL
, date_received DATETIME NULL
, id_location_storage INT NOT NULL
, id_currency_cost INT NOT NULL
, cost_local_VAT_incl FLOAT NOT NULL
, cost_local_VAT_excl FLOAT NOT NULL
, is_sealed BIT NOT NULL
, date_unsealed DATETIME NULL
, date_expiration DATETIME NULL
, is_consumed BIT NOT NULL
, date_consumed DATETIME NULL
, active BIT NOT NULL
, guid BINARY(36) NOT NULL
);
# Product Price
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product_Price';
CREATE TABLE IF NOT EXISTS Shop_Product_Price (
id_price INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_permutation INT NULL,
CONSTRAINT FK_Shop_Product_Price_id_permutation
FOREIGN KEY (id_permutation)
REFERENCES Shop_Product_Permutation(id_permutation),
id_currency INT NOT NULL,
CONSTRAINT FK_Shop_Product_Price_id_currency
FOREIGN KEY (id_currency)
REFERENCES Shop_Currency(id_currency),
id_region_purchase INT NOT NULL,
CONSTRAINT FK_Shop_Product_Price_id_region_purchase
FOREIGN KEY (id_region_purchase)
REFERENCES Shop_Region(id_region),
price_local_VAT_incl FLOAT NULL,
price_local_VAT_excl FLOAT NULL,
id_stripe_price VARCHAR(200),
active BIT NOT NULL DEFAULT 1,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Product_Price_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Product Price Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product_Price_Audit';
CREATE TABLE IF NOT EXISTS Shop_Product_Price_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_price INT NOT NULL,
CONSTRAINT FK_Shop_Product_Price_Audit_id_price
FOREIGN KEY (id_price)
REFERENCES Shop_Product_Price(id_price)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Product_Price_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Product Price Temp
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product_Price_Temp';
CREATE TABLE IF NOT EXISTS Shop_Product_Price_Temp (
id_price INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_permutation INT NULL,
id_currency INT NOT NULL,
id_region_purchase INT NOT NULL,
price_local_VAT_incl FLOAT NULL,
price_local_VAT_excl FLOAT NULL,
id_stripe_price VARCHAR(200),
active BIT NOT NULL DEFAULT 1
);
# Product Permutation Images
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product_Image';
CREATE TABLE IF NOT EXISTS Shop_Product_Image (
id_image INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_type_image INT NOT NULL,
CONSTRAINT FK_Shop_Product_Image_id_type_image
FOREIGN KEY (id_type_image)
REFERENCES Shop_Image_Type(id_type),
id_permutation INT NULL,
CONSTRAINT FK_Shop_Product_Image_id_permutation
FOREIGN KEY (id_permutation)
REFERENCES Shop_Product_Permutation(id_permutation),
url VARCHAR(255),
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Product_Image_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Product Image Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product_Image_Audit';
CREATE TABLE IF NOT EXISTS Shop_Product_Image_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_image INT NOT NULL,
CONSTRAINT FK_Shop_Product_Image_Audit_id_image
FOREIGN KEY (id_image)
REFERENCES Shop_Product_Image(id_image),
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Product_Image_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Delivery Options
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Delivery_Option';
CREATE TABLE IF NOT EXISTS Shop_Delivery_Option (
id_option INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(50) NOT NULL,
name VARCHAR(100) NOT NULL,
description VARCHAR(4000),
latency_delivery_min INT NOT NULL,
latency_delivery_max INT NOT NULL,
/*
quantity_min INT NOT NULL,
quantity_max INT NOT NULL,
*/
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Delivery_Option_Type_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Delivery Option Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Delivery_Option_Audit';
CREATE TABLE IF NOT EXISTS Shop_Delivery_Option_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_option INT NOT NULL,
CONSTRAINT FK_Shop_Delivery_Option_Audit_id_option
FOREIGN KEY (id_option)
REFERENCES Shop_Delivery_Option(id_option)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Delivery_Option_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Delivery Option
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product_Permutation_Delivery_Option_Link';
CREATE TABLE IF NOT EXISTS Shop_Product_Permutation_Delivery_Option_Link (
id_link INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_product INT NOT NULL,
CONSTRAINT FK_Shop_Permutation_Delivery_Option_Link_id_product
FOREIGN KEY (id_product)
REFERENCES Shop_Product(id_product)
ON UPDATE RESTRICT,
id_permutation INT,
CONSTRAINT FK_Shop_Permutation_Delivery_Option_Link_id_permutation
FOREIGN KEY (id_permutation)
REFERENCES Shop_Product_Permutation(id_permutation)
ON UPDATE RESTRICT,
id_delivery_option INT NOT NULL,
CONSTRAINT FK_Shop_Permutation_Delivery_Option_Link_id_delivery_option
FOREIGN KEY (id_delivery_option)
REFERENCES Shop_Delivery_Option(id_option)
ON UPDATE RESTRICT,
id_region INT NOT NULL,
CONSTRAINT FK_Shop_Permutation_Delivery_Option_Link_id_region
FOREIGN KEY (id_region)
REFERENCES Shop_Region(id_region)
ON UPDATE RESTRICT,
id_currency INT NOT NULL,
CONSTRAINT FK_Shop_Permutation_Delivery_Option_Link_id_currency
FOREIGN KEY (id_currency)
REFERENCES Shop_Currency(id_currency)
ON UPDATE RESTRICT,
price_local FLOAT NOT NULL,
quantity_min FLOAT NULL,
quantity_max FLOAT NULL,
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Permutation_Delivery_Option_Link_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Delivery Option Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Product_Permutation_Delivery_Option_Link_Audit';
CREATE TABLE IF NOT EXISTS Shop_Product_Permutation_Delivery_Option_Link_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_link INT NOT NULL,
CONSTRAINT FK_Shop_Permutation_Delivery_Option_Link_Audit_id_link
FOREIGN KEY (id_link)
REFERENCES Shop_Product_Permutation_Delivery_Option_Link(id_link)
ON UPDATE RESTRICT,
name_field VARCHAR(64) NOT NULL,
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Permutation_Delivery_Option_Link_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Discounts
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Discount';
CREATE TABLE Shop_Discount (
id_discount INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(50) NOT NULL,
name VARCHAR(200) NOT NULL,
id_product INT NOT NULL,
CONSTRAINT FK_Shop_Discount_id_product
FOREIGN KEY (id_product)
REFERENCES Shop_Product(id_product),
id_permutation INT,
CONSTRAINT FK_Shop_Discount_id_permutation
FOREIGN KEY (id_permutation)
REFERENCES Shop_Product_Permutation(id_permutation)
ON UPDATE RESTRICT,
/*
id_delivery_region INT,
CONSTRAINT FK_Shop_Discount_id_delivery_region
FOREIGN KEY (id_delivery_region)
REFERENCES Shop_Delivery_Region(id_region)
ON UPDATE RESTRICT,
id_currency INT,
CONSTRAINT FK_Shop_Discount_id_currency
FOREIGN KEY (id_currency)
REFERENCES Shop_Currency(id_currency)
ON UPDATE RESTRICT,
*/
multiplier FLOAT NOT NULL DEFAULT 1 CHECK (multiplier > 0),
subtractor FLOAT NOT NULL DEFAULT 0,
apply_multiplier_first BIT DEFAULT 1,
quantity_min FLOAT NOT NULL DEFAULT 0,
quantity_max FLOAT NOT NULL,
date_start DATETIME NOT NULL,
date_end DATETIME NOT NULL,
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Discount_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Discount Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Discount_Audit';
CREATE TABLE IF NOT EXISTS Shop_Discount_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_discount INT NOT NULL,
CONSTRAINT FK_Shop_Discount_Audit_id_discount
FOREIGN KEY (id_discount)
REFERENCES Shop_Discount(id_discount)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Discount_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
ON UPDATE RESTRICT
);
# Discount Region Currency Link
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Discount_Region_Currency_Link';
CREATE TABLE IF NOT EXISTS Shop_Discount_Region_Currency_Link (
id_link INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_discount INT NOT NULL,
CONSTRAINT FK_Shop_Discount_Region_Currency_Link_id_discount
FOREIGN KEY (id_discount)
REFERENCES Shop_Discount(id_discount)
ON UPDATE RESTRICT,
id_region INT NOT NULL,
CONSTRAINT FK_Shop_Discount_Region_Currency_Link_id_region
FOREIGN KEY (id_region)
REFERENCES Shop_Region(id_region)
ON UPDATE RESTRICT,
id_currency INT NOT NULL,
CONSTRAINT FK_Shop_Discount_Region_Currency_Link_id_currency
FOREIGN KEY (id_currency)
REFERENCES Shop_Currency(id_currency)
ON UPDATE RESTRICT,
active BIT NOT NULL DEFAULT 1,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Discount_Region_Currency_Link_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Discount Region Currency Link Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Discount_Region_Currency_Link_Audit';
CREATE TABLE IF NOT EXISTS Shop_Discount_Region_Currency_Link_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_link INT NOT NULL,
CONSTRAINT FK_Shop_Discount_Region_Currency_Link_Audit_id_link
FOREIGN KEY (id_link)
REFERENCES Shop_Discount_Region_Currency_Link(id_link)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Discount_Region_Currency_Link_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
ON UPDATE RESTRICT
);
# Permission Groups
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Permission_Group';
CREATE TABLE IF NOT EXISTS Shop_Permission_Group (
id_group INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(50),
name VARCHAR(255),
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Permission_Group_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
ON UPDATE RESTRICT
);
# Permission Group Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Permission_Group_Audit';
CREATE TABLE IF NOT EXISTS Shop_Permission_Group_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_group INT NOT NULL,
CONSTRAINT FK_Shop_Permission_Group_Audit_id_group
FOREIGN KEY (id_group)
REFERENCES Shop_Permission_Group(id_group)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Permission_Group_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
ON UPDATE RESTRICT
);
# Permissions
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Permission';
CREATE TABLE IF NOT EXISTS Shop_Permission (
id_permission INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(50),
name VARCHAR(255),
id_permission_group INT NOT NULL,
CONSTRAINT FK_Shop_Permission_id_permission_group
FOREIGN KEY (id_permission_group)
REFERENCES Shop_Permission_Group(id_group)
ON UPDATE RESTRICT,
id_access_level_required INT NOT NULL,
CONSTRAINT FK_Shop_Permission_id_access_level_required
FOREIGN KEY (id_access_level_required)
REFERENCES Shop_Access_Level(id_access_level),
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Permission_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
);
# Permission Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Permission_Audit';
CREATE TABLE IF NOT EXISTS Shop_Permission_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_permission INT NOT NULL,
CONSTRAINT FK_Shop_Permission_Audit_id_permission
FOREIGN KEY (id_permission)
REFERENCES Shop_Permission(id_permission)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Permission_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
ON UPDATE RESTRICT
);
# Roles
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Role';
CREATE TABLE IF NOT EXISTS Shop_Role (
id_role INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(50),
name VARCHAR(255),
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Role_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
);
# Role Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Role_Audit';
CREATE TABLE Shop_Role_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_role INT NOT NULL,
CONSTRAINT FK_Shop_Role_Audit_id_role
FOREIGN KEY (id_role)
REFERENCES Shop_Role(id_role)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Role_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
ON UPDATE RESTRICT
);
# Role Permission link
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Role_Permission_Link';
CREATE TABLE IF NOT EXISTS Shop_Role_Permission_Link (
id_link INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_role INT,
CONSTRAINT FK_Shop_Role_Permission_Link_id_role
FOREIGN KEY (id_role)
REFERENCES Shop_Role(id_role)
ON UPDATE RESTRICT,
id_permission INT,
CONSTRAINT FK_Shop_Role_Permission_Link_id_permission
FOREIGN KEY (id_permission)
REFERENCES Shop_Permission(id_permission)
ON UPDATE RESTRICT,
id_access_level INT,
CONSTRAINT FK_Shop_Role_Permission_Link_id_access_level
FOREIGN KEY (id_access_level)
REFERENCES Shop_Access_Level(id_access_level),
active BIT NOT NULL DEFAULT 1,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Role_Permission_Link_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
);
# Role Permission link Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Role_Permission_Link_Audit';
CREATE TABLE IF NOT EXISTS Shop_Role_Permission_Link_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_link INT NOT NULL,
CONSTRAINT FK_Shop_Role_Permission_Link_Audit_id_link
FOREIGN KEY (id_link)
REFERENCES Shop_Role_Permission_Link(id_link)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Role_Permission_Link_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
);
# Users
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_User';
CREATE TABLE IF NOT EXISTS Shop_User (
id_user INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_user_auth0 VARCHAR(200) NOT NULL,
firstname VARCHAR(255) NOT NULL,
surname VARCHAR(255) NOT NULL,
email VARCHAR(254) NOT NULL,
is_email_verified BIT NOT NULL DEFAULT 0,
is_super_user BIT NOT NULL DEFAULT 0,
id_currency_default INT NULL,
id_region_default INT NULL,
is_included_VAT_default BIT NOT NULL DEFAULT 1,
active BIT NOT NULL DEFAULT 1,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_User_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
);
# User Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_User_Audit';
CREATE TABLE IF NOT EXISTS Shop_User_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_user INT NOT NULL,
CONSTRAINT FK_Shop_User_Audit_id_user
FOREIGN KEY (id_user)
REFERENCES Shop_User(id_user)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_User_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
ON UPDATE RESTRICT
);
# User Role link
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_User_Role_Link';
CREATE TABLE IF NOT EXISTS Shop_User_Role_Link (
id_link INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_user INT NOT NULL,
CONSTRAINT FK_Shop_User_Role_Link_id_user
FOREIGN KEY (id_user)
REFERENCES Shop_User(id_user)
ON UPDATE RESTRICT,
id_role INT NOT NULL,
CONSTRAINT FK_Shop_User_Role_Link_id_role
FOREIGN KEY (id_role)
REFERENCES Shop_Role(id_role),
active BIT NOT NULL DEFAULT 1,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_User_Role_Link_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
);
# User Role Link Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_User_Role_Link_Audit';
CREATE TABLE IF NOT EXISTS Shop_User_Role_Link_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_link INT NOT NULL,
CONSTRAINT FK_Shop_User_Role_Link_Audit_id_link
FOREIGN KEY (id_link)
REFERENCES Shop_User_Role_Link(id_link)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_User_Role_Link_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
);
# User Addresses
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_User_Address';
CREATE TABLE Shop_User_Address (
id_user_address INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_user INT NOT NULL,
CONSTRAINT FK_Shop_Address_id_user
FOREIGN KEY (id_user)
REFERENCES Shop_User(id_user)
ON UPDATE RESTRICT,
-- region VARCHAR(100) NOT NULL,
id_region INT NOT NULL,
name_full VARCHAR(255) NOT NULL,
phone_number VARCHAR(20) NOT NULL,
postcode VARCHAR(20) NOT NULL,
address_line_1 VARCHAR(256) NOT NULL,
address_line_2 VARCHAR(256) NOT NULL,
city VARCHAR(256) NOT NULL,
county VARCHAR(256) NOT NULL,
active BIT NOT NULL DEFAULT 1,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_User_Address_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
);
# Address Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_User_Address_Audit';
CREATE TABLE IF NOT EXISTS Shop_User_Address_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_user_address INT NOT NULL,
CONSTRAINT FK_Shop_User_Address_Audit_id_address
FOREIGN KEY (id_user_address)
REFERENCES Shop_User_Address(id_user_address)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_User_Address_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
ON UPDATE RESTRICT
);
# User Basket (Product Link)
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_User_Basket';
CREATE TABLE IF NOT EXISTS Shop_User_Basket (
id_item INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_user INT NOT NULL,
CONSTRAINT FK_Shop_User_Basket_id_user
FOREIGN KEY (id_user)
REFERENCES Shop_User(id_user)
ON UPDATE RESTRICT,
id_product INT NOT NULL,
CONSTRAINT FK_Shop_User_Basket_id_product
FOREIGN KEY (id_product)
REFERENCES Shop_Product(id_product)
ON UPDATE RESTRICT,
id_permutation INT,
CONSTRAINT FK_Shop_User_Basket_id_permutation
FOREIGN KEY (id_permutation)
REFERENCES Shop_Product_Permutation(id_permutation)
ON UPDATE RESTRICT,
quantity INT NOT NULL,
active BIT NOT NULL DEFAULT 1,
created_on DATETIME,
created_by INT,
id_change_set_user INT,
CONSTRAINT FK_Shop_User_Basket_id_change_set_user
FOREIGN KEY (id_change_set_user)
REFERENCES Shop_User_Change_Set(id_change_set)
/*
id_change_set_product INT,
CONSTRAINT FK_Shop_User_Basket_id_change_set_product
FOREIGN KEY (id_change_set_product)
REFERENCES Shop_Product_Change_Set(id_change_set)
*/
);
# Product Basket Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_User_Basket_Audit';
CREATE TABLE IF NOT EXISTS Shop_User_Basket_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_item INT NOT NULL,
CONSTRAINT FK_Shop_User_Basket_Audit_id_link
FOREIGN KEY (id_item)
REFERENCES Shop_User_Basket(id_item)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set_user INT,
CONSTRAINT FK_Shop_User_Basket_Audit_id_change_set_user
FOREIGN KEY (id_change_set_user)
REFERENCES Shop_User_Change_Set(id_change_set)
/*
id_change_set_product INT,
CONSTRAINT FK_Shop_User_Basket_Audit_id_change_set_product
FOREIGN KEY (id_change_set_product)
REFERENCES Shop_Product_Change_Set(id_change_set)
*/
);
# User Order Types
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_User_Order_Status';
CREATE TABLE IF NOT EXISTS Shop_User_Order_Status (
id_status INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(50),
name VARCHAR(255),
name_plural VARCHAR(256),
active BIT NOT NULL DEFAULT 1,
display_order INT NOT NULL,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_User_Order_Status_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
);
# Order Type Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_User_Order_Status_Audit';
CREATE TABLE IF NOT EXISTS Shop_User_Order_Status_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_status INT NOT NULL,
CONSTRAINT FK_Shop_User_Order_Status_Audit_id_status
FOREIGN KEY (id_status)
REFERENCES Shop_User_Order_Status(id_status)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_User_Order_Status_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Product_Change_Set(id_change_set)
);
# Supplier
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier';
CREATE TABLE IF NOT EXISTS Shop_Supplier (
id_supplier INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, name_company VARCHAR(255) NOT NULL
, name_contact VARCHAR(255) NULL
, department_contact VARCHAR(255) NULL
/*
id_address INT NOT NULL,
CONSTRAINT FK_Shop_Supplier_id_address
FOREIGN KEY (id_address)
REFERENCES Shop_Address(id_address),
*/
, phone_number VARCHAR(50) NULL
, fax VARCHAR(50) NULL
, email VARCHAR(255) NOT NULL
, website VARCHAR(255) NULL
, id_currency INT NOT NULL
, CONSTRAINT FK_Shop_Supplier_id_currency
FOREIGN KEY (id_currency)
REFERENCES Shop_Currency(id_currency)
, active BIT NOT NULL DEFAULT 1
, created_on DATETIME
, created_by INT
, id_change_set INT
, CONSTRAINT FK_Shop_Supplier_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
, id_supplier_temp INT NOT NULL
);
# Supplier Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Audit';
CREATE TABLE IF NOT EXISTS Shop_Supplier_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_supplier INT NOT NULL,
CONSTRAINT FK_Shop_Supplier_Audit_id_supplier
FOREIGN KEY (id_supplier)
REFERENCES Shop_Supplier(id_supplier)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Supplier_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
);
# Supplier Staging
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Temp';
CREATE TABLE IF NOT EXISTS Shop_Supplier_Temp (
id_temp INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_supplier INT NOT NULL,
name_company VARCHAR(255) NOT NULL,
name_contact VARCHAR(255) NULL,
department_contact VARCHAR(255) NULL,
-- id_address INT NOT NULL,
phone_number VARCHAR(50) NULL,
fax VARCHAR(50) NULL,
email VARCHAR(255) NOT NULL,
website VARCHAR(255) NULL,
id_currency INT NOT NULL,
active BIT NULL,
GUID BINARY(36) NOT NULL
);
# Supplier Addresses
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Address';
CREATE TABLE Shop_Supplier_Address (
id_address INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, id_supplier INT NOT NULL
, CONSTRAINT FK_Shop_Supplier_Address_id_supplier
FOREIGN KEY (id_supplier)
REFERENCES partsltd_prod.Shop_Supplier(id_supplier)
ON UPDATE RESTRICT
, id_region INT NOT NULL
, CONSTRAINT FK_Shop_Supplier_Address_id_region
FOREIGN KEY (id_region)
REFERENCES partsltd_prod.Shop_Region(id_region)
, postcode VARCHAR(20) NOT NULL
, address_line_1 VARCHAR(256) NOT NULL
, address_line_2 VARCHAR(256) NOT NULL
, city VARCHAR(256) NOT NULL
, county VARCHAR(256) NOT NULL
, active BIT NOT NULL DEFAULT 1
, created_on DATETIME
, created_by INT
, id_change_set INT
, CONSTRAINT FK_Shop_Supplier_Address_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES partsltd_prod.Shop_User_Change_Set(id_change_set)
);
# Supplier Address Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Address_Audit';
CREATE TABLE IF NOT EXISTS Shop_Supplier_Address_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_address INT NOT NULL,
CONSTRAINT FK_Shop_Supplier_Address_Audit_id_address
FOREIGN KEY (id_address)
REFERENCES Shop_Supplier_Address(id_address)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Supplier_Address_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_User_Change_Set(id_change_set)
ON UPDATE RESTRICT
);
# Supplier Addresses Staging
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Address_Temp';
CREATE TABLE Shop_Supplier_Address_Temp (
id_address INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, id_supplier INT NOT NULL
, id_region INT NOT NULL
, postcode VARCHAR(20) NOT NULL
, address_line_1 VARCHAR(256) NOT NULL
, address_line_2 VARCHAR(256) NOT NULL
, city VARCHAR(256) NOT NULL
, county VARCHAR(256) NOT NULL
, active BIT NOT NULL DEFAULT 1
, GUID BINARY(36) NOT NULL
);
# Supplier Purchase Order
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Purchase_Order';
CREATE TABLE IF NOT EXISTS Shop_Supplier_Purchase_Order (
id_order INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_order_temp INT NULL,
id_supplier_ordered INT NOT NULL,
CONSTRAINT FK_Shop_Supplier_Purchase_Order_id_supplier_ordered
FOREIGN KEY (id_supplier_ordered)
REFERENCES Shop_Supplier(id_supplier),
/*
id_supplier_fulfilled INT NOT NULL,
CONSTRAINT FK_Shop_Supplier_Purchase_Order_id_supplier_fulfilled
FOREIGN KEY (id_supplier_fulfilled)
REFERENCES Shop_Supplier(id_supplier),
*/
id_currency_cost INT NOT NULL,
cost_total_local_VAT_excl FLOAT NOT NULL,
cost_total_local_VAT_incl FLOAT NOT NULL,
/*
latency_delivery INT NOT NULL,
quantity_ordered FLOAT NOT NULL,
id_unit_quantity INT NOT NULL,
CONSTRAINT FK_Shop_Supplier_Purchase_Order_id_unit_quantity
FOREIGN KEY (id_unit_quantity)
REFERENCES Shop_Unit_Measurement(id_unit),
-- quantity_received INT NULL,
display_order INT NOT NULL,
*/
active BIT NOT NULL DEFAULT 1,
created_on DATETIME,
created_by INT,
updated_last_on DATETIME NULL,
created_last_by VARCHAR(100) NULL,
id_change_set INT NULL,
CONSTRAINT FK_Shop_Supplier_Purchase_Order_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Sales_And_Purchasing_Change_Set(id_change_set)
);
# Supplier Purchase Order Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Purchase_Order_Audit';
CREATE TABLE IF NOT EXISTS Shop_Supplier_Purchase_Order_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_order INT NOT NULL,
CONSTRAINT FK_Shop_Supplier_Purchase_Order_Audit_id_order
FOREIGN KEY (id_order)
REFERENCES Shop_Supplier_Purchase_Order(id_order)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Supplier_Purchase_Order_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Sales_And_Purchasing_Change_Set(id_change_set)
);
# Supplier Purchase Order Staging
DROP TABLE IF EXISTS Shop_Supplier_Purchase_Order_Temp;
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Purchase_Order_Temp';
CREATE TABLE IF NOT EXISTS Shop_Supplier_Purchase_Order_Temp (
id_temp INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, id_order INT NOT NULL
, id_supplier_ordered INT NOT NULL
, id_currency_cost INT NOT NULL
, active BIT NULL
, GUID BINARY(36) NOT NULL
);
# Supplier Purchase Order Product Link
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Purchase_Order_Product_Link';
CREATE TABLE IF NOT EXISTS Shop_Supplier_Purchase_Order_Product_Link (
id_link INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_order INT NOT NULL,
CONSTRAINT FK_Shop_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_Shop_Supplier_Purchase_Order_Product_Link_id_permutation
FOREIGN KEY (id_permutation)
REFERENCES Shop_Product_Permutation(id_permutation),
-- id_currency_cost INT NOT NULL,
id_unit_quantity INT NOT NULL,
CONSTRAINT FK_Shop_Supplier_Purchase_Order_Product_Link_id_unit_quantity
FOREIGN KEY (id_unit_quantity)
REFERENCES Shop_Unit_Measurement(id_unit_measurement),
quantity_ordered FLOAT NOT NULL,
quantity_received FLOAT NULL,
latency_delivery_days INT NOT NULL,
display_order INT NOT NULL,
active BIT NOT NULL,
cost_total_local_VAT_excl FLOAT NOT NULL,
cost_total_local_VAT_incl FLOAT NOT NULL,
cost_unit_local_VAT_excl FLOAT NOT NULL,
cost_unit_local_VAT_incl FLOAT NOT NULL,
created_on DATETIME,
created_by INT,
updated_last_on DATETIME NULL,
created_last_by VARCHAR(100) NULL,
id_change_set INT NULL,
CONSTRAINT FK_Shop_Supplier_Purchase_Order_Product_Link_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Sales_And_Purchasing_Change_Set(id_change_set)
);
# Supplier Purchase Order Product Link Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Purchase_Order_Product_Link_Audit';
CREATE TABLE IF NOT EXISTS Shop_Supplier_Purchase_Order_Product_Link_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_link INT NOT NULL,
CONSTRAINT FK_Shop_Supplier_Purchase_Order_Product_Link_Audit_id_link
FOREIGN KEY (id_link)
REFERENCES Shop_Supplier_Purchase_Order_Product_Link(id_link)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Supplier_Purchase_Order_Product_Link_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Sales_And_Purchasing_Change_Set(id_change_set)
);
# Supplier Purchase Order Product Link Temp
-- drop table Shop_Supplier_Purchase_Order_Product_Link_Temp;
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Purchase_Order_Product_Link_Temp';
CREATE TABLE IF NOT EXISTS Shop_Supplier_Purchase_Order_Product_Link_Temp (
id_temp INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, id_link INT NOT NULL
, id_order INT NOT NULL
, id_product INT NULL
, id_permutation INT NULL
, csv_list_variations VARCHAR(4000) NULL
, id_unit_quantity INT NOT NULL
, quantity_ordered FLOAT NOT NULL
, quantity_received FLOAT NULL
, latency_delivery_days INT NOT NULL
, display_order INT NOT NULL
, active BIT NOT NULL
, cost_total_local_VAT_excl FLOAT NOT NULL
, cost_total_local_VAT_incl FLOAT NOT NULL
, GUID BINARY(36) NOT NULL
);
# Manufacturing Purchase Order
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Manufacturing_Purchase_Order';
CREATE TABLE IF NOT EXISTS Shop_Manufacturing_Purchase_Order (
id_order INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_order_temp INT NULL,
/*
cost_total_local FLOAT NOT NULL,
id_currency_cost INT NOT NULL,
*/
id_currency INT NOT NULL,
CONSTRAINT FK_Manufacturing_Purchase_Order_id_currency
FOREIGN KEY (id_currency)
REFERENCES Shop_Currency(id_currency),
cost_total_local_VAT_excl FLOAT NULL,
cost_total_local_VAT_incl FLOAT NULL,
price_total_local_VAT_excl FLOAT NULL,
price_total_local_VAT_incl FLOAT NULL,
/*
latency_delivery INT NOT NULL,
quantity_ordered FLOAT NOT NULL,
id_unit_quantity INT NOT NULL,
CONSTRAINT FK_Shop_Manufacturing_Purchase_Order_id_unit_quantity
FOREIGN KEY (id_unit_quantity)
REFERENCES Shop_Unit_Measurement(id_unit),
quantity_received INT NULL,
display_order INT NOT NULL,
*/
active BIT NOT NULL DEFAULT 1,
created_on DATETIME,
created_by INT,
updated_last_on DATETIME NULL,
created_last_by VARCHAR(100) NULL,
id_change_set INT NULL,
CONSTRAINT FK_Shop_Manufacturing_Purchase_Order_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Sales_And_Purchasing_Change_Set(id_change_set)
);
# Manufacturing Purchase Order Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Manufacturing_Purchase_Order_Audit';
CREATE TABLE IF NOT EXISTS Shop_Manufacturing_Purchase_Order_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_order INT NOT NULL,
CONSTRAINT FK_Shop_Manufacturing_Purchase_Order_Audit_id_order
FOREIGN KEY (id_order)
REFERENCES Shop_Manufacturing_Purchase_Order(id_order)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Manufacturing_Purchase_Order_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Sales_And_Purchasing_Change_Set(id_change_set)
);
# Manufacturing Purchase Order Temp
-- DROP TABLE Shop_Manufacturing_Purchase_Order_Temp
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Manufacturing_Purchase_Order_Temp';
CREATE TABLE IF NOT EXISTS Shop_Manufacturing_Purchase_Order_Temp (
id_temp INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_order INT NOT NULL,
/*
cost_total_local FLOAT NOT NULL,
*/
id_currency INT NOT NULL,
cost_total_local_VAT_excl FLOAT NULL,
cost_total_local_VAT_incl FLOAT NULL,
price_total_local_VAT_excl FLOAT NULL,
price_total_local_VAT_incl FLOAT NULL,
/*
latency_delivery INT NOT NULL,
quantity_ordered FLOAT NOT NULL,
id_unit_quantity INT NOT NULL,
CONSTRAINT FK_Shop_Manufacturing_Purchase_Order_id_unit_quantity
FOREIGN KEY (id_unit_quantity)
REFERENCES Shop_Unit_Measurement(id_unit),
quantity_received INT NULL,
display_order INT NOT NULL,
*/
active BIT NOT NULL DEFAULT 1,
GUID BINARY(36) NOT NULL
);
# Manufacturing Purchase Order Product Link
-- DROP TABLE partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link_Audit
-- DROP TABLE partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Manufacturing_Purchase_Order_Product_Link';
CREATE TABLE IF NOT EXISTS Shop_Manufacturing_Purchase_Order_Product_Link (
id_link INT NOT NULL AUTO_INCREMENT PRIMARY KEY
, id_order INT NOT NULL
, CONSTRAINT FK_Manufacturing_Purchase_Order_Product_Link_id_order
FOREIGN KEY (id_order)
REFERENCES partsltd_prod.Shop_Manufacturing_Purchase_Order(id_order)
, id_permutation INT NOT NULL
, CONSTRAINT FK_Manufacturing_Purchase_Order_Product_Link_id_permutation
FOREIGN KEY (id_permutation)
REFERENCES partsltd_prod.Shop_Product_Permutation(id_permutation)
, cost_unit_local_VAT_excl FLOAT NULL
, cost_unit_local_VAT_incl FLOAT NULL
, price_unit_local_VAT_excl FLOAT NULL
, price_unit_local_VAT_incl FLOAT NULL
, id_unit_quantity INT NOT NULL
, CONSTRAINT FK_Manufacturing_Purchase_Order_id_unit_quantity
FOREIGN KEY (id_unit_quantity)
REFERENCES partsltd_prod.Shop_Unit_Measurement(id_unit_measurement)
, quantity_used FLOAT NULL
, quantity_produced FLOAT NULL
, id_unit_latency_manufacture INT NULL
, CONSTRAINT FK_MPO_id_unit_latency_manufacture
FOREIGN KEY (id_unit_latency_manufacture)
REFERENCES partsltd_prod.Shop_Unit_Measurement(id_unit_measurement)
, latency_manufacture INT NULL
, display_order INT NOT NULL
, active BIT NOT NULL
, created_on DATETIME
, created_by INT
, updated_last_on DATETIME NULL
, created_last_by VARCHAR(100) NULL
, id_change_set INT NULL
, CONSTRAINT FK_Manufacturing_Purchase_Order_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES partsltd_prod.Shop_Sales_And_Purchasing_Change_Set(id_change_set)
);
# Manufacturing Purchase Order Product Link Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Manufacturing_Purchase_Order_Product_Link_Audit';
CREATE TABLE IF NOT EXISTS Shop_Manufacturing_Purchase_Order_Product_Link_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_link INT NOT NULL,
CONSTRAINT FK_Manufacturing_Purchase_Order_Product_Link_Audit_id_link
FOREIGN KEY (id_link)
REFERENCES Shop_Manufacturing_Purchase_Order_Product_Link(id_link)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Manufacturing_Purchase_Order_Product_Link_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Sales_And_Purchasing_Change_Set(id_change_set)
);
# Manufacturing Purchase Order Product Link Temp
-- DROP TABLE Shop_Manufacturing_Purchase_Order_Product_Link_Temp;
-- SELECT * FROM Shop_Manufacturing_Purchase_Order_Product_Link_Temp;
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Manufacturing_Purchase_Order_Product_Link_Temp';
CREATE TABLE IF NOT EXISTS Shop_Manufacturing_Purchase_Order_Product_Link_Temp (
id_temp INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_link INT NOT NULL,
id_order INT NOT NULL,
id_product INT NULL,
id_permutation INT NULL,
csv_list_variations VARCHAR(4000) NULL,
id_unit_quantity INT NOT NULL,
quantity_used FLOAT NULL,
quantity_produced FLOAT NULL,
id_unit_latency_manufacture INT NULL,
latency_manufacture INT NULL,
display_order INT NOT NULL,
active BIT NOT NULL,
cost_unit_local_VAT_excl FLOAT NULL,
cost_unit_local_VAT_incl FLOAT NULL,
price_unit_local_VAT_excl FLOAT NULL,
price_unit_local_VAT_incl FLOAT NULL,
GUID BINARY(36) NOT NULL
);
# Customer
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Customer';
CREATE TABLE IF NOT EXISTS Shop_Customer (
id_customer INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name_company VARCHAR(255) NOT NULL,
name_contact VARCHAR(255) NULL,
department_contact VARCHAR(255) NULL,
id_address INT NOT NULL,
CONSTRAINT FK_Shop_Customer_id_address
FOREIGN KEY (id_address)
REFERENCES Shop_Address(id_address),
phone_number VARCHAR(50) NULL,
email VARCHAR(255) NOT NULL,
id_currency INT NOT NULL,
CONSTRAINT FK_Shop_Customer_id_currency
FOREIGN KEY (id_currency)
REFERENCES Shop_Currency(id_currency),
active BIT NOT NULL DEFAULT 1,
created_on DATETIME,
created_by INT,
id_change_set INT,
CONSTRAINT FK_Shop_Customer_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Sales_And_Purchasing_Change_Set(id_change_set)
);
# Customer Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Customer_Audit';
CREATE TABLE IF NOT EXISTS Shop_Customer_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_customer INT NOT NULL,
CONSTRAINT FK_Shop_Customer_Audit_id_customer
FOREIGN KEY (id_customer)
REFERENCES Shop_Customer(id_customer)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Customer_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Sales_And_Purchasing_Change_Set(id_change_set)
);
# Customer Sales Purchase Order
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Customer_Sales_Order';
CREATE TABLE IF NOT EXISTS Shop_Customer_Sales_Order (
id_order INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_customer INT NOT NULL,
CONSTRAINT FK_Shop_Customer_Sales_Order_id_customer
FOREIGN KEY (id_customer)
REFERENCES Shop_Customer(id_customer),
price_total_local FLOAT NOT NULL,
id_currency_price INT NOT NULL,
/*
latency_delivery INT NOT NULL,
quantity_ordered FLOAT NOT NULL,
id_unit_quantity INT NOT NULL,
CONSTRAINT FK_Shop_Customer_Sales_Order_id_unit_quantity
FOREIGN KEY (id_unit_quantity)
REFERENCES Shop_Unit_Measurement(id_unit),
quantity_received INT NULL,
display_order INT NOT NULL,
*/
active BIT NOT NULL DEFAULT 1,
created_on DATETIME,
created_by INT,
updated_last_on DATETIME NULL,
created_last_by VARCHAR(100) NULL,
id_change_set INT NULL,
CONSTRAINT FK_Shop_Customer_Sales_Order_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Sales_And_Purchasing_Change_Set(id_change_set)
);
# Customer Sales Order Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Customer_Sales_Order_Audit';
CREATE TABLE IF NOT EXISTS Shop_Customer_Sales_Order_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_order INT NOT NULL,
CONSTRAINT FK_Shop_Customer_Sales_Order_Audit_id_order
FOREIGN KEY (id_order)
REFERENCES Shop_Customer_Sales_Order(id_order)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Customer_Sales_Order_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Sales_And_Purchasing_Change_Set(id_change_set)
);
# Customer Sales Order Product Link
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Customer_Sales_Order_Product_Link';
CREATE TABLE IF NOT EXISTS Shop_Customer_Sales_Order_Product_Link (
id_link INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_order INT NOT NULL,
CONSTRAINT FK_Shop_Customer_Sales_Order_Product_Link_id_order
FOREIGN KEY (id_order)
REFERENCES Shop_Customer_Sales_Order(id_order),
id_permutation INT NOT NULL,
CONSTRAINT FK_Shop_Customer_Sales_Order_Product_Link_id_permutation
FOREIGN KEY (id_permutation)
REFERENCES Shop_Product_Permutation(id_permutation),
price_total_local FLOAT NOT NULL,
id_currency_price INT NOT NULL,
quantity_ordered FLOAT NOT NULL,
id_unit_quantity INT NOT NULL,
CONSTRAINT FK_Shop_Customer_Sales_Order_Product_Link_id_unit_quantity
FOREIGN KEY (id_unit_quantity)
REFERENCES Shop_Unit_Measurement(id_unit_measurement),
quantity_delivered FLOAT NOT NULL,
latency_delivery_days INT NOT NULL,
display_order INT NOT NULL,
active BIT NOT NULL,
created_on DATETIME,
created_by INT,
updated_last_on DATETIME NULL,
created_last_by VARCHAR(100) NULL,
id_change_set INT NULL,
CONSTRAINT FK_Shop_Customer_Sales_Order_Product_Link_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Sales_And_Purchasing_Change_Set(id_change_set)
);
# Customer Sales Order Product Link Audits
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Customer_Sales_Order_Product_Link_Audit';
CREATE TABLE IF NOT EXISTS Shop_Customer_Sales_Order_Product_Link_Audit (
id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_link INT NOT NULL,
CONSTRAINT FK_Shop_Customer_Sales_Order_Product_Link_Audit_id_link
FOREIGN KEY (id_link)
REFERENCES Shop_Customer_Sales_Order_Product_Link(id_link)
ON UPDATE RESTRICT,
name_field VARCHAR(50),
value_prev VARCHAR(500),
value_new VARCHAR(500),
id_change_set INT NOT NULL,
CONSTRAINT FK_Shop_Customer_Sales_Order_Product_Link_Audit_id_change_set
FOREIGN KEY (id_change_set)
REFERENCES Shop_Sales_And_Purchasing_Change_Set(id_change_set)
);
# Customer Sales Order Product Link Temp
-- DROP TABLE Shop_Customer_Sales_Order_Product_Link_Temp;
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Customer_Sales_Order_Product_Link_Temp';
CREATE TABLE IF NOT EXISTS Shop_Customer_Sales_Order_Product_Link_Temp (
id_link INT NOT NULL PRIMARY KEY,
GUID BINARY(36) NOT NULL,
id_order INT NOT NULL,
/*
CONSTRAINT FK_Customer_Sales_Order_Product_Link_Temp_id_order
FOREIGN KEY (id_order)
REFERENCES Shop_Customer_Sales_Order(id_order),
*/
id_permutation INT NOT NULL,
CONSTRAINT FK_Customer_Sales_Order_Product_Link_Temp_id_permutation
FOREIGN KEY (id_permutation)
REFERENCES Shop_Product_Permutation(id_permutation),
price_total_local FLOAT NOT NULL,
id_currency_price INT NOT NULL,
quantity_ordered FLOAT NOT NULL,
id_unit_quantity INT NOT NULL,
CONSTRAINT FK_Customer_Sales_Order_Product_Link_Temp_id_unit_quantity
FOREIGN KEY (id_unit_quantity)
REFERENCES Shop_Unit_Measurement(id_unit_measurement),
quantity_delivered FLOAT NULL,
latency_delivery_days INT NOT NULL,
display_order INT NOT NULL,
active BIT NOT NULL
);
# Calc User Staging
-- USE partsltd_prod;
-- DROP TABLE IF EXISTS Shop_Calc_User_Temp;
SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Calc_User_Temp';
CREATE TABLE Shop_Calc_User_Temp (
-- id_row INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
guid BINARY(36) NOT NULL,
id_user INT NULL,
id_permission_required INT NOT NULL,
CONSTRAINT FK_Shop_Calc_User_Temp_id_permission_required
FOREIGN KEY (id_permission_required)
REFERENCES partsltd_prod.Shop_Permission (id_permission),
priority_access_level_required INT NOT NULL,
id_product INT NULL,
CONSTRAINT FK_Shop_Calc_User_Temp_id_product
FOREIGN KEY (id_product)
REFERENCES partsltd_prod.Shop_Product (id_product),
is_super_user BIT NULL,
priority_access_level_user INT NULL,
can_view BIT,
can_edit BIT,
can_admin BIT
);
# Shop Access Level
DROP TRIGGER IF EXISTS before_insert_Shop_Access_Level;
DROP TRIGGER IF EXISTS before_update_Shop_Access_Level;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Access_Level
BEFORE INSERT ON Shop_Access_Level
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Access_Level
BEFORE UPDATE ON Shop_Access_Level
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Access_Level_Audit (
id_access_level,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed code
SELECT NEW.id_access_level, 'code', OLD.code, NEW.code, NEW.id_change_set
WHERE NOT (OLD.code <=> NEW.code)
UNION
# Changed name
SELECT NEW.id_access_level, 'name', OLD.name, NEW.name, NEW.id_change_set
WHERE NOT (OLD.name <=> NEW.name)
UNION
# Changed priority
SELECT NEW.id_access_level, 'priority', CONVERT(OLD.priority, CHAR), CONVERT(NEW.priority, CHAR), NEW.id_change_set
WHERE NOT (OLD.priority <=> NEW.priority)
UNION
# Changed active
SELECT NEW.id_access_level, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
UNION
# Changed display_order
SELECT NEW.id_access_level, 'display_order', CONVERT(OLD.display_order, CHAR), CONVERT(NEW.display_order, CHAR), NEW.id_change_set
WHERE NOT OLD.display_order <=> NEW.display_order
;
END //
DELIMITER ;;
# Product Change Set
DROP TRIGGER IF EXISTS before_insert_Shop_Product_Change_Set;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Product_Change_Set
BEFORE INSERT ON Shop_Product_Change_Set
FOR EACH ROW
BEGIN
IF NEW.updated_last_on <=> NULL THEN
SET NEW.updated_last_on = NOW();
END IF;
IF NEW.updated_last_by <=> NULL THEN
SET NEW.updated_last_by = CURRENT_USER();
END IF;
END //
DELIMITER ;;
# Shop User Change Set
DROP TRIGGER IF EXISTS before_insert_Shop_User_Change_Set;
DELIMITER //
CREATE TRIGGER before_insert_Shop_User_Change_Set
BEFORE INSERT ON Shop_User_Change_Set
FOR EACH ROW
BEGIN
IF NEW.updated_last_on <=> NULL THEN
SET NEW.updated_last_on = NOW();
END IF;
IF NEW.updated_last_by <=> NULL THEN
SET NEW.updated_last_by = CURRENT_USER();
END IF;
END //
DELIMITER ;;
# Product Change Set
DROP TRIGGER IF EXISTS before_insert_Shop_Sales_And_Purchasing_Change_Set;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Sales_And_Purchasing_Change_Set
BEFORE INSERT ON Shop_Sales_And_Purchasing_Change_Set
FOR EACH ROW
BEGIN
IF NEW.updated_last_on <=> NULL THEN
SET NEW.updated_last_on = NOW();
END IF;
IF NEW.updated_last_by <=> NULL THEN
SET NEW.updated_last_by = CURRENT_USER();
END IF;
END //
DELIMITER ;;
# File Type
DROP TRIGGER IF EXISTS before_insert_File_Type;
DROP TRIGGER IF EXISTS before_update_File_Type;
DELIMITER //
CREATE TRIGGER before_insert_File_Type
BEFORE INSERT ON File_Type
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_File_Type
BEFORE UPDATE ON File_Type
FOR EACH ROW
BEGIN
INSERT INTO File_Type_Audit (
id_type,
name_field,
value_prev,
value_new
)
# Changed code
SELECT NEW.id_type, 'code', OLD.code, NEW.code
WHERE NOT OLD.code <=> NEW.code
UNION
# Changed name
SELECT NEW.id_type, 'name', OLD.name, NEW.name
WHERE NOT OLD.name <=> NEW.name
UNION
# Changed extension
SELECT NEW.id_type, 'extension', CONVERT(OLD.extension, CHAR), CONVERT(NEW.extension, CHAR)
WHERE NOT OLD.extension <=> NEW.extension
;
END //
DELIMITER ;;
# File Type Audits
DROP TRIGGER IF EXISTS before_insert_File_Type_Audit;
DROP TRIGGER IF EXISTS before_update_File_Type_Audit;
DELIMITER //
CREATE TRIGGER before_insert_File_Type_Audit
BEFORE INSERT ON File_Type_Audit
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_File_Type_Audit
BEFORE UPDATE ON File_Type_Audit
FOR EACH ROW
BEGIN
SET NEW.updated_last_on = NOW();
SET NEW.updated_last_by = CURRENT_USER();
END //
DELIMITER ;;
# Shop General
DROP TRIGGER IF EXISTS before_insert_Shop_General;
DROP TRIGGER IF EXISTS before_update_Shop_General;
DELIMITER //
CREATE TRIGGER before_insert_Shop_General
BEFORE INSERT ON Shop_General
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_General
BEFORE UPDATE ON Shop_General
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_General_Audit (
id_general,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed quantity max
SELECT NEW.id_general, 'quantity_max', CONVERT(OLD.quantity_max, CHAR), CONVERT(NEW.quantity_max, CHAR), NEW.id_change_set
WHERE NOT OLD.quantity_max <=> NEW.quantity_max
;
END //
DELIMITER ;;
# Shop Image Type
DROP TRIGGER IF EXISTS before_insert_Shop_Image_Type;
DROP TRIGGER IF EXISTS before_update_Shop_Image_Type;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Image_Type
BEFORE INSERT ON Shop_Image_Type
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Image_Type
BEFORE UPDATE ON Shop_Image_Type
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Image_Type_Audit (
id_type,
name_field,
value_prev,
value_new,
id_change_set
)
/*
# Changed id_type_file
SELECT NEW.id_type, 'id_type_file', OLD.id_type_file, NEW.id_type_file, NEW.id_change_set
WHERE NOT OLD.id_type_file <=> NEW.id_type_file
UNION
*/
# Changed code
SELECT NEW.id_type, 'code', OLD.code, NEW.code, NEW.id_change_set
WHERE NOT OLD.code <=> NEW.code
UNION
# Changed name
SELECT NEW.id_type, 'name', OLD.name, NEW.name, NEW.id_change_set
WHERE NOT OLD.name <=> NEW.name
UNION
# Changed name_plural
SELECT NEW.id_type, 'name_plural', OLD.name_plural, NEW.name_plural, NEW.id_change_set
WHERE NOT OLD.name_plural <=> NEW.name_plural
UNION
# Changed active
SELECT NEW.id_type, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
UNION
# Changed display_order
SELECT NEW.id_type, 'display_order', CONVERT(OLD.display_order, CHAR), CONVERT(NEW.display_order, CHAR), NEW.id_change_set
WHERE NOT (OLD.display_order <=> NEW.display_order)
;
END //
DELIMITER ;;
# Shop Delivery Region
DROP TRIGGER IF EXISTS before_insert_Shop_Region;
DROP TRIGGER IF EXISTS before_update_Shop_Region;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Region
BEFORE INSERT ON Shop_Region
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Region
BEFORE UPDATE ON Shop_Region
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Region_Audit (
id_region,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed code
SELECT NEW.id_region, 'code', OLD.code, NEW.code, NEW.id_change_set
WHERE NOT OLD.code <=> NEW.code
UNION
# Changed name
SELECT NEW.id_region, 'name', OLD.name, NEW.name, NEW.id_change_set
WHERE NOT OLD.name <=> NEW.name
UNION
# Changed active
SELECT NEW.id_region, 'active', CONVERT(OLD.active, CHAR), CONVERT(NEW.active, CHAR), NEW.id_change_set
WHERE NOT OLD.active <=> NEW.active
UNION
# Changed display_order
SELECT NEW.id_region, 'display_order', CONVERT(OLD.display_order, CHAR), CONVERT(NEW.display_order, CHAR), NEW.id_change_set
WHERE NOT OLD.display_order <=> NEW.display_order
;
END //
DELIMITER ;;
# Shop Region Branch
DROP TRIGGER IF EXISTS before_insert_Shop_Region_Branch;
DROP TRIGGER IF EXISTS before_update_Shop_Region_Branch;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Region_Branch
BEFORE INSERT ON Shop_Region_Branch
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Region_Branch
BEFORE UPDATE ON Shop_Region_Branch
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Region_Branch_Audit (
id_branch,
name_field,
value_prev,
value_new,
id_change_set
)
/*
# Changed depth
SELECT NEW.id_branch, 'depth', CONVERT(OLD.depth, CHAR), CONVERT(NEW.depth, CHAR), NEW.id_change_set
WHERE NOT OLD.depth <=> NEW.depth
UNION
*/
# Changed active
SELECT NEW.id_branch, 'active', CONVERT(OLD.active, CHAR), CONVERT(NEW.active, CHAR), NEW.id_change_set
WHERE NOT OLD.active <=> NEW.active
UNION
# Changed display_order
SELECT NEW.id_branch, 'display_order', CONVERT(OLD.display_order, CHAR), CONVERT(NEW.display_order, CHAR), NEW.id_change_set
WHERE NOT OLD.display_order <=> NEW.display_order
;
END //
DELIMITER ;;
# Shop Address
DROP TRIGGER IF EXISTS before_insert_Shop_Address;
DROP TRIGGER IF EXISTS before_update_Shop_Address;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Address
BEFORE INSERT ON Shop_Address
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Address
BEFORE UPDATE ON Shop_Address
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Address_Audit (
id_address,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed region
SELECT NEW.id_address, 'id_region', OLD.id_region, NEW.id_region, NEW.id_change_set
WHERE NOT OLD.id_region <=> NEW.id_region
UNION
# Changed postcode
SELECT NEW.id_address, 'postcode', OLD.postcode, NEW.postcode, NEW.id_change_set
WHERE NOT OLD.postcode <=> NEW.postcode
UNION
# Changed address_line_1
SELECT NEW.id_address, 'address_line_1', OLD.address_line_1, NEW.address_line_1, NEW.id_change_set
WHERE NOT OLD.address_line_1 <=> NEW.address_line_1
UNION
# Changed address_line_2
SELECT NEW.id_address, 'address_line_2', OLD.address_line_2, NEW.address_line_2, NEW.id_change_set
WHERE NOT OLD.address_line_2 <=> NEW.address_line_2
UNION
# Changed city
SELECT NEW.id_address, 'city', OLD.city, NEW.city, NEW.id_change_set
WHERE NOT OLD.city <=> NEW.city
UNION
# Changed county
SELECT NEW.id_address, 'county', OLD.county, NEW.county, NEW.id_change_set
WHERE NOT OLD.county <=> NEW.county
UNION
# Changed active
SELECT NEW.id_address, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
;
END //
DELIMITER ;;
# Shop Storage Location
DROP TRIGGER IF EXISTS before_insert_Shop_Storage_Location;
DROP TRIGGER IF EXISTS before_update_Shop_Storage_Location;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Storage_Location
BEFORE INSERT ON Shop_Storage_Location
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Storage_Location
BEFORE UPDATE ON Shop_Storage_Location
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Storage_Location_Audit (
id_location,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed id_plant
SELECT NEW.id_location, 'id_plant', OLD.id_plant, NEW.id_plant, NEW.id_change_set
WHERE NOT OLD.id_plant <=> NEW.id_plant
UNION
# Changed code
SELECT NEW.id_location, 'code', OLD.code, NEW.code, NEW.id_change_set
WHERE NOT OLD.code <=> NEW.code
UNION
# Changed name
SELECT NEW.id_location, 'name', OLD.name, NEW.name, NEW.id_change_set
WHERE NOT OLD.name <=> NEW.name
UNION
# Changed active
SELECT NEW.id_location, 'active', CONVERT(OLD.active, CHAR), CONVERT(NEW.active, CHAR), NEW.id_change_set
WHERE NOT OLD.active <=> NEW.active
;
END //
DELIMITER ;;
# Shop Currency
DROP TRIGGER IF EXISTS before_insert_Shop_Currency;
DROP TRIGGER IF EXISTS before_update_Shop_Currency;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Currency
BEFORE INSERT ON Shop_Currency
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Currency
BEFORE UPDATE ON Shop_Currency
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Currency_Audit (
id_currency,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed code
SELECT NEW.id_currency, 'code', OLD.code, NEW.code, NEW.id_change_set
WHERE NOT OLD.code <=> NEW.code
UNION
# Changed name
SELECT NEW.id_currency, 'name', OLD.name, NEW.name, NEW.id_change_set
WHERE NOT OLD.name <=> NEW.name
UNION
# Changed symbol
SELECT NEW.id_currency, 'symbol', OLD.symbol, NEW.symbol, NEW.id_change_set
WHERE NOT OLD.symbol <=> NEW.symbol
UNION
# Changed ratio_2_GBP
SELECT NEW.id_currency, 'factor_from_GBP', OLD.factor_from_GBP, NEW.factor_from_GBP, NEW.id_change_set
WHERE NOT OLD.factor_from_GBP <=> NEW.factor_from_GBP
UNION
# Changed active
SELECT NEW.id_currency, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
UNION
# Changed display_order
SELECT NEW.id_currency, 'display_order', CONVERT(display_order, CHAR), CONVERT(display_order, CHAR), NEW.id_change_set
WHERE NOT (OLD.display_order <=> NEW.display_order)
;
END //
DELIMITER ;;
# Shop Tax_Or_Surcharge
DROP TRIGGER IF EXISTS before_insert_Shop_Tax_Or_Surcharge;
DROP TRIGGER IF EXISTS before_update_Shop_Tax_Or_Surcharge;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Tax_Or_Surcharge
BEFORE INSERT ON Shop_Tax_Or_Surcharge
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Tax_Or_Surcharge
BEFORE UPDATE ON Shop_Tax_Or_Surcharge
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Tax_Or_Surcharge_Audit (
id_tax,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed code
SELECT NEW.id_tax, 'code', OLD.code, NEW.code, NEW.id_change_set
WHERE NOT OLD.code <=> NEW.code
UNION
# Changed name
SELECT NEW.id_tax, 'name', OLD.name, NEW.name, NEW.id_change_set
WHERE NOT OLD.name <=> NEW.name
UNION
# Changed fixed_fee
SELECT NEW.id_tax, 'fixed_fee', OLD.fixed_fee, NEW.fixed_fee, NEW.id_change_set
WHERE NOT OLD.fixed_fee <=> NEW.fixed_fee
UNION
# Changed multiplier
SELECT NEW.id_tax, 'multiplier', OLD.multiplier, NEW.multiplier, NEW.id_change_set
WHERE NOT OLD.multiplier <=> NEW.multiplier
UNION
# Changed apply_fixed_fee_before_multiplier
SELECT NEW.id_tax, 'apply_fixed_fee_before_multiplier', CONVERT(CONVERT(OLD.apply_fixed_fee_before_multiplier, SIGNED), CHAR), CONVERT(CONVERT(NEW.apply_fixed_fee_before_multiplier, SIGNED), CHAR), NEW.id_change_set
WHERE NOT OLD.apply_fixed_fee_before_multiplier <=> NEW.apply_fixed_fee_before_multiplier
UNION
# Changed quantity_min
SELECT NEW.id_tax, 'quantity_min', OLD.quantity_min, NEW.quantity_min, NEW.id_change_set
WHERE NOT OLD.quantity_min <=> NEW.quantity_min
UNION
# Changed quantity_max
SELECT NEW.id_tax, 'quantity_max', OLD.quantity_max, NEW.quantity_max, NEW.id_change_set
WHERE NOT OLD.quantity_max <=> NEW.quantity_max
UNION
# Changed display_order
SELECT NEW.id_tax, 'display_order', CONVERT(OLD.display_order, CHAR), CONVERT(NEW.display_order, CHAR), NEW.id_change_set
WHERE NOT OLD.display_order <=> NEW.display_order
UNION
# Changed active
SELECT NEW.id_tax, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT OLD.active <=> NEW.active
;
END //
DELIMITER ;;
# Shop Category
DROP TRIGGER IF EXISTS before_insert_Shop_Product_Category;
DROP TRIGGER IF EXISTS before_update_Shop_Product_Category;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Product_Category
BEFORE INSERT ON Shop_Product_Category
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Product_Category
BEFORE UPDATE ON Shop_Product_Category
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Product_Category_Audit (
id_category,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed code
SELECT NEW.id_category, 'code', OLD.code, NEW.code, NEW.id_change_set
WHERE NOT OLD.code <=> NEW.code
UNION
# Changed name
SELECT NEW.id_category, 'name', OLD.name, NEW.name, NEW.id_change_set
WHERE NOT OLD.name <=> NEW.name
UNION
# Changed description
SELECT NEW.id_category, 'description', OLD.description, NEW.description, NEW.id_change_set
WHERE NOT OLD.description <=> NEW.description
UNION
# Changed active
SELECT NEW.id_category, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
UNION
# Changed display_order
SELECT NEW.id_category, 'display_order', CONVERT(OLD.display_order, CHAR), CONVERT(NEW.display_order, CHAR), NEW.id_change_set
WHERE NOT OLD.display_order <=> NEW.display_order
UNION
# Changed id_access_level_required
SELECT NEW.id_category, 'id_access_level_required', CONVERT(OLD.id_access_level_required, CHAR), CONVERT(NEW.id_access_level_required, CHAR), NEW.id_change_set
WHERE NOT OLD.id_access_level_required <=> NEW.id_access_level_required
;
END //
DELIMITER ;;
# Shop Product
DROP TRIGGER IF EXISTS before_insert_Shop_Product;
DROP TRIGGER IF EXISTS before_update_Shop_Product;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Product
BEFORE INSERT ON Shop_Product
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Product
BEFORE UPDATE ON Shop_Product
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
/*
IF NOT NEW.has_variations THEN
IF ISNULL(NEW.price_GBP_full) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Product must have price or variations (with prices).';
END IF;
IF ISNULL(NEW.price_GBP_min) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Product must have minimum price or variations (with prices).';
END IF;
IF ISNULL(NEW.latency_manuf) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Product must have manufacturing latency or variations (with manufacturing latencies).';
END IF;
IF ISNULL(NEW.quantity_min) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Product must have minimum quantity or variations (with minimum quantities).';
END IF;
IF ISNULL(NEW.quantity_max) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Product must have maximum quantity or variations (with maximum quantities).';
END IF;
IF ISNULL(NEW.quantity_step) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Product must have increment of quantity or variations (with increments of quantities).';
END IF;
IF ISNULL(NEW.quantity_stock) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Product must have stock quantity or variations (with stock quantities).';
END IF;
IF ISNULL(NEW.is_subscription) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Product must have subscription status or variations (with subscription statuses).';
END IF;
IF ISNULL(NEW.id_unit_measurement_interval_recurrence) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Product must have recurrence interval or variations (with recurrence intervals).';
END IF;
IF ISNULL(NEW.count_interval_recurrence) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Product must have recurrence interval count or variations (with recurrence interval counts).';
END IF;
END IF;
*/
INSERT INTO Shop_Product_Audit (
id_product,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed name
SELECT NEW.id_product, 'name', OLD.name, NEW.name, NEW.id_change_set
WHERE NOT OLD.name <=> NEW.name
/*
UNION
# Changed description
SELECT NEW.id_product, 'description', OLD.description, NEW.description, NEW.id_change_set
WHERE NOT OLD.description <=> NEW.description
UNION
# Changed price_GBP_full
SELECT NEW.id_product, 'price_GBP_full', CONVERT(OLD.price_GBP_full, CHAR), CONVERT(NEW.price_GBP_full, CHAR), NEW.id_change_set
WHERE NOT OLD.price_GBP_full <=> NEW.price_GBP_full
UNION
# Changed price_GBP_min
SELECT NEW.id_product, 'price_GBP_min', CONVERT(OLD.price_GBP_min, CHAR), CONVERT(NEW.price_GBP_min, CHAR), NEW.id_change_set
WHERE NOT OLD.price_GBP_min <=> NEW.price_GBP_min
UNION
/*
# Changed discount
SELECT NEW.id_product, 'discount', CONVERT(OLD.discount, CHAR), CONVERT(NEW.discount, CHAR), NEW.id_change_set
WHERE NOT OLD.discount <=> NEW.discount
*/
UNION
# Changed id_category
SELECT NEW.id_product, 'id_category', CONVERT(OLD.id_category, CHAR), CONVERT(NEW.id_category, CHAR), NEW.id_change_set
WHERE NOT OLD.id_category <=> NEW.id_category
UNION
# Changed has_variations
SELECT NEW.id_product, 'has_variations', CONVERT(CONVERT(NEW.has_variations, SIGNED), CHAR), CONVERT(CONVERT(NEW.has_variations, SIGNED), CHAR), NEW.id_change_set
WHERE NOT OLD.has_variations <=> NEW.has_variations
/*
UNION
# Changed latency_manuf
SELECT NEW.id_product, 'latency_manuf', CONVERT(OLD.latency_manuf, CHAR), CONVERT(NEW.latency_manuf, CHAR), NEW.id_change_set
WHERE NOT OLD.latency_manuf <=> NEW.latency_manuf
UNION
# Changed quantity_min
SELECT NEW.id_product, 'quantity_min', CONVERT(OLD.quantity_min, CHAR), CONVERT(NEW.quantity_min, CHAR), NEW.id_change_set
WHERE NOT OLD.quantity_min <=> NEW.quantity_min
UNION
# Changed quantity_max
SELECT NEW.id_product, 'quantity_max', CONVERT(OLD.quantity_max, CHAR), CONVERT(NEW.quantity_max, CHAR), NEW.id_change_set
WHERE NOT OLD.quantity_max <=> NEW.quantity_max
UNION
# Changed quantity_step
SELECT NEW.id_product, 'quantity_step', CONVERT(OLD.quantity_step, CHAR), CONVERT(NEW.quantity_step, CHAR), NEW.id_change_set
WHERE NOT OLD.quantity_step <=> NEW.quantity_step
UNION
# Changed quantity_stock
SELECT NEW.id_product, 'quantity_stock', CONVERT(OLD.quantity_stock, CHAR), CONVERT(NEW.quantity_stock, CHAR), NEW.id_change_set
WHERE NOT OLD.quantity_stock <=> NEW.quantity_stock
UNION
# Changed is_subscription
SELECT NEW.id_product, 'is_subscription', CONVERT(CONVERT(OLD.is_subscription, SIGNED), CHAR), CONVERT(CONVERT(NEW.is_subscription, SIGNED), CHAR), NEW.id_change_set
WHERE NOT OLD.is_subscription <=> NEW.is_subscription
UNION
# Changed id_unit_measurement_interval_recurrence
SELECT NEW.id_product, 'id_unit_measurement_interval_recurrence', CONVERT(OLD.id_unit_measurement_interval_recurrence, CHAR), CONVERT(NEW.id_unit_measurement_interval_recurrence, CHAR), NEW.id_change_set
WHERE NOT OLD.id_unit_measurement_interval_recurrence <=> NEW.id_unit_measurement_interval_recurrence
UNION
# Changed count_interval_recurrence
SELECT NEW.id_product, 'count_interval_recurrence', CONVERT(OLD.count_interval_recurrence, CHAR), CONVERT(NEW.count_interval_recurrence, CHAR), NEW.id_change_set
WHERE NOT OLD.count_interval_recurrence <=> NEW.count_interval_recurrence
UNION
# Changed id_stripe_product
SELECT NEW.id_product, 'id_stripe_product', OLD.id_stripe_product, NEW.id_stripe_product, NEW.id_change_set
WHERE NOT OLD.id_stripe_product <=> NEW.id_stripe_product
/*
UNION
# Changed id_stripe_price
SELECT NEW.id_product, 'id_stripe_price', OLD.id_stripe_price, NEW.id_stripe_price, NEW.id_change_set
WHERE NOT OLD.id_stripe_price <=> NEW.id_stripe_price
*/
UNION
# Changed id_access_level_required
SELECT NEW.id_product, 'id_access_level_required', CONVERT(OLD.id_access_level_required, CHAR), CONVERT(NEW.id_access_level_required, CHAR), NEW.id_change_set
WHERE NOT OLD.id_access_level_required <=> NEW.id_access_level_required
UNION
# Changed active
SELECT NEW.id_product, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
UNION
# Changed display_order
SELECT NEW.id_product, 'display_order', CONVERT(OLD.display_order, CHAR), CONVERT(NEW.display_order, CHAR), NEW.id_change_set
WHERE NOT OLD.display_order <=> NEW.display_order
;
END //
DELIMITER ;;
# Shop Product Permutation
DROP TRIGGER IF EXISTS before_insert_Shop_Product_Permutation;
DROP TRIGGER IF EXISTS before_update_Shop_Product_Permutation;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Product_Permutation
BEFORE INSERT ON Shop_Product_Permutation
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Product_Permutation
BEFORE UPDATE ON Shop_Product_Permutation
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
IF (NOT (
NEW.id_unit_measurement_interval_recurrence IS NULL
OR NEW.id_unit_measurement_interval_recurrence NOT IN (SELECT id_unit_measurement FROM Shop_Unit_Measurement WHERE is_unit_of_time = 1)
)) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Recurrence interval ID must be a unit of time.';
END IF;
IF (NOT (
NEW.id_unit_measurement_interval_expiration_unsealed IS NULL
OR NEW.id_unit_measurement_interval_expiration_unsealed NOT IN (SELECT id_unit_measurement FROM Shop_Unit_Measurement WHERE is_unit_of_time = 1)
)) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Unsealed expiration interval ID must be a unit of time.';
END IF;
INSERT INTO Shop_Product_Permutation_Audit (
id_permutation,
name_field,
value_prev,
value_new,
id_change_set
)
/*
# Changed id_product
SELECT NEW.id_permutation, 'id_product', OLD.id_product, NEW.id_product, NEW.id_change_set
WHERE NOT OLD.id_product <=> NEW.id_product
UNION
# Changed id_variation
SELECT NEW.id_permutation, 'id_variation', OLD.id_variation, NEW.id_variation, NEW.id_change_set
WHERE NOT OLD.id_variation <=> NEW.id_variation
UNION
# Changed name
SELECT NEW.id_permutation, 'name', OLD.name, NEW.name, NEW.id_change_set
WHERE NOT (OLD.name <=> NEW.name)
UNION
*/
# Changed description
SELECT NEW.id_permutation, 'description', OLD.description, NEW.description, NEW.id_change_set
WHERE NOT (OLD.description <=> NEW.description)
UNION
# Changed cost_local_VAT_excl
SELECT NEW.id_permutation, 'cost_local_VAT_excl', CONVERT(OLD.cost_local_VAT_excl, CHAR), CONVERT(NEW.cost_local_VAT_excl, CHAR), NEW.id_change_set
WHERE NOT (OLD.cost_local_VAT_excl <=> NEW.cost_local_VAT_excl)
UNION
# Changed cost_local_VAT_incl
SELECT NEW.id_permutation, 'cost_local_VAT_incl', CONVERT(OLD.cost_local_VAT_incl, CHAR), CONVERT(NEW.cost_local_VAT_incl, CHAR), NEW.id_change_set
WHERE NOT (OLD.cost_local_VAT_incl <=> NEW.cost_local_VAT_incl)
UNION
# Changed id_currency_cost
SELECT NEW.id_permutation, 'id_currency_cost', CONVERT(OLD.id_currency_cost, CHAR), CONVERT(NEW.id_currency_cost, CHAR), NEW.id_change_set
WHERE NOT (OLD.id_currency_cost <=> NEW.id_currency_cost)
UNION
/*
# Changed profit_local_min
SELECT NEW.id_permutation, 'profit_local_min', CONVERT(OLD.profit_local_min, CHAR), CONVERT(NEW.profit_local_min, CHAR), NEW.id_change_set
WHERE NOT (OLD.profit_local_min <=> NEW.profit_local_min)
UNION
# Changed id_currency_profit_min
SELECT NEW.id_permutation, 'id_currency_profit_min', CONVERT(OLD.id_currency_profit_min, CHAR), CONVERT(NEW.id_currency_profit_min, CHAR), NEW.id_change_set
WHERE NOT (OLD.id_currency_profit_min <=> NEW.id_currency_profit_min)
UNION
*/
/*
# Changed price_GBP_min
SELECT NEW.id_permutation, 'price_GBP_min', CONVERT(OLD.price_GBP_min, CHAR), CONVERT(NEW.price_GBP_min, CHAR), NEW.id_change_set
WHERE NOT (OLD.price_GBP_min <=> NEW.price_GBP_min)
UNION
*/
# Changed latency_manufacture
SELECT NEW.id_permutation, 'latency_manufacture', CONVERT(OLD.latency_manufacture, CHAR), CONVERT(NEW.latency_manufacture, CHAR), NEW.id_change_set
WHERE NOT OLD.latency_manufacture <=> NEW.latency_manufacture
UNION
# Changed id_unit_measurement_quantity
SELECT NEW.id_permutation, 'id_unit_measurement_quantity', CONVERT(OLD.id_unit_measurement_quantity, CHAR), CONVERT(NEW.id_unit_measurement_quantity, CHAR), NEW.id_change_set
WHERE NOT OLD.id_unit_measurement_quantity <=> NEW.id_unit_measurement_quantity
UNION
# Changed count_unit_measurement_per_quantity_step
SELECT NEW.id_permutation, 'count_unit_measurement_per_quantity_step', CONVERT(OLD.count_unit_measurement_per_quantity_step, CHAR), CONVERT(NEW.count_unit_measurement_per_quantity_step, CHAR), NEW.id_change_set
WHERE NOT OLD.count_unit_measurement_per_quantity_step <=> NEW.count_unit_measurement_per_quantity_step
UNION
# Changed quantity_min
SELECT NEW.id_permutation, 'quantity_min', CONVERT(OLD.quantity_min, CHAR), CONVERT(NEW.quantity_min, CHAR), NEW.id_change_set
WHERE NOT OLD.quantity_min <=> NEW.quantity_min
UNION
# Changed quantity_max
SELECT NEW.id_permutation, 'quantity_max', CONVERT(OLD.quantity_max, CHAR), CONVERT(NEW.quantity_max, CHAR), NEW.id_change_set
WHERE NOT OLD.quantity_max <=> NEW.quantity_max
UNION
# Changed quantity_stock
SELECT NEW.id_permutation, 'quantity_stock', CONVERT(OLD.quantity_stock, CHAR), CONVERT(NEW.quantity_stock, CHAR), NEW.id_change_set
WHERE NOT OLD.quantity_stock <=> NEW.quantity_stock
UNION
# Changed is_subscription
SELECT NEW.id_permutation, 'is_subscription', CONVERT(CONVERT(OLD.is_subscription, SIGNED), CHAR), CONVERT(CONVERT(NEW.is_subscription, SIGNED), CHAR), NEW.id_change_set
WHERE NOT OLD.is_subscription <=> NEW.is_subscription
UNION
# Changed id_unit_measurement_interval_recurrence
SELECT NEW.id_permutation, 'id_unit_measurement_interval_recurrence', CONVERT(OLD.id_unit_measurement_interval_recurrence, CHAR), CONVERT(NEW.id_unit_measurement_interval_recurrence, CHAR), NEW.id_change_set
WHERE NOT OLD.id_unit_measurement_interval_recurrence <=> NEW.id_unit_measurement_interval_recurrence
UNION
# Changed count_interval_recurrence
SELECT NEW.id_permutation, 'count_interval_recurrence', CONVERT(OLD.count_interval_recurrence, CHAR), CONVERT(NEW.count_interval_recurrence, CHAR), NEW.id_change_set
WHERE NOT OLD.count_interval_recurrence <=> NEW.count_interval_recurrence
UNION
# Changed id_stripe_product
SELECT NEW.id_permutation, 'id_stripe_product', OLD.id_stripe_product, NEW.id_stripe_product, NEW.id_change_set
WHERE NOT (OLD.id_stripe_product <=> NEW.id_stripe_product)
UNION
# Changed does_expire_faster_once_unsealed
SELECT NEW.id_permutation, 'does_expire_faster_once_unsealed', CONVERT(OLD.does_expire_faster_once_unsealed, CHAR), CONVERT(NEW.does_expire_faster_once_unsealed, CHAR), NEW.id_change_set
WHERE NOT OLD.does_expire_faster_once_unsealed <=> NEW.does_expire_faster_once_unsealed
UNION
# Changed id_unit_measurement_interval_expiration_unsealed
SELECT NEW.id_permutation, 'id_unit_measurement_interval_expiration_unsealed', CONVERT(OLD.id_unit_measurement_interval_expiration_unsealed, CHAR), CONVERT(NEW.id_unit_measurement_interval_expiration_unsealed, CHAR), NEW.id_change_set
WHERE NOT OLD.id_unit_measurement_interval_expiration_unsealed <=> NEW.id_unit_measurement_interval_expiration_unsealed
UNION
# Changed count_interval_expiration_unsealed
SELECT NEW.id_permutation, 'count_interval_expiration_unsealed', CONVERT(OLD.count_interval_expiration_unsealed, CHAR), CONVERT(NEW.count_interval_expiration_unsealed, CHAR), NEW.id_change_set
WHERE NOT OLD.count_interval_expiration_unsealed <=> NEW.count_interval_expiration_unsealed
UNION
# Changed active
SELECT NEW.id_permutation, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
/*
UNION
# Changed display_order
SELECT NEW.id_permutation, 'display_order', CONVERT(OLD.display_order, CHAR), CONVERT(NEW.display_order, CHAR), NEW.id_change_set
WHERE NOT (OLD.display_order <=> NEW.display_order)
*/
;
END //
DELIMITER ;;
# Shop Variation Type
DROP TRIGGER IF EXISTS before_insert_Shop_Variation_Type;
DROP TRIGGER IF EXISTS before_update_Shop_Variation_Type;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Variation_Type
BEFORE INSERT ON Shop_Variation_Type
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Variation_Type
BEFORE UPDATE ON Shop_Variation_Type
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Variation_Type_Audit (
id_type,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed code
SELECT NEW.id_type, 'code', OLD.code, NEW.code, NEW.id_change_set
WHERE NOT OLD.code <=> NEW.code
UNION
# Changed name
SELECT NEW.id_type, 'name', OLD.name, NEW.name, NEW.id_change_set
WHERE NOT OLD.name <=> NEW.name
UNION
# Changed name_plural
SELECT NEW.id_type, 'name_plural', OLD.name_plural, NEW.name_plural, NEW.id_change_set
WHERE NOT OLD.name_plural <=> NEW.name_plural
UNION
# Changed active
SELECT NEW.id_type, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
UNION
# Changed display_order
SELECT NEW.id_type, 'display_order', CONVERT(OLD.display_order, CHAR), CONVERT(NEW.display_order, CHAR), NEW.id_change_set
WHERE NOT (OLD.display_order <=> NEW.display_order)
;
END //
DELIMITER ;;
# Shop Variation
DROP TRIGGER IF EXISTS before_insert_Shop_Variation;
DROP TRIGGER IF EXISTS before_update_Shop_Variation;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Variation
BEFORE INSERT ON Shop_Variation
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Variation
BEFORE UPDATE ON Shop_Variation
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Variation_Audit (
id_variation,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed id_unit_measurement
SELECT NEW.id_variation, 'id_unit_measurement', OLD.id_unit_measurement, NEW.id_unit_measurement, NEW.id_change_set
WHERE NOT OLD.id_unit_measurement <=> NEW.id_unit_measurement
UNION
# Changed count_unit_measurement
SELECT NEW.id_variation, 'count_unit_measurement', OLD.count_unit_measurement, NEW.count_unit_measurement, NEW.id_change_set
WHERE NOT OLD.count_unit_measurement <=> NEW.count_unit_measurement
UNION
# Changed code
SELECT NEW.id_variation, 'code', OLD.code, NEW.code, NEW.id_change_set
WHERE NOT OLD.code <=> NEW.code
UNION
# Changed name
SELECT NEW.id_variation, 'name', OLD.name, NEW.name, NEW.id_change_set
WHERE NOT OLD.name <=> NEW.name
UNION
# Changed active
SELECT NEW.id_variation, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
UNION
# Changed display_order
SELECT NEW.id_variation, 'display_order', CONVERT(OLD.display_order, CHAR), CONVERT(NEW.display_order, CHAR), NEW.id_change_set
WHERE NOT (OLD.display_order <=> NEW.display_order)
;
END //
DELIMITER ;;
# Shop Product Permutation Variation Link
DROP TRIGGER IF EXISTS before_insert_Shop_Product_Permutation_Variation_Link;
DROP TRIGGER IF EXISTS before_update_Shop_Product_Permutation_Variation_Link;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Product_Permutation_Variation_Link
BEFORE INSERT ON Shop_Product_Permutation_Variation_Link
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Product_Permutation_Variation_Link
BEFORE UPDATE ON Shop_Product_Permutation_Variation_Link
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Product_Permutation_Variation_Link_Audit (
id_link,
name_field,
value_prev,
value_new,
id_change_set
)
/*
# Changed id_product
SELECT NEW.id_link, 'id_product', OLD.id_product, NEW.id_product, NEW.id_change_set
WHERE NOT OLD.id_product <=> NEW.id_product
UNION
# Changed id_variation
SELECT NEW.id_link, 'id_variation', OLD.id_variation, NEW.id_variation, NEW.id_change_set
WHERE NOT OLD.id_variation <=> NEW.id_variation
UNION
*/
# Changed active
SELECT NEW.id_link, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
UNION
# Changed display_order
SELECT NEW.id_link, 'display_order', CONVERT(OLD.display_order, CHAR), CONVERT(NEW.display_order, CHAR), NEW.id_change_set
WHERE NOT (OLD.display_order <=> NEW.display_order)
;
END //
DELIMITER ;;
# Shop Product Permutation
DROP TRIGGER IF EXISTS before_insert_Shop_Stock_Item;
DROP TRIGGER IF EXISTS before_update_Shop_Stock_Item;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Stock_Item
BEFORE INSERT ON Shop_Stock_Item
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Stock_Item
BEFORE UPDATE ON Shop_Stock_Item
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Stock_Item_Audit (
id_stock,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed id_permutation
SELECT NEW.id_stock, 'id_permutation', OLD.id_permutation, NEW.id_permutation, NEW.id_change_set
WHERE NOT (OLD.id_permutation <=> NEW.id_permutation)
UNION
# Changed date_purchased
SELECT NEW.id_stock, 'date_purchased', OLD.date_purchased, NEW.date_purchased, NEW.id_change_set
WHERE NOT (OLD.date_purchased <=> NEW.date_purchased)
UNION
# Changed date_received
SELECT NEW.id_stock, 'date_received', OLD.date_received, NEW.date_received, NEW.id_change_set
WHERE NOT (OLD.date_received <=> NEW.date_received)
UNION
# Changed id_location_storage
SELECT NEW.id_stock, 'id_location_storage', OLD.id_location_storage, NEW.id_location_storage, NEW.id_change_set
WHERE NOT (OLD.id_location_storage <=> NEW.id_location_storage)
UNION
# Changed id_currency_cost
SELECT NEW.id_stock, 'id_currency_cost', OLD.id_currency_cost, NEW.id_currency_cost, NEW.id_change_set
WHERE NOT (OLD.id_currency_cost <=> NEW.id_currency_cost)
UNION
# Changed cost_local_VAT_incl
SELECT NEW.id_stock, 'cost_local_VAT_incl', OLD.cost_local_VAT_incl, NEW.cost_local_VAT_incl, NEW.id_change_set
WHERE NOT (OLD.cost_local_VAT_incl <=> NEW.cost_local_VAT_incl)
UNION
# Changed cost_local_VAT_excl
SELECT NEW.id_stock, 'cost_local_VAT_excl', OLD.cost_local_VAT_excl, NEW.cost_local_VAT_excl, NEW.id_change_set
WHERE NOT (OLD.cost_local_VAT_excl <=> NEW.cost_local_VAT_excl)
UNION
# Changed is_sealed
SELECT NEW.id_stock, 'is_sealed', OLD.is_sealed, NEW.is_sealed, NEW.id_change_set
WHERE NOT (OLD.is_sealed <=> NEW.is_sealed)
UNION
# Changed date_unsealed
SELECT NEW.id_stock, 'date_unsealed', OLD.date_unsealed, NEW.date_unsealed, NEW.id_change_set
WHERE NOT (OLD.date_unsealed <=> NEW.date_unsealed)
UNION
# Changed date_expiration
SELECT NEW.id_stock, 'date_expiration', OLD.date_expiration, NEW.date_expiration, NEW.id_change_set
WHERE NOT (OLD.date_expiration <=> NEW.date_expiration)
UNION
# Changed is_consumed
SELECT NEW.id_stock, 'is_consumed', OLD.is_consumed, NEW.is_consumed, NEW.id_change_set
WHERE NOT (OLD.is_consumed <=> NEW.is_consumed)
UNION
# Changed date_consumed
SELECT NEW.id_stock, 'date_consumed', OLD.date_consumed, NEW.date_consumed, NEW.id_change_set
WHERE NOT (OLD.date_consumed <=> NEW.date_consumed)
UNION
# Changed active
SELECT NEW.id_stock, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
;
END //
DELIMITER ;;
# Shop Product Currency Link
DROP TRIGGER IF EXISTS before_insert_Shop_Product_Price;
DROP TRIGGER IF EXISTS before_update_Shop_Product_Price;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Product_Price
BEFORE INSERT ON Shop_Product_Price
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
/*
SET NEW.price_local = (
SELECT PP.price_GBP_full * C.factor_from_GBP
FROM Shop_Product_Permutation PP
INNER JOIN Shop_Product P ON PP.id_product = P.id_product
INNER JOIN Shop_Currency C ON NEW.id_currency = C.id_currency
WHERE NEW.id_product = P.id_product
LIMIT 1
);
*/
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Product_Price
BEFORE UPDATE ON Shop_Product_Price
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
/*
SET NEW.price_local = (
SELECT P.price_GBP_full * C.factor_from_GBP
FROM Shop_Product P
INNER JOIN Shop_Currency C ON NEW.id_currency = C.id_currency
WHERE NEW.id_product = P.id_product
LIMIT 1
);
*/
INSERT INTO Shop_Product_Price_Audit (
id_price,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed id_permutation
SELECT NEW.id_price, 'id_permutation', CONVERT(OLD.id_permutation, CHAR), CONVERT(NEW.id_permutation, CHAR), NEW.id_change_set
WHERE NOT OLD.id_permutation <=> NEW.id_permutation
UNION
# Changed id_currency
SELECT NEW.id_price, 'id_currency', CONVERT(OLD.id_currency, CHAR), CONVERT(NEW.id_currency, CHAR), NEW.id_change_set
WHERE NOT OLD.id_currency <=> NEW.id_currency
UNION
# Changed id_region_purchase
SELECT NEW.id_price, 'id_region_purchase', CONVERT(OLD.id_region_purchase, CHAR), CONVERT(NEW.id_region_purchase, CHAR), NEW.id_change_set
WHERE NOT OLD.id_region_purchase <=> NEW.id_region_purchase
UNION
# Changed price_local_VAT_incl
SELECT NEW.id_price, 'price_local_VAT_incl', OLD.price_local_VAT_incl, NEW.price_local_VAT_incl, NEW.id_change_set
WHERE NOT OLD.price_local_VAT_incl <=> NEW.price_local_VAT_incl
UNION
# Changed price_local_VAT_excl
SELECT NEW.id_price, 'price_local_VAT_excl', OLD.price_local_VAT_excl, NEW.price_local_VAT_excl, NEW.id_change_set
WHERE NOT OLD.price_local_VAT_excl <=> NEW.price_local_VAT_excl
UNION
# Changed id_stripe_price
SELECT NEW.id_price, 'id_stripe_price', OLD.id_stripe_price, NEW.id_stripe_price, NEW.id_change_set
WHERE NOT OLD.id_stripe_price <=> NEW.id_stripe_price
UNION
# Changed active
SELECT NEW.id_price, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
;
END //
DELIMITER ;;
# Shop Image
DROP TRIGGER IF EXISTS before_insert_Shop_Product_Image;
DROP TRIGGER IF EXISTS before_update_Shop_Product_Image;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Product_Image
BEFORE INSERT ON Shop_Product_Image
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Product_Image
BEFORE UPDATE ON Shop_Product_Image
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change set ID must be provided.';
END IF;
IF ISNULL(NEW.id_permutation) THEN -- ISNULL(NEW.id_product) AND
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Image must NOT have ID for product AND product permutation.';
END IF;
INSERT INTO Shop_Product_Image_Audit (
id_image,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed id_type_image
SELECT NEW.id_image, 'id_type_image', CONVERT(OLD.id_type_image, CHAR), CONVERT(NEW.id_type_image, CHAR), NEW.id_change_set
WHERE NOT OLD.id_type_image <=> NEW.id_type_image
UNION
/*
# Changed id_type_file
SELECT NEW.id_image, 'id_type_file', CONVERT(OLD.id_type_file, CHAR), CONVERT(NEW.id_type_file, CHAR), NEW.id_change_set
WHERE NOT OLD.id_type_file <=> NEW.id_type_file
UNION
# Changed id_product
SELECT NEW.id_image, 'id_product', CONVERT(OLD.id_product, CHAR), CONVERT(NEW.id_product, CHAR), NEW.id_change_set
WHERE NOT OLD.id_product <=> NEW.id_product
UNION
*/
# Changed id_permutation
SELECT NEW.id_image, 'id_permutation', CONVERT(OLD.id_permutation, CHAR), CONVERT(NEW.id_permutation, CHAR), NEW.id_change_set
WHERE NOT OLD.id_permutation <=> NEW.id_permutation
UNION
# Changed url
SELECT NEW.id_image, 'url', OLD.url, NEW.url, NEW.id_change_set
WHERE NOT OLD.url <=> NEW.url
UNION
# Changed active
SELECT NEW.id_image, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
UNION
# Changed display_order
SELECT NEW.id_image, 'display_order', CONVERT(OLD.display_order, CHAR), CONVERT(NEW.display_order, CHAR), NEW.id_change_set
WHERE NOT (OLD.display_order <=> NEW.display_order)
;
END //
DELIMITER ;;
# Shop Delivery Option Type
DROP TRIGGER IF EXISTS before_insert_Shop_Delivery_Option;
DROP TRIGGER IF EXISTS before_update_Shop_Delivery_Option;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Delivery_Option
BEFORE INSERT ON Shop_Delivery_Option
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Delivery_Option
BEFORE UPDATE ON Shop_Delivery_Option
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Delivery_Option_Audit (
id_option,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed code
SELECT NEW.id_option, 'code', OLD.code, NEW.code, NEW.id_change_set
WHERE NOT OLD.code <=> NEW.code
UNION
# Changed name
SELECT NEW.id_option, 'name', OLD.name, NEW.name, NEW.id_change_set
WHERE NOT OLD.name <=> NEW.name
UNION
# Changed latency_delivery_min
SELECT NEW.id_option, 'latency_delivery_min', CONVERT(OLD.latency_delivery_min, CHAR), CONVERT(NEW.latency_delivery_min, CHAR), NEW.id_change_set
WHERE NOT OLD.latency_delivery_min <=> NEW.latency_delivery_min
UNION
# Changed latency_delivery_max
SELECT NEW.id_option, 'latency_delivery_max', CONVERT(OLD.latency_delivery_max, CHAR), CONVERT(NEW.latency_delivery_max, CHAR), NEW.id_change_set
WHERE NOT OLD.latency_delivery_max <=> NEW.latency_delivery_max
/*
UNION
# Changed quantity_min
SELECT NEW.id_option, 'quantity_min', CONVERT(OLD.quantity_min, CHAR), CONVERT(NEW.quantity_min, CHAR), NEW.id_change_set
WHERE NOT OLD.quantity_min <=> NEW.quantity_min
UNION
# Changed quantity_max
SELECT NEW.id_option, 'quantity_max', CONVERT(OLD.quantity_max, CHAR), CONVERT(NEW.quantity_max, CHAR), NEW.id_change_set
WHERE NOT OLD.quantity_max <=> NEW.quantity_max
*/
UNION
# Changed active
SELECT NEW.id_option, 'active', CONVERT(OLD.active, CHAR), CONVERT(NEW.active, CHAR), NEW.id_change_set
WHERE NOT OLD.active <=> NEW.active
UNION
# Changed display_order
SELECT NEW.id_option, 'display_order', CONVERT(OLD.display_order, CHAR), CONVERT(NEW.display_order, CHAR), NEW.id_change_set
WHERE NOT OLD.display_order <=> NEW.display_order
;
END //
DELIMITER ;;
# Shop Product Delivery Option Link
DROP TRIGGER IF EXISTS before_insert_Shop_Product_Permutation_Delivery_Option_Link;
DROP TRIGGER IF EXISTS before_update_Shop_Product_Permutation_Delivery_Option_Link;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Product_Permutation_Delivery_Option_Link
BEFORE INSERT ON Shop_Product_Permutation_Delivery_Option_Link
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Product_Permutation_Delivery_Option_Link
BEFORE UPDATE ON Shop_Product_Permutation_Delivery_Option_Link
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Product_Permutation_Delivery_Option_Link_Audit (
id_link,
name_field,
value_prev,
value_new,
id_change_set
)
/*
# Changed id_product
SELECT NEW.id_link, 'id_product', CONVERT(OLD.id_product, CHAR), CONVERT(NEW.id_product, CHAR), NEW.id_change_set
WHERE NOT OLD.id_product <=> NEW.id_product
UNION
# Changed id_permutation
SELECT NEW.id_link, 'id_permutation', CONVERT(OLD.id_permutation, CHAR), CONVERT(NEW.id_permutation, CHAR), NEW.id_change_set
WHERE NOT OLD.id_permutation <=> NEW.id_permutation
UNION
# Changed id_option
SELECT NEW.id_link, 'id_option', CONVERT(OLD.id_option, CHAR), CONVERT(NEW.id_option, CHAR), NEW.id_change_set
WHERE NOT OLD.id_option <=> NEW.id_option
UNION
# Changed id_region
SELECT NEW.id_link, 'id_region', CONVERT(OLD.id_region, CHAR), CONVERT(NEW.id_region, CHAR), NEW.id_change_set
WHERE NOT OLD.id_region <=> NEW.id_region
UNION
*/
# Changed price_local
SELECT NEW.id_link, 'price_local', CONVERT(OLD.price_local, CHAR), CONVERT(NEW.price_local, CHAR), NEW.id_change_set
WHERE NOT OLD.price_local <=> NEW.price_local
/*
UNION
# Changed quantity_min
SELECT NEW.id_link, 'quantity_min', CONVERT(OLD.quantity_min, CHAR), CONVERT(NEW.quantity_min, CHAR), NEW.id_change_set
WHERE NOT OLD.quantity_min <=> NEW.quantity_min
UNION
# Changed quantity_max
SELECT NEW.id_link, 'quantity_max', CONVERT(OLD.quantity_max, CHAR), CONVERT(NEW.quantity_max, CHAR), NEW.id_change_set
WHERE NOT OLD.quantity_max <=> NEW.quantity_max
*/
UNION
# Changed active
SELECT NEW.id_link, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
UNION
# Changed display_order
SELECT NEW.id_link, 'display_order', CONVERT(OLD.display_order, CHAR), CONVERT(NEW.display_order, CHAR), NEW.id_change_set
WHERE NOT (OLD.display_order <=> NEW.display_order)
;
END //
DELIMITER ;;
# Shop Discount
DROP TRIGGER IF EXISTS before_insert_Shop_Discount;
DROP TRIGGER IF EXISTS before_update_Shop_Discount;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Discount
BEFORE INSERT ON Shop_Discount
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Discount
BEFORE UPDATE ON Shop_Discount
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Discount_Audit (
id_discount,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed code
SELECT NEW.id_discount, 'code', OLD.code, NEW.code, NEW.id_change_set
WHERE NOT OLD.code <=> NEW.code
UNION
# Changed name
SELECT NEW.id_discount, 'name', OLD.name, NEW.name, NEW.id_change_set
WHERE NOT OLD.name <=> NEW.name
UNION
# Changed multiplier
SELECT NEW.id_discount, 'multiplier', OLD.multiplier, NEW.multiplier, NEW.id_change_set
WHERE NOT OLD.multiplier <=> NEW.multiplier
UNION
# Changed subtractor
SELECT NEW.id_discount, 'subtractor', OLD.subtractor, NEW.subtractor, NEW.id_change_set
WHERE NOT OLD.subtractor <=> NEW.subtractor
UNION
# Changed apply_multiplier_first
SELECT NEW.id_discount, 'apply_multiplier_first', CONVERT(CONVERT(OLD.apply_multiplier_first, SIGNED), CHAR), CONVERT(CONVERT(NEW.apply_multiplier_first, SIGNED), CHAR), NEW.id_change_set
WHERE NOT OLD.apply_multiplier_first <=> NEW.apply_multiplier_first
UNION
# Changed quantity_min
SELECT NEW.id_discount, 'quantity_min', OLD.quantity_min, NEW.quantity_min, NEW.id_change_set
WHERE NOT OLD.quantity_min <=> NEW.quantity_min
UNION
# Changed quantity_max
SELECT NEW.id_discount, 'quantity_max', OLD.quantity_max, NEW.quantity_max, NEW.id_change_set
WHERE NOT OLD.quantity_max <=> NEW.quantity_max
UNION
# Changed date_start
SELECT NEW.id_discount, 'date_start', OLD.date_start, NEW.date_start, NEW.id_change_set
WHERE NOT OLD.date_start <=> NEW.date_start
UNION
# Changed date_end
SELECT NEW.id_discount, 'date_end', OLD.date_end, NEW.date_end, NEW.id_change_set
WHERE NOT OLD.date_end <=> NEW.date_end
UNION
# Changed display_order
SELECT NEW.id_discount, 'display_order', CONVERT(OLD.display_order, CHAR), CONVERT(NEW.display_order, CHAR), NEW.id_change_set
WHERE NOT OLD.display_order <=> NEW.display_order
UNION
# Changed active
SELECT NEW.id_discount, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT OLD.active <=> NEW.active
;
END //
DELIMITER ;;
# Shop Discount Region Currency Link
DROP TRIGGER IF EXISTS before_insert_Shop_Discount_Region_Currency_Link;
DROP TRIGGER IF EXISTS before_update_Shop_Discount_Region_Currency_Link;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Discount_Region_Currency_Link
BEFORE INSERT ON Shop_Discount_Region_Currency_Link
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Discount_Region_Currency_Link
BEFORE UPDATE ON Shop_Discount_Region_Currency_Link
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Discount_Region_Currency_Link_Audit (
id_link,
name_field,
value_prev,
value_new,
id_change_set
)
/*
# Changed id_discount
SELECT NEW.id_link, 'id_discount', CONVERT(OLD.id_discount, CHAR), CONVERT(NEW.id_discount, CHAR), NEW.id_change_set
WHERE NOT OLD.id_discount <=> NEW.id_discount
UNION
# Changed id_region
SELECT NEW.id_link, 'id_region', CONVERT(OLD.id_region, CHAR), CONVERT(NEW.id_region, CHAR), NEW.id_change_set
WHERE NOT OLD.id_region <=> NEW.id_region
UNION
*/
# Changed active
SELECT NEW.id_link, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
;
END //
DELIMITER ;;
# Shop Permission Group
DROP TRIGGER IF EXISTS before_insert_Shop_Permission_Group;
DROP TRIGGER IF EXISTS before_update_Shop_Permission_Group;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Permission_Group
BEFORE INSERT ON Shop_Permission_Group
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Permission_Group
BEFORE UPDATE ON Shop_Permission_Group
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Permission_Group_Audit (
id_group,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed code
SELECT NEW.id_group, 'code', OLD.code, NEW.code, NEW.id_change_set
WHERE NOT OLD.code <=> NEW.code
UNION
# Changed name
SELECT NEW.id_group, 'name', OLD.name, NEW.name, NEW.id_change_set
WHERE NOT OLD.name <=> NEW.name
UNION
# Changed active
SELECT NEW.id_group, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
UNION
# Changed display_order
SELECT NEW.id_group, 'display_order', CONVERT(OLD.display_order, CHAR), CONVERT(NEW.display_order, CHAR), NEW.id_change_set
WHERE NOT OLD.display_order <=> NEW.display_order
;
END //
DELIMITER ;;
# Shop Permission
DROP TRIGGER IF EXISTS before_insert_Shop_Permission;
DROP TRIGGER IF EXISTS before_update_Shop_Permission;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Permission
BEFORE INSERT ON Shop_Permission
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Permission
BEFORE UPDATE ON Shop_Permission
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Permission_Audit (
id_permission,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed code
SELECT NEW.id_permission, 'code', OLD.code, NEW.code, NEW.id_change_set
WHERE NOT OLD.code <=> NEW.code
UNION
# Changed name
SELECT NEW.id_permission, 'name', OLD.name, NEW.name, NEW.id_change_set
WHERE NOT OLD.name <=> NEW.name
UNION
# Changed id_permission_group
SELECT NEW.id_permission, 'id_permission_group', CONVERT(OLD.id_permission_group, CHAR), CONVERT(NEW.id_permission_group, CHAR), NEW.id_change_set
WHERE NOT OLD.id_permission_group <=> NEW.id_permission_group
UNION
# Changed Id_access_level_required
SELECT NEW.id_permission, 'Id_access_level_required', CONVERT(OLD.Id_access_level_required, CHAR), CONVERT(NEW.Id_access_level_required, CHAR), NEW.id_change_set
WHERE NOT OLD.Id_access_level_required <=> NEW.Id_access_level_required
UNION
# Changed active
SELECT NEW.id_permission, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
UNION
# Changed display_order
SELECT NEW.id_permission, 'display_order', CONVERT(OLD.display_order, CHAR), CONVERT(NEW.display_order, CHAR), NEW.id_change_set
WHERE NOT OLD.display_order <=> NEW.display_order
;
END //
DELIMITER ;;
# Shop Role
DROP TRIGGER IF EXISTS before_insert_Shop_Role;
DROP TRIGGER IF EXISTS before_update_Shop_Role;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Role
BEFORE INSERT ON Shop_Role
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Role
BEFORE UPDATE ON Shop_Role
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Role_Audit (
id_role,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed code
SELECT NEW.id_role, 'code', OLD.code, NEW.code, NEW.id_change_set
WHERE NOT OLD.code <=> NEW.code
UNION
# Changed name
SELECT NEW.id_role, 'name', OLD.name, NEW.name, NEW.id_change_set
WHERE NOT OLD.name <=> NEW.name
UNION
# Changed active
SELECT NEW.id_role, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
UNION
# Changed display_order
SELECT NEW.id_role, 'display_order', CONVERT(OLD.display_order, CHAR), CONVERT(NEW.display_order, CHAR), NEW.id_change_set
WHERE NOT OLD.display_order <=> NEW.display_order
;
END //
DELIMITER ;;
# Shop Role Permission Link
DROP TRIGGER IF EXISTS before_insert_Shop_Role_Permission_Link;
DROP TRIGGER IF EXISTS before_update_Shop_Role_Permission_Link;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Role_Permission_Link
BEFORE INSERT ON Shop_Role_Permission_Link
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Role_Permission_Link
BEFORE UPDATE ON Shop_Role_Permission_Link
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Role_Permission_Link_Audit (
id_link,
name_field,
value_prev,
value_new,
id_change_set
)
/*
# Changed id_role
SELECT NEW.id_link, 'id_role', CONVERT(OLD.id_role, CHAR), CONVERT(NEW.id_role, CHAR), NEW.id_change_set
WHERE NOT OLD.id_role <=> NEW.id_role
UNION
# Changed id_permission
SELECT NEW.id_link, 'id_permission', CONVERT(OLD.id_permission, CHAR), CONVERT(NEW.id_permission, CHAR), NEW.id_change_set
WHERE NOT OLD.id_permission <=> NEW.id_permission
UNION
*/
# Changed id_access_level
SELECT NEW.id_link, 'id_access_level', CONVERT(OLD.id_access_level, CHAR), CONVERT(NEW.id_access_level, CHAR), NEW.id_change_set
WHERE NOT OLD.id_access_level <=> NEW.id_access_level
UNION
# Changed active
SELECT NEW.id_link, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
;
END //
DELIMITER ;;
# Shop User
DROP TRIGGER IF EXISTS before_insert_Shop_User;
DROP TRIGGER IF EXISTS before_update_Shop_User;
DELIMITER //
CREATE TRIGGER before_insert_Shop_User
BEFORE INSERT ON Shop_User
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_User
BEFORE UPDATE ON Shop_User
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_User_Audit (
id_user,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed id_user_auth0
SELECT NEW.id_user, 'id_user_auth0', OLD.id_user_auth0, NEW.id_user_auth0, NEW.id_change_set
WHERE NOT (OLD.id_user_auth0 <=> NEW.id_user_auth0)
UNION
# Changed firstname
SELECT NEW.id_user, 'firstname', OLD.firstname, NEW.firstname, NEW.id_change_set
WHERE NOT (OLD.firstname <=> NEW.firstname)
UNION
# Changed surname
SELECT NEW.id_user, 'surname', OLD.surname, NEW.surname, NEW.id_change_set
WHERE NOT (OLD.surname <=> NEW.surname)
UNION
# Changed email
SELECT NEW.id_user, 'email', OLD.email, NEW.email, NEW.id_change_set
WHERE NOT (OLD.email <=> NEW.email)
UNION
# Changed is_email_verified
SELECT NEW.id_user, 'is_email_verified', CONVERT(CONVERT(OLD.is_email_verified, SIGNED), CHAR), CONVERT(CONVERT(NEW.is_email_verified, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.is_email_verified <=> NEW.is_email_verified)
UNION
# Changed is_super_user
SELECT NEW.id_user, 'is_super_user', CONVERT(CONVERT(OLD.is_super_user, SIGNED), CHAR), CONVERT(CONVERT(NEW.is_super_user, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.is_super_user <=> NEW.is_super_user)
UNION
# Changed active
SELECT NEW.id_user, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
UNION
# Changed id_currency_default
SELECT NEW.id_user, 'id_currency_default', CONVERT(OLD.id_currency_default, CHAR), CONVERT(NEW.id_currency_default, CHAR), NEW.id_change_set
WHERE NOT (OLD.id_currency_default <=> NEW.id_currency_default)
UNION
# Changed id_region_default
SELECT NEW.id_user, 'id_region_default', CONVERT(OLD.id_region_default, CHAR), CONVERT(NEW.id_region_default, CHAR), NEW.id_change_set
WHERE NOT (OLD.id_region_default <=> NEW.id_region_default)
UNION
# Changed is_included_VAT_default
SELECT NEW.id_user, 'is_included_VAT_default', CONVERT(CONVERT(OLD.is_included_VAT_default, SIGNED), CHAR), CONVERT(CONVERT(NEW.is_included_VAT_default, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.is_included_VAT_default <=> NEW.is_included_VAT_default)
;
END //
DELIMITER ;;
# Shop User Role Link
DROP TRIGGER IF EXISTS before_insert_Shop_User_Role_Link;
DROP TRIGGER IF EXISTS before_update_Shop_User_Role_Link;
DELIMITER //
CREATE TRIGGER before_insert_Shop_User_Role_Link
BEFORE INSERT ON Shop_User_Role_Link
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_User_Role_Link
BEFORE UPDATE ON Shop_User_Role_Link
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_User_Role_Link_Audit (
id_link,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed active
SELECT NEW.id_link, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
;
END //
DELIMITER ;;
# Shop Address
DROP TRIGGER IF EXISTS before_insert_Shop_User_Address;
DROP TRIGGER IF EXISTS before_update_Shop_User_Address;
DELIMITER //
CREATE TRIGGER before_insert_Shop_User_Address
BEFORE INSERT ON Shop_User_Address
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_User_Address
BEFORE UPDATE ON Shop_User_Address
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_User_Address_Audit (
id_user_address,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed region
SELECT NEW.id_user_address, 'id_region', OLD.id_region, NEW.id_region, NEW.id_change_set
WHERE NOT OLD.id_region <=> NEW.id_region
UNION
# Changed name_full
SELECT NEW.id_user_address, 'name_full', OLD.name_full, NEW.name_full, NEW.id_change_set
WHERE NOT OLD.name_full <=> NEW.name_full
UNION
# Changed phone_number
SELECT NEW.id_user_address, 'phone_number', OLD.phone_number, NEW.phone_number, NEW.id_change_set
WHERE NOT OLD.phone_number <=> NEW.phone_number
UNION
# Changed postcode
SELECT NEW.id_user_address, 'postcode', OLD.postcode, NEW.postcode, NEW.id_change_set
WHERE NOT OLD.postcode <=> NEW.postcode
UNION
# Changed address_line_1
SELECT NEW.id_user_address, 'address_line_1', OLD.address_line_1, NEW.address_line_1, NEW.id_change_set
WHERE NOT OLD.address_line_1 <=> NEW.address_line_1
UNION
# Changed address_line_2
SELECT NEW.id_user_address, 'address_line_2', OLD.address_line_2, NEW.address_line_2, NEW.id_change_set
WHERE NOT OLD.address_line_2 <=> NEW.address_line_2
UNION
# Changed city
SELECT NEW.id_user_address, 'city', OLD.city, NEW.city, NEW.id_change_set
WHERE NOT OLD.city <=> NEW.city
UNION
# Changed county
SELECT NEW.id_user_address, 'county', OLD.county, NEW.county, NEW.id_change_set
WHERE NOT OLD.county <=> NEW.county
UNION
# Changed active
SELECT NEW.id_user_address, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
;
END //
DELIMITER ;;
# Shop Product Variation Link
DROP TRIGGER IF EXISTS before_insert_Shop_User_Basket;
DROP TRIGGER IF EXISTS before_update_Shop_User_Basket;
DELIMITER //
CREATE TRIGGER before_insert_Shop_User_Basket
BEFORE INSERT ON Shop_User_Basket
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_User_Basket
BEFORE UPDATE ON Shop_User_Basket
FOR EACH ROW
BEGIN
IF NEW.id_change_set_user <=> OLD.id_change_set_user THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_User_Basket_Audit (
id_item,
name_field,
value_prev,
value_new,
id_change_set_user
)
# Changed id_user
SELECT NEW.id_item, 'id_user', OLD.id_user, NEW.id_user, NEW.id_change_set_user
WHERE NOT OLD.id_user <=> NEW.id_user
UNION
# Changed id_product
SELECT NEW.id_item, 'id_product', OLD.id_product, NEW.id_product, NEW.id_change_set_user
WHERE NOT OLD.id_product <=> NEW.id_product
UNION
# Changed quantity
SELECT NEW.id_item, 'quantity', CONVERT(OLD.quantity, CHAR), CONVERT(NEW.quantity, CHAR), NEW.id_change_set_user
WHERE NOT (OLD.quantity <=> NEW.quantity)
UNION
# Changed active
SELECT NEW.id_item, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set_user
WHERE NOT (OLD.active <=> NEW.active)
;
END //
DELIMITER ;;
# Shop User Order Type
DROP TRIGGER IF EXISTS before_insert_Shop_User_Order_Status;
DROP TRIGGER IF EXISTS before_update_Shop_User_Order_Status;
DELIMITER //
CREATE TRIGGER before_insert_Shop_User_Order_Status
BEFORE INSERT ON Shop_User_Order_Status
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_User_Order_Status
BEFORE UPDATE ON Shop_User_Order_Status
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_User_Order_Status_Audit (
id_Status,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed code
SELECT NEW.id_Status, 'code', OLD.code, NEW.code, NEW.id_change_set
WHERE NOT OLD.code <=> NEW.code
UNION
# Changed name
SELECT NEW.id_Status, 'name', OLD.name, NEW.name, NEW.id_change_set
WHERE NOT OLD.name <=> NEW.name
UNION
# Changed name_plural
SELECT NEW.id_Status, 'name_plural', OLD.name_plural, NEW.name_plural, NEW.id_change_set
WHERE NOT OLD.name_plural <=> NEW.name_plural
UNION
# Changed active
SELECT NEW.id_Status, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
UNION
# Changed display_order
SELECT NEW.id_Status, 'display_order', CONVERT(OLD.display_order, CHAR), CONVERT(NEW.display_order, CHAR), NEW.id_change_set
WHERE NOT (OLD.display_order <=> NEW.display_order)
;
END //
DELIMITER ;;
# Shop Supplier
DROP TRIGGER IF EXISTS before_insert_Shop_Supplier;
DROP TRIGGER IF EXISTS before_update_Shop_Supplier;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Supplier
BEFORE INSERT ON Shop_Supplier
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Supplier
BEFORE UPDATE ON Shop_Supplier
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Supplier_Audit (
id_supplier,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed name_company
SELECT NEW.id_supplier, 'name_company', OLD.name_company, NEW.name_company, NEW.id_change_set
WHERE NOT OLD.name_company <=> NEW.name_company
UNION
# Changed name_contact
SELECT NEW.id_supplier, 'name_contact', OLD.name_contact, NEW.name_contact, NEW.id_change_set
WHERE NOT OLD.name_contact <=> NEW.name_contact
UNION
# Changed department_contact
SELECT NEW.id_supplier, 'department_contact', OLD.department_contact, NEW.department_contact, NEW.id_change_set
WHERE NOT OLD.department_contact <=> NEW.department_contact
UNION
/*
# Changed id_address
SELECT NEW.id_supplier, 'id_address', OLD.id_address, NEW.id_address, NEW.id_change_set
WHERE NOT OLD.id_address <=> NEW.id_address
UNION
*/
# Changed phone_number
SELECT NEW.id_supplier, 'phone_number', OLD.phone_number, NEW.phone_number, NEW.id_change_set
WHERE NOT OLD.phone_number <=> NEW.phone_number
UNION
# Changed fax
SELECT NEW.id_supplier, 'fax', OLD.fax, NEW.fax, NEW.id_change_set
WHERE NOT OLD.fax <=> NEW.fax
UNION
# Changed email
SELECT NEW.id_supplier, 'email', OLD.email, NEW.email, NEW.id_change_set
WHERE NOT OLD.email <=> NEW.email
UNION
# Changed website
SELECT NEW.id_supplier, 'website', OLD.website, NEW.website, NEW.id_change_set
WHERE NOT OLD.website <=> NEW.website
UNION
# Changed id_currency
SELECT NEW.id_supplier, 'id_currency', OLD.id_currency, NEW.id_currency, NEW.id_change_set
WHERE NOT OLD.id_currency <=> NEW.id_currency
UNION
# Changed id_supplier_temp
SELECT NEW.id_supplier, 'id_supplier_temp', OLD.id_supplier_temp, NEW.id_supplier_temp, NEW.id_change_set
WHERE NOT OLD.id_supplier_temp <=> NEW.id_supplier_temp
;
END //
DELIMITER ;;
# Shop Supplier Address
DROP TRIGGER IF EXISTS before_insert_Shop_Supplier_Address;
DROP TRIGGER IF EXISTS before_update_Shop_Supplier_Address;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Supplier_Address
BEFORE INSERT ON Shop_Supplier_Address
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Supplier_Address
BEFORE UPDATE ON Shop_Supplier_Address
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Supplier_Address_Audit (
id_address,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed region
SELECT NEW.id_address, 'id_region', OLD.id_region, NEW.id_region, NEW.id_change_set
WHERE NOT OLD.id_region <=> NEW.id_region
UNION
# Changed postcode
SELECT NEW.id_address, 'postcode', OLD.postcode, NEW.postcode, NEW.id_change_set
WHERE NOT OLD.postcode <=> NEW.postcode
UNION
# Changed address_line_1
SELECT NEW.id_address, 'address_line_1', OLD.address_line_1, NEW.address_line_1, NEW.id_change_set
WHERE NOT OLD.address_line_1 <=> NEW.address_line_1
UNION
# Changed address_line_2
SELECT NEW.id_address, 'address_line_2', OLD.address_line_2, NEW.address_line_2, NEW.id_change_set
WHERE NOT OLD.address_line_2 <=> NEW.address_line_2
UNION
# Changed city
SELECT NEW.id_address, 'city', OLD.city, NEW.city, NEW.id_change_set
WHERE NOT OLD.city <=> NEW.city
UNION
# Changed county
SELECT NEW.id_address, 'county', OLD.county, NEW.county, NEW.id_change_set
WHERE NOT OLD.county <=> NEW.county
UNION
# Changed active
SELECT NEW.id_address, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set
WHERE NOT (OLD.active <=> NEW.active)
;
END //
DELIMITER ;;
# Shop Unit of Measurement
DROP TRIGGER IF EXISTS before_insert_Shop_Unit_Measurement;
DROP TRIGGER IF EXISTS before_update_Shop_Unit_Measurement;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Unit_Measurement
BEFORE INSERT ON Shop_Unit_Measurement
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Unit_Measurement
BEFORE UPDATE ON Shop_Unit_Measurement
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Unit_Measurement_Audit (
id_unit_measurement,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed name_singular
SELECT NEW.id_unit_measurement, 'name_singular', OLD.name_singular, NEW.name_singular, NEW.id_change_set
WHERE NOT OLD.name_singular <=> NEW.name_singular
UNION
# Changed name_plural
SELECT NEW.id_unit_measurement, 'name_plural', OLD.name_plural, NEW.name_plural, NEW.id_change_set
WHERE NOT OLD.name_plural <=> NEW.name_plural
UNION
# Changed symbol
SELECT NEW.id_unit_measurement, 'symbol', OLD.symbol, NEW.symbol, NEW.id_change_set
WHERE NOT OLD.symbol <=> NEW.symbol
UNION
# Changed is_base_unit
SELECT NEW.id_unit_measurement, 'is_base_unit', OLD.is_base_unit, NEW.is_base_unit, NEW.id_change_set
WHERE NOT OLD.is_base_unit <=> NEW.is_base_unit
UNION
# Changed is_unit_of_distance
SELECT NEW.id_unit_measurement, 'is_unit_of_distance', OLD.is_unit_of_distance, NEW.is_unit_of_distance, NEW.id_change_set
WHERE NOT OLD.is_unit_of_distance <=> NEW.is_unit_of_distance
UNION
# Changed is_unit_of_mass
SELECT NEW.id_unit_measurement, 'is_unit_of_mass', OLD.is_unit_of_mass, NEW.is_unit_of_mass, NEW.id_change_set
WHERE NOT OLD.is_unit_of_mass <=> NEW.is_unit_of_mass
UNION
# Changed is_unit_of_time
SELECT NEW.id_unit_measurement, 'is_unit_of_time', OLD.is_unit_of_time, NEW.is_unit_of_time, NEW.id_change_set
WHERE NOT OLD.is_unit_of_time <=> NEW.is_unit_of_time
UNION
# Changed is_unit_of_volume
SELECT NEW.id_unit_measurement, 'is_unit_of_volume', OLD.is_unit_of_volume, NEW.is_unit_of_volume, NEW.id_change_set
WHERE NOT OLD.is_unit_of_volume <=> NEW.is_unit_of_volume
UNION
# Changed active
SELECT NEW.id_unit_measurement, 'active', OLD.active, NEW.active, NEW.id_change_set
WHERE NOT OLD.active <=> NEW.active
;
END //
DELIMITER ;;
# Shop Unit of Measurement Conversion
DROP TRIGGER IF EXISTS before_insert_Shop_Unit_Measurement_Conversion;
DROP TRIGGER IF EXISTS before_update_Shop_Unit_Measurement_Conversion;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Unit_Measurement_Conversion
BEFORE INSERT ON Shop_Unit_Measurement_Conversion
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Unit_Measurement_Conversion
BEFORE UPDATE ON Shop_Unit_Measurement_Conversion
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Unit_Measurement_Conversion_Audit (
id_conversion,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed id_unit_derived
SELECT NEW.id_conversion, 'id_unit_derived', OLD.id_unit_derived, NEW.id_unit_derived, NEW.id_change_set
WHERE NOT OLD.id_unit_derived <=> NEW.id_unit_derived
UNION
# Changed id_unit_base
SELECT NEW.id_conversion, 'id_unit_base', OLD.id_unit_base, NEW.id_unit_base, NEW.id_change_set
WHERE NOT OLD.id_unit_base <=> NEW.id_unit_base
UNION
# Changed multiplier_unit_base
SELECT NEW.id_conversion, 'multiplier_unit_base', OLD.multiplier_unit_base, NEW.multiplier_unit_base, NEW.id_change_set
WHERE NOT OLD.multiplier_unit_base <=> NEW.multiplier_unit_base
UNION
# Changed increment_unit_base
SELECT NEW.id_conversion, 'active', OLD.increment_unit_base, NEW.increment_unit_base, NEW.id_change_set
WHERE NOT OLD.increment_unit_base <=> NEW.increment_unit_base
UNION
# Changed apply_multiplier_before_increment
SELECT NEW.id_conversion, 'apply_multiplier_before_increment', OLD.apply_multiplier_before_increment, NEW.apply_multiplier_before_increment, NEW.id_change_set
WHERE NOT OLD.apply_multiplier_before_increment <=> NEW.apply_multiplier_before_increment
UNION
# Changed active
SELECT NEW.id_conversion, 'active', OLD.active, NEW.active, NEW.id_change_set
WHERE NOT OLD.active <=> NEW.active
;
END //
DELIMITER ;;
# Shop Supplier Purchase Order
DROP TRIGGER IF EXISTS before_insert_Shop_Supplier_Purchase_Order;
DROP TRIGGER IF EXISTS before_update_Shop_Supplier_Purchase_Order;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Supplier_Purchase_Order
BEFORE INSERT ON Shop_Supplier_Purchase_Order
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Supplier_Purchase_Order
BEFORE UPDATE ON Shop_Supplier_Purchase_Order
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Supplier_Purchase_Order_Audit (
id_order,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed id_order_temp
SELECT NEW.id_order, 'id_order_temp', OLD.id_order_temp, NEW.id_order_temp, NEW.id_change_set
WHERE NOT OLD.id_order_temp <=> NEW.id_order_temp
UNION
# Changed id_supplier_ordered
SELECT NEW.id_order, 'id_supplier_ordered', OLD.id_supplier_ordered, NEW.id_supplier_ordered, NEW.id_change_set
WHERE NOT OLD.id_supplier_ordered <=> NEW.id_supplier_ordered
UNION
# Changed id_currency_cost
SELECT NEW.id_order, 'id_currency_cost', OLD.id_currency_cost, NEW.id_currency_cost, NEW.id_change_set
WHERE NOT OLD.id_currency_cost <=> NEW.id_currency_cost
UNION
# Changed cost_total_local_VAT_excl
SELECT NEW.id_order, 'cost_total_local_VAT_excl', OLD.cost_total_local_VAT_excl, NEW.cost_total_local_VAT_excl, NEW.id_change_set
WHERE NOT OLD.cost_total_local_VAT_excl <=> NEW.cost_total_local_VAT_excl
UNION
# Changed cost_total_local_VAT_incl
SELECT NEW.id_order, 'cost_total_local_VAT_incl', OLD.cost_total_local_VAT_incl, NEW.cost_total_local_VAT_incl, NEW.id_change_set
WHERE NOT OLD.cost_total_local_VAT_incl <=> NEW.cost_total_local_VAT_incl
/*
UNION
# Changed latency_delivery
SELECT NEW.id_order, 'latency_delivery', OLD.latency_delivery, NEW.latency_delivery, NEW.id_change_set
WHERE NOT OLD.latency_delivery <=> NEW.latency_delivery
UNION
# Changed quantity_ordered
SELECT NEW.id_order, 'quantity_ordered', OLD.quantity_ordered, NEW.quantity_ordered, NEW.id_change_set
WHERE NOT OLD.quantity_ordered <=> NEW.quantity_ordered
UNION
# Changed id_unit_quantity
SELECT NEW.id_order, 'id_unit_quantity', OLD.id_unit_quantity, NEW.id_unit_quantity, NEW.id_change_set
WHERE NOT OLD.id_unit_quantity <=> NEW.id_unit_quantity
UNION
# Changed quantity_received
SELECT NEW.id_order, 'quantity_received', OLD.quantity_received, NEW.quantity_received, NEW.id_change_set
WHERE NOT OLD.quantity_received <=> NEW.quantity_received
*/
;
END //
DELIMITER ;;
# Shop Supplier Purchase Order Product Link
DROP TRIGGER IF EXISTS before_insert_Shop_Supplier_Purchase_Order_Product_Link;
DROP TRIGGER IF EXISTS before_update_Shop_Supplier_Purchase_Order_Product_Link;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Supplier_Purchase_Order_Product_Link
BEFORE INSERT ON Shop_Supplier_Purchase_Order_Product_Link
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Supplier_Purchase_Order_Product_Link
BEFORE UPDATE ON Shop_Supplier_Purchase_Order_Product_Link
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Supplier_Purchase_Order_Product_Link_Audit (
id_link,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed id_order
SELECT NEW.id_link, 'id_order', OLD.id_order, NEW.id_order, NEW.id_change_set
WHERE NOT OLD.id_order <=> NEW.id_order
UNION
# Changed id_permutation
SELECT NEW.id_link, 'id_permutation', OLD.id_permutation, NEW.id_permutation, NEW.id_change_set
WHERE NOT OLD.id_permutation <=> NEW.id_permutation
UNION
/*
# Changed id_currency_cost
SELECT NEW.id_link, 'id_currency_cost', OLD.id_currency_cost, NEW.id_currency_cost, NEW.id_change_set
WHERE NOT OLD.id_currency_cost <=> NEW.id_currency_cost
UNION
*/
# Changed quantity_ordered
SELECT NEW.id_link, 'quantity_ordered', OLD.quantity_ordered, NEW.quantity_ordered, NEW.id_change_set
WHERE NOT OLD.quantity_ordered <=> NEW.quantity_ordered
UNION
# Changed id_unit_quantity
SELECT NEW.id_link, 'id_unit_quantity', OLD.id_unit_quantity, NEW.id_unit_quantity, NEW.id_change_set
WHERE NOT OLD.id_unit_quantity <=> NEW.id_unit_quantity
UNION
# Changed quantity_received
SELECT NEW.id_link, 'quantity_received', OLD.quantity_received, NEW.quantity_received, NEW.id_change_set
WHERE NOT OLD.quantity_received <=> NEW.quantity_received
UNION
# Changed latency_delivery_days
SELECT NEW.id_link, 'latency_delivery_days', OLD.latency_delivery_days, NEW.latency_delivery_days, NEW.id_change_set
WHERE NOT OLD.latency_delivery_days <=> NEW.latency_delivery_days
UNION
# Changed display_order
SELECT NEW.id_link, 'display_order', OLD.display_order, NEW.display_order, NEW.id_change_set
WHERE NOT OLD.display_order <=> NEW.display_order
UNION
# Changed active
SELECT NEW.id_link, 'active', OLD.active, NEW.active, NEW.id_change_set
WHERE NOT OLD.active <=> NEW.active
UNION
# Changed cost_total_local_VAT_excl
SELECT NEW.id_link, 'cost_total_local_VAT_excl', OLD.cost_total_local_VAT_excl, NEW.cost_total_local_VAT_excl, NEW.id_change_set
WHERE NOT OLD.cost_total_local_VAT_excl <=> NEW.cost_total_local_VAT_excl
UNION
# Changed cost_total_local_VAT_incl
SELECT NEW.id_link, 'cost_total_local_VAT_incl', OLD.cost_total_local_VAT_incl, NEW.cost_total_local_VAT_incl, NEW.id_change_set
WHERE NOT OLD.cost_total_local_VAT_incl <=> NEW.cost_total_local_VAT_incl
UNION
# Changed cost_unit_local_VAT_excl
SELECT NEW.id_link, 'cost_unit_local_VAT_excl', OLD.cost_unit_local_VAT_excl, NEW.cost_unit_local_VAT_excl, NEW.id_change_set
WHERE NOT OLD.cost_unit_local_VAT_excl <=> NEW.cost_unit_local_VAT_excl
UNION
# Changed cost_unit_local_VAT_incl
SELECT NEW.id_link, 'cost_unit_local_VAT_incl', OLD.cost_unit_local_VAT_incl, NEW.cost_unit_local_VAT_incl, NEW.id_change_set
WHERE NOT OLD.cost_unit_local_VAT_incl <=> NEW.cost_unit_local_VAT_incl
;
END //
DELIMITER ;;
# Shop Manufacturing Purchase Order
DROP TRIGGER IF EXISTS before_insert_Shop_Manufacturing_Purchase_Order;
DROP TRIGGER IF EXISTS before_update_Shop_Manufacturing_Purchase_Order;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Manufacturing_Purchase_Order
BEFORE INSERT ON Shop_Manufacturing_Purchase_Order
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
-- SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
IF NOT EXISTS (SELECT * FROM partsltd_prod.Shop_User U WHERE U.id_user = NEW.created_by LIMIT 1) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Valid created by User ID must be provided.';
END IF;
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Manufacturing_Purchase_Order
BEFORE UPDATE ON Shop_Manufacturing_Purchase_Order
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Manufacturing_Purchase_Order_Audit (
id_order,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed id_order_temp
SELECT NEW.id_order, 'id_order_temp', OLD.id_order_temp, NEW.id_order_temp, NEW.id_change_set
WHERE NOT OLD.id_order_temp <=> NEW.id_order_temp
UNION
# Changed id_currency
SELECT NEW.id_order, 'id_currency', OLD.id_currency, NEW.id_currency, NEW.id_change_set
WHERE NOT OLD.id_currency <=> NEW.id_currency
UNION
# Changed cost_total_local_VAT_excl
SELECT NEW.id_order, 'cost_total_local_VAT_excl', OLD.cost_total_local_VAT_excl, NEW.cost_total_local_VAT_excl, NEW.id_change_set
WHERE NOT OLD.cost_total_local_VAT_excl <=> NEW.cost_total_local_VAT_excl
UNION
# Changed cost_total_local_VAT_incl
SELECT NEW.id_order, 'cost_total_local_VAT_incl', OLD.cost_total_local_VAT_incl, NEW.cost_total_local_VAT_incl, NEW.id_change_set
WHERE NOT OLD.cost_total_local_VAT_incl <=> NEW.cost_total_local_VAT_incl
UNION
# Changed price_total_local_VAT_excl
SELECT NEW.id_order, 'price_total_local_VAT_excl', OLD.price_total_local_VAT_excl, NEW.price_total_local_VAT_excl, NEW.id_change_set
WHERE NOT OLD.price_total_local_VAT_excl <=> NEW.price_total_local_VAT_excl
UNION
# Changed price_total_local_VAT_incl
SELECT NEW.id_order, 'price_total_local_VAT_incl', OLD.price_total_local_VAT_incl, NEW.price_total_local_VAT_incl, NEW.id_change_set
WHERE NOT OLD.price_total_local_VAT_incl <=> NEW.price_total_local_VAT_incl
UNION
# Changed active
SELECT NEW.id_order, 'active', OLD.active, NEW.active, NEW.id_change_set
WHERE NOT OLD.active <=> NEW.active
;
END //
DELIMITER ;;
# Shop Manufacturing Purchase Order Product Link
DROP TRIGGER IF EXISTS before_insert_Shop_Manufacturing_Purchase_Order_Product_Link;
DROP TRIGGER IF EXISTS before_update_Shop_Manufacturing_Purchase_Order_Product_Link;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Manufacturing_Purchase_Order_Product_Link
BEFORE INSERT ON Shop_Manufacturing_Purchase_Order_Product_Link
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Manufacturing_Purchase_Order_Product_Link
BEFORE UPDATE ON Shop_Manufacturing_Purchase_Order_Product_Link
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Manufacturing_Purchase_Order_Product_Link_Audit (
id_link,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed id_order
SELECT NEW.id_link, 'id_order', OLD.id_order, NEW.id_order, NEW.id_change_set
WHERE NOT OLD.id_order <=> NEW.id_order
UNION
# Changed id_permutation
SELECT NEW.id_link, 'id_permutation', OLD.id_permutation, NEW.id_permutation, NEW.id_change_set
WHERE NOT OLD.id_permutation <=> NEW.id_permutation
UNION
# Changed id_unit_quantity
SELECT NEW.id_link, 'id_unit_quantity', OLD.id_unit_quantity, NEW.id_unit_quantity, NEW.id_change_set
WHERE NOT OLD.id_unit_quantity <=> NEW.id_unit_quantity
UNION
# Changed quantity_used
SELECT NEW.id_link, 'quantity_used', OLD.quantity_used, NEW.quantity_used, NEW.id_change_set
WHERE NOT OLD.quantity_used <=> NEW.quantity_used
UNION
# Changed quantity_produced
SELECT NEW.id_link, 'quantity_produced', OLD.quantity_produced, NEW.quantity_produced, NEW.id_change_set
WHERE NOT OLD.quantity_produced <=> NEW.quantity_produced
UNION
# Changed cost_unit_local_VAT_excl
SELECT NEW.id_order, 'cost_unit_local_VAT_excl', OLD.cost_unit_local_VAT_excl, NEW.cost_unit_local_VAT_excl, NEW.id_change_set
WHERE NOT OLD.cost_unit_local_VAT_excl <=> NEW.cost_unit_local_VAT_excl
UNION
# Changed cost_unit_local_VAT_incl
SELECT NEW.id_order, 'cost_unit_local_VAT_incl', OLD.cost_unit_local_VAT_incl, NEW.cost_unit_local_VAT_incl, NEW.id_change_set
WHERE NOT OLD.cost_unit_local_VAT_incl <=> NEW.cost_unit_local_VAT_incl
UNION
# Changed price_unit_local_VAT_excl
SELECT NEW.id_order, 'price_unit_local_VAT_excl', OLD.price_unit_local_VAT_excl, NEW.price_unit_local_VAT_excl, NEW.id_change_set
WHERE NOT OLD.price_unit_local_VAT_excl <=> NEW.price_unit_local_VAT_excl
UNION
# Changed price_unit_local_VAT_incl
SELECT NEW.id_order, 'price_unit_local_VAT_incl', OLD.price_unit_local_VAT_incl, NEW.price_unit_local_VAT_incl, NEW.id_change_set
WHERE NOT OLD.price_unit_local_VAT_incl <=> NEW.price_unit_local_VAT_incl
UNION
# Changed id_unit_latency_manufacture
SELECT NEW.id_link, 'id_unit_latency_manufacture', OLD.id_unit_latency_manufacture, NEW.id_unit_latency_manufacture, NEW.id_change_set
WHERE NOT OLD.id_unit_latency_manufacture <=> NEW.id_unit_latency_manufacture
UNION
# Changed latency_manufacture
SELECT NEW.id_link, 'latency_manufacture', OLD.latency_manufacture, NEW.latency_manufacture, NEW.id_change_set
WHERE NOT OLD.latency_manufacture <=> NEW.latency_manufacture
UNION
# Changed display_order
SELECT NEW.id_link, 'display_order', OLD.display_order, NEW.display_order, NEW.id_change_set
WHERE NOT OLD.display_order <=> NEW.display_order
UNION
# Changed active
SELECT NEW.id_link, 'active', OLD.active, NEW.active, NEW.id_change_set
WHERE NOT OLD.active <=> NEW.active
;
END //
DELIMITER ;;
# Shop Customer
DROP TRIGGER IF EXISTS before_insert_Shop_Customer;
DROP TRIGGER IF EXISTS before_update_Shop_Customer;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Customer
BEFORE INSERT ON Shop_Customer
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Customer
BEFORE UPDATE ON Shop_Customer
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Customer_Audit (
id_customer,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed name_company
SELECT NEW.id_customer, 'name_company', OLD.name_company, NEW.name_company, NEW.id_change_set
WHERE NOT OLD.name_company <=> NEW.name_company
UNION
# Changed name_contact
SELECT NEW.id_customer, 'name_contact', OLD.name_contact, NEW.name_contact, NEW.id_change_set
WHERE NOT OLD.name_contact <=> NEW.name_contact
UNION
# Changed department_contact
SELECT NEW.id_customer, 'department_contact', OLD.department_contact, NEW.department_contact, NEW.id_change_set
WHERE NOT OLD.department_contact <=> NEW.department_contact
UNION
# Changed id_address
SELECT NEW.id_customer, 'id_address', OLD.id_address, NEW.id_address, NEW.id_change_set
WHERE NOT OLD.id_address <=> NEW.id_address
UNION
# Changed phone_number
SELECT NEW.id_customer, 'phone_number', OLD.phone_number, NEW.phone_number, NEW.id_change_set
WHERE NOT OLD.phone_number <=> NEW.phone_number
UNION
# Changed email
SELECT NEW.id_customer, 'email', OLD.email, NEW.email, NEW.id_change_set
WHERE NOT OLD.email <=> NEW.email
UNION
# Changed id_currency
SELECT NEW.id_customer, 'id_currency', OLD.id_currency, NEW.id_currency, NEW.id_change_set
WHERE NOT OLD.id_currency <=> NEW.id_currency
UNION
# Changed active
SELECT NEW.id_customer, 'active', OLD.active, NEW.active, NEW.id_change_set
WHERE NOT OLD.active <=> NEW.active
;
END //
DELIMITER ;;
# Shop Customer Sales Order
DROP TRIGGER IF EXISTS before_insert_Shop_Customer_Sales_Order;
DROP TRIGGER IF EXISTS before_update_Shop_Customer_Sales_Order;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Customer_Sales_Order
BEFORE INSERT ON Shop_Customer_Sales_Order
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Customer_Sales_Order
BEFORE UPDATE ON Shop_Customer_Sales_Order
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Customer_Sales_Order_Audit (
id_order,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed id_customer
SELECT NEW.id_order, 'id_customer', OLD.id_customer, NEW.id_customer, NEW.id_change_set
WHERE NOT OLD.id_customer <=> NEW.id_customer
UNION
# Changed price_total_local
SELECT NEW.id_order, 'price_total_local', OLD.price_total_local, NEW.price_total_local, NEW.id_change_set
WHERE NOT OLD.price_total_local <=> NEW.price_total_local
UNION
# Changed id_currency_price
SELECT NEW.id_order, 'id_currency_price', OLD.id_currency_price, NEW.id_currency_price, NEW.id_change_set
WHERE NOT OLD.id_currency_price <=> NEW.id_currency_price
UNION
# Changed active
SELECT NEW.id_order, 'active', OLD.active, NEW.active, NEW.id_change_set
WHERE NOT OLD.active <=> NEW.active
;
END //
DELIMITER ;;
# Shop Customer Sales Order Product Link
DROP TRIGGER IF EXISTS before_insert_Shop_Customer_Sales_Order_Product_Link;
DROP TRIGGER IF EXISTS before_update_Shop_Customer_Sales_Order_Product_Link;
DELIMITER //
CREATE TRIGGER before_insert_Shop_Customer_Sales_Order_Product_Link
BEFORE INSERT ON Shop_Customer_Sales_Order_Product_Link
FOR EACH ROW
BEGIN
SET NEW.created_on := IFNULL(NEW.created_on, NOW());
SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1));
END //
DELIMITER ;;
DELIMITER //
CREATE TRIGGER before_update_Shop_Customer_Sales_Order_Product_Link
BEFORE UPDATE ON Shop_Customer_Sales_Order_Product_Link
FOR EACH ROW
BEGIN
IF OLD.id_change_set <=> NEW.id_change_set THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'New change Set ID must be provided.';
END IF;
INSERT INTO Shop_Customer_Sales_Order_Product_Link_Audit (
id_link,
name_field,
value_prev,
value_new,
id_change_set
)
# Changed id_order
SELECT NEW.id_link, 'id_order', OLD.id_order, NEW.id_order, NEW.id_change_set
WHERE NOT OLD.id_order <=> NEW.id_order
UNION
# Changed id_permutation
SELECT NEW.id_link, 'id_permutation', OLD.id_permutation, NEW.id_permutation, NEW.id_change_set
WHERE NOT OLD.id_permutation <=> NEW.id_permutation
UNION
# Changed price_total_local
SELECT NEW.id_link, 'price_total_local', OLD.price_total_local, NEW.price_total_local, NEW.id_change_set
WHERE NOT OLD.price_total_local <=> NEW.price_total_local
UNION
# Changed id_currency_price
SELECT NEW.id_link, 'id_currency_price', OLD.id_currency_price, NEW.id_currency_price, NEW.id_change_set
WHERE NOT OLD.id_currency_price <=> NEW.id_currency_price
UNION
# Changed quantity_ordered
SELECT NEW.id_link, 'quantity_ordered', OLD.quantity_ordered, NEW.quantity_ordered, NEW.id_change_set
WHERE NOT OLD.quantity_ordered <=> NEW.quantity_ordered
UNION
# Changed id_unit_quantity
SELECT NEW.id_link, 'id_unit_quantity', OLD.id_unit_quantity, NEW.id_unit_quantity, NEW.id_change_set
WHERE NOT OLD.id_unit_quantity <=> NEW.id_unit_quantity
UNION
# Changed quantity_delivered
SELECT NEW.id_link, 'quantity_delivered', OLD.quantity_delivered, NEW.quantity_delivered, NEW.id_change_set
WHERE NOT OLD.quantity_delivered <=> NEW.quantity_delivered
UNION
# Changed latency_delivery_days
SELECT NEW.id_link, 'latency_delivery_days', OLD.latency_delivery_days, NEW.latency_delivery_days, NEW.id_change_set
WHERE NOT OLD.latency_delivery_days <=> NEW.latency_delivery_days
UNION
# Changed display_order
SELECT NEW.id_link, 'display_order', OLD.display_order, NEW.display_order, NEW.id_change_set
WHERE NOT OLD.display_order <=> NEW.display_order
UNION
# Changed active
SELECT NEW.id_link, 'active', OLD.active, NEW.active, NEW.id_change_set
WHERE NOT OLD.active <=> NEW.active
;
END //
DELIMITER ;;
-- USE partsltd_prod;
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_debug_timing_reporting;
DELIMITER //
CREATE PROCEDURE p_debug_timing_reporting (
IN a_time_start TIMESTAMP(6)
)
BEGIN
/*
PROCEDURE p_debug_timing_reporting
Shared method timing reporting
*/
DECLARE v_time_end TIMESTAMP(6);
SET v_time_end := CURRENT_TIMESTAMP(6);
SELECT
a_time_start
, UNIX_TIMESTAMP(a_time_start)
, MICROSECOND(a_time_start) / 1000
, v_time_end
, UNIX_TIMESTAMP(v_time_end)
, MICROSECOND(v_time_end) / 1000
, v_time_end - a_time_start AS timestamp_delta
, UNIX_TIMESTAMP(v_time_end - a_time_start) AS UNIX_TIMESTAMP_timestamp_delta
, MICROSECOND(v_time_end - a_time_start) AS MICROSECOND_timestamp_delta
-- , TIME_FORMAT(TIMEDIFF(v_time_end, a_time_start), '%H:%i:%s') AS time_difference
, CONCAT(
TIME_FORMAT(TIMEDIFF(v_time_end, a_time_start), '%H hours, %i minutes, %s seconds'),
', ',
TIMESTAMPDIFF(MICROSECOND, a_time_start, v_time_end) % 1000000 / 1000, ' milliseconds'
) AS time_difference
;
END //
DELIMITER ;;
/*
CALL partsltd_prod.p_debug_timing_reporting (
CURRENT_TIMESTAMP(6)
);
*/
DROP PROCEDURE IF EXISTS p_split;
DELIMITER //
CREATE PROCEDURE p_split (
IN a_guid BINARY(36)
, IN a_string LONGTEXT
, IN a_separator VARCHAR(1000)
-- IN a_allow_empty BIT
, IN a_debug BIT
)
BEGIN
DECLARE v_has_string BIT;
DECLARE v_has_separator BIT;
DECLARE v_i_separator INT;
DECLARE v_i_start INT;
DECLARE v_i_end INT;
DECLARE v_current_item VARCHAR(4000);
DECLARE v_time_start TIMESTAMP(6);
SET v_time_start := CURRENT_TIMESTAMP(6);
SET a_string := IFNULL(a_string, '');
SET a_separator := IFNULL(a_separator, '');
SET a_debug := IFNULL(a_debug, 0);
IF a_debug = 1 THEN
SELECT
a_guid
, a_string
, a_separator
, a_debug
;
END IF;
CALL p_validate_guid ( a_guid );
DROP TABLE IF EXISTS tmp_Split_Split;
CREATE TEMPORARY TABLE tmp_Split_Split (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
substring VARCHAR(4000) NOT NULL
);
SET v_has_string = CASE WHEN a_string = '' THEN 0 ELSE 1 END;
SET v_has_separator = CASE WHEN a_separator = '' THEN 0 ELSE 1 END;
IF v_has_string THEN
SET v_i_start = 1;
SET v_i_end = LOCATE(',', a_string);
WHILE v_i_end > 0 DO
SET v_current_item = SUBSTRING(a_string, v_i_start, v_i_end - v_i_start);
INSERT INTO tmp_Split_Split (substring) VALUES (v_current_item);
SET v_i_start = v_i_end + 1;
SET v_i_end = LOCATE(',', a_string, v_i_start);
END WHILE;
SET v_current_item = SUBSTRING(a_string, v_i_start);
INSERT INTO tmp_Split_Split (substring) VALUES (TRIM(v_current_item));
END IF;
IF EXISTS (SELECT * FROM tmp_Split_Split LIMIT 1) THEN
START TRANSACTION;
INSERT INTO Split_Temp (
guid
, display_order
, substring
)
SELECT
a_guid
, display_order
, substring
FROM tmp_Split_Split
;
COMMIT;
END IF;
DROP TABLE IF EXISTS tmp_Split_Split;
IF a_debug = 1 THEN
CALL p_debug_timing_reporting ( v_time_start );
END IF;
END //
DELIMITER ;;
/*
CALL p_split (
'nips'
, 'noods, cheese ' # a_string
, ',' # a_separator
# '0', # a_allow_empty
, 1
);
SELECT *
FROM Split_Temp
WHERE GUID = 'nips';
CALL p_clear_split_temp( 'nips' );
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_clear_split_temp;
DELIMITER //
CREATE PROCEDURE p_clear_split_temp (
IN a_guid BINARY(36)
)
BEGIN
CALL p_validate_guid( a_guid );
START TRANSACTION;
-- DROP TABLE IF EXISTS
DELETE FROM Split_Temp
WHERE GUID = a_guid
;
COMMIT;
END //
DELIMITER ;;
/*
CALL p_clear_split_temp ( 'nips' );
*/
DROP PROCEDURE IF EXISTS p_validate_guid;
DROP PROCEDURE IF EXISTS p_validate_guid_test;
DELIMITER //
CREATE PROCEDURE p_validate_guid (
IN a_guid BINARY(36)
-- , IN a_debug BIT
)
BEGIN
/*
DECLARE v_code_type_error_bad_data VARCHAR(200);
DECLARE v_id_type_error_bad_data INT;
IF ISNULL(a_guid) THEN
SET v_code_type_error_bad_data := (SELECT code FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA');
SET v_id_type_error_bad_data := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data);
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, 'GUID is required.'
;
END IF;
*/
IF ISNULL(a_guid) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'GUID is required.'
;
END IF;
END //
DELIMITER ;;
DELIMITER //
CREATE PROCEDURE p_validate_guid_test ()
BEGIN
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
id_type INT
, code VARCHAR(200)
, msg TEXT
);
CALL p_validate_guid ( 'nips' );
CALL p_validate_guid ( NULL );
SELECT * FROM tmp_Msg_Error;
DROP TABLE tmp_Msg_Error;
END //
DELIMITER ;;
CALL p_validate_guid_test();
DROP PROCEDURE IF EXISTS p_split_key_value_pair_csv;
DELIMITER //
CREATE PROCEDURE p_split_key_value_pair_csv (
IN a_guid BINARY(36)
, IN a_string LONGTEXT
, IN a_debug BIT
)
BEGIN
DECLARE v_has_string BIT;
DECLARE v_current_item VARCHAR(4000);
DECLARE v_time_start TIMESTAMP(6);
SET v_time_start := CURRENT_TIMESTAMP(6);
SET a_string := IFNULL(a_string, '');
SET a_debug := IFNULL(a_debug, 0);
SET v_has_string = CASE WHEN a_string = '' THEN 0 ELSE 1 END;
IF a_debug = 1 THEN
SELECT
a_guid
, a_string
, a_debug
;
END IF;
CALL p_validate_guid ( a_guid );
DROP TEMPORARY TABLE IF EXISTS tmp_Split_Input;
DROP TEMPORARY TABLE IF EXISTS tmp_Split_Split;
CREATE TEMPORARY TABLE tmp_Split_Input (
input_string TEXT
);
CREATE TEMPORARY TABLE tmp_Split_Split (
id INT AUTO_INCREMENT PRIMARY KEY
, key_column VARCHAR(4000)
, value_column VARCHAR(4000)
);
INSERT INTO tmp_Split_Input (
input_string
)
VALUES (
a_string
);
INSERT INTO tmp_Split_Split (key_column, value_column)
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(t.pair, ':', 1), ',', -1) AS key_column,
SUBSTRING_INDEX(t.pair, ':', -1) AS value_column
FROM (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(input_string, ',', n), ',', -1) pair
FROM temp_input
CROSS JOIN (
SELECT a.N + b.N * 10 + 1 n
FROM (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
CROSS JOIN (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
ORDER BY n
) numbers
WHERE n <= 1 + (LENGTH(input_string) - LENGTH(REPLACE(input_string, ',', '')))
) t;
IF EXISTS (SELECT * FROM tmp_Split_Split LIMIT 1) THEN
START TRANSACTION;
INSERT INTO Split_Key_Value_Pair_Csv_Temp (
guid
, id
, key_column
, value_column
)
SELECT
a_guid
, id
, key_column
, value_column
FROM tmp_Split_Split
;
COMMIT;
END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_Split_Input;
DROP TEMPORARY TABLE IF EXISTS tmp_Split_Split;
IF a_debug = 1 THEN
CALL p_debug_timing_reporting ( v_time_start );
END IF;
END //
DELIMITER ;;
/*
CALL p_split_key_value_pair_csv (
'nipsnipsnipsnipsnipsnipsnipsnipsnips'
, '1:100,2:200,3:300,4:400' # a_string
, 1
);
SELECT *
FROM Split_key_value_pair_csv_Temp
WHERE GUID = 'nipsnipsnipsnipsnipsnipsnipsnipsnips';
CALL p_clear_split_key_value_pair_csv_temp( 'nipsnipsnipsnipsnipsnipsnipsnipsnips' );
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_clear_split_key_value_pair_csv_temp;
DELIMITER //
CREATE PROCEDURE p_clear_split_key_value_pair_csv_temp (
IN a_guid BINARY(36)
)
BEGIN
CALL p_validate_guid( a_guid );
START TRANSACTION;
-- DROP TABLE IF EXISTS
DELETE FROM Split_Key_Value_Pair_Csv_Temp
WHERE GUID = a_guid
;
COMMIT;
END //
DELIMITER ;;
/*
CALL p_clear_split_key_value_pair_csv_temp ( 'nipsnipsnipsnipsnipsnipsnipsnipsnips' );
*/
DROP FUNCTION IF EXISTS fn_shop_get_product_permutation_variations_csv;
DELIMITER //
CREATE FUNCTION fn_shop_get_product_permutation_variations_csv(id_product_permutation INT)
RETURNS VARCHAR(4000)
DETERMINISTIC
BEGIN
DECLARE csv VARCHAR(4000);
SET csv := (
SELECT
CASE WHEN P.has_variations = 0 THEN
''
ELSE
GROUP_CONCAT(
CONCAT(
PV.id_type
, ':'
, PV.id_variation
)
SEPARATOR ','
)
END
FROM partsltd_prod.Shop_Product_Permutation PP
LEFT JOIN partsltd_prod.Shop_Product P ON PP.id_product = P.id_product
LEFT JOIN partsltd_prod.Shop_Product_Permutation_Variation_Link PPVL ON PP.id_permutation = PPVL.id_permutation
LEFT JOIN partsltd_prod.Shop_Variation PV ON PPVL.id_variation = PV.id_variation
LEFT JOIN partsltd_prod.Shop_Variation_Type PVT ON PV.id_type = PVT.id_type
WHERE PP.id_permutation = id_product_permutation
GROUP BY P.id_product, P.has_variations, PVT.display_order, PVT.name, PV.display_order, PV.name
LIMIT 1
);
RETURN csv;
END //
DELIMITER ;
SELECT
fn_shop_get_product_permutation_variations_csv(
3 -- id_product_permutation
)
, fn_shop_get_product_permutation_variations_csv(
1 -- id_product_permutation
)
;
/*
*/
DROP FUNCTION IF EXISTS fn_shop_get_id_product_permutation_from_variation_csv_list;
DELIMITER //
CREATE FUNCTION fn_shop_get_id_product_permutation_from_variation_csv_list (
a_id_product INT
, a_variation_csv TEXT
)
RETURNS INT
DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE v_id_permutation INT;
DECLARE done INT DEFAULT FALSE;
DECLARE v_id_variation_type INT;
DECLARE v_id_variation INT;
DECLARE v_id_permutation_tmp INT;
DECLARE cur CURSOR FOR
SELECT
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(t.pair, ':', 1), ',', -1) AS UNSIGNED) AS id_variation_type,
CAST(SUBSTRING_INDEX(t.pair, ':', -1) AS UNSIGNED) AS id_variation
FROM (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(a_variation_csv, ',', n), ',', -1) pair
FROM (
SELECT a.N + b.N * 10 + 1 n
FROM (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
CROSS JOIN (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
ORDER BY n
) numbers
WHERE n <= 1 + (LENGTH(a_variation_csv) - LENGTH(REPLACE(a_variation_csv, ',', '')))
) t;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
SET v_id_permutation = NULL;
OPEN cur;
read_loop: LOOP
FETCH cur INTO v_id_variation_type, v_id_variation;
IF done THEN
LEAVE read_loop;
END IF;
IF v_id_permutation IS NULL THEN
-- First iteration: find initial v_id_permutations
SELECT PPVL.id_permutation INTO v_id_permutation
FROM partsltd_prod.Shop_Product_Permutation_Variation_Link PPVL
INNER JOIN partsltd_prod.Shop_Product_Permutation PP ON PPVL.id_permutation = PP.id_permutation
INNER JOIN partsltd_prod.Shop_Variation PV ON PPVL.id_variation = PV.id_variation
WHERE 1=1
AND PP.id_product = a_id_product
AND PPVL.id_variation = v_id_variation
AND PV.id_type = v_id_variation_type
;
ELSE
-- Subsequent iterations: narrow down the v_id_permutation
SELECT PPVL.id_permutation INTO v_id_permutation_tmp
FROM partsltd_prod.Shop_Product_Permutation_Variation_Link PPVL
INNER JOIN partsltd_prod.Shop_Product_Permutation PP ON PPVL.id_permutation = PP.id_permutation
INNER JOIN partsltd_prod.Shop_Variation PV ON PPVL.id_variation = PV.id_variation
WHERE 1=1
AND PP.id_product = a_id_product
AND PPVL.v_id_permutation = v_id_permutation
AND PPVL.id_variation = v_id_variation
AND PV.id_type = v_id_variation_type
;
IF v_id_permutation_tmp IS NULL THEN
-- If no match found, exit the loop
SET v_id_permutation := NULL;
LEAVE read_loop;
ELSE
SET v_id_permutation := v_id_permutation_tmp;
END IF;
END IF;
END LOOP;
CLOSE cur;
RETURN v_id_permutation;
END //
DELIMITER ;
/*
SELECT fn_shop_get_id_product_permutation_from_variation_csv_list ( 1, '1:1' ) AS id_permutation;
SELECT fn_shop_get_id_product_permutation_from_variation_csv_list ( 3, '' ) AS id_permutation;
*/
/*
-- Update the table using the function
UPDATE product_permutation_input
SET v_id_permutation = find_v_id_permutation(variation_csv)
WHERE v_id_permutation IS NULL;
*/
/*
select * from partsltd_prod.Shop_Variation
DROP PROCEDURE IF EXISTS p_shop_get_id_product_permutation_from_variation_csv_list;
DELIMITER //
CREATE PROCEDURE p_shop_get_id_product_permutation_from_variation_csv_list (
IN a_guid BINARY(36)
, IN a_debug BIT
)
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE v_id INT;
DECLARE v_row_id INT;
DECLARE v_variation_csv TEXT;
DECLARE v_id_permutation INT;
DECLARE v_time_start TIMESTAMP(6);
-- Cursor to iterate through unprocessed rows
DECLARE cur CURSOR FOR
SELECT id, session_guid, row_id, variation_csv
FROM product_permutation_input
WHERE v_id_permutation IS NULL;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
SET v_time_start := CURRENT_TIMESTAMP(6);
SET a_debug := IFNULL(a_debug, 0);
IF a_debug = 1 THEN
SELECT
a_guid
, a_debug
;
END IF;
CALL p_validate_guid ( a_guid );
OPEN cur;
read_loop: LOOP
FETCH cur INTO v_id, v_session_guid, v_row_id, v_variation_csv;
IF done THEN
LEAVE read_loop;
END IF;
-- Find matching v_id_permutation
SET v_id_permutation = NULL;
SELECT ppvl.v_id_permutation INTO v_id_permutation
FROM (
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(t.pair, ':', 1), ',', -1) AS id_variation_type,
SUBSTRING_INDEX(t.pair, ':', -1) AS id_variation
FROM (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(v_variation_csv, ',', numbers.n), ',', -1) pair
FROM (
SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 -- add more if needed
) numbers
WHERE CHAR_LENGTH(v_variation_csv) - CHAR_LENGTH(REPLACE(v_variation_csv, ',', '')) >= numbers.n - 1
) t
) parsed
INNER JOIN product_permutation_variation_link ppvl
ON parsed.id_variation_type = ppvl.id_variation_type
AND parsed.id_variation = ppvl.id_variation
GROUP BY ppvl.v_id_permutation
HAVING COUNT(*) = (LENGTH(v_variation_csv) - LENGTH(REPLACE(v_variation_csv, ',', '')) + 1)
LIMIT 1;
-- Update the v_id_permutation in the input table
UPDATE product_permutation_input
SET v_id_permutation = v_id_permutation
WHERE id = v_id;
END LOOP;
CLOSE cur;
IF EXISTS ( SELECT * FROM Shop_Get_Id_Product_Permutation_From_Variation_Csv_List_Temp WHERE GUID = a_guid LIMIT 1 ) THEN
IF EXISTS (SELECT * FROM tmp_Split_Split LIMIT 1) THEN
START TRANSACTION;
INSERT INTO Split_Key_Value_Pair_Csv_Temp (
guid
, id
, key_column
, value_column
)
SELECT
a_guid
, id
, key_column
, value_column
FROM tmp_Split_Split
;
COMMIT;
END IF;
END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_Split_Input;
DROP TEMPORARY TABLE IF EXISTS tmp_Split_Split;
IF a_debug = 1 THEN
CALL p_debug_timing_reporting ( v_time_start );
END IF;
END //
DELIMITER ;;
*/
/*
CALL p_shop_get_id_product_permutation_from_variation_csv_list (
'nipsnipsnipsnipsnipsnipsnipsnipsnips'
, '1:100,2:200,3:300,4:400' # a_string
, 1
);
SELECT *
FROM Split_key_value_pair_csv_Temp
WHERE GUID = 'nipsnipsnipsnipsnipsnipsnipsnipsnips';
CALL p_clear_split_key_value_pair_csv_temp( 'nipsnipsnipsnipsnipsnipsnipsnipsnips' );
*/
DROP FUNCTION IF EXISTS fn_shop_get_product_variations_from_id_csv_list;
DELIMITER //
CREATE FUNCTION fn_shop_get_product_variations_from_id_csv_list (
a_id_permutation INT
, a_variation_csv TEXT
, a_guid BINARY(36)
)
RETURNS INT
DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE v_csv_pairs VARCHAR(4000);
DECLARE v_current_pair VARCHAR(50);
DECLARE v_id_variation_type INT;
DECLARE v_id_variation INT;
DECLARE v_rank_counter INT;
CALL p_validate_guid( a_guid );
SET v_csv_pairs := a_variation_csv;
SET v_rank_counter := 1;
DROP TEMPORARY TABLE IF EXISTS tmp_Get_Variation_From_Csv_Variations;
CREATE TEMPORARY TABLE tmp_Get_Variation_From_Csv_Variations (
id_variation_type INT NOT NULL
, id_variation INT NOT NULL
);
WHILE LENGTH(v_csv_pairs) > 0 DO
IF LOCATE(',', v_csv_pairs) > 0 THEN
SET v_current_pair := SUBSTRING_INDEX(v_csv_pairs, ',', 1);
SET v_csv_pairs := SUBSTRING(v_csv_pairs, LOCATE(',', v_csv_pairs) + 1);
ELSE
SET v_current_pair := v_csv_pairs;
SET v_csv_pairs := '';
END IF;
SET v_id_variation_type := SUBSTRING_INDEX(v_current_pair, ':', 1);
SET v_id_variation := SUBSTRING_INDEX(v_current_pair, ':', -1);
INSERT INTO tmp_Get_Variation_From_Csv_Variations (
id_variation_type
, id_variation
)
SELECT
v_id_variation_type AS id_variation_type
, v_id_variation AS id_variation
;
SET v_rank_counter := v_rank_counter + 1;
END WHILE;
INSERT INTO partsltd_prod.Shop_Product_Permutation_Variation_Link_Temp (
id_link
, id_permutation
, id_variation
, display_order
, active
, GUID
)
SELECT
IFNULL(PPVL.id_link, -v_rank_counter) AS id_link
, a_id_permutation
, t_V.id_variation
, v_rank_counter AS display_order
, 1 AS active
, a_guid
FROM tmp_Get_Variation_From_Csv_Variations t_V
LEFT JOIN partsltd_prod.Shop_Product_Permutation_Variation_Link PPVL ON t_V.id_variation = PPVL.id_variation
;
DROP TEMPORARY TABLE tmp_Get_Variation_From_Csv_Variations;
RETURN v_rank_counter;
END //
DELIMITER ;
/*
SELECT
partsltd_prod.fn_shop_get_product_variations_from_id_csv_list(
1 -- a_id_permutation
, '1:1' -- a_variation_csv
, 'NIPPLENIPPLENIPPLENIPPLENIPPLENIPPLE' -- a_guid
)
;
SELECT *
FROM partsltd_prod.Shop_Product_Permutation_Variation_Link_Temp
WHERE GUID = 'NIPPLENIPPLENIPPLENIPPLENIPPLENIPPLE'
;
DELETE
FROM partsltd_prod.Shop_Product_Permutation_Variation_Link_Temp
WHERE GUID = 'NIPPLENIPPLENIPPLENIPPLENIPPLENIPPLE'
;
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_user_eval;
DROP PROCEDURE IF EXISTS p_shop_calc_user;
DELIMITER //
CREATE PROCEDURE p_shop_calc_user (
IN a_guid BINARY(36)
, IN a_ids_user TEXT
, IN a_get_inactive_user BIT
, IN a_ids_permission VARCHAR(4000)
, IN a_ids_access_level VARCHAR(4000)
, IN a_ids_product TEXT
, IN a_debug BIT
)
BEGIN
-- Variable declaration
DECLARE v_has_filter_permission BIT;
DECLARE v_has_filter_user BIT;
DECLARE v_has_filter_access_level BIT;
-- DECLARE v_has_filter_permutation BIT;
DECLARE v_has_filter_product BIT;
DECLARE v_id_permission_product INT;
DECLARE v_id_permission INT;
-- DECLARE v_ids_product VARCHAR(500);
DECLARE v_id_access_level_view INT;
# DECLARE v_id_access_level_product_required INT;
DECLARE v_priority_access_level_view INT;
DECLARE v_priority_access_level_edit INT;
DECLARE v_priority_access_level_admin INT;
DECLARE v_id_access_level INT;
DECLARE v_priority_access_level INT;
DECLARE v_time_start TIMESTAMP(6);
DECLARE v_ids_row_delete VARCHAR(500);
DECLARE v_code_type_error_bad_data VARCHAR(200);
DECLARE v_id_type_error_bad_data INT;
DECLARE v_code_error_permission VARCHAR(200);
DECLARE v_id_permission_required INT;
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_code_type_error_bad_data := (SELECT code FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA');
SET v_id_type_error_bad_data := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data);
SET v_code_error_permission := (SELECT code FROM Shop_Msg_Error_Type WHERE id_type = 2);
CALL partsltd_prod.p_validate_guid ( a_guid );
SET a_ids_user := TRIM(IFNULL(a_ids_user, ''));
SET a_get_inactive_user := IFNULL(a_get_inactive_user, 0);
SET a_ids_permission := TRIM(IFNULL(a_ids_permission, ''));
SET a_ids_access_level := TRIM(IFNULL(a_ids_access_level, ''));
SET a_ids_product := TRIM(IFNULL(a_ids_product, ''));
SET a_debug := IFNULL(a_debug, 0);
IF a_debug = 1 THEN
SELECT
a_guid
, a_ids_user
, a_get_inactive_user
, a_ids_permission
, a_ids_access_level
, a_ids_product
, a_debug
;
END IF;
-- Clear previous proc results
DROP TABLE IF EXISTS tmp_Calc_User;
DROP TABLE IF EXISTS tmp_Shop_Calc_User;
DROP TABLE IF EXISTS tmp_Product_Calc_User;
DROP TABLE IF EXISTS tmp_Product_p_Shop_User_Eval_Temp;
-- DROP TABLE IF EXISTS tmp_Split;
-- Permanent Table
CREATE TEMPORARY TABLE tmp_Calc_User (
id_row INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
id_user INT NULL,
id_permission_required INT NOT NULL,
priority_access_level_required INT NOT NULL,
id_product INT NULL,
is_super_user BIT NULL,
priority_access_level_user INT NULL,
can_view BIT,
can_edit BIT,
can_admin BIT
);
CREATE TEMPORARY TABLE tmp_Product_Calc_User (
-- id_row INT PRIMARY KEY AUTO_INCREMENT NOT NULL
id_product INT NULL
, id_access_level_required INT NOT NULL
, priority_access_level_required INT NOT NULL
-- guid BINARY(36) NOT NULL,
-- rank_product INT NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
-- guid BINARY(36) NOT NULL,
id_type INT NULL,
code VARCHAR(50) NOT NULL,
msg VARCHAR(4000) NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split (
substring VARCHAR(4000) NOT NULL
, as_int INT NULL
);
DELETE FROM tmp_Split;
SET v_has_filter_user = CASE WHEN a_ids_user = '' THEN 0 ELSE 1 END;
SET a_ids_permission = REPLACE(a_ids_permission, '|', ',');
SET v_has_filter_permission = CASE WHEN a_ids_permission = '' THEN 0 ELSE 1 END;
SET a_ids_access_level = REPLACE(a_ids_access_level, '|', ',');
SET v_has_filter_access_level = CASE WHEN a_ids_access_level = '' THEN 0 ELSE 1 END;
/*
SET a_ids_permutation = REPLACE(a_ids_permutation, '|', ',');
SET v_has_filter_permutation = CASE WHEN a_ids_permutation = '' THEN 0 ELSE 1 END;
*/
SET a_ids_product = REPLACE(a_ids_product, '|', ',');
SET v_has_filter_product = CASE WHEN a_ids_product = '' THEN 0 ELSE 1 END;
SET v_id_access_level_view = (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'VIEW' LIMIT 1);
SET v_priority_access_level_view = (SELECT priority FROM partsltd_prod.Shop_Access_Level WHERE id_access_level = v_id_access_level_view);
SET v_priority_access_level_edit = (SELECT priority FROM partsltd_prod.Shop_Access_Level WHERE code = 'EDIT' LIMIT 1);
SET v_priority_access_level_admin = (SELECT priority FROM partsltd_prod.Shop_Access_Level WHERE code = 'ADMIN' LIMIT 1);
IF a_debug = 1 THEN
SELECT
v_priority_access_level_view
, v_priority_access_level_edit
, v_priority_access_level_admin
;
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
IF v_has_filter_access_level THEN
CALL partsltd_prod.p_split(a_guid, a_ids_access_level, ',', a_debug);
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) -- AS as_int
FROM Split_Temp
WHERE 1=1
AND GUID = a_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( a_guid );
# Invalid IDs
IF EXISTS (
SELECT t_S.substring
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Access_Level AL ON t_S.as_int = AL.id_access_level
WHERE
ISNULL(t_S.as_int)
OR ISNULL(AL.id_access_level)
OR AL.active = 0
) THEN
INSERT INTO tmp_Msg_Error (
-- guid,
id_type,
code,
msg
)
SELECT
-- a_guid,
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive access level IDs: ', GROUP_CONCAT(t_S.substring SEPARATOR ', '))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Access_Level AL ON t_S.as_int = AL.id_access_level
WHERE
ISNULL(t_S.as_int)
OR ISNULL(AL.id_access_level)
OR AL.active = 0
;
END IF;
END IF;
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
IF v_has_filter_access_level THEN
SET v_id_access_level := (
SELECT AL.id_access_level
FROM tmp_Split t_S
INNER JOIN partsltd_prod.Shop_Access_Level AL
ON t_S.as_int = AL.id_access_level
AND AL.active
ORDER BY AL.priority ASC
LIMIT 1
);
ELSE
SET v_id_access_level = v_id_access_level_view;
END IF;
SET v_priority_access_level := (SELECT priority FROM partsltd_prod.Shop_Access_Level WHERE id_access_level = v_id_access_level LIMIT 1);
END IF;
DELETE FROM tmp_Split;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
IF v_has_filter_product = 1 THEN
CALL partsltd_prod.p_split(a_guid, a_ids_product, ',', a_debug);
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM Split_Temp
WHERE 1=1
AND GUID = a_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( a_guid );
# Invalid product IDs
IF EXISTS (SELECT * FROM tmp_Split t_S LEFT JOIN partsltd_prod.Shop_Product P ON t_S.as_int = P.id_product WHERE ISNULL(t_S.as_int) OR ISNULL(P.id_product) OR P.active = 0) THEN
INSERT INTO tmp_Msg_Error (
-- guid,
id_type,
code,
msg
)
SELECT
-- a_guid,
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive product IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Product P ON t_S.as_int = P.id_product
WHERE
ISNULL(t_S.as_int)
OR ISNULL(P.id_product)
OR P.active = 0
;
END IF;
END IF;
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
IF (v_has_filter_product = 1 AND EXISTS (SELECT * FROM tmp_Split)) THEN
INSERT INTO tmp_Product_Calc_User (
id_product,
-- id_permutation,
id_access_level_required,
priority_access_level_required
)
SELECT
DISTINCT P.id_product,
-- PP.id_permutation,
CASE WHEN AL_P.priority < AL_C.priority THEN AL_P.id_access_level ELSE AL_C.id_access_level END AS id_access_level_required,
CASE WHEN AL_P.priority < AL_C.priority THEN AL_P.priority ELSE AL_C.priority END AS priority_access_level_required
FROM tmp_Split t_S
INNER JOIN partsltd_prod.Shop_Product P ON t_S.as_int = P.id_product # Shop_Product_Permutation PP
INNER JOIN partsltd_prod.Shop_Access_Level AL_P
ON P.id_access_level_required = AL_P.id_access_level
AND AL_P.active
INNER JOIN partsltd_prod.Shop_Product_Category C ON P.id_category = C.id_category
INNER JOIN partsltd_prod.Shop_Access_Level AL_C
ON C.id_access_level_required = AL_C.id_access_level
AND AL_C.active
;
SET v_has_filter_product = EXISTS (SELECT * FROM tmp_Product_Calc_User);
/*
UPDATE tmp_Product_Calc_User t_P
INNER JOIN partsltd_prod.Shop_Product P ON t_P.id_product = P.id_product
INNER JOIN partsltd_prod.Shop_Product_Category PC ON P.id_category = PC.id_category
INNER JOIN partsltd_prod.Shop_Access_Level AL ON PC.id_access_level_required = AL.id_access_level
SET
t_P.id_access_level_required = CASE WHEN t_P.priority_access_level_required <= AL.priority THEN t_P.id_access_level_required ELSE AL.id_access_level END
, t_P.priority_access_level_required = LEAST(t_P.priority_access_level_required, AL.priority)
;
*/
ELSE
INSERT INTO tmp_Product_Calc_User (
id_product,
-- id_permutation,
id_access_level_required,
priority_access_level_required
)
VALUES (
NULL
, v_id_access_level_view
, v_priority_access_level_view
);
END IF;
END IF;
DELETE FROM tmp_Split;
-- Permission IDs
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
IF v_has_filter_permission THEN
CALL partsltd_prod.p_split(a_guid, a_ids_permission, ',', a_debug);
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM Split_Temp
WHERE 1=1
AND GUID = a_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( a_guid );
# Invalid or inactive
IF EXISTS (SELECT PERM.id_permission FROM tmp_Split t_S LEFT JOIN partsltd_prod.Shop_Permission PERM ON t_S.as_int = PERM.id_permission WHERE ISNULL(t_S.as_int) OR ISNULL(PERM.id_permission) OR PERM.active = 0) THEN
INSERT INTO tmp_Msg_Error (
-- guid,
id_type,
code,
msg
)
SELECT
-- a_guid,
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive permission IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Permission PERM ON t_S.as_int = PERM.id_permission
WHERE
ISNULL(t_S.as_int)
OR ISNULL(PERM.id_permission)
OR PERM.active = 0
;
ELSE
SET v_id_permission_required := (
SELECT PERM.id_permission
FROM partsltd_prod.Shop_Permission PERM
INNER JOIN partsltd_prod.Shop_Access_Level AL ON PERM.id_access_level_required = AL.id_access_level
ORDER BY AL.priority ASC
LIMIT 1
);
END IF;
END IF;
END IF;
DELETE FROM tmp_Split;
IF a_debug = 1 THEN
SELECT * FROM tmp_Product_Calc_User;
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
-- Invalid user ID
CALL partsltd_prod.p_split(a_guid, a_ids_user, ',', a_debug);
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM Split_Temp
WHERE 1=1
AND GUID = a_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( a_guid );
# Invalid or inactive
IF EXISTS (SELECT U.id_user FROM tmp_Split t_S LEFT JOIN partsltd_prod.Shop_User U ON t_S.as_int = U.id_user WHERE ISNULL(t_S.as_int) OR ISNULL(U.id_user) OR U.active = 0) THEN
INSERT INTO tmp_Msg_Error (
-- guid,
id_type,
code,
msg
)
SELECT
-- a_guid,
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive user IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_User U ON t_S.as_int = U.id_user
WHERE
ISNULL(t_S.as_int)
OR ISNULL(U.id_user)
OR U.active = 0
;
ELSE
/*
SET a_ids_user = (
SELECT U.id_user
FROM tmp_Split t_S
INNER JOIN partsltd_prod.Shop_User U ON t_S.as_int = U.id_user
);
SET v_has_filter_user = ISNULL(a_ids_user);
*/
IF NOT EXISTS (SELECT * FROM tmp_Split) THEN
INSERT INTO tmp_Split (substring, as_int)
VALUES ( '', NULL );
END IF;
IF a_debug = 1 THEN
SELECT *
FROM tmp_Split;
END IF;
INSERT INTO tmp_Calc_User (
id_user
, id_permission_required
, priority_access_level_required
, id_product
, priority_access_level_user
, is_super_user
)
SELECT
U.id_user
, v_id_permission_required
, CASE WHEN v_priority_access_level < AL_P.priority THEN v_priority_access_level ELSE AL_P.priority END AS priority_access_level_required
, t_P.id_product
, CASE WHEN MIN(IFNULL(AL_U.priority, 0)) = 0 THEN v_priority_access_level_view ELSE MIN(IFNULL(AL_U.priority, 0)) END AS priority_access_level_user
, IFNULL(U.is_super_user, 0) AS is_super_user
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_User U
ON t_S.as_int = U.id_user
AND U.active
LEFT JOIN partsltd_prod.Shop_User_Role_Link URL
ON U.id_user = URL.id_user
AND URL.active
LEFT JOIN partsltd_prod.Shop_Role_Permission_Link RPL
ON URL.id_role = RPL.id_role
AND RPL.active
LEFT JOIN partsltd_prod.Shop_Access_Level AL_U
ON RPL.id_access_level = AL_U.id_access_level
AND AL_U.active
CROSS JOIN tmp_Product_Calc_User t_P
LEFT JOIN partsltd_prod.Shop_Access_Level AL_P
ON t_P.id_access_level_required = AL_P.id_access_level
AND AL_P.active
GROUP BY t_S.as_int, U.id_user, t_P.id_product, AL_P.priority
;
SET v_has_filter_user = EXISTS ( SELECT * FROM tmp_Calc_User LIMIT 1 );
END IF;
END IF;
DELETE FROM tmp_Split;
-- Calculated fields
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
UPDATE tmp_Calc_User t_U
SET
t_U.can_view = t_U.is_super_user = 1 OR (t_U.priority_access_level_user <= v_priority_access_level_view AND t_U.priority_access_level_user <= t_U.priority_access_level_required)
, t_U.can_edit = t_U.is_super_user = 1 OR (t_U.priority_access_level_user <= v_priority_access_level_edit AND t_U.priority_access_level_user <= t_U.priority_access_level_required)
, t_U.can_admin = t_U.is_super_user = 1 OR (t_U.priority_access_level_user <= v_priority_access_level_admin AND t_U.priority_access_level_user <= t_U.priority_access_level_required)
;
END IF;
-- Export data to staging table
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
START TRANSACTION;
INSERT INTO partsltd_prod.Shop_Calc_User_Temp (
guid
, id_user
, id_permission_required
, priority_access_level_required
, id_product
, is_super_user
, priority_access_level_user
, can_view
, can_edit
, can_admin
)
SELECT
a_guid
, id_user
, id_permission_required
, priority_access_level_required
, id_product
, is_super_user
, priority_access_level_user
, can_view
, can_edit
, can_admin
FROM tmp_Calc_User
;
COMMIT;
END IF;
IF a_debug = 1 THEN
SELECT * FROM tmp_Msg_Error;
SELECT * FROM tmp_Calc_User;
SELECT * FROM tmp_Product_Calc_User;
SELECT * FROM partsltd_prod.Shop_Calc_User_Temp WHERE GUID = a_guid;
CALL partsltd_prod.p_shop_clear_calc_user ( a_guid, a_debug );
END IF;
-- Clean up
DROP TABLE IF EXISTS tmp_Calc_User;
DROP TABLE IF EXISTS tmp_Shop_Calc_User;
DROP TABLE IF EXISTS tmp_Product_Calc_User;
DROP TABLE IF EXISTS tmp_Product_p_Shop_User_Eval_Temp;
-- DROP TABLE IF EXISTS tmp_Split;
IF a_debug = 1 THEN
CALL partsltd_prod.p_debug_timing_reporting( v_time_start );
END IF;
END //
DELIMITER ;;
/*
CALL partsltd_prod.p_shop_calc_user (
'chips '
, NULL
, 0
, '2'
, '1'
, '1,2,3,4,5'
, 0
);
-- SELECT * FROM partsltd_prod.Shop_Calc_User_Temp;
SELECT * FROM partsltd_prod.Shop_Calc_User_Temp WHERE GUID = 'chips ';
CALL partsltd_prod.p_shop_clear_calc_user ( 'chips ', 0 );
-- SELECT * FROM partsltd_prod.Shop_Calc_User_Temp;
DROP TABLE IF EXISTS tmp_Msg_Error;
CALL p_shop_calc_user(
'chips '
, 1
, FALSE -- a_get_inactive_users
, 2
, 1
, '' -- a_ids_product
, 0 -- a_debug
);
SELECT * FROM partsltd_prod.Shop_Calc_User_Temp WHERE GUID = 'chips ';
CALL partsltd_prod.p_shop_clear_calc_user ( 'chips ', 0 );
DROP TABLE IF EXISTS tmp_Msg_Error;
SELECT * FROM partsltd_prod.shop_user_role_link;
SELECT * FROM partsltd_prod.shop_role_permission_link;
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_clear_Shop_Calc_User_Temp;
DROP PROCEDURE IF EXISTS p_clear_Shop_Calc_User_Temp;
DROP PROCEDURE IF EXISTS p_shop_clear_calc_user;
DELIMITER //
CREATE PROCEDURE p_shop_clear_calc_user (
IN a_guid BINARY(36)
, IN a_debug BIT
)
BEGIN
DECLARE v_time_start TIMESTAMP(6);
SET v_time_start := CURRENT_TIMESTAMP(6);
CALL p_validate_guid ( a_guid );
START TRANSACTION;
DELETE FROM Shop_Calc_User_Temp
WHERE GUID = a_guid
;
COMMIT;
IF a_debug = 1 THEN
CALL partsltd_prod.p_debug_timing_reporting( v_time_start );
END IF;
END //
DELIMITER ;;
/*
CALL p_shop_clear_calc_user (
'noods, cheese ' # a_guid
, 1 -- debug
);
SELECT *
FROM Shop_Calc_User_Temp
WHERE GUID = 'noods, cheese '
;
*/
/*
CALL p_shop_get_many_access_level (
0 # a_get_inactive_access_level
)
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_get_many_access_level;
DELIMITER //
CREATE PROCEDURE p_shop_get_many_access_level (
IN a_get_inactive_access_level BIT
)
BEGIN
SET a_get_inactive_access_level = IFNULL(a_get_inactive_access_level, 0);
SELECT
AL.id_access_level
, AL.code
, AL.name
, AL.priority
, AL.display_order
, AL.active
FROM Shop_Access_Level AL
WHERE
a_get_inactive_access_level = 1
OR AL.active = 1
ORDER BY AL.display_order
;
END //
DELIMITER ;;
/*
CALL p_shop_get_many_access_level (
0 # a_get_inactive_access_level
);
*/
/*
CALL p_shop_get_many_region (
0 # a_get_inactive_region
)
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_get_many_region;
DELIMITER //
CREATE PROCEDURE p_shop_get_many_region (
IN a_get_inactive_region BIT
)
BEGIN
IF a_get_inactive_region IS NULL THEN
SET a_get_inactive_region = 0;
END IF;
SELECT
R.id_region,
R.code,
R.name,
R.active,
R.display_order
FROM Shop_Region R
WHERE a_get_inactive_region
OR R.active
ORDER BY R.display_order
;
END //
DELIMITER ;;
/*
CALL p_shop_get_many_region (
0 # a_get_inactive_region
);
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_get_many_plant;
DELIMITER //
CREATE PROCEDURE p_shop_get_many_plant (
IN a_get_inactive_plant BIT
)
BEGIN
SET a_get_inactive_plant = IFNULL(a_get_inactive_plant, 0);
SELECT
P.id_plant
, P.id_address
, A.id_region
, P.id_user_manager
, P.code
, P.name
, P.active
FROM Shop_Plant P
INNER JOIN Shop_Address A ON P.id_address = A.id_address
WHERE
a_get_inactive_plant = 1
OR P.active = 1
;
END //
DELIMITER ;;
/*
CALL p_shop_get_many_plant (
0 # a_get_inactive_plant
);
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_get_many_storage_location;
DELIMITER //
CREATE PROCEDURE p_shop_get_many_storage_location (
IN a_get_inactive_storage_location BIT
)
BEGIN
SET a_get_inactive_storage_location = IFNULL(a_get_inactive_storage_location, 0);
SELECT
SL.id_location
, P.id_plant
, P.id_address
, A.id_region
, SL.code
, SL.name
, P.active
FROM Shop_Storage_Location SL
INNER JOIN Shop_Plant P ON SL.id_plant = P.id_plant
INNER JOIN Shop_Address A ON P.id_address = A.id_address
WHERE
a_get_inactive_storage_location = 1
OR SL.active = 1
;
END //
DELIMITER ;;
/*
CALL p_shop_get_many_storage_location (
0 # a_get_inactive_storage_location
);
*/
/*
CALL p_shop_get_many_currency (
0 # a_get_inactive_currency
)
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_get_many_currency;
DELIMITER //
CREATE PROCEDURE p_shop_get_many_currency (
IN a_get_inactive_currency BIT
)
BEGIN
IF a_get_inactive_currency IS NULL THEN
SET a_get_inactive_currency = 0;
END IF;
SELECT
C.id_currency,
C.code,
C.name,
C.symbol,
C.factor_from_GBP,
C.display_order,
C.active
FROM Shop_Currency C
WHERE a_get_inactive_currency
OR C.active
ORDER BY C.display_order
;
END //
DELIMITER ;;
/*
CALL p_shop_get_many_currency (
0 # a_get_inactive_currency
);
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_get_many_unit_measurement;
DELIMITER //
CREATE PROCEDURE p_shop_get_many_unit_measurement (
IN a_get_inactive_unit_measurement BIT
)
BEGIN
SET a_get_inactive_unit_measurement := IFNULL(a_get_inactive_unit_measurement, 0);
SELECT
UM.id_unit_measurement,
UM.name_singular,
UM.name_plural,
UM.symbol,
UM.symbol_is_suffix_not_prefix,
UM.is_base_unit,
UM.is_unit_of_distance,
UM.is_unit_of_mass,
UM.is_unit_of_time,
UM.is_unit_of_volume,
UM.active
FROM Shop_Unit_Measurement UM
WHERE
a_get_inactive_unit_measurement = 1
OR UM.active = 1
;
END //
DELIMITER ;;
/*
CALL p_shop_get_many_unit_measurement (
0 # a_get_inactive_unit_measurement
);
select *
from shop_unit_measurement
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_save_category;
DROP PROCEDURE IF EXISTS p_shop_save_category;
DROP PROCEDURE IF EXISTS p_shop_save_product_category;
DELIMITER //
CREATE PROCEDURE p_shop_save_product_category (
IN a_comment VARCHAR(500),
IN a_guid BINARY(36),
IN a_id_user INT,
IN a_debug BIT
)
BEGIN
DECLARE v_code_type_error_bad_data VARCHAR(100);
DECLARE v_id_type_error_bad_data INT;
DECLARE v_id_permission_product INT;
DECLARE v_ids_product_permission LONGTEXT;
DECLARE v_id_change_set INT;
DECLARE v_id_access_level_edit INT;
DECLARE v_time_start TIMESTAMP(6);
DECLARE exit handler for SQLEXCEPTION
BEGIN
-- Get diagnostic information
GET DIAGNOSTICS CONDITION 1
@sqlstate = RETURNED_SQLSTATE
, @errno = MYSQL_ERRNO
, @text = MESSAGE_TEXT
;
-- Rollback the transaction
ROLLBACK;
-- Select the error information
-- SELECT 'Error' AS status, @errno AS error_code, @sqlstate AS sql_state, @text AS message;
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NULL
, code VARCHAR(50) NOT NULL
, msg VARCHAR(4000) NOT NULL
);
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
MET.id_type
, @errno
, @text
FROM partsltd_prod.Shop_Msg_Error_Type MET
WHERE MET.code = 'MYSQL_ERROR'
;
SELECT *
FROM tmp_Msg_Error;
DROP TABLE IF EXISTS tmp_Msg_Error;
END;
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_code_type_error_bad_data := 'BAD_DATA';
SET v_id_type_error_bad_data := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1);
SET v_id_access_level_edit := (SELECT id_access_level FROM Shop_Access_Level WHERE code = 'EDIT' LIMIT 1);
CALL p_validate_guid ( a_guid );
DROP TABLE IF EXISTS tmp_Category;
CREATE TEMPORARY TABLE tmp_Category (
id_category INT NOT NULL
, code VARCHAR(50) NOT NULL
, name VARCHAR(255) NOT NULL
, description VARCHAR(4000) NULL
, id_access_level_required INT NOT NULL
, active BIT NOT NULL
, display_order INT NOT NULL
, can_view BIT NULL
, can_edit BIT NULL
, can_admin BIT NULL
, name_error VARCHAR(255) NOT NULL
, is_new BIT NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NULL
, code VARCHAR(50) NOT NULL
, msg VARCHAR(4000) NOT NULL
);
-- Get data from Temp table
INSERT INTO tmp_Category (
id_category
, code
, name
, description
, id_access_level_required
, active
, display_order
, name_error
, is_new
)
SELECT
IFNULL(PC_T.id_category, PC.id_category) AS id_category
, IFNULL(PC_T.code, PC.code) AS code
, IFNULL(PC_T.name, PC.code) AS name
, IFNULL(PC_T.description, PC.description) AS description
, IFNULL(PC_T.id_access_level_required, PC.id_access_level_required) AS id_access_level_required
, IFNULL(IFNULL(PC_T.active, PC.active), 1) AS active
, IFNULL(PC_T.display_order, PC.display_order) AS display_order
, IFNULL(PC_T.name, IFNULL(PC.name, IFNULL(PC_T.code, IFNULL(PC.code, IFNULL(PC_T.id_category, '(No Product Category)'))))) AS name_error
, CASE WHEN IFNULL(PC_T.id_category, 0) < 1 THEN 1 ELSE 0 END AS is_new
FROM Shop_Product_Category_Temp PC_T
LEFT JOIN Shop_Product_Category PC ON PC_T.id_category = PC.id_category
WHERE PC_T.guid = a_guid
;
-- Validation
-- Missing mandatory fields
-- code
IF EXISTS (SELECT * FROM tmp_Category t_C WHERE ISNULL(t_C.code) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following category(s) do not have a code: ', GROUP_CONCAT(IFNULL(t_C.name_error, 'NULL') SEPARATOR ', ')) AS msg
FROM tmp_Category t_C
WHERE ISNULL(t_C.code)
;
END IF;
-- name
IF EXISTS (SELECT * FROM tmp_Category t_C WHERE ISNULL(t_C.name) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following category(s) do not have a name: ', GROUP_CONCAT(IFNULL(t_C.name_error, 'NULL') SEPARATOR ', ')) AS msg
FROM tmp_Category t_C
WHERE ISNULL(t_C.name)
;
END IF;
-- display_order
IF EXISTS (SELECT * FROM tmp_Category t_C WHERE ISNULL(t_C.display_order) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following category(s) do not have a display order: ', GROUP_CONCAT(IFNULL(t_C.name_error, 'NULL') SEPARATOR ', ')) AS msg
FROM tmp_Category t_C
WHERE ISNULL(t_C.display_order)
;
END IF;
-- Permissions
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN -- (SELECT * FROM tmp_Product WHERE is_new = 0 LIMIT 1) THEN
SET v_ids_product_permission := (
SELECT GROUP_CONCAT(P.id_product SEPARATOR ',')
FROM Shop_Product P
INNER JOIN tmp_Category t_C
ON P.id_category = t_C.id_category
AND t_C.is_new = 0
);
IF NOT ISNULL(v_ids_product_permission) THEN
SET v_id_permission_product = (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_PRODUCT' LIMIT 1);
CALL p_shop_calc_user(a_guid, a_id_user, FALSE, v_id_permission_product, v_id_access_level_edit, v_ids_product_permission);
UPDATE tmp_Category t_C
INNER JOIN Shop_Product P ON t_C.id_category = P.id_product
INNER JOIN Shop_Calc_User_Temp UE_T
ON P.id_product = UE_T.id_product
AND UE_T.GUID = a_guid
SET
t_C.can_view = UE_T.can_view
, t_C.can_edit = UE_T.can_edit
, t_C.can_admin = UE_T.can_admin
;
CALL p_shop_clear_calc_user(a_guid);
END IF;
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
START TRANSACTION;
IF NOT ISNULL(v_ids_product_permission) THEN
INSERT INTO Shop_Product_Change_Set ( comment )
VALUES ( a_comment )
;
SET v_id_change_set := LAST_INSERT_ID();
UPDATE Shop_Product_Category PC
INNER JOIN tmp_Category t_C ON PC.id_category = t_C.id_category
SET
PC.id_category = t_C.id_category
, PC.code = t_C.code
, PC.name = t_C.name
, PC.description = t_C.description
, PC.id_access_level_required = t_C.id_access_level_required
, PC.active = t_C.active
, PC.display_order = t_C.display_order
, PC.id_change_set = v_id_change_set
;
END IF;
INSERT INTO Shop_Product_Category (
code
, name
, description
, id_access_level_required
, active
, display_order
, created_by
, created_on
)
SELECT
-- t_C.id_category AS id_category
t_C.code AS code
, t_C.name AS name
, t_C.description AS description
, t_C.id_access_level_required AS id_access_level_required
, t_C.active AS active
, t_C.display_order AS display_order
, a_id_user AS created_by
, v_time_start AS created_on
FROM tmp_Category t_C
WHERE is_new = 1
AND active = 1
;
DELETE FROM Shop_Product_Category_Temp
WHERE GUID = a_guid;
COMMIT;
END IF;
# Errors
SELECT *
FROM tmp_Msg_Error t_ME
INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type
;
IF a_debug = 1 THEN
SELECT * from tmp_Catgory;
END IF;
DROP TEMPORARY TABLE tmp_Catgory;
DROP TEMPORARY TABLE tmp_Msg_Error;
IF a_debug = 1 THEN
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END IF;
END //
DELIMITER ;;
-- Clear previous proc
DROP PROCEDURE IF EXISTS partsltd_prod.p_shop_save_product_category_test;
DELIMITER //
CREATE PROCEDURE p_shop_save_product_category_test ()
BEGIN
DECLARE v_guid BINARY(36);
DECLARE v_time_start TIMESTAMP(6);
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_guid := 'nips';
SELECT *
FROM partsltd_prod.Shop_Product_Category
;
SELECT *
FROM partsltd_prod.Shop_Product_Category_Temp
;
START TRANSACTION;
INSERT INTO partsltd_prod.Shop_Product_Category_Temp (
id_category
, name
, code
, description
, id_access_level_required
, display_order
, guid
)
VALUES (
-5 -- id_category
, 'Nips' -- name
, 'Lips' -- code
, 'Chips' -- description
, 2 -- id_access_level_required
, 25 -- display_order
, v_guid
);
COMMIT;
SELECT *
FROM partsltd_prod.Shop_Product_Category_Temp
WHERE GUID = v_guid
;
CALL partsltd_prod.p_shop_save_product_category (
'Test save product category' -- comment
, v_guid -- guid
, 1 -- id_user
, 1 -- debug
);
SELECT *
FROM partsltd_prod.Shop_Product_Category
;
SELECT *
FROM partsltd_prod.Shop_Product_Category_Temp
;
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END //
DELIMITER ;;
/*
CALL partsltd_prod.p_shop_save_product_category_test ();
DELETE FROM partsltd_prod.Shop_Product_Category_Temp;
DROP TABLE IF EXISTS tmp_Msg_Error;
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_clear_calc_product_permutation;
DELIMITER //
CREATE PROCEDURE p_shop_clear_calc_product_permutation (
IN a_guid BINARY(36)
)
BEGIN
IF ISNULL(a_guid) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'GUID is required.';
ELSE
START TRANSACTION;
DELETE FROM Shop_Product_Category_Temp
WHERE GUID = a_guid
;
DELETE FROM Shop_Product_Temp
WHERE GUID = a_guid
;
DELETE FROM Shop_Product_Permutation_Temp
WHERE GUID = a_guid
;
COMMIT;
END IF;
END //
DELIMITER ;;
/*
CALL p_shop_clear_calc_product_permutation (
'noods, cheese ' # a_guid
);
SELECT * FROM Shop_Product_Category_Temp
WHERE GUID = a_guid
;
SELECT * FROM Shop_Product_Temp
WHERE GUID = a_guid
;
SELECT * FROM Shop_Product_Permutation_Temp
WHERE GUID = a_guid
;
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_save_product;
DROP PROCEDURE IF EXISTS p_shop_save_product;
DELIMITER //
CREATE PROCEDURE p_shop_save_product (
IN a_comment VARCHAR(500),
IN a_guid BINARY(36),
IN a_id_user INT,
IN a_debug BIT
)
BEGIN
DECLARE v_code_type_error_bad_data VARCHAR(100);
DECLARE v_id_access_level_edit INT;
DECLARE v_id_type_error_bad_data INT;
DECLARE v_id_permission_product INT;
DECLARE v_ids_product_permission LONGTEXT;
DECLARE v_id_change_set INT;
DECLARE v_time_start TIMESTAMP(6);
DECLARE exit handler for SQLEXCEPTION
BEGIN
-- Get diagnostic information
GET DIAGNOSTICS CONDITION 1
@sqlstate = RETURNED_SQLSTATE
, @errno = MYSQL_ERRNO
, @text = MESSAGE_TEXT
;
-- Rollback the transaction
ROLLBACK;
-- Select the error information
-- SELECT 'Error' AS status, @errno AS error_code, @sqlstate AS sql_state, @text AS message;
INSERT INTO tmp_Msg_Error (
-- guid
id_type
, code
, msg
)
SELECT
-- a_guid
(SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'MYSQL_ERROR' LIMIT 1)
, @errno
, IFNULL(@text, 'NULL')
;
SELECT *
FROM tmp_Msg_Error t_ME
INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type
;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
DROP TEMPORARY TABLE IF EXISTS tmp_Product;
END;
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_code_type_error_bad_data := (SELECT code FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1);
SET v_id_type_error_bad_data := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1);
SET v_id_access_level_edit := (SELECT id_access_level FROM Shop_Access_Level WHERE code = 'EDIT' LIMIT 1);
CALL p_validate_guid ( a_guid );
SET a_debug := IFNULL(a_debug, 0);
IF a_debug = 1 THEN
SELECT
v_code_type_error_bad_data
, v_id_type_error_bad_data
;
END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_Product;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
CREATE TEMPORARY TABLE tmp_Product (
id_category INT NOT NULL
, id_product INT NOT NULL
, name VARCHAR(255) NOT NULL
, has_variations BIT NOT NULL
, id_access_level_required INT NOT NULL
, active BIT NOT NULL
, display_order INT NOT NULL
, can_view BIT NULL
, can_edit BIT NULL
, can_admin BIT NULL
, name_error VARCHAR(255) NOT NULL
, is_new BIT NOT NULL
);
CREATE TEMPORARY 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
);
-- Get data from Temp table
INSERT INTO tmp_Product (
id_category
, id_product
, name
, has_variations
, id_access_level_required
, active
, display_order
, name_error
, is_new
)
SELECT
IFNULL(P_T.id_category, P.id_category) AS id_category
, IFNULL(P_T.id_product, 0) AS id_product
, IFNULL(P_T.name, P.name) AS name
, IFNULL(P_T.has_variations, P.has_variations) AS has_variations
, IFNULL(P_T.id_access_level_required, P.id_access_level_required) AS id_access_level_required
, IFNULL(P_T.active, P.active) AS active
, IFNULL(P_T.display_order, P.display_order) AS display_order
, IFNULL(P_T.name, IFNULL(P.name, IFNULL(P_T.id_product, '(No Product)'))) AS name_error
, CASE WHEN IFNULL(P_T.id_product, 0) < 1 THEN 1 ELSE 0 END AS is_new
FROM partsltd_prod.Shop_Product_Temp P_T
LEFT JOIN partsltd_prod.Shop_Product P ON P_T.id_product = P.id_product
;
-- Validation
-- Missing mandatory fields
-- id_category
IF EXISTS (SELECT * FROM tmp_Product t_P WHERE ISNULL(t_P.id_category) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, IFNULL(CONCAT('The following product(s) do not have a category: ', GROUP_CONCAT(IFNULL(t_P.name_error, 'NULL') SEPARATOR ', ')), 'NULL')
FROM tmp_Product t_P
WHERE ISNULL(t_P.id_category)
;
END IF;
-- name
IF EXISTS (SELECT * FROM tmp_Product t_P WHERE ISNULL(t_P.name) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, IFNULL(CONCAT('The following product(s) do not have a name: ', GROUP_CONCAT(IFNULL(t_P.name_error, 'NULL') SEPARATOR ', ')), 'NULL')
FROM tmp_Product t_P
WHERE ISNULL(t_P.name)
;
END IF;
-- has_variations
IF EXISTS (SELECT * FROM tmp_Product t_P WHERE ISNULL(t_P.has_variations) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, IFNULL(CONCAT('The following product(s) do not have a has-variations setting: ', GROUP_CONCAT(IFNULL(t_P.name_error, 'NULL') SEPARATOR ', ')), 'NULL')
FROM tmp_Product t_P
WHERE ISNULL(t_P.has_variations)
;
END IF;
-- id_access_level_required
IF EXISTS (SELECT * FROM tmp_Product t_P WHERE ISNULL(t_P.id_access_level_required) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, IFNULL(CONCAT('The following product(s) do not have a required access level ID: ', GROUP_CONCAT(IFNULL(t_P.name_error, 'NULL') SEPARATOR ', ')), 'NULL')
FROM tmp_Product t_P
WHERE ISNULL(t_P.id_access_level_required)
;
END IF;
-- display_order
IF EXISTS (SELECT * FROM tmp_Product t_P WHERE ISNULL(t_P.display_order) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, IFNULL(CONCAT('The following product(s) do not have a display order: ', GROUP_CONCAT(IFNULL(t_P.name_error, 'NULL') SEPARATOR ', ')), 'NULL')
FROM tmp_Product t_P
WHERE ISNULL(t_P.display_order)
;
END IF;
-- Permissions
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN -- (SELECT * FROM tmp_Product WHERE is_new = 0 LIMIT 1) THEN
SET v_ids_product_permission := (SELECT GROUP_CONCAT(id_product SEPARATOR ',') FROM tmp_Product WHERE is_new = 0);
IF NOT ISNULL(v_ids_product_permission) THEN
SET v_id_permission_product = (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_PRODUCT' LIMIT 1);
CALL partsltd_prod.p_shop_calc_user(
a_guid
, a_id_user
, FALSE -- get_inactive_users
, v_id_permission_product
, v_id_access_level_edit
, v_ids_product_permission
, 0 -- debug
);
UPDATE tmp_Product t_P
INNER JOIN Shop_Calc_User_Temp UE_T
ON t_P.id_product = UE_T.id_product
AND UE_T.GUID = a_guid
SET
t_P.can_view = UE_T.can_view
, t_P.can_edit = UE_T.can_edit
, t_P.can_admin = UE_T.can_admin
;
CALL partsltd_prod.p_shop_clear_calc_user(
a_guid
, 0 -- debug
);
END IF;
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
START TRANSACTION;
IF NOT ISNULL(v_ids_product_permission) THEN
INSERT INTO partsltd_prod.Shop_Product_Change_Set ( comment )
VALUES ( a_comment )
;
SET v_id_change_set := LAST_INSERT_ID();
UPDATE partsltd_prod.Shop_Product P
INNER JOIN tmp_Product t_P ON P.id_product = t_P.id_product
SET
P.id_category = t_P.id_category
, P.name = t_P.name
, P.has_variations = t_P.has_variations
, P.id_access_level_required = t_P.id_access_level_required
, P.display_order = t_P.display_order
, P.id_change_set = v_id_change_set
;
END IF;
INSERT INTO partsltd_prod.Shop_Product (
id_category
, name
, has_variations
, id_access_level_required
, display_order
, created_by
, created_on
)
SELECT
t_P.id_category AS id_category
, t_P.name AS name
, t_P.has_variations AS has_variations
, t_P.id_access_level_required AS id_access_level_required
, t_P.display_order AS display_order
, a_id_user AS created_by
, v_time_start AS created_on
FROM tmp_Product t_P
WHERE is_new = 1
;
DELETE FROM partsltd_prod.Shop_Product_Category_Temp
WHERE GUID = a_guid;
COMMIT;
END IF;
SELECT *
FROM tmp_Msg_Error t_ME
INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type
;
DROP TEMPORARY TABLE IF EXISTS tmp_Product;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
IF a_debug = 1 THEN
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END IF;
END //
DELIMITER ;;
-- Clear previous proc
DROP PROCEDURE IF EXISTS partsltd_prod.p_shop_save_product_test;
DELIMITER //
CREATE PROCEDURE p_shop_save_product_test ()
BEGIN
DECLARE v_guid BINARY(36);
DECLARE v_time_start TIMESTAMP(6);
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_guid := 'nips';
SELECT *
FROM partsltd_prod.Shop_Product
;
SELECT *
FROM partsltd_prod.Shop_Product_Temp
;
START TRANSACTION;
INSERT INTO partsltd_prod.Shop_Product_Temp (
id_product
, id_category
, name
, has_variations
, id_access_level_required
, display_order
, active
, guid
)
VALUES
/* Test 1 - Update
(
4 -- id_product
, 1 -- id_category
, 'Laptops' -- name
, 0 -- has_variations
, 2 -- id_access_level_required
, 2 -- display_order
, 1 -- active
, v_guid
)
*/
/* Test 2 - Insert */
(
-14 -- id_product
, 5 -- id_category
, 'Clip' -- name
, 0 -- has_variations
, 1 -- id_access_level_required
, 1 -- display_order
, 1 -- active
, v_guid
)
;
COMMIT;
SELECT *
FROM partsltd_prod.Shop_Product_Temp
WHERE GUID = v_guid
;
CALL partsltd_prod.p_shop_save_product (
'Test save product' -- comment
, v_guid -- guid
, 1 -- id_user
, 1 -- debug
);
SELECT *
FROM partsltd_prod.Shop_Product
;
SELECT *
FROM partsltd_prod.Shop_Product_Temp
;
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END //
DELIMITER ;;
/*
CALL partsltd_prod.p_shop_save_product_test ();
DELETE FROM partsltd_prod.Shop_Product_Temp;
DROP TABLE IF EXISTS tmp_Msg_Error;
*/-- USE partsltd_prod;
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_calc_product_permutation;
DELIMITER //
CREATE PROCEDURE p_shop_calc_product_permutation (
IN a_id_user INT
, IN a_get_all_product_category BIT
, IN a_get_inactive_product_category BIT
, IN a_ids_product_category TEXT
, IN a_get_all_product BIT
, IN a_get_inactive_product BIT
, IN a_ids_product TEXT
, IN a_get_all_product_permutation BIT
, IN a_get_inactive_permutation BIT
, IN a_ids_permutation TEXT
, IN a_get_products_quantity_stock_below_min BIT
, IN a_guid BINARY(36)
, IN a_debug BIT
)
BEGIN
/*
PROCEDURE p_shop_calc_product_permutation
Shared filtering for product permutations
select * FROM partsltd_prod.Shop_msg_error_type;
*/
DECLARE v_has_filter_product_category BIT;
DECLARE v_has_filter_product BIT;
DECLARE v_has_filter_permutation BIT;
DECLARE v_id_permission_product INT;
DECLARE v_ids_product_permission TEXT;
DECLARE v_id_access_level_view INT;
DECLARE v_id_minimum INT;
DECLARE v_ids_product_invalid TEXT;
DECLARE v_ids_category_invalid TEXT;
DECLARE v_time_start TIMESTAMP(6);
DECLARE v_id_type_error_bad_data INT;
DECLARE v_code_type_error_bad_data VARCHAR(50);
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_id_access_level_view := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'VIEW');
SELECT
MET.id_type
, MET.code
INTO
v_id_type_error_bad_data
, v_code_type_error_bad_data
FROM partsltd_prod.Shop_Msg_Error_Type MET
WHERE MET.code = 'BAD_DATA'
;
SET a_id_user := IFNULL(a_id_user, 0);
SET a_get_all_product_category := IFNULL(a_get_all_product_category, 0);
SET a_get_inactive_product_category := IFNULL(a_get_inactive_product_category, 0);
SET a_ids_product_category := TRIM(IFNULL(a_ids_product_category, ''));
SET a_get_all_product := IFNULL(a_get_all_product, 0);
SET a_get_inactive_product := IFNULL(a_get_inactive_product, 0);
SET a_ids_product := TRIM(IFNULL(a_ids_product, ''));
SET a_get_all_product_permutation := IFNULL(a_get_all_product_permutation, 0);
SET a_get_inactive_permutation := IFNULL(a_get_inactive_permutation, 0);
SET a_ids_permutation := TRIM(IFNULL(a_ids_permutation, ''));
SET a_get_products_quantity_stock_below_min := IFNULL(a_get_products_quantity_stock_below_min, 0);
-- SET a_guid := IFNULL(a_guid, UUID());
SET a_debug := IFNULL(a_debug, 0);
IF a_debug = 1 THEN
SELECT
a_id_user
, a_get_all_product_category, a_ids_product_category, a_get_inactive_product_category
, a_get_all_product, a_get_inactive_product, a_ids_product
, a_get_all_product_permutation, a_get_inactive_permutation, a_ids_permutation
, a_get_products_quantity_stock_below_min
, a_debug
;
END IF;
-- Temporary tables
-- DROP TEMPORARY TABLE IF EXISTS tmp_Split;
DROP TEMPORARY TABLE IF EXISTS tmp_Category_calc;
DROP TEMPORARY TABLE IF EXISTS tmp_Product_calc;
DROP TEMPORARY TABLE IF EXISTS tmp_Permutation_calc;
CREATE TEMPORARY TABLE tmp_Category_calc (
id_category INT NOT NULL
-- , active BIT NOT NULL
-- display_order INT NOT NULL
);
CREATE TEMPORARY TABLE tmp_Product_calc (
id_category INT NOT NULL
, id_product INT NOT NULL
-- active BIT NOT NULL
-- display_order INT NOT NULL
, can_view BIT
, can_edit BIT
, can_admin BIT
);
CREATE TEMPORARY TABLE tmp_Permutation_calc (
id_permutation INT NULL
-- id_category INT NOT NULL
, id_product INT NOT NULL
-- , active BIT NOT NULL
-- , display_order INT NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT
-- , guid BINARY(36) NOT NULL
, id_type INT NULL
, code VARCHAR(50) NOT NULL
, msg VARCHAR(4000) NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split (
substring VARCHAR(4000) NOT NULL
, as_int INT NULL
);
DELETE FROM tmp_Split;
-- Parse filters
SET v_has_filter_product_category = CASE WHEN a_ids_product_category = '' THEN 0 ELSE 1 END;
SET v_has_filter_product = CASE WHEN a_ids_product = '' THEN 0 ELSE 1 END;
SET v_has_filter_permutation = CASE WHEN a_ids_permutation = '' THEN 0 ELSE 1 END;
CALL p_validate_guid ( a_guid );
IF a_debug = 1 THEN
SELECT
v_has_filter_product_category
, v_has_filter_product
, v_has_filter_permutation
;
END IF;
-- Categories
IF TRUE THEN -- NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
CALL partsltd_prod.p_split(a_guid, a_ids_product_category, ',', a_debug);
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM partsltd_prod.Split_Temp
WHERE 1=1
AND GUID = a_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( a_guid );
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Product_Category PC ON t_S.as_int = PC.id_category
WHERE
ISNULL(t_S.as_int)
OR ISNULL(PC.id_category)
OR (
PC.active = 0
AND a_get_inactive_product_category = 0
)
) THEN
INSERT INTO tmp_Msg_Error (
-- guid,
id_type,
code,
msg
)
SELECT
-- a_guid,
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive category IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Product_Category PC ON t_S.as_int = PC.id_category
WHERE
ISNULL(t_S.as_int)
OR ISNULL(PC.id_category)
OR (
PC.active = 0
AND a_get_inactive_product_category = 0
)
;
ELSE
INSERT INTO tmp_Category_calc (
id_category
)
SELECT
PC.id_category
FROM tmp_Split t_S
RIGHT JOIN partsltd_prod.Shop_Product_Category PC ON t_S.as_int = PC.id_category
WHERE (
a_get_all_product_category = 1
OR (
v_has_filter_product_category = 1
AND NOT ISNULL(t_S.as_int)
)
)
AND (
a_get_inactive_product_category = 1
OR PC.active = 1
)
;
END IF;
END IF;
DELETE FROM tmp_Split;
-- Products
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
CALL partsltd_prod.p_split(a_guid, a_ids_product, ',', a_debug);
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM partsltd_prod.Split_Temp
WHERE 1=1
AND GUID = a_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( a_guid );
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Product P ON t_S.as_int = P.id_product
WHERE
ISNULL(t_S.as_int)
OR ISNULL(P.id_product)
OR (
P.active = 0
AND a_get_inactive_product = 0
)
) THEN
INSERT INTO tmp_Msg_Error (
-- guid,
id_type,
code,
msg
)
SELECT
-- a_guid,
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive product IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Product P ON t_S.as_int = P.id_product
WHERE
ISNULL(t_S.as_int)
OR ISNULL(P.id_product)
OR (
P.active = 0
AND a_get_inactive_product = 0
)
;
ELSE
INSERT INTO tmp_Product_calc (
id_category
, id_product
)
SELECT
P.id_category
, P.id_product
FROM tmp_Split t_S
RIGHT JOIN partsltd_prod.Shop_Product P ON t_S.as_int = P.id_product
INNER JOIN tmp_Category_calc t_C ON P.id_category = t_C.id_category
WHERE (
a_get_all_product = 1
OR (
v_has_filter_product = 1
AND NOT ISNULL(t_S.as_int)
)
)
AND (
a_get_inactive_product = 1
OR P.active = 1
)
;
END IF;
END IF;
DELETE FROM tmp_Split;
-- Permutations
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
CALL partsltd_prod.p_split(a_guid, a_ids_product, ',', a_debug);
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM partsltd_prod.Split_Temp
WHERE 1=1
AND GUID = a_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( a_guid );
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_S.as_int = PP.id_permutation
WHERE
ISNULL(t_S.as_int)
OR ISNULL(PP.id_permutation)
) THEN
INSERT INTO tmp_Msg_Error (
-- guid,
id_type,
code,
msg
)
SELECT
-- a_guid,
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive permutation IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_S.as_int = PP.id_permutation
WHERE
ISNULL(t_S.as_int)
OR ISNULL(PP.id_permutation)
OR (
PP.active = 0
AND a_get_inactive_product_permutation = 0
)
;
ELSE
INSERT INTO tmp_Permutation_calc (
id_permutation
-- id_category,
, id_product
)
SELECT
PP.id_permutation
-- P.id_category,
, PP.id_product
FROM tmp_Split t_S
RIGHT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_S.as_int = PP.id_permutation
INNER JOIN tmp_Product_calc t_P ON PP.id_product = t_P.id_product
WHERE 1=1
AND (
a_get_all_product_permutation = 1
OR (
v_has_filter_permutation = 1
AND NOT ISNULL(t_S.as_int)
)
)
AND (
a_get_products_quantity_stock_below_min = 0
OR PP.quantity_stock < PP.quantity_min
)
AND (
a_get_inactive_permutation = 1
OR PP.active = 1
)
;
END IF;
END IF;
DELETE FROM tmp_Split;
-- Permissions
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF EXISTS (SELECT * FROM tmp_Product_calc LIMIT 1) THEN
SET v_id_permission_product := (SELECT id_permission FROM partsltd_prod.Shop_Permission WHERE code = 'STORE_PRODUCT' LIMIT 1);
SET v_ids_product_permission := (SELECT GROUP_CONCAT(id_product SEPARATOR ',') FROM tmp_Product_calc WHERE NOT ISNULL(id_product));
IF a_debug = 1 THEN
SELECT
a_guid AS a_guid
, a_id_user
, false AS a_get_inactive_user
, v_id_permission_product AS a_ids_permission
, v_id_access_level_view AS a_ids_access_level
, v_ids_product_permission AS a_ids_product
;
END IF;
CALL p_shop_calc_user(
a_guid
, a_id_user
, false -- a_get_inactive_user
, v_id_permission_product -- a_ids_permission
, v_id_access_level_view -- a_ids_access_level
, v_ids_product_permission -- a_ids_permutation
, false -- a_debug
);
UPDATE tmp_Product_calc t_P
INNER JOIN partsltd_prod.Shop_Calc_User_Temp UE_T
ON t_P.id_product = UE_T.id_product
AND UE_T.GUID = a_guid
SET t_P.can_view = UE_T.can_view,
t_P.can_edit = UE_T.can_edit,
t_P.can_admin = UE_T.can_admin
;
IF a_debug = 1 THEN
SELECT *
FROM partsltd_prod.Shop_Calc_User_Temp
WHERE GUID = a_guid
;
END IF;
SET v_ids_product_invalid := (
SELECT GROUP_CONCAT(t_P.id_product SEPARATOR ',')
FROM tmp_Product_calc t_P
WHERE ISNULL(t_P.can_view)
);
SET v_ids_category_invalid := (
SELECT GROUP_CONCAT(t_P.id_category SEPARATOR ',')
FROM (SELECT DISTINCT id_category, id_product, can_view FROM tmp_Product_calc) t_P
WHERE ISNULL(t_P.can_view)
);
DELETE t_C
FROM tmp_Category_calc t_C
WHERE FIND_IN_SET(t_C.id_category, v_ids_category_invalid) > 0
;
DELETE t_P
FROM tmp_Product_calc t_P
WHERE FIND_IN_SET(t_P.id_product, v_ids_product_invalid) > 0
;
DELETE t_PP
FROM tmp_Permutation_calc t_PP
WHERE FIND_IN_SET(t_PP.id_product, v_ids_product_invalid) > 0
;
CALL p_shop_clear_calc_user( a_guid, a_debug );
END IF;
END IF;
IF a_debug = 1 THEN
SELECT * FROM tmp_Category_calc;
SELECT * FROM tmp_Product_calc;
SELECT * FROM tmp_Permutation_calc;
END IF;
-- Transaction
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
/*
DELETE FROM tmp_Category_calc;
DELETE FROM tmp_Product_calc;
DELETE FROM tmp_Permutation_calc;
ELSE
SELECT * FROM Shop_Product_Category_Temp;
SELECT * FROM Shop_Product_Temp;
SELECT * FROM Shop_Product_Permutation_Temp;
*/
START TRANSACTION;
# Categories
INSERT INTO Shop_Product_Category_Temp (
id_category
, code
, name
, description
, id_access_level_required
, display_order
, active
, can_view
, can_edit
, can_admin
, guid
)
SELECT
t_C.id_category
, PC.code
, PC.name
, PC.description
, PC.id_access_level_required
, PC.display_order
, PC.active
, MIN(IFNULL(t_P.can_view, 0)) AS can_view
, MIN(IFNULL(t_P.can_edit, 0)) AS can_edit
, MIN(IFNULL(t_P.can_admin, 0)) AS can_admin
, a_guid
FROM tmp_Category_calc t_C
INNER JOIN partsltd_prod.Shop_Product_Category PC ON t_C.id_category = PC.id_category
LEFT JOIN tmp_Product_calc t_P ON t_C.id_category = t_P.id_product
GROUP BY PC.id_category
;
# Products
INSERT INTO Shop_Product_Temp (
id_product
, id_category
, name
, has_variations
, id_access_level_required
, display_order
, active
, can_view
, can_edit
, can_admin
, guid
)
SELECT
t_P.id_product
, P.id_category
, P.name
, P.has_variations
, P.id_access_level_required
, P.display_order
, P.active
, t_P.can_view
, t_P.can_edit
, t_P.can_admin
, a_guid
FROM tmp_Product_calc t_P
INNER JOIN partsltd_prod.Shop_Product P ON t_P.id_product = P.id_product
INNER JOIN tmp_Category_calc t_C ON t_P.id_category = t_C.id_category
INNER JOIN partsltd_prod.Shop_Access_Level AL ON P.id_access_level_required = AL.id_access_level
GROUP BY P.id_product, t_P.can_view, t_P.can_edit, t_P.can_admin
;
# Product Permutations
INSERT INTO Shop_Product_Permutation_Temp (
id_permutation
, id_product
, description
, cost_local_VAT_excl
, cost_local_VAT_incl
, id_currency_cost
, profit_local_min
, latency_manufacture
, id_unit_measurement_quantity
, count_unit_measurement_per_quantity_step
, quantity_min
, quantity_max
, quantity_stock
, is_subscription
, id_unit_measurement_interval_recurrence
, count_interval_recurrence
, id_stripe_product
, does_expire_faster_once_unsealed
, id_unit_measurement_interval_expiration_unsealed
, count_interval_expiration_unsealed
, active
, can_view
, can_edit
, can_admin
, guid
)
SELECT
t_PP.id_permutation
, PP.id_product
, PP.description
, PP.cost_local_VAT_excl
, PP.cost_local_VAT_incl
, PP.id_currency_cost
, PP.profit_local_min
, PP.latency_manufacture
, PP.id_unit_measurement_quantity
, PP.count_unit_measurement_per_quantity_step
, PP.quantity_min
, PP.quantity_max
, PP.quantity_stock
, PP.is_subscription
, PP.id_unit_measurement_interval_recurrence
, PP.count_interval_recurrence
, PP.id_stripe_product
, PP.does_expire_faster_once_unsealed
, PP.id_unit_measurement_interval_expiration_unsealed
, PP.count_interval_expiration_unsealed
, PP.active
, IFNULL(t_P.can_view, 0) AS can_view
, IFNULL(t_P.can_edit, 0) AS can_edit
, IFNULL(t_P.can_admin, 0) AS can_admin
, a_guid
FROM tmp_Permutation_calc t_PP
INNER JOIN partsltd_prod.Shop_Product_Permutation PP ON t_PP.id_permutation = PP.id_permutation
INNER JOIN tmp_Product_calc t_P ON t_PP.id_product = t_P.id_product
INNER JOIN partsltd_prod.Shop_Product P ON t_PP.id_product = P.id_product
INNER JOIN partsltd_prod.Shop_Product_Category PC ON P.id_category = PC.id_category
LEFT JOIN partsltd_prod.Shop_Product_Permutation_Variation_Link PPVL ON PP.id_permutation = PPVL.id_permutation
LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM_Q ON PP.id_unit_measurement_quantity = UM_Q.id_unit_measurement
LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM_R ON PP.id_unit_measurement_interval_recurrence = UM_R.id_unit_measurement
LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM_X ON PP.id_unit_measurement_interval_expiration_unsealed = UM_X.id_unit_measurement
INNER JOIN partsltd_prod.Shop_Currency C ON PP.id_currency_cost = C.id_currency
GROUP BY PP.id_permutation, t_P.can_view, t_P.can_edit, t_P.can_admin
;
COMMIT;
END IF;
/*
# Errors
SELECT
t_ME.display_order,
t_ME.guid,
t_ME.id_type,
t_ME.msg,
MET.code,
MET.name,
MET.description
FROM tmp_Msg_Error t_ME
INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET
ON t_ME.id_type = MET.id_type
WHERE guid = a_guid
;
*/
IF a_debug = 1 THEN
SELECT *
FROM tmp_Msg_Error
;
SELECT *
FROM partsltd_prod.Shop_Product_Category_Temp
WHERE GUID = a_guid
;
SELECT *
FROM partsltd_prod.Shop_Product_Temp
WHERE GUID = a_guid
;
SELECT *
FROM partsltd_prod.Shop_Product_Permutation_Temp
WHERE GUID = a_guid
;
CALL p_shop_clear_calc_product_permutation ( a_guid );
END IF;
-- Clean up
-- DROP TEMPORARY TABLE IF EXISTS tmp_Split;
DROP TEMPORARY TABLE IF EXISTS tmp_Permutation_calc;
DROP TEMPORARY TABLE IF EXISTS tmp_Product_calc;
DROP TEMPORARY TABLE IF EXISTS tmp_Category_calc;
IF a_debug = 1 THEN
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END IF;
END //
DELIMITER ;;
/*
CALL partsltd_prod.p_shop_calc_product_permutation (
1 #'auth0|6582b95c895d09a70ba10fef', # a_id_user
, 1 # a_get_all_product_category
, 0 # a_get_inactive_product_category
, '' # a_ids_product_category
, 1 # a_get_all_product
, 0 # a_get_inactive_product
, '' # a_ids_product
, 1 # a_get_all_product_permutation
, 0 # a_get_inactive_permutation
, '' # a_ids_permutation
, 0 # a_get_products_quantity_stock_below_minimum
, 'NIPS ' # a_guid
, 0 # a_debug
);
SELECT *
FROM partsltd_prod.Shop_Product_Category_Temp
WHERE GUID = 'NIPS '
;
SELECT *
FROM partsltd_prod.Shop_Product_Temp
WHERE GUID = 'NIPS '
;
SELECT *
FROM partsltd_prod.Shop_Product_Permutation_Temp
WHERE GUID = 'NIPS '
;
CALL p_shop_clear_calc_product_permutation ( 'NIPS ' );
SELECT *
FROM partsltd_prod.Shop_Product_Category_Temp
WHERE GUID = 'NIPS '
;
SELECT *
FROM partsltd_prod.Shop_Product_Temp
WHERE GUID = 'NIPS '
;
SELECT *
FROM partsltd_prod.Shop_Product_Permutation_Temp
WHERE GUID = 'NIPS '
;
*/--
USE partsltd_prod;
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_get_many_product;
DELIMITER //
CREATE PROCEDURE p_shop_get_many_product (
IN a_id_user INT
, IN a_get_all_product_category BIT
, IN a_get_inactive_product_category BIT
, IN a_ids_product_category VARCHAR(500)
, IN a_get_all_product BIT
, IN a_get_inactive_product BIT
, IN a_ids_product VARCHAR(500)
, IN a_get_all_product_permutation BIT
, IN a_get_inactive_permutation BIT
, IN a_ids_permutation VARCHAR(4000)
, IN a_get_all_image BIT
, IN a_get_inactive_image BIT
, IN a_ids_image VARCHAR(4000)
, IN a_get_products_quantity_stock_below_min BIT
, IN a_debug BIT
)
BEGIN
-- Argument redeclaration
-- Variable declaration
# DECLARE v_has_filter_product_category BIT;
# DECLARE v_has_filter_product BIT;
# DECLARE v_has_filter_permutation BIT;
DECLARE v_has_filter_image BIT;
DECLARE v_guid BINARY(36);
# DECLARE v_id_user VARCHAR(100);
-- DECLARE v_ids_permutation_unavailable VARCHAR(4000);
DECLARE v_id_permission_product INT;
DECLARE v_ids_product_permission VARCHAR(4000);
-- DECLARE v_ids_permutation_permission VARCHAR(4000);
DECLARE v_id_access_level_view INT;
-- DECLARE v_now DATETIME;
DECLARE v_id_minimum INT;
DECLARE v_ids_product_invalid VARCHAR(4000);
DECLARE v_time_start TIMESTAMP(6);
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_guid := UUID();
SET v_id_access_level_view := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'VIEW');
-- Argument validation + default values
SET a_id_user := IFNULL(a_id_user, 0);
SET a_get_all_product_category := IFNULL(a_get_all_product_category, 0);
SET a_get_inactive_product_category := IFNULL(a_get_inactive_product_category, 0);
SET a_ids_product_category := TRIM(IFNULL(a_ids_product_category, ''));
SET a_get_all_product := IFNULL(a_get_all_product, 0);
SET a_get_inactive_product := IFNULL(a_get_inactive_product, 0);
SET a_ids_product := TRIM(IFNULL(a_ids_product, ''));
SET a_get_all_product_permutation := IFNULL(a_get_all_product_permutation, 0);
SET a_get_inactive_permutation := IFNULL(a_get_inactive_permutation, 0);
SET a_ids_permutation := TRIM(IFNULL(a_ids_permutation, ''));
SET a_get_all_image := IFNULL(a_get_all_image, 0);
SET a_get_inactive_image := IFNULL(a_get_inactive_image, 0);
SET a_ids_image := TRIM(IFNULL(a_ids_image, ''));
SET a_get_products_quantity_stock_below_min := IFNULL(a_get_products_quantity_stock_below_min, 0);
SET a_debug := IFNULL(a_debug, 0);
IF a_debug = 1 THEN
SELECT
a_id_user
, a_get_all_product_category, a_ids_product_category, a_get_inactive_product_category
, a_get_all_product, a_get_inactive_product, a_ids_product
, a_get_all_product_permutation, a_get_inactive_permutation, a_ids_permutation
, a_get_all_image, a_get_inactive_image, a_ids_image
, a_get_products_quantity_stock_below_min
, a_debug
;
END IF;
-- Temporary tables
DROP TEMPORARY TABLE IF EXISTS tmp_Split;
DROP TEMPORARY TABLE IF EXISTS tmp_Image;
DROP TEMPORARY TABLE IF EXISTS tmp_Category;
DROP TEMPORARY TABLE IF EXISTS tmp_Permutation;
DROP TEMPORARY TABLE IF EXISTS tmp_Product;
CREATE TEMPORARY TABLE tmp_Category (
id_category INT NOT NULL
/*
active BIT NOT NULL
*/
, display_order INT NOT NULL
);
CREATE TEMPORARY TABLE tmp_Product (
id_category INT NOT NULL
, id_product INT NOT NULL
, display_order INT NOT NULL
/*
active BIT NOT NULL,
*/
, can_view BIT
, can_edit BIT
, can_admin BIT
);
CREATE TEMPORARY TABLE tmp_Permutation (
id_permutation INT NULL
-- id_category INT NOT NULL,
, id_product INT NOT NULL
-- , active BIT NOT NULL
-- , display_order INT NOT NULL
);
CREATE TEMPORARY TABLE tmp_Image (
id_image INT NOT NULL
-- id_product INT NOT NULL,
, id_permutation INT NULL
/*
active BIT NOT NULL
display_order INT NOT NULL
-- rank_in_product_permutation INT NOT NULL
*/
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
-- guid BINARY(36) NOT NULL,
id_type INT NULL,
code VARCHAR(50) NOT NULL,
msg VARCHAR(4000) NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split (
substring VARCHAR(4000) NOT NULL
, as_int INT NULL
);
DELETE FROM tmp_Split;
-- Parse filters
-- CALL p_validate_guid ( v_guid );
-- SET v_has_filter_product_category = CASE WHEN a_ids_product_category = '' THEN 0 ELSE 1 END;
-- SET v_has_filter_product = CASE WHEN a_ids_product = '' THEN 0 ELSE 1 END;
-- SET v_has_filter_permutation = CASE WHEN a_ids_permutation = '' THEN 0 ELSE 1 END;
SET v_has_filter_image = CASE WHEN a_ids_image = '' THEN 0 ELSE 1 END;
-- select v_has_filter_product, v_has_filter_permutation;
CALL partsltd_prod.p_shop_calc_product_permutation (
a_id_user
, a_get_all_product_category
, a_get_inactive_product_category
, a_ids_product_category
, a_get_all_product
, a_get_inactive_product
, a_ids_product
, a_get_all_product_permutation
, a_get_inactive_permutation
, a_ids_permutation
, a_get_products_quantity_stock_below_min
, v_guid -- a_guid
, 0 -- a_debug
);
INSERT INTO tmp_Category (
id_category
/*
active,
*/
, display_order
)
SELECT
PC.id_category
/*
PC.active,
*/
, PC.display_order
FROM (SELECT * FROM partsltd_prod.Shop_Product_Category_Temp WHERE GUID = v_guid) PC_T
INNER JOIN partsltd_prod.Shop_Product_Category PC ON PC_T.id_category = PC.id_category
;
INSERT INTO tmp_Product (
id_product
, id_category
/*
active
*/
, display_order
)
SELECT
P.id_product
, P.id_category
-- P.active,
, P.display_order
FROM (SELECT * FROM partsltd_prod.Shop_Product_Temp WHERE GUID = v_guid) P_T
INNER JOIN partsltd_prod.Shop_Product P ON P.id_product = P_T.id_product
;
INSERT INTO tmp_Permutation (
id_permutation
-- id_category,
, id_product
-- , active
-- , display_order
)
SELECT
PP.id_permutation
-- P.id_category,
, PP.id_product
-- , PP.active
-- , RANK() OVER (ORDER BY VT.display_order, V.display_order)
FROM (SELECT * FROM partsltd_prod.Shop_Product_Permutation_Temp WHERE GUID = v_guid) PP_T
INNER JOIN partsltd_prod.Shop_Product_Permutation PP ON PP_T.id_permutation = PP.id_permutation
;
# Product Images
IF (v_has_filter_image = 1 AND NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1)) THEN
CALL partsltd_prod.p_split(v_guid, a_ids_image, ',', a_debug);
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM partsltd_prod.Split_Temp
WHERE 1=1
AND GUID = v_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( v_guid );
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Product_Image I ON t_S.as_int = I.id_image
WHERE
ISNULL(t_S.as_int)
OR ISNULL(I.id_image)
) THEN
INSERT INTO tmp_Msg_Error (
-- guid,
id_type,
code,
msg
)
SELECT
-- v_guid,
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive image IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Product_Image I ON t_S.as_int = I.id_image
WHERE
ISNULL(t_S.as_int)
OR ISNULL(I.id_image)
-- OR PC.active = 0
;
ELSE
INSERT INTO tmp_Image (
id_image
, id_permutation
)
SELECT
I.id_image
, I.id_permutation
FROM tmp_Split t_S
RIGHT JOIN partsltd_prod.Shop_Product_Image I ON t_S.as_int = I.id_image
INNER JOIN tmp_Permutation t_PP ON I.id_permutation = t_PP.id_permutation
WHERE
(
a_get_all_image = 1
OR NOT ISNULL(t_S.as_int)
)
AND (
a_get_inactive_image = 1
OR I.active = 1
)
;
END IF;
END IF;
DELETE FROM tmp_Split;
-- Outputs
# Categories
SELECT
-- DISTINCT
t_C.id_category
, PC.code
, PC.name
, PC.description
, PC.id_access_level_required
, AL.name AS name_access_level_required
, PC.display_order
, PC.active
, MIN(t_P.can_view) AS can_view
, MIN(t_P.can_edit) AS can_edit
, MIN(t_P.can_admin) AS can_admin
FROM tmp_Category t_C
INNER JOIN partsltd_prod.Shop_Product_Category PC ON t_C.id_category = PC.id_category
LEFT JOIN tmp_Product t_P ON t_C.id_category = t_P.id_product
INNER JOIN partsltd_prod.Shop_Access_Level AL ON PC.id_access_level_required = AL.id_access_level
GROUP BY t_C.id_category -- , t_P.id_product
ORDER BY PC.display_order
;
# Products
SELECT
t_P.id_product,
P.id_category,
P.name,
P.has_variations,
P.id_access_level_required,
AL.name AS name_access_level_required,
P.active,
P.display_order,
t_P.can_view,
t_P.can_edit,
t_P.can_admin
FROM tmp_Product t_P
INNER JOIN partsltd_prod.Shop_Product P ON t_P.id_product = P.id_product
INNER JOIN tmp_Category t_C ON t_P.id_category = t_C.id_category
INNER JOIN partsltd_prod.Shop_Access_Level AL ON P.id_access_level_required = AL.id_access_level
GROUP BY t_P.id_category, t_C.display_order, t_P.id_product, t_P.can_view, t_P.can_edit, t_P.can_admin
ORDER BY t_C.display_order, P.display_order
;
# Product Permutations
SELECT
t_PP.id_permutation,
PP.id_product,
P.id_category,
PP.description,
PP.cost_local_VAT_excl,
PP.cost_local_VAT_incl,
PP.id_currency_cost,
C.code AS code_currency_cost,
C.symbol AS symbol_currency_cost,
PP.profit_local_min,
PP.latency_manufacture,
PP.id_unit_measurement_quantity,
UM_Q.symbol AS symbol_unit_measurement_quantity,
UM_Q.symbol_is_suffix_not_prefix AS symbol_is_suffix_not_prefix_unit_measurement_quantity,
UM_Q.name_singular AS name_singular_unit_measurement_quantity,
UM_Q.name_plural AS name_plural_unit_measurement_quantity,
PP.count_unit_measurement_per_quantity_step,
PP.quantity_min,
PP.quantity_max,
PP.quantity_stock,
PP.is_subscription,
PP.id_unit_measurement_interval_recurrence,
UM_R.symbol AS symbol_unit_measurement_interval_recurrence,
UM_R.symbol_is_suffix_not_prefix AS symbol_is_suffix_not_prefix_unit_measurement_interval_recurrence,
UM_R.name_singular AS name_singular_unit_measurement_interval_recurrence,
UM_R.name_plural AS name_plural_unit_measurement_interval_recurrence,
PP.count_interval_recurrence,
PP.id_stripe_product,
PP.does_expire_faster_once_unsealed,
PP.id_unit_measurement_interval_expiration_unsealed,
UM_X.symbol AS symbol_unit_measurement_interval_expiration_unsealed,
UM_X.symbol_is_suffix_not_prefix AS symbol_is_suffix_not_prefix_unit_measurement_interval_expiration_unsealed,
UM_X.name_singular AS name_singular_unit_measurement_interval_expiration_unsealed,
UM_X.name_plural AS name_plural_unit_measurement_interval_expiration_unsealed,
PP.count_interval_expiration_unsealed,
NOT ISNULL(PPVL.id_permutation) AS has_variations,
PP.active,
-- PP.display_order,
IFNULL(t_P.can_view, 0) AS can_view,
IFNULL(t_P.can_edit, 0) AS can_edit,
IFNULL(t_P.can_admin, 0) AS can_admin
FROM tmp_Permutation t_PP
INNER JOIN partsltd_prod.Shop_Product_Permutation PP ON t_PP.id_permutation = PP.id_permutation
INNER JOIN tmp_Product t_P ON t_PP.id_product = t_P.id_product
INNER JOIN partsltd_prod.Shop_Product P ON t_PP.id_product = P.id_product
INNER JOIN partsltd_prod.Shop_Product_Category PC ON P.id_category = PC.id_category
LEFT JOIN partsltd_prod.Shop_Product_Permutation_Variation_Link PPVL ON PP.id_permutation = PPVL.id_permutation
LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM_Q ON PP.id_unit_measurement_quantity = UM_Q.id_unit_measurement
LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM_R ON PP.id_unit_measurement_interval_recurrence = UM_R.id_unit_measurement
LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM_X ON PP.id_unit_measurement_interval_expiration_unsealed = UM_X.id_unit_measurement
INNER JOIN partsltd_prod.Shop_Currency C ON PP.id_currency_cost = C.id_currency
GROUP BY PC.id_category, P.id_product, PP.id_permutation, t_P.can_view, t_P.can_edit, t_P.can_admin
ORDER BY PC.display_order, P.display_order -- , t_PP.display_order
;
# Variations
SELECT
V.id_variation
, V.id_type
, V.code AS code_variation
, V.name AS name_variation
, V.display_order AS display_order_variation
, V.active AS active_variation
, VT.code AS code_variation_type
, VT.name AS name_variation_type
, VT.name_plural AS name_plural_variation_type
, VT.display_order AS display_order_variation_type
, VT.active AS active_variation_type
, t_P.id_product
, t_PP.id_permutation
, t_C.id_category
FROM partsltd_prod.Shop_Variation V
INNER JOIN partsltd_prod.Shop_Variation_Type VT ON V.id_type = VT.id_type
INNER JOIN partsltd_prod.Shop_Product_Permutation_Variation_Link PPVL ON V.id_variation = PPVL.id_variation
INNER JOIN tmp_Permutation t_PP ON PPVL.id_permutation = t_PP.id_permutation
INNER JOIN tmp_Product t_P ON t_PP.id_product = t_P.id_product
INNER JOIN tmp_Category t_C ON t_P.id_category = t_C.id_category
WHERE
V.active
AND PPVL.active
;
# Images
SELECT
t_I.id_image,
t_PP.id_product,
t_I.id_permutation,
t_C.id_category,
I.url,
I.active,
I.display_order
FROM tmp_Image t_I
INNER JOIN partsltd_prod.Shop_Product_Image I ON t_I.id_image = I.id_image
INNER JOIN tmp_Permutation t_PP ON t_I.id_permutation = t_PP.id_permutation
INNER JOIN tmp_Product t_P ON t_PP.id_product = t_P.id_product
INNER JOIN tmp_Category t_C ON t_P.id_category = t_C.id_category
ORDER BY t_C.display_order, t_P.display_order, I.display_order
;
# Errors
SELECT *
/*
t_ME.display_order,
t_ME.guid,
t_ME.id_type,
t_ME.msg,
MET.code,
MET.name,
MET.description
*/
FROM tmp_Msg_Error t_ME
INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type
-- WHERE guid = v_guid
;
IF a_debug = 1 THEN
SELECT * FROM tmp_Category;
SELECT * FROM tmp_Product;
SELECT * FROM tmp_Permutation;
SELECT * FROM tmp_Image;
END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_Split;
DROP TEMPORARY TABLE IF EXISTS tmp_Image;
DROP TEMPORARY TABLE IF EXISTS tmp_Category;
DROP TEMPORARY TABLE IF EXISTS tmp_Permutation;
DROP TEMPORARY TABLE IF EXISTS tmp_Product;
CALL partsltd_prod.p_shop_clear_calc_product_permutation ( v_guid );
IF a_debug = 1 THEN
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END IF;
END //
DELIMITER ;;
/*
CALL partsltd_prod.p_shop_get_many_product (
1 #'auth0|6582b95c895d09a70ba10fef', # a_id_user
, 1 # a_get_all_product_category
, 0 # a_get_inactive_product_category
, '' # a_ids_product_category
, 1 # a_get_all_product
, 0 # a_get_inactive_product
, '' # a_ids_product
, 1 # a_get_all_product_permutation
, 0 # a_get_inactive_permutation
, '' # a_ids_permutation
, 1 # a_get_all_image
, 0 # a_get_inactive_image
, '' # a_ids_image
, 0 # a_get_products_quantity_stock_below_minimum
, 0 # a_debug
);
select * FROM partsltd_prod.Shop_Calc_User_Temp;
select * FROM partsltd_prod.Shop_Product_Category;
select * FROM partsltd_prod.Shop_Product_Permutation;
select * FROM partsltd_prod.Shop_product_change_set;
insert into shop_product_change_set ( comment ) values ('set stock quantities below minimum for testing');
update shop_product_permutation
set quantity_stock = 0,
id_change_set = (select id_change_set FROM partsltd_prod.Shop_product_change_set order by id_change_set desc limit 1)
where id_permutation < 5
DROP TABLE IF EXISTS tmp_Msg_Error;
select * FROM partsltd_prod.Shop_image;
select * FROM partsltd_prod.Shop_product;
select * from TMP_MSG_ERROR;
DROP TABLE TMP_MSG_ERROR;
insert into shop_product_change_set (comment)
values ('set product not subscription - test bool output to python');
update shop_product
set is_subscription = 0,
id_change_set = (select id_change_set FROM partsltd_prod.Shop_product_change_set order by id_change_set desc limit 1)
where id_product = 1
select * FROM partsltd_prod.Shop_Calc_User_Temp;
select distinct guid
-- DELETE
FROM partsltd_prod.Shop_Calc_User_Temp;
*/
/*
CALL p_shop_get_many_stripe_product_new (
''
)
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_get_many_stripe_product_new;
DELIMITER //
CREATE PROCEDURE p_shop_get_many_stripe_product_new (
IN a_id_user INT
)
BEGIN
DECLARE v_has_filter_user BIT;
DECLARE v_code_error_data VARCHAR(200);
DECLARE v_code_error_permission VARCHAR(200);
DECLARE v_guid BINARY(36);
SET v_code_error_data := (SELECT code FROM Shop_Msg_Error_Type WHERE id_type = 1);
SET v_code_error_permission := (SELECT code FROM Shop_Msg_Error_Type WHERE id_type = 2);
SET v_guid = UUID();
IF a_id_user IS NULL THEN
SET a_id_user = '';
ELSE
SET a_id_user = TRIM(a_id_user);
END IF;
-- Temporary tables
DROP TABLE IF EXISTS tmp_Shop_Product;
DROP TABLE IF EXISTS tmp_Shop_User;
CREATE TABLE tmp_Shop_User(
id_user INT NOT NULL PRIMARY KEY,
CONSTRAINT FK_tmp_Shop_User_id_user
FOREIGN KEY (id_user)
REFERENCES Shop_User(id_user),
active BIT NOT NULL
);
CREATE TABLE tmp_Shop_Product (
id_product INT NOT NULL,
CONSTRAINT FK_tmp_Shop_Product_id_product
FOREIGN KEY (id_product)
REFERENCES Shop_Product(id_product),
id_permutation INT NULL,
CONSTRAINT FK_tmp_Shop_Product_id_permutation
FOREIGN KEY (id_permutation)
REFERENCES Shop_Product_Permutation(id_permutation),
active BIT NOT NULL,
display_order_product INT NOT NULL,
display_order_permutation INT NOT NULL,
name VARCHAR(200) NOT NULL,
description VARCHAR(4000) NOT NULL
);
CREATE TABLE IF NOT EXISTS tmp_Msg_Error ( # IF NOT EXISTS
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
guid BINARY(36) NOT NULL,
code VARCHAR(50) NOT NULL,
# CONSTRAINT chk_tmp_Msg_Error_code CHECK (code IN (SELECT code FROM Shop_Msg_Error_Type)),
/*
id_type INT NOT NULL,
CONSTRAINT FK_tmp_Msg_Error_id_type
FOREIGN KEY (id_type)
REFERENCES Shop_Msg_Error_Type(id_type),
*/
msg VARCHAR(4000) NOT NULL
);
-- Parse filters
SET v_has_filter_user = CASE WHEN a_id_user = '' THEN 0 ELSE 1 END;
-- User
IF v_has_filter_user THEN
INSERT INTO tmp_Shop_User (
id_user,
active
)
SELECT id_user,
active
FROM Shop_User
WHERE id_user LIKE CONCAT('%', a_id_user, '%')
AND active
LIMIT 1
;
SET v_has_filter_user = EXISTS (SELECT id_user FROM tmp_Shop_User LIMIT 1);
SET a_id_user := (SELECT id_user FROM tmp_Shop_User LIMIT 1);
END IF;
IF NOT v_has_filter_user THEN
INSERT INTO tmp_Msg_Error (
guid,
code,
msg
)
VALUES (
v_guid,
v_code_error_data,
'User ID not valid.'
)
;
END IF;
-- Get products
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN
INSERT INTO tmp_Shop_Product (
id_product,
id_permutation,
active,
display_order_product,
display_order_permutation,
name,
description
)
SELECT id_product,
id_permutation,
active,
display_order_product,
display_order_permutation,
name,
description
FROM (
SELECT id_product,
NULL AS id_permutation,
active,
display_order AS display_order_product,
NULL AS display_order_permutation,
name,
description,
id_stripe_product
FROM Shop_Product P
UNION
SELECT t_PPPV.id_product,
id_permutation,
t_PPPV.active,
display_order_product,
display_order_permutation,
CONCAT(P.name, ': ', names_variation) AS name,
CONCAT(P.description, ' With variations: ', type_name_pairs_variation) AS description,
t_PPPV.id_stripe_product
FROM (
SELECT P.id_product,
PP.id_permutation,
PP.active,
P.display_order AS display_order_product,
PP.display_order AS display_order_permutation,
GROUP_CONCAT(V.name SEPARATOR ' ') AS names_variation,
GROUP_CONCAT(CONCAT(VT.name, ': ', V.name) SEPARATOR ', ') AS type_name_pairs_variation,
PP.id_stripe_product
FROM Shop_Product_Permutation PP
INNER JOIN Shop_Product P
ON PP.id_product = P.id_product
AND P.active
INNER JOIN Shop_Product_Permutation_Variation_Link PPVL
ON PP.id_permutation = PPVL.id_permutation
AND PPVL.active
INNER JOIN Shop_Variation V
ON PPVL.id_variation = V.id_variation
AND V.active
INNER JOIN Shop_Variation_Type VT
ON V.id_type = VT.id_type
AND VT.active
GROUP BY id_product, id_permutation -- , VT.id_type, V.id_variation
) t_PPPV
INNER JOIN Shop_Product P
ON t_PPPV.id_product = P.id_product
) t_PPP
WHERE ISNULL(id_stripe_product)
AND active
;
END IF;
-- Permissions
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN
CALL p_shop_calc_user (
v_guid, # a_guid
a_id_user, # a_id_user
0, # a_get_inactive_users
CONVERT((SELECT id_permission FROM Shop_Permission WHERE 'STORE_ADMIN' = code), CHAR), # a_ids_permission
(SELECT id_access_level FROM Shop_Access_Level WHERE code = 'ADMIN' AND active), # a_ids_access_level
(SELECT GROUP_CONCAT(id_product SEPARATOR ',') From tmp_Shop_Product), # a_ids_product
(SELECT GROUP_CONCAT(id_permutation SEPARATOR ',') From tmp_Shop_Product) # a_ids_permutation -- WHERE NOT ISNULL(id_permutation)
);
IF EXISTS (SELECT can_admin FROM Shop_Calc_User_Temp WHERE guid = v_guid AND NOT can_admin) THEN
INSERT INTO tmp_Msg_Error (
guid,
code,
msg
)
VALUES (
v_guid,
v_code_error_permission,
'User ID does not have permission to get all new stripe products.'
)
;
END IF;
DELETE FROM Shop_Calc_User_Temp
WHERE guid = v_guid
;
END IF;
-- Returns
/*
SELECT *
FROM tmp_Shop_User
;
*/
IF EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN
DELETE FROM tmp_Shop_Product;
END IF;
SELECT id_product,
id_permutation,
name,
description
FROM tmp_Shop_Product
ORDER BY display_order_product, display_order_permutation
;
SELECT PP.id_permutation,
V.id_variation,
V.name AS name_variation,
VT.id_type AS id_type_variation,
VT.name as name_variation_type
FROM tmp_Shop_Product t_P
INNER JOIN Shop_Product_Permutation PP
ON t_P.id_permutation = PP.id_permutation
INNER JOIN Shop_Product_Permutation_Variation_Link PPVL
ON PP.id_permutation = PPVL.id_permutation
AND PPVL.active
INNER JOIN Shop_Variation V
ON PPVL.id_variation = V.id_variation
AND V.active
INNER JOIN Shop_Variation_Type VT
ON V.id_type = VT.id_type
AND VT.active
;
# Errors
SELECT *
FROM tmp_Msg_Error
WHERE guid = v_guid
;
/*
# Return arguments for test
SELECT
a_id_user
;
*/
-- Clean up
DROP TABLE IF EXISTS tmp_Shop_Product;
DROP TABLE IF EXISTS tmp_Shop_User;
END //
DELIMITER ;;
/*
CALL p_shop_get_many_stripe_product_new (
''
);
CALL p_shop_get_many_stripe_product_new (
'auth0|6582b95c895d09a70ba10fef'
);
select * from shop_product;
select * from shop_product_permutation_variation_link;
CALL p_shop_calc_user (
'ead789a1-c7ac-11ee-a256-b42e9986184a', # a_guid
'auth0|6582b95c895d09a70ba10fef', # a_id_user
0, # a_get_inactive_users
'4', # a_ids_permission
'3', # a_ids_access_level
'1', # a_ids_product
'1' # a_ids_permutation -- WHERE NOT ISNULL(id_permutation)
);
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_save_permutation;
DROP PROCEDURE IF EXISTS p_shop_save_product_permutation;
DELIMITER //
CREATE PROCEDURE p_shop_save_product_permutation (
IN a_comment VARCHAR(500),
IN a_guid BINARY(36),
IN a_id_user INT,
IN a_debug BIT
)
BEGIN
DECLARE v_code_type_error_bad_data VARCHAR(100);
DECLARE v_id_type_error_bad_data INT;
DECLARE v_id_permission_product INT;
DECLARE v_ids_product_permission LONGTEXT;
DECLARE v_id_change_set INT;
DECLARE v_id_access_level_edit INT;
DECLARE v_time_start TIMESTAMP(6);
DECLARE exit handler for SQLEXCEPTION
BEGIN
-- Get diagnostic information
GET DIAGNOSTICS CONDITION 1
@sqlstate = RETURNED_SQLSTATE
, @errno = MYSQL_ERRNO
, @text = MESSAGE_TEXT
;
-- Rollback the transaction
ROLLBACK;
-- Select the error information
-- SELECT 'Error' AS status, @errno AS error_code, @sqlstate AS sql_state, @text AS message;
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NULL
, code VARCHAR(50) NOT NULL
, msg VARCHAR(4000) NOT NULL
);
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
MET.id_type
, @errno
, @text
FROM partsltd_prod.Shop_Msg_Error_Type MET
WHERE MET.code = 'MYSQL_ERROR'
LIMIT 1
;
SELECT *
FROM tmp_Msg_Error;
DROP TABLE IF EXISTS tmp_Msg_Error;
END;
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_code_type_error_bad_data := 'BAD_DATA';
SET v_id_type_error_bad_data := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1);
SET v_id_access_level_edit := (SELECT id_access_level FROM Shop_Access_Level WHERE code = 'EDIT' LIMIT 1);
CALL p_validate_guid ( a_guid );
DROP TEMPORARY TABLE tmp_Permutation_Variation_Link;
DROP TEMPORARY TABLE IF EXISTS tmp_Permutation;
CREATE TEMPORARY TABLE tmp_Permutation (
id_permutation INT NOT NULL
, id_permutation_temp INT NOT NULL
, id_product INT NOT NULL
, csv_id_pairs_variation VARCHAR(4000) NULL
, description VARCHAR(4000) NOT NULL
, cost_local_VAT_excl FLOAT NULL
, cost_local_VAT_incl FLOAT NULL
, id_currency_cost INT NOT NULL
, profit_local_min FLOAT NULL
, latency_manufacture INT NOT NULL
, id_unit_measurement_quantity INT NOT NULL
, count_unit_measurement_per_quantity_step FLOAT NOT NULL
, quantity_min FLOAT NULL
, quantity_max FLOAT NULL
, quantity_stock FLOAT NOT NULL
, is_subscription BIT NOT NULL
, id_unit_measurement_interval_recurrence INT
, count_interval_recurrence INT
, id_stripe_product VARCHAR(100) NULL
, does_expire_faster_once_unsealed BIT NOT NULL
, id_unit_measurement_interval_expiration_unsealed INT
, count_interval_expiration_unsealed INT
, active BIT NOT NULL DEFAULT 1
, can_view BIT NULL
, can_edit BIT NULL
, can_admin BIT NULL
, name_error VARCHAR(255) NOT NULL
, is_new BIT NOT NULL
);
CREATE TEMPORARY TABLE tmp_Permutation_Variation_Link (
id_link INT NOT NULL
, id_permutation INT NOT NULL
, id_variation_type INT NOT NULL
, id_variation INT NOT NULL
, active BIT NOT NULL
, display_order INT NOT NULL
, is_new BIT NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NULL
, code VARCHAR(50) NOT NULL
, msg VARCHAR(4000) NOT NULL
);
-- Get data from Temp table
INSERT INTO tmp_Permutation (
id_permutation
, id_permutation_temp
, id_product
, csv_id_pairs_variation
, description
, cost_local_VAT_excl
, cost_local_VAT_incl
, id_currency_cost
, profit_local_min
, latency_manufacture
, id_unit_measurement_quantity
, count_unit_measurement_per_quantity_step
, quantity_min
, quantity_max
, quantity_stock
, is_subscription
, id_unit_measurement_interval_recurrence
, count_interval_recurrence
, id_stripe_product
, does_expire_faster_once_unsealed
, id_unit_measurement_interval_expiration_unsealed
, count_interval_expiration_unsealed
, active
, name_error
, is_new
)
SELECT
PP_T.id_permutation
, PP_T.id_permutation
, IFNULL(PP_T.id_product, PP.id_product) AS id_product
, PP_T.csv_id_pairs_variation
, IFNULL(PP_T.description, PP.description) AS description
, IFNULL(PP_T.cost_local_VAT_excl, PP.cost_local_VAT_excl) AS cost_local_VAT_excl
, IFNULL(PP_T.cost_local_VAT_incl, PP.cost_local_VAT_incl) AS cost_local_VAT_incl
, IFNULL(PP_T.id_currency_cost, PP.id_currency_cost) AS a_id_currency_cost
, IFNULL(PP_T.profit_local_min, PP.profit_local_min) AS profit_local_min
, IFNULL(PP_T.latency_manufacture, PP.latency_manufacture) AS latency_manufacture
, IFNULL(PP_T.id_unit_measurement_quantity, PP.id_unit_measurement_quantity) AS id_unit_measurement_quantity
, IFNULL(PP_T.count_unit_measurement_per_quantity_step, PP.count_unit_measurement_per_quantity_step) AS count_unit_measurement_per_quantity_step
, IFNULL(PP_T.quantity_min, PP.quantity_min) AS quantity_min
, IFNULL(PP_T.quantity_max, PP.quantity_max) AS quantity_max
, IFNULL(PP_T.quantity_stock, PP.quantity_stock) AS quantity_stock
, IFNULL(PP_T.is_subscription, PP.is_subscription) AS is_subscription
, IFNULL(PP_T.id_unit_measurement_interval_recurrence, PP.id_unit_measurement_interval_recurrence) AS id_unit_measurement_interval_recurrence
, IFNULL(PP_T.count_interval_recurrence, PP.count_interval_recurrence) AS count_interval_recurrence
, IFNULL(PP_T.id_stripe_product, PP.id_stripe_product) AS id_stripe_product
, IFNULL(PP_T.does_expire_faster_once_unsealed, PP.does_expire_faster_once_unsealed) AS does_expire_faster_once_unsealed
, IFNULL(PP_T.id_unit_measurement_interval_expiration_unsealed, PP.id_unit_measurement_interval_expiration_unsealed) AS id_unit_measurement_interval_expiration_unsealed
, IFNULL(PP_T.count_interval_expiration_unsealed, PP.count_interval_expiration_unsealed) AS count_interval_expiration_unsealed
, IFNULL(PP_T.active, PP.active) AS active
, IFNULL(fn_shop_get_product_permutation_name(PP_T.id_permutation), '(No Permutation)') AS name_error
, CASE WHEN IFNULL(PP_T.id_permutation, 0) < 1 THEN 1 ELSE 0 END AS is_new
FROM Shop_Product_Permutation_Temp PP_T
LEFT JOIN Shop_Product_Permutation PP ON PP_T.id_permutation = PP.id_permutation
WHERE PP_T.guid = a_guid
;
select 'nips';
SELECT
partsltd_prod.fn_shop_get_product_variations_from_id_csv_list(
t_PP.id_permutation -- a_id_permutation
, t_PP.csv_id_pairs_variation -- a_variation_csv
, a_guid -- a_guid
)
FROM tmp_Permutation t_PP
WHERE NOT ISNULL(t_PP.csv_id_pairs_variation)
;
INSERT INTO tmp_Permutation_Variation_Link (
id_link
, id_permutation
, id_variation
, display_order
, active
, is_new
)
SELECT
PPVL_T.id_link
, PPVL_T.id_permutation
, PPVL_T.id_variation
, PPVL_T.display_order
, ISNULL(PPVL_T.id_link) AS active
, IFNULL(PPVL_T.id_link, 0) < 1 AS is_new
FROM partsltd_prod.Shop_Product_Permutation_Variation_Link_Temp PPVL_T
RIGHT JOIN partsltd_prod.Shop_Product_Permutation_Variation_Link PPVL ON PPVL_T.id_link = PPVL.id_variation
INNER JOIN tmp_Permutation t_PP ON PPVL_T.id_permutation = t_PP.id_permutation
;
select 'lips';
-- Validation
-- Missing mandatory fields
-- id_product
IF EXISTS (SELECT * FROM tmp_Permutation t_P WHERE ISNULL(t_P.id_product) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following product permutation(s) do not have a product: ', GROUP_CONCAT(t_P.name_error SEPARATOR ', ')) AS msg
FROM tmp_Permutation t_P
WHERE ISNULL(t_P.id_product)
;
END IF;
-- cost_local_VAT_excl
IF EXISTS (SELECT * FROM tmp_Permutation t_P WHERE NOT ISNULL(t_P.cost_local_VAT_excl) AND t_P.cost_local_VAT_excl < 0 LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following product permutation(s) do not have a valid local cost excluding VAT: ', GROUP_CONCAT(t_P.name_error SEPARATOR ', ')) AS msg
FROM tmp_Permutation t_P
WHERE NOT ISNULL(t_P.cost_local_VAT_excl) AND t_P.cost_local_VAT_excl < 0
;
END IF;
-- cost_local_VAT_incl
IF EXISTS (SELECT * FROM tmp_Permutation t_P WHERE NOT ISNULL(t_P.cost_local_VAT_incl) AND t_P.cost_local_VAT_incl < 0 LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following product permutation(s) do not have a valid local cost including VAT: ', GROUP_CONCAT(t_P.name_error SEPARATOR ', ')) AS msg
FROM tmp_Permutation t_P
WHERE NOT ISNULL(t_P.cost_local_VAT_incl) AND t_P.cost_local_VAT_incl < 0
;
END IF;
-- profit_local_min
IF EXISTS (SELECT * FROM tmp_Permutation t_P WHERE NOT ISNULL(t_P.profit_local_min) AND t_P.profit_local_min < 0 LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following product permutation(s) do not have a local minimum profit: ', GROUP_CONCAT(t_P.name_error SEPARATOR ', ')) AS msg
FROM tmp_Permutation t_P
WHERE NOT ISNULL(t_P.profit_local_min) AND t_P.profit_local_min < 0
;
END IF;
SELECT 'NIPS';
-- latency_manufacture
IF EXISTS (SELECT * FROM tmp_Permutation t_P WHERE ISNULL(t_P.latency_manufacture) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following product permutation(s) do not have a manufacturing latency: ', GROUP_CONCAT(t_P.name_error SEPARATOR ', ')) AS msg
FROM tmp_Permutation t_P
WHERE ISNULL(t_P.latency_manufacture)
;
END IF;
-- id_unit_measurement_quantity
IF EXISTS (SELECT * FROM tmp_Permutation t_P WHERE ISNULL(t_P.id_unit_measurement_quantity) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following product permutation(s) do not have a unit measurement for stock quantities: ', GROUP_CONCAT(t_P.name_error SEPARATOR ', ')) AS msg
FROM tmp_Permutation t_P
WHERE ISNULL(t_P.id_unit_measurement_quantity)
;
END IF;
-- count_unit_measurement_per_quantity_step
IF EXISTS (SELECT * FROM tmp_Permutation t_P WHERE ISNULL(t_P.count_unit_measurement_per_quantity_step) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following product permutation(s) do not have a count unit measurement per quantity step: ', GROUP_CONCAT(t_P.name_error SEPARATOR ', ')) AS msg
FROM tmp_Permutation t_P
WHERE ISNULL(t_P.count_unit_measurement_per_quantity_step)
;
END IF;
-- quantity_min
IF EXISTS (SELECT * FROM tmp_Permutation t_P WHERE ISNULL(t_P.quantity_min) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following product permutation(s) do not have a minimum quantity: ', GROUP_CONCAT(t_P.name_error SEPARATOR ', ')) AS msg
FROM tmp_Permutation t_P
WHERE ISNULL(t_P.quantity_min)
;
END IF;
-- quantity_max
IF EXISTS (SELECT * FROM tmp_Permutation t_P WHERE ISNULL(t_P.quantity_max) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following product permutation(s) do not have a maximum quantity: ', GROUP_CONCAT(t_P.name_error SEPARATOR ', ')) AS msg
FROM tmp_Permutation t_P
WHERE ISNULL(t_P.quantity_max)
;
END IF;
-- is_subscription
IF EXISTS (SELECT * FROM tmp_Permutation t_P WHERE ISNULL(t_P.is_subscription) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following product permutation(s) do not have an is subscription?: ', GROUP_CONCAT(t_P.name_error SEPARATOR ', ')) AS msg
FROM tmp_Permutation t_P
WHERE ISNULL(t_P.is_subscription)
;
END IF;
-- does_expire_faster_once_unsealed
IF EXISTS (SELECT * FROM tmp_Permutation t_P WHERE ISNULL(t_P.does_expire_faster_once_unsealed) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following product permutation(s) do not have a does expire faster once unsealed: ', GROUP_CONCAT(t_P.name_error SEPARATOR ', ')) AS msg
FROM tmp_Permutation t_P
WHERE ISNULL(t_P.does_expire_faster_once_unsealed)
;
END IF;
-- Permissions
SET v_ids_product_permission := (
SELECT GROUP_CONCAT(P.id_product SEPARATOR ',')
FROM Shop_Product P
INNER JOIN tmp_Permutation t_P
ON P.id_product = t_P.id_product
-- AND t_P.is_new = 0
);
SET v_id_permission_product = (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_PRODUCT' LIMIT 1);
IF a_debug = 1 THEN
SELECT
a_guid
, a_id_user
, FALSE AS a_get_inactive_user
, v_id_permission_product
, v_id_access_level_edit
, v_ids_product_permission
, 0 AS a_debug
;
END IF;
CALL p_shop_calc_user(
a_guid
, a_id_user
, FALSE -- a_get_inactive_user
, v_id_permission_product
, v_id_access_level_edit
, v_ids_product_permission
, 0 -- a_debug
);
UPDATE tmp_Permutation t_P
INNER JOIN Shop_Product P ON t_P.id_product = P.id_product
INNER JOIN Shop_Calc_User_Temp UE_T
ON P.id_product = UE_T.id_product
AND UE_T.GUID = a_guid
SET
t_P.can_view = UE_T.can_view
, t_P.can_edit = UE_T.can_edit
, t_P.can_admin = UE_T.can_admin
;
CALL p_shop_clear_calc_user(
a_guid
, 0 -- a_debug
);
IF EXISTS (SELECT * FROM tmp_Permutation t_P WHERE ISNULL(t_P.can_edit) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following product permutation(s) do not have product edit permission: ', GROUP_CONCAT(t_P.name_error SEPARATOR ', ')) AS msg
FROM tmp_Permutation t_P
WHERE ISNULL(t_P.can_edit)
;
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
START TRANSACTION;
INSERT INTO Shop_Product_Change_Set ( comment )
VALUES ( a_comment )
;
SET v_id_change_set := LAST_INSERT_ID();
INSERT INTO Shop_Product_Permutation (
id_product
, description
, cost_local_VAT_excl
, cost_local_VAT_incl
, id_currency_cost
, profit_local_min
, latency_manufacture
, id_unit_measurement_quantity
, count_unit_measurement_per_quantity_step
, quantity_min
, quantity_max
, quantity_stock
, is_subscription
, id_unit_measurement_interval_recurrence
, count_interval_recurrence
, id_stripe_product
, does_expire_faster_once_unsealed
, id_unit_measurement_interval_expiration_unsealed
, count_interval_expiration_unsealed
, active
, created_by
, created_on
)
SELECT
t_P.id_product AS id_product
, t_P.description AS description
, t_P.cost_local_VAT_excl AS cost_local_VAT_excl
, t_P.cost_local_VAT_incl AS cost_local_VAT_incl
, t_P.id_currency_cost AS id_currency_cost
, t_P.profit_local_min AS profit_local_min
, t_P.latency_manufacture AS latency_manufacture
, t_P.id_unit_measurement_quantity AS id_unit_measurement_quantity
, t_P.count_unit_measurement_per_quantity_step AS count_unit_measurement_per_quantity_step
, t_P.quantity_min AS quantity_min
, t_P.quantity_max AS quantity_max
, t_P.quantity_stock AS quantity_stock
, t_P.is_subscription AS is_subscription
, t_P.id_unit_measurement_interval_recurrence AS id_unit_measurement_interval_recurrence
, t_P.count_interval_recurrence AS count_interval_recurrence
, t_P.id_stripe_product AS id_stripe_product
, t_P.does_expire_faster_once_unsealed AS does_expire_faster_once_unsealed
, t_P.id_unit_measurement_interval_expiration_unsealed AS id_unit_measurement_interval_expiration_unsealed
, t_P.count_interval_expiration_unsealed AS count_interval_expiration_unsealed
, t_P.active AS active
, a_id_user AS created_by
, v_time_start AS created_on
FROM tmp_Permutation t_P
WHERE
is_new = 1
AND active = 1
;
UPDATE Shop_Product_Permutation PP
INNER JOIN tmp_Permutation t_P ON PP.id_permutation = t_P.id_permutation
SET
PP.id_product = t_P.id_product
, PP.description = t_P.description
, PP.cost_local_VAT_excl = t_P.cost_local_VAT_excl
, PP.cost_local_VAT_incl = t_P.cost_local_VAT_incl
, PP.id_currency_cost = t_P.id_currency_cost
, PP.profit_local_min = t_P.profit_local_min
, PP.latency_manufacture = t_P.latency_manufacture
, PP.id_unit_measurement_quantity = t_P.id_unit_measurement_quantity
, PP.count_unit_measurement_per_quantity_step = t_P.count_unit_measurement_per_quantity_step
, PP.quantity_min = t_P.quantity_min
, PP.quantity_max = t_P.quantity_max
, PP.quantity_stock = t_P.quantity_stock
, PP.is_subscription = t_P.is_subscription
, PP.id_unit_measurement_interval_recurrence = t_P.id_unit_measurement_interval_recurrence
, PP.count_interval_recurrence = t_P.count_interval_recurrence
, PP.id_stripe_product = t_P.id_stripe_product
, PP.does_expire_faster_once_unsealed = t_P.does_expire_faster_once_unsealed
, PP.id_unit_measurement_interval_expiration_unsealed = t_P.id_unit_measurement_interval_expiration_unsealed
, PP.count_interval_expiration_unsealed = t_P.count_interval_expiration_unsealed
, PP.active = t_P.active
, PP.id_change_set = v_id_change_set
;
UPDATE tmp_Permutation t_PP
INNER JOIN partsltd_prod.Shop_Product_Permutation PP ON t_PP.id_permutation = PP.id_permutation_temp
SET
t_PP.id_permutation = PP.id_permutation
;
UPDATE tmp_Permutation_Variation_Link t_PPVL
INNER JOIN tmp_Permutation t_PP ON t_PPVL.id_permutation = t_PP.id_permutation_temp
SET
t_PPVL.id_permutation = t_PP.id_permutation
;
INSERT INTO partsltd_prod.Shop_Product_Permutation_Variation_Link (
id_permutation
, id_variation
, display_order
, active
)
SELECT
t_PPVL.id_permutation
, t_PPVL.id_variation
, t_PPVL.display_order
, t_PPVL.active
FROM tmp_Permutation_Variation_Link t_PPVL
WHERE
t_PPVL.is_new = 1
AND t_PPVL.active = 1
;
UPDATE partsltd_prod.Shop_Product_Permutation_Variation_Link PPVL
INNER JOIN tmp_Permutation_Variation_Link t_PPVL
ON PPVL.id_link = t_PPVL.id_link
AND t_PPVL.is_new = 1
SET
PPVL.id_permutation = t_PPVL.id_permutation
, PPVL.id_variation = t_PPVL.id_variation
, PPVL.display_order = t_PPVL.display_order
, PPVL.active = t_PPVL.active
, PPVL.id_change_set = v_id_change_set
;
END IF;
DELETE FROM Shop_Product_Permutation_Temp
WHERE GUID = a_guid
;
DELETE FROM Shop_Product_Permutation_Variation_Link_Temp
WHERE GUID = a_guid
;
COMMIT;
# Errors
SELECT *
FROM tmp_Msg_Error t_ME
INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type
;
IF a_debug = 1 THEN
SELECT * FROM tmp_Permutation;
SELECT * FROM tmp_Permutation_Variation_Link;
END IF;
DROP TEMPORARY TABLE tmp_Permutation_Variation_Link;
DROP TEMPORARY TABLE tmp_Permutation;
DROP TEMPORARY TABLE tmp_Msg_Error;
IF a_debug = 1 THEN
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END IF;
END //
DELIMITER ;;
/*
DELETE FROM Shop_Product_Permutation_Temp
WHERE id_permutation = 1
;
INSERT INTO Shop_Product_Permutation_Temp (
id_permutation,
id_product,
description,
cost_local,
id_currency_cost,
profit_local_min,
latency_manufacture,
id_unit_measurement_quantity,
count_unit_measurement_per_quantity_step,
quantity_min,
quantity_max,
quantity_stock,
is_subscription,
id_unit_measurement_interval_recurrence,
count_interval_recurrence,
id_stripe_product,
does_expire_faster_once_unsealed,
id_unit_measurement_interval_expiration_unsealed,
count_interval_expiration_unsealed,
active,
guid
)
VALUES
(
1 -- id_permutation,
, 1 -- id_product,
, 'Good Reddy Teddy' -- description,
, 5.0 -- cost_local,
, 1 -- id_currency_cost,
, 3.0 -- profit_local_min,
, 14 -- latency_manufacture,
, 1 -- id_unit_measurement_quantity,
, 1.0 -- count_unit_measurement_quantity,
, 3.0 -- quantity_min,
, 99.0 -- quantity_max,
, 1.0 -- quantity_stock,
, False -- is_subscription,
, null -- id_unit_measurement_interval_recurrence,
, null -- count_interval_recurrence,
, null -- id_stripe_product,
, False -- does_expire_faster_once_unsealed,
, null -- id_unit_measurement_interval_expiration_unsealed,
, null -- count_interval_expiration_unsealed,
, True -- active,
, 'NIPS' -- guid
)
;
select 'Shop_Product_Permutation_Temp before call';
SELECT * FROM Shop_Product_Permutation_Temp;
SELECT 'Shop_Product_Permutation before call' AS result_name;
select * FROM Shop_Product_Permutation;
CALL p_shop_save_product_permutation (
1, -- 'auth0|6582b95c895d09a70ba10fef', # a_id_user
'Initial data', # a_comment
'NIPS' # a_guid
);
SELECT 'Shop_Product_Permutation_Temp after call' AS result_name;
select * FROM Shop_Product_Permutation_Temp;
SELECT 'Shop_Product_Permutation after call' AS result_name;
select * FROM Shop_Product_Permutation;
DELETE FROM Shop_Product_Permutation_Temp
WHERE id_permutation = 1;
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS partsltd_prod.p_shop_save_product_permutation_test;
DELIMITER //
CREATE PROCEDURE p_shop_save_product_permutation_test ()
BEGIN
DECLARE v_guid BINARY(36);
DECLARE v_time_start TIMESTAMP(6);
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_guid := 'nips';
SELECT *
FROM partsltd_prod.Shop_Product_Permutation
;
SELECT *
FROM partsltd_prod.Shop_Product_Permutation_Temp
;
START TRANSACTION;
INSERT INTO partsltd_prod.Shop_Product_Permutation_Temp (
id_permutation
, id_product
, csv_id_pairs_variation
, description
, cost_local_VAT_excl
, cost_local_VAT_incl
, id_currency_cost
, profit_local_min
, latency_manufacture
, id_unit_measurement_quantity
, count_unit_measurement_per_quantity_step
, quantity_min
, quantity_max
, quantity_stock
, is_subscription
, id_unit_measurement_interval_recurrence
, count_interval_recurrence
, id_stripe_product
, does_expire_faster_once_unsealed
, id_unit_measurement_interval_expiration_unsealed
, count_interval_expiration_unsealed
, active
, guid
)
VALUES
/* Test 1 - Insert
(
-1 -- id_permutation
, 5 -- id_product
, '' -- csv_id_pairs_variation
, 'Hair clip' -- description
, NULL -- cost_local_VAT_excl
, NULL -- cost_local_VAT_incl
, 1 -- id_currency_cost
, NULL -- profit_local_min
, 1 -- latency_manufacture
, 3 -- id_unit_measurement_quantity
, 1 -- count_unit_measurement_per_quantity_step
, 0 -- quantity_min
, 0 -- quantity_max
, 2 -- quantity_stock
, FALSE -- is_subscription
, NULL -- id_unit_measurement_interval_recurrence
, NULL -- count_interval_recurrence
, NULL -- id_stripe_product
, FALSE -- does_expire_faster_once_unsealed
, NULL -- id_unit_measurement_interval_expiration_unsealed
, NULL -- count_interval_expiration_unsealed
, 1 -- active
, v_guid
)
*/
/* Test 2 - Update
(
4 -- id_product
, 1 -- id_category
, 'Laptops' -- name
, 0 -- has_variations
, 2 -- id_access_level_required
, 2 -- display_order
, 1 -- active
, v_guid
)
*/
/* Test 3 - Insert with Variations */
(
-1 -- id_permutation
, 8 -- id_product
, '1:1' -- csv_id_pairs_variation
, 'Test with variations' -- description
, NULL -- cost_local_VAT_excl
, NULL -- cost_local_VAT_incl
, 1 -- id_currency_cost
, NULL -- profit_local_min
, 1 -- latency_manufacture
, 3 -- id_unit_measurement_quantity
, 1 -- count_unit_measurement_per_quantity_step
, 0 -- quantity_min
, 0 -- quantity_max
, 2 -- quantity_stock
, FALSE -- is_subscription
, NULL -- id_unit_measurement_interval_recurrence
, NULL -- count_interval_recurrence
, NULL -- id_stripe_product
, FALSE -- does_expire_faster_once_unsealed
, NULL -- id_unit_measurement_interval_expiration_unsealed
, NULL -- count_interval_expiration_unsealed
, 1 -- active
, v_guid
)
;
COMMIT;
SELECT *
FROM partsltd_prod.Shop_Product_Permutation_Temp
WHERE GUID = v_guid
;
CALL partsltd_prod.p_shop_save_product_permutation (
'Test save product' -- comment
, v_guid -- guid
, 1 -- id_user
, 1 -- debug
);
SELECT *
FROM partsltd_prod.Shop_Product_Permutation
;
SELECT *
FROM partsltd_prod.Shop_Product_Permutation_Temp
;
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END //
DELIMITER ;;
/*
CALL partsltd_prod.p_shop_save_product_permutation_test ();
DELETE FROM partsltd_prod.Shop_Product_Permutation_Temp;
DROP TABLE IF EXISTS tmp_Msg_Error;
SELECT * FROM partsltd_prod.Shop_Product
Cannot add or update a child row: a foreign key constraint fails (`partsltd_prod`.`shop_product_permutation`, CONSTRAINT `FK_Shop_Product_Permutation_id_product` FOREIGN KEY (`id_product`) REFERENCES `shop_product` (`id_product`) ON UPDATE RESTRICT)
*/
DROP PROCEDURE IF EXISTS p_shop_get_many_product_variation;
DELIMITER //
CREATE PROCEDURE p_shop_get_many_product_variation (
IN a_id_user INT
, IN a_get_all_variation_type BIT
, IN a_get_inactive_variation_type BIT
, IN a_ids_variation_type VARCHAR(4000)
, IN a_get_all_variation BIT
, IN a_get_inactive_variation BIT
, IN a_ids_variation TEXT
, IN a_debug BIT
)
BEGIN
-- Argument redeclaration
-- Variable declaration
DECLARE v_has_filter_variation BIT;
DECLARE v_has_filter_variation_type BIT;
DECLARE v_guid BINARY(36);
# DECLARE v_id_user VARCHAR(100);
# DECLARE v_ids_permutation_unavailable VARCHAR(4000);
DECLARE v_id_permission_variation INT;
# DECLARE v_ids_product_permission VARCHAR(4000);
# DECLARE v_ids_permutation_permission VARCHAR(4000);
DECLARE v_id_access_level_view INT;
DECLARE v_time_start TIMESTAMP(6);
DECLARE v_id_minimum INT;
DECLARE v_code_error_bad_data VARCHAR(50);
DECLARE v_id_type_error_bad_data INT;
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_guid := UUID();
SET v_id_access_level_view := (SELECT id_access_level FROM Shop_Access_Level WHERE code = 'VIEW' LIMIT 1);
SET v_code_error_bad_data := (SELECT code FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1);
SET v_id_type_error_bad_data := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_error_bad_data LIMIT 1);
-- Argument validation + default values
SET a_id_user = IFNULL(a_id_user, 0);
SET a_get_all_variation = IFNULL(a_get_all_variation, 1);
SET a_get_inactive_variation = IFNULL(a_get_inactive_variation, 0);
SET a_ids_variation = TRIM(REPLACE(IFNULL(a_ids_variation, ''), '|', ','));
SET a_get_all_variation_type = IFNULL(a_get_all_variation_type, 1);
SET a_get_inactive_variation_type = IFNULL(a_get_inactive_variation_type, 0);
SET a_ids_variation_type = TRIM(REPLACE(IFNULL(a_ids_variation_type, ''), '|', ','));
IF a_debug = 1 THEN
SELECT
a_id_user
, a_get_all_variation_type
, a_get_inactive_variation_type
, a_ids_variation_type
, a_get_all_variation
, a_get_inactive_variation
, a_ids_variation
, a_debug
;
END IF;
-- Temporary tables
DROP TABLE IF EXISTS tmp_Variation;
DROP TABLE IF EXISTS tmp_Variation_Type;
CREATE TEMPORARY TABLE tmp_Variation_Type (
id_type INT NOT NULL
);
CREATE TEMPORARY TABLE tmp_Variation (
id_variation INT NOT NULL
, id_type INT NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
-- guid BINARY(36) NOT NULL,
id_type INT NULL,
code VARCHAR(50) NOT NULL,
msg VARCHAR(4000) NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split (
substring VARCHAR(4000) NOT NULL
, as_int INT NULL
);
DELETE FROM tmp_Split;
-- Parse filters
SET v_has_filter_variation = CASE WHEN a_ids_variation = '' THEN 0 ELSE 1 END;
SET v_has_filter_variation_type = CASE WHEN a_ids_variation_type = '' THEN 0 ELSE 1 END;
-- select v_has_filter_product, v_has_filter_permutation;
IF v_has_filter_variation_type THEN -- NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
CALL partsltd_prod.p_split(v_guid, a_ids_variation_type, ',', a_debug);
DELETE FROM tmp_Split;
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM partsltd_prod.Split_Temp
WHERE 1=1
AND GUID = v_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( v_guid );
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Variation_Type VT ON t_S.as_int = VT.id_type
WHERE
ISNULL(t_S.as_int)
OR ISNULL(VT.id_type)
) THEN
INSERT INTO tmp_Msg_Error (
-- guid,
id_type,
code,
msg
)
SELECT
-- v_guid,
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive variation type IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Variation_Type VT ON t_S.as_int = VT.id_type
WHERE
ISNULL(t_S.as_int)
OR ISNULL(VT.id_type)
;
ELSE
INSERT INTO tmp_Variation_Type (
id_type
)
SELECT
DISTINCT VT.id_type
FROM tmp_Split t_S
RIGHT JOIN partsltd_prod.Shop_Variation_Type VT ON t_S.as_int = VT.id_type
WHERE
(
a_get_all_variation_type = 1
OR (
v_has_filter_variation_type = 1
AND NOT ISNULL(t_S.as_int)
)
)
AND (
a_get_inactive_variation_type = 1
OR VT.active = 1
)
;
END IF;
END IF;
DELETE FROM tmp_Split;
IF (v_has_filter_variation AND NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1)) THEN -- NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
CALL partsltd_prod.p_split(v_guid, a_ids_variation, ',', a_debug);
DELETE FROM tmp_Split;
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM partsltd_prod.Split_Temp
WHERE 1=1
AND GUID = v_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( v_guid );
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Variation V ON t_S.as_int = V.id_variation
WHERE
ISNULL(t_S.as_int)
OR ISNULL(V.id_variation)
) THEN
INSERT INTO tmp_Msg_Error (
-- guid,
id_type,
code,
msg
)
SELECT
-- v_guid,
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive variation IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Variation V ON t_S.as_int = V.id_variation
WHERE
ISNULL(t_S.as_int)
OR ISNULL(VT.id_type)
;
ELSE
INSERT INTO tmp_Variation (
id_variation
, id_type
)
SELECT
DISTINCT V.id_variation
, V.id_type
FROM tmp_Split t_S
RIGHT JOIN partsltd_prod.Shop_Variation V ON t_S.as_int = V.id_variation
WHERE
(
a_get_all_variation = 1
OR (
v_has_filter_variation = 1
AND NOT ISNULL(t_S.as_int)
)
)
AND (
a_get_inactive_variation = 1
OR V.active = 1
)
;
END IF;
END IF;
DELETE FROM tmp_Split;
-- Permissions
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
# SET v_id_user := (SELECT id_user FROM Shop_User WHERE name = CURRENT_USER());
SET v_id_permission_variation := (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_PRODUCT' LIMIT 1);
IF a_debug = 1 THEN
SELECT
v_guid
, a_id_user
, FALSE AS a_get_inactive_users
, v_id_permission_variation
, v_id_access_level_view
, '' AS a_ids_product
, 0 AS a_debug
;
-- select * from Shop_Calc_User_Temp;
END IF;
CALL p_shop_calc_user(
v_guid
, a_id_user
, FALSE -- a_get_inactive_users
, v_id_permission_variation
, v_id_access_level_view
, '' -- a_ids_product
, 0 -- a_debug
);
IF a_debug = 1 THEN
select * from Shop_Calc_User_Temp;
END IF;
IF NOT EXISTS (SELECT can_view FROM Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = v_guid) THEN
INSERT INTO tmp_Msg_Error (
-- guid,
id_type,
code,
msg
)
VALUES (
-- v_guid,
v_id_type_error_bad_data,
v_code_error_bad_data,
CONCAT('You do not have view permissions for ', (SELECT name FROM Shop_Permission WHERE id_permission = v_id_permission_variation LIMIT 1))
)
;
END IF;
CALL p_shop_clear_calc_user( v_guid, 0 );
END IF;
IF EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
DELETE FROM tmp_Variation;
DELETE FROM tmp_Variation_Type;
END IF;
-- Returns
# Variation Types
SELECT
t_VT.id_type
, VT.code
, VT.name
, VT.name_plural
, VT.display_order
, VT.active
FROM tmp_Variation_Type t_VT
INNER JOIN Shop_Variation_Type VT ON t_VT.id_type = VT.id_type
;
# Variations
SELECT
t_V.id_variation
, t_V.id_type
, V.code AS code_variation
, V.name AS name_variation
, V.display_order
, V.active AS active_variation
/*
, VT.code AS code_variation_type
, VT.name AS name_variation_type
, VT.name_plural AS name_plural_variation_type
, VT.active AS active_variation_type
, VT.display_order
*/
FROM tmp_Variation t_V
INNER JOIN Shop_Variation V ON t_V.id_variation = V.id_variation
INNER JOIN tmp_Variation_Type t_VT ON V.id_type = t_VT.id_type
INNER JOIN Shop_Variation_Type VT ON t_VT.id_type = VT.id_type
ORDER BY VT.display_order, V.display_order
;
# Errors
SELECT
*
FROM tmp_Msg_Error t_ME
INNER JOIN Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type
-- WHERE guid = v_guid
;
-- Clean up
DROP TABLE IF EXISTS tmp_Variation;
DROP TABLE IF EXISTS tmp_Variation_Type;
CALL partsltd_prod.p_shop_clear_calc_product_permutation ( v_guid );
IF a_debug = 1 THEN
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END IF;
END //
DELIMITER ;;
/*
CALL p_shop_get_many_product_variation (
1 # 'auth0|6582b95c895d09a70ba10fef', # a_id_user
, 1 # a_get_all_variation_type
, 1 # a_get_inactive_variation_type
, '' # a_ids_variation_type
, 1 # a_get_all_variation
, 1 # a_get_inactive_variation
, '' # a_ids_variation
, 0 # a_debug
);
select * from TMP_MSG_ERROR;
DROP TABLE TMP_MSG_ERROR;
select * from shop_variation;
select * from shop_variation_type;
*/
/*
select * from shop_supplier;
select * from shop_product;
insert into shop_product_change_set (comment)
values ('set product not subscription - test bool output to python');
update shop_product
set is_subscription = 0,
id_change_set = (select id_change_set from shop_product_change_set order by id_change_set desc limit 1)
where id_product = 1
INSERT INTO tmp_Variation_Type (
id_type,
active,
rank_type
)
SELECT
VT.id_type,
S.active,
RANK() OVER (ORDER BY id_type ASC) AS rank_type
FROM Shop_Variation_Type VT
LEFT JOIN Split_Temp S_T ON VT.id_type = S_T.substring
WHERE
(
a_get_all_variation_type = 1
OR NOT ISNULL(S_T.substring)
)
AND (
a_get_inactive_variation_type
OR VT.active = 1
)
;
END IF;
IF a_get_first_variation_type_only THEN
DELETE t_VT
FROM tmp_Shop_Variation_Type t_VT
WHERE t_VT.rank_type > 1
;
END IF;
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_save_product_variation;
DROP TABLE IF EXISTS tmp_Variation_Type;
DROP TABLE IF EXISTS tmp_Variation;
DROP TABLE IF EXISTS tmp_Msg_Error;
DELIMITER //
CREATE PROCEDURE p_shop_save_product_variation (
IN a_comment VARCHAR(500)
, IN a_guid BINARY(36)
, IN a_id_user INT
, IN a_debug BIT
)
BEGIN
DECLARE v_code_type_error_bad_data VARCHAR(50);
DECLARE v_code_type_error_no_permission VARCHAR(50);
DECLARE v_code_type_error_warning VARCHAR(50);
DECLARE v_id_access_level_edit INT;
DECLARE v_id_change_set INT;
DECLARE v_ids_permission_product_variation VARCHAR(100);
DECLARE v_id_type_error_bad_data INT;
DECLARE v_id_type_error_no_permission INT;
DECLARE v_id_type_error_warning INT;
DECLARE v_ids_product_permission TEXT;
DECLARE v_time_start TIMESTAMP(6);
DECLARE exit handler for SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
@sqlstate = RETURNED_SQLSTATE
, @errno = MYSQL_ERRNO
, @text = MESSAGE_TEXT
;
ROLLBACK;
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NULL
, code VARCHAR(50) NOT NULL
, msg VARCHAR(4000) NOT NULL
);
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
MET.id_type
, @errno
, @text
FROM partsltd_prod.Shop_Msg_Error_Type MET
WHERE code = 'MYSQL_ERROR'
LIMIT 1
;
SELECT *
FROM tmp_Msg_Error;
DROP TABLE IF EXISTS tmp_Msg_Error;
END;
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1);
SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1);
SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION' LIMIT 1);
SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission LIMIT 1);
SET v_code_type_error_warning := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'WARNING' LIMIT 1);
SET v_id_type_error_warning := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_warning LIMIT 1);
SET v_ids_permission_product_variation := (SELECT GROUP_CONCAT(id_permission SEPARATOR ',') FROM partsltd_prod.Shop_Permission WHERE code IN ('STORE_PRODUCT'));
SET v_id_access_level_edit := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'EDIT' LIMIT 1);
CALL p_validate_guid ( a_guid );
SET a_comment := TRIM(IFNULL(a_comment, ''));
DROP TEMPORARY TABLE IF EXISTS tmp_Variation_Type;
DROP TEMPORARY TABLE IF EXISTS tmp_Variation;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
-- Temporary tables
CREATE TEMPORARY TABLE tmp_Variation_Type (
id_type INT NOT NULL PRIMARY KEY
, id_type_temp INT NOT NULL
, code VARCHAR(50)
, name VARCHAR(255)
, name_plural VARCHAR(256)
, active BIT NULL
, display_order INT NOT NULL
, created_on DATETIME
, created_by INT
, is_new BIT NOT NULL
, name_error VARCHAR(1000) NOT NULL
);
-- CREATE TEMPORARY TABLE tmp_Variation_Type_Count
CREATE TEMPORARY TABLE tmp_Variation (
id_variation INT NOT NULL PRIMARY KEY
, id_type INT NOT NULL
, code VARCHAR(50)
, name VARCHAR(255)
, active BIT
, display_order INT NOT NULL
, created_on DATETIME
, created_by INT
, has_type BIT NULL
, is_new BIT NOT NULL
, name_error VARCHAR(1000) NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NOT NULL
, code VARCHAR(50) NOT NULL
, msg VARCHAR(4000) NOT NULL
);
INSERT INTO tmp_Variation_Type (
id_type
, id_type_temp
, code
, name
, name_plural
, active
, display_order
, created_on
, created_by
, is_new
, name_error
)
SELECT
VT_T.id_type
, VT_T.id_type
, VT_T.code
, VT_T.name
, VT_T.name_plural
, VT_T.active
, VT_T.display_order
, IFNULL(VT_T.created_on, VT.created_on) AS created_on
, IFNULL(VT_T.created_by, VT.created_by) AS created_by
, IFNULL(VT_T.id_type, 0) < 1 AS is_new
, CASE WHEN IFNULL(VT_T.id_type, 0) < 1 THEN
CONCAT(
'New Variation Type: '
, VT_T.display_order
, ' - '
, IFNULL(VT_T.code, '(No Code)')
, ' - '
, IFNULL(VT_T.name, '(No Name)')
)
ELSE
CONCAT(
VT_T.display_order
, ' - '
, IFNULL(VT_T.code, '(No Code)')
, ' - '
, IFNULL(VT_T.name, '(No Name)')
)
END AS name_error
FROM partsltd_prod.Shop_Variation_Type_Temp VT_T
LEFT JOIN partsltd_prod.Shop_Variation_Type VT ON VT_T.id_type = VT.id_type
WHERE VT_T.GUID = a_guid
;
INSERT INTO tmp_Variation (
id_variation
, id_type
, code
, name
, active
, display_order
, created_on
, created_by
, has_type
, is_new
, name_error
)
SELECT
V_T.id_variation
, IFNULL(V_T.id_type, V.id_type) AS id_type
, V_T.code
, V_T.name
, V_T.active
, V_T.display_order
, IFNULL(V_T.created_on, V.created_on) AS created_on
, IFNULL(V_T.created_by, V.created_by) AS created_by
, NOT ISNULL(t_VT.id_type) AS has_type
, IFNULL(V_T.id_variation, 0) < 1 AS is_new
, CASE WHEN IFNULL(V_T.id_variation, 0) < 1 THEN
CONCAT(
'New Variation: '
, V_T.display_order
, ' - '
, IFNULL(V_T.code, '(No Code)')
, ' - '
, IFNULL(V_T.name, '(No Name)')
)
ELSE
CONCAT(
V_T.display_order
, ' - '
, IFNULL(V_T.code, '(No Code)')
, ' - '
, IFNULL(V_T.name, '(No Name)')
)
END AS name_error
FROM partsltd_prod.Shop_Variation_Temp V_T
LEFT JOIN partsltd_prod.Shop_Variation V ON V_T.id_variation = V.id_variation
-- LEFT JOIN partsltd_prod.Shop_Variation_Type VT ON V_T.id_type = VT.id_type
LEFT JOIN tmp_Variation_Type t_VT ON V_T.id_type = t_VT.id_type
WHERE V_T.GUID = a_guid
;
-- Insert missing order records
INSERT INTO tmp_Variation_Type (
id_type
, id_type_temp
, code
, name
, name_plural
, active
, display_order
, created_on
, created_by
, is_new
, name_error
)
SELECT
VT.id_type
, VT.id_type
, VT.code
, VT.name
, VT.name_plural
, VT.active
, VT.display_order
, VT.created_on
, VT.created_by
, 0 AS is_new
, CONCAT(
VT.display_order
, ' - '
, IFNULL(VT.code, '(No Code)')
, ' - '
, IFNULL(VT.name, '(No Name)')
) AS name_error
FROM partsltd_prod.Shop_Variation_Type VT
INNER JOIN tmp_Variation t_V
ON VT.id_type = t_V.id_type
AND t_V.has_type = 0
AND NOT ISNULL(t_V.id_type)
;
UPDATE tmp_Variation t_V
INNER JOIN tmp_Variation_Type t_VT ON t_V.id_type = t_V.id_type
SET t_V.has_type = 1
WHERE t_V.has_type = 0
;
-- Validation
-- Variation Type
# id_type
IF EXISTS (
SELECT *
FROM tmp_Variation_Type t_VT
INNER JOIN partsltd_prod.Shop_Variation_Type VT ON t_VT.id_type = VT.id_type
WHERE 1=1
AND t_VT.id_type > 0
AND ISNULL(VT.id_type)
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT(
'A valid ID is required for the following Product Variation Type(s): '
, GROUP_CONCAT(t_VT.name_error SEPARATOR ', ')
) AS msg
FROM tmp_Variation_Type t_VT
INNER JOIN partsltd_prod.Shop_Variation_Type VT ON t_VT.id_type = VT.id_type
WHERE 1=1
AND t_VT.id_type > 0
AND ISNULL(VT.id_type)
;
END IF;
-- Variation
# id_variation
IF EXISTS (
SELECT *
FROM tmp_Variation t_V
INNER JOIN partsltd_prod.Shop_Variation V ON t_V.id_variation = V.id_variation
WHERE 1=1
AND t_V.id_variation > 0
AND ISNULL(V.id_variation)
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT(
'A valid ID is required for the following Product Variation(s): '
, GROUP_CONCAT(t_V.name_error SEPARATOR ', ')
) AS msg
FROM tmp_Variation t_V
INNER JOIN partsltd_prod.Shop_Variation V ON t_V.id_variation = V.id_variation
WHERE 1=1
AND t_V.id_variation > 0
AND ISNULL(V.id_variation)
;
END IF;
# id_type
IF EXISTS ( SELECT * FROM tmp_Variation t_V WHERE t_V.has_type = 0 LIMIT 1 ) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT(
'A valid ID is required for the following Product Variation(s): '
, GROUP_CONCAT(t_V.name_error SEPARATOR ', ')
) AS msg
FROM tmp_Variation t_V
WHERE t_V.has_type = 0
;
END IF;
-- Duplicate Variation Type Ids
-- Duplicate Variation Ids
-- Duplicate Variation Type Codes
-- Duplicate Variation Codes
-- Variation unit measurement with no count unit measurement
-- Permissions
IF a_debug = 1 THEN
SELECT
a_guid
, a_id_user
, FALSE -- get inactive users
, v_ids_permission_product_variation
, v_id_access_level_edit
, NULL -- ids_product
, 0 -- a_debug
;
SELECT *
FROM partsltd_prod.Shop_Calc_User_Temp
WHERE GUID = a_guid
;
END IF;
CALL p_shop_calc_user(
a_guid
, a_id_user
, FALSE -- get inactive users
, v_ids_permission_product_variation
, v_id_access_level_edit
, NULL -- ids_product
, 0 -- a_debug
);
IF a_debug = 1 THEN
SELECT * from partsltd_prod.Shop_Calc_User_Temp WHERE GUID = a_guid;
END IF;
IF EXISTS (SELECT * FROM partsltd_prod.Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = a_guid AND IFNULL(UE_T.can_view, 0) = 0) THEN
DELETE FROM tmp_Msg_Error;
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_no_permission
, v_code_type_error_no_permission
, CONCAT(
'You do not have edit permissions for '
, GROUP_CONCAT(name SEPARATOR ', ')
)
FROM partsltd_prod.Shop_Permission PERM
INNER JOIN partsltd_prod.Shop_Calc_User_Temp UE_T
ON PERM.id_permission = UE_T.id_permission
AND UE_T.GUID = a_guid
AND IFNULL(UE_T.can_view, 0) = 0
;
END IF;
CALL partsltd_prod.p_shop_clear_calc_user(
a_guid
, 0 -- a_debug
);
IF EXISTS ( SELECT * FROM tmp_Msg_Error WHERE id_type <> v_id_type_error_warning LIMIT 1 ) THEN
DELETE FROM tmp_Variation_Type;
DELETE FROM tmp_Variation;
END IF;
-- Transaction
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
START TRANSACTION;
INSERT INTO Shop_Product_Change_Set (
comment
, updated_last_by
, updated_last_on
)
VALUES (
a_comment
, a_id_user
, v_time_start
);
SET v_id_change_set := LAST_INSERT_ID();
INSERT INTO partsltd_prod.Shop_Variation_Type (
id_type_temp
, code
, name
, name_plural
, active
, display_order
, created_on
, created_by
)
SELECT
t_VT.id_type
, t_VT.code
, t_VT.name
, t_VT.name_plural
, t_VT.active
, t_VT.display_order
, t_VT.created_on
, t_VT.created_by
FROM tmp_Variation_Type t_VT
WHERE t_VT.is_new = 1
;
UPDATE tmp_Variation_Type t_VT
INNER JOIN partsltd_prod.Shop_Variation_Type VT ON t_VT.id_type_temp = VT.id_type_temp
SET
t_VT.id_type = VT.id_type
WHERE t_VT.is_new = 1
;
UPDATE tmp_Variation t_V
INNER JOIN tmp_Variation_Type t_VT
ON t_V.id_type = t_VT.id_type_temp
AND t_VT.is_new = 1
SET
t_V.id_type = t_VT.id_type
;
INSERT INTO partsltd_prod.Shop_Variation (
id_type
, code
, name
, active
, display_order
, created_on
, created_by
)
SELECT
t_V.id_type
, t_V.code
, t_V.name
, t_V.active
, t_V.display_order
, t_V.created_on
, t_V.created_by
FROM tmp_Variation t_V
WHERE t_V.is_new = 1
;
UPDATE partsltd_prod.Shop_Variation_Type VT
INNER JOIN tmp_Variation_Type t_VT
ON VT.id_type = t_VT.id_type
AND t_VT.is_new = 0
INNER JOIN tmp_Variation t_V ON t_VT.id_type = t_V.id_type
SET
VT.code = t_VT.code
, VT.name = t_VT.name
, VT.name_plural = t_VT.name_plural
, VT.active = t_VT.active
, VT.display_order = t_VT.display_order
, VT.created_on = t_VT.created_on
, VT.created_by = t_VT.created_by
, VT.id_change_set = v_id_change_set
;
UPDATE partsltd_prod.Shop_Variation V
INNER JOIN tmp_Variation t_V
ON V.id_variation = t_V.id_variation
AND t_V.is_new = 0
SET
V.code = t_V.code
, V.name = t_V.name
, V.active = t_V.active
, V.display_order = t_V.display_order
, V.created_on = t_V.created_on
, V.created_by = t_V.created_by
, V.id_change_set = v_id_change_set
;
DELETE VT_T
FROM partsltd_prod.Shop_Variation_Type_Temp VT_T
WHERE VT_T.GUID = a_guid
;
DELETE V_T
FROM partsltd_prod.Shop_Variation_Temp V_T
WHERE V_T.GUID = a_guid
;
COMMIT;
END IF;
# Errors
SELECT *
FROM tmp_Msg_Error t_ME
INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type
;
IF a_debug = 1 THEN
SELECT * from tmp_Variation_Type;
SELECT * from tmp_Variation;
END IF;
DROP TEMPORARY TABLE tmp_Variation_Type;
DROP TEMPORARY TABLE tmp_Variation;
DROP TEMPORARY TABLE tmp_Msg_Error;
IF a_debug = 1 THEN
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END IF;
END //
DELIMITER ;;
-- Clear previous proc
DROP PROCEDURE IF EXISTS partsltd_prod.p_shop_save_product_variation_test;
DELIMITER //
CREATE PROCEDURE p_shop_save_product_variation_test ()
BEGIN
DECLARE v_guid BINARY(36);
DECLARE v_time_start TIMESTAMP(6);
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_guid := 'nips';
SELECT *
FROM partsltd_prod.Shop_Variation_Type
;
SELECT *
FROM partsltd_prod.Shop_Variation_Type_Temp
;
SELECT *
FROM partsltd_prod.Shop_Variation
;
SELECT *
FROM partsltd_prod.Shop_Variation_Temp
;
START TRANSACTION;
DELETE FROM partsltd_prod.Shop_Variation_Type_Temp;
DELETE FROM partsltd_prod.Shop_Variation_Temp;
INSERT INTO partsltd_prod.Shop_Variation_Type_Temp (
id_type
-- , id_type_temp
, code
, name
, name_plural
, display_order
, active
, GUID
)
/* Test 1 - Insert
VALUES (
-1
-- , -1
, 'SIZE'
, 'Size'
, 'Sizes'
, 2
, 1
, v_guid
)
*/
/* Test 2: Alter */
SELECT
id_type
-- , id_type AS id_type_temp
, code
, name
, name_plural
, display_order
, active
, v_guid AS GUID
FROM partsltd_prod.Shop_Variation_Type
WHERE id_type = 1
;
INSERT INTO partsltd_prod.Shop_Variation_Temp (
id_variation
, id_type
, code
, name
, display_order
, active
, GUID
)
/* Test 1 - Insert
VALUES (
-1 -- id_variation
, -1 -- id_type
, '300 mL' -- code
, '300 millilitres' -- name
, 1 -- display_order
, 1 -- active
, v_guid --
)
*/
/* Test 3 - Insert
VALUES (
-1 -- id_variation
, 1 -- id_type
, 'SILVER' -- code
, 'Silver' -- name
, 10 -- display_order
, 1 -- active
, 'NIPS' -- v_guid --
);
*/
/* Test 2: Alter */
SELECT
id_variation
, id_type
, code
, name
, display_order
, active
, v_guid AS GUID
FROM partsltd_prod.Shop_Variation
WHERE id_variation = 2
UNION
SELECT
-1 -- id_variation
, 1 -- id_type
, 'GREEN' -- code
, 'Green' -- name
, 3 -- display_order
, 1 -- active
, v_guid --
;
COMMIT;
SELECT *
FROM partsltd_prod.Shop_Variation_Type_Temp
WHERE GUID = v_guid
;
SELECT *
FROM partsltd_prod.Shop_Variation_Temp
WHERE GUID = v_guid
;
CALL partsltd_prod.p_shop_save_product_variation (
'Test save Variations - add + edit' -- comment
, v_guid -- guid
, 1 -- id_user
, 1 -- debug
);
SELECT *
FROM partsltd_prod.Shop_Variation_Type_Temp
;
SELECT *
FROM partsltd_prod.Shop_Variation_Temp
;
SELECT *
FROM partsltd_prod.Shop_Variation_Type
;
SELECT *
FROM partsltd_prod.Shop_Variation
;
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END //
DELIMITER ;;
/*
CALL partsltd_prod.p_shop_save_product_variation_test ();
DELETE FROM partsltd_prod.Shop_Variation_Type_Temp;
DELETE FROM partsltd_prod.Shop_Variation_Temp;
DROP TABLE IF EXISTS tmp_Msg_Error;
delete from shop_variation_audit
where id_variation = 3
;
delete from shop_variation_audit
where id_variation = 3
;
delete from shop_variation_type_audit
where id_type = -1
;
delete
-- select *
from shop_variation_type
where id_type = -1
;
Cannot add or update a child row: a foreign key constraint fails (`partsltd_prod`.`shop_variation_type`, CONSTRAINT `FK_Shop_Variation_Type_id_change_set` FOREIGN KEY (`id_change_set`) REFERENCES `shop_product_change_set` (`id_change_set`))
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_get_many_stock_item;
DELIMITER //
CREATE PROCEDURE p_shop_get_many_stock_item (
IN a_id_user INT,
IN a_get_all_product_permutation BIT,
IN a_get_inactive_product_permutation BIT,
IN a_ids_product_permutation TEXT,
IN a_get_all_stock_item BIT,
IN a_get_inactive_stock_item BIT,
IN a_ids_stock_item LONGTEXT,
IN a_get_all_region_storage BIT,
IN a_get_inactive_region_storage BIT,
IN a_ids_region_storage TEXT,
IN a_get_all_plant_storage BIT,
IN a_get_inactive_plant_storage BIT,
IN a_ids_plant_storage TEXT,
IN a_get_all_location_storage BIT,
IN a_get_inactive_location_storage BIT,
IN a_ids_location_storage TEXT,
IN a_date_received_to DATETIME,
IN a_get_sealed_stock_item_only BIT,
IN a_get_unsealed_stock_item_only BIT,
IN a_get_expired_stock_item_only BIT,
IN a_get_nonexpired_stock_item_only BIT,
IN a_get_consumed_stock_item_only BIT,
IN a_get_nonconsumed_stock_item_only BIT,
IN a_debug BIT
)
BEGIN
DECLARE v_has_filter_permutation BIT;
DECLARE v_has_filter_stock_item BIT;
DECLARE v_has_filter_region_storage BIT;
DECLARE v_has_filter_plant_storage BIT;
DECLARE v_has_filter_location_storage BIT;
DECLARE v_guid BINARY(36);
-- DECLARE v_ids_permutation_unavailable LONGTEXT;
DECLARE v_id_permission_product INT;
DECLARE v_ids_product_permission LONGTEXT;
-- DECLARE v_ids_permutation_permission VARCHAR(4000);
DECLARE v_id_access_level_view INT;
-- DECLARE v_now DATETIME;
-- DECLARE v_id_minimum INT;
DECLARE v_time_start TIMESTAMP(6);
SET v_guid := UUID();
SET v_id_access_level_view := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'VIEW');
SET v_time_start := CURRENT_TIMESTAMP(6);
-- Argument validation + default values
SET a_id_user := TRIM(IFNULL(a_id_user, ''));
SET a_get_all_product_permutation := IFNULL(a_get_all_product_permutation, 0);
-- SET a_guid_permutations := IFNULL(a_guid_permutations, '');
SET a_get_inactive_product_permutation := IFNULL(a_get_inactive_product_permutation, 0);
SET a_ids_product_permutation := IFNULL(a_ids_product_permutation, '');
SET a_get_all_stock_item := IFNULL(a_get_all_stock_item, 0);
SET a_get_inactive_stock_item := IFNULL(a_get_inactive_stock_item, 0);
SET a_ids_stock_item := TRIM(IFNULL(a_ids_stock_item, ''));
SET a_get_all_region_storage := IFNULL(a_get_all_region_storage, 0);
SET a_get_inactive_region_storage := IFNULL(a_get_inactive_region_storage, 0);
SET a_ids_region_storage := TRIM(IFNULL(a_ids_region_storage, ''));
SET a_get_all_plant_storage := IFNULL(a_get_all_plant_storage, 0);
SET a_get_inactive_plant_storage := IFNULL(a_get_inactive_plant_storage, 0);
SET a_ids_plant_storage := TRIM(IFNULL(a_ids_plant_storage, ''));
SET a_get_all_location_storage := IFNULL(a_get_all_location_storage, 0);
SET a_get_inactive_location_storage := IFNULL(a_get_inactive_location_storage, 0);
SET a_ids_location_storage := TRIM(IFNULL(a_ids_location_storage, ''));
SET a_date_received_to := a_date_received_to; -- IFNULL(a_date_received_to, NOW());
SET a_get_sealed_stock_item_only := IFNULL(a_get_sealed_stock_item_only, 0);
SET a_get_unsealed_stock_item_only := IFNULL(a_get_unsealed_stock_item_only, 0);
SET a_get_expired_stock_item_only := IFNULL(a_get_expired_stock_item_only, 0);
SET a_get_nonexpired_stock_item_only := IFNULL(a_get_nonexpired_stock_item_only, 0);
SET a_get_consumed_stock_item_only := IFNULL(a_get_consumed_stock_item_only, 0);
SET a_get_nonconsumed_stock_item_only := IFNULL(a_get_nonconsumed_stock_item_only, 0);
-- Temporary tables
DROP TEMPORARY TABLE IF EXISTS tmp_Region_Storage;
DROP TEMPORARY TABLE IF EXISTS tmp_Plant_Storage;
DROP TEMPORARY TABLE IF EXISTS tmp_Location_Storage;
DROP TEMPORARY TABLE IF EXISTS tmp_Stock_Item;
DROP TEMPORARY TABLE IF EXISTS tmp_Permutation;
-- DROP TABLE IF EXISTS tmp_Msg_Error;
DROP TEMPORARY TABLE IF EXISTS tmp_Category;
DROP TEMPORARY TABLE IF EXISTS tmp_Permutation;
DROP TEMPORARY TABLE IF EXISTS tmp_Product;
CREATE TEMPORARY TABLE tmp_Category (
id_category INT NOT NULL
, display_order INT NOT NULL
);
CREATE TEMPORARY TABLE tmp_Product (
id_category INT NOT NULL
, id_product INT NOT NULL
, display_order INT NOT NULL
);
CREATE TEMPORARY TABLE tmp_Permutation (
id_permutation INT NULL
, id_product INT NOT NULL
, can_view BIT
, can_edit BIT
, can_admin BIT
);
CREATE TEMPORARY TABLE tmp_Stock_Item (
id_stock INT NOT NULL PRIMARY KEY
, id_permutation INT NOT NULL
, id_product INT NOT NULL
, id_location_storage INT NOT NULL
, can_view BIT NULL
, can_edit BIT NULL
, can_admin BIT NULL
);
CREATE TEMPORARY TABLE tmp_Region_Storage (
id_region INT NOT NULL PRIMARY KEY
/*
CONSTRAINT FK_tmp_Region_Storage_id_region
FOREIGN KEY (id_region)
REFERENCES Shop_Region(id_region)
*/
-- , rank_region INT NOT NULL
);
CREATE TEMPORARY TABLE tmp_Plant_Storage (
id_plant INT NOT NULL PRIMARY KEY
/*
CONSTRAINT FK_tmp_Plant_Storage_id_plant
FOREIGN KEY (id_plant)
REFERENCES Shop_Plant(id_plant)
*/
-- , rank_plant INT NOT NULL
, id_region INT NOT NULL
);
CREATE TEMPORARY TABLE tmp_Location_Storage (
id_location INT NOT NULL PRIMARY KEY
/*
CONSTRAINT FK_tmp_Location_Storage_id_location
FOREIGN KEY (id_location)
REFERENCES Shop_Location_Storage(id_location)
*/
-- , rank_location INT NOT NULL
, id_plant INT NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
-- guid BINARY(36) NOT NULL,
id_type INT NULL,
code VARCHAR(50) NOT NULL,
msg VARCHAR(4000) NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split (
substring VARCHAR(4000) NOT NULL
, as_int INT NULL
);
DELETE FROM tmp_Split;
-- Parse filters
SET v_has_filter_permutation = CASE WHEN a_ids_product_permutation = '' THEN 0 ELSE 1 END; -- CASE WHEN a_guid_permutations = '' THEN 0 ELSE 1 END;
SET v_has_filter_stock_item = CASE WHEN a_ids_stock_item = '' THEN 0 ELSE 1 END;
SET v_has_filter_region_storage = CASE WHEN a_ids_region_storage = '' THEN 0 ELSE 1 END;
SET v_has_filter_plant_storage = CASE WHEN a_ids_plant_storage = '' THEN 0 ELSE 1 END;
SET v_has_filter_location_storage = CASE WHEN a_ids_location_storage = '' THEN 0 ELSE 1 END;
-- select v_has_filter_product, v_has_filter_permutation;
CALL partsltd_prod.p_shop_calc_product_permutation (
a_id_user
, 1 -- a_get_all_product_category
, 0 -- a_get_inactive_product_category
, '' -- a_ids_product_category
, 1 -- a_get_all_product
, 0 -- a_get_inactive_product
, '' -- a_ids_product
, a_get_all_product_permutation
, a_get_inactive_product_permutation
, a_ids_product_permutation
, 0
, v_guid -- a_guid
, 0 -- a_debug
);
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
INSERT INTO tmp_Category (
id_category
, display_order
)
SELECT
PC.id_category
, PC.display_order
FROM (SELECT * FROM partsltd_prod.Shop_Product_Category_Temp WHERE GUID = v_guid) PC_T
INNER JOIN partsltd_prod.Shop_Product_Category PC ON PC_T.id_category = PC.id_category
;
INSERT INTO tmp_Product (
id_product
, id_category
, display_order
)
SELECT
P.id_product
, P.id_category
, P.display_order
FROM (SELECT * FROM partsltd_prod.Shop_Product_Temp WHERE GUID = v_guid) P_T
INNER JOIN partsltd_prod.Shop_Product P ON P.id_product = P_T.id_product
;
INSERT INTO tmp_Permutation (
id_permutation
, id_product
, can_view
, can_edit
, can_admin
)
SELECT
PP.id_permutation
, PP.id_product
, PP_T.can_view
, PP_T.can_edit
, PP_T.can_admin
FROM (SELECT * FROM partsltd_prod.Shop_Product_Permutation_Temp WHERE GUID = v_guid) PP_T
INNER JOIN partsltd_prod.Shop_Product_Permutation PP ON PP_T.id_permutation = PP.id_permutation
;
# Stock Items
CALL partsltd_prod.p_split(v_guid, a_ids_stock_item, ',', a_debug);
DELETE FROM tmp_Split;
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM partsltd_prod.Split_Temp
WHERE 1=1
AND GUID = v_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( v_guid );
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Stock_Item SI ON t_S.as_int = SI.id_stock
WHERE
ISNULL(t_S.as_int)
OR ISNULL(SI.id_stock)
) THEN
INSERT INTO tmp_Msg_Error (
-- guid,
id_type,
code,
msg
)
SELECT
-- v_guid,
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive stock item IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Stock_Item SI ON t_S.as_int = SI.id_stock
WHERE
ISNULL(t_S.as_int)
OR ISNULL(SI.id_stock)
;
ELSE
INSERT INTO tmp_Stock_Item (
id_stock
, id_permutation
, id_product
, id_location_storage
)
SELECT
SI.id_stock
, SI.id_permutation
, t_PP.id_product
, SI.id_location_storage
FROM tmp_Split t_S
RIGHT JOIN partsltd_prod.Shop_Stock_Item SI ON t_S.as_int = SI.id_stock
INNER JOIN tmp_Permutation t_PP ON SI.id_permutation = t_PP.id_permutation
WHERE
(
a_get_all_stock_item = 1
OR (
v_has_filter_stock_item = 1
AND NOT ISNULL(t_S.as_int)
)
)
AND (
a_get_inactive_stock_item = 1
OR SI.active = 1
)
AND (
ISNULL(a_date_received_to)
OR SI.date_received <= a_date_received_to
)
AND (
a_get_unsealed_stock_item_only = 0
OR SI.is_sealed = 0
)
AND (
a_get_sealed_stock_item_only = 0
OR SI.is_sealed = 1
)
AND (
a_get_nonexpired_stock_item_only = 0
OR SI.date_expiration > v_time_start
)
AND (
a_get_expired_stock_item_only = 0
OR SI.date_expiration <= v_time_start
)
AND (
a_get_consumed_stock_item_only = 0
OR SI.is_consumed = 1
)
AND (
a_get_nonconsumed_stock_item_only = 0
OR SI.is_consumed = 0
)
;
END IF;
END IF;
DELETE FROM tmp_Split;
-- Storage Regions
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
CALL partsltd_prod.p_split(v_guid, a_ids_region_storage, ',', a_debug);
DELETE FROM tmp_Split;
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM partsltd_prod.Split_Temp
WHERE 1=1
AND GUID = v_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( v_guid );
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Region R ON t_S.as_int = R.id_region
WHERE
ISNULL(t_S.as_int)
OR ISNULL(R.id_region)
) THEN
INSERT INTO tmp_Msg_Error (
-- guid,
id_type,
code,
msg
)
SELECT
-- v_guid,
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive region IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Region R ON t_S.as_int = R.id_region
WHERE
ISNULL(t_S.as_int)
OR ISNULL(R.id_region)
;
ELSE
INSERT INTO tmp_Region_Storage (
id_region
)
WITH RECURSIVE Recursive_CTE_Region_Storage AS (
SELECT
R.id_region AS id_region_parent,
NULL AS id_region_child
FROM tmp_Split t_S
RIGHT JOIN partsltd_prod.Shop_Region R
ON t_S.as_int = R.id_region
AND (
a_get_all_region_storage = 1
OR NOT ISNULL(t_S.as_int)
)
AND (
a_get_inactive_region_storage = 1
OR R.active = 1
)
INNER JOIN (
SELECT
A.id_region
FROM tmp_Stock_Item t_SI
-- INNER JOIN tmp_Stock_Item t_SI ON SL.id_location = t_SI.id_location_storage
INNER JOIN partsltd_prod.Shop_Storage_Location SL ON t_SI.id_location_storage = SL.id_location
INNER JOIN partsltd_prod.Shop_Plant P ON SL.id_plant = P.id_plant
INNER JOIN partsltd_prod.Shop_Address A ON P.id_address = A.id_address
) A_SI ON R.id_region = A_SI.id_region
UNION
SELECT
RB.id_region_parent,
RB.id_region_child
FROM partsltd_prod.Shop_Region_Branch RB
INNER JOIN Recursive_CTE_Region_Storage r_RS
ON RB.id_region_parent = r_RS.id_region_child
AND (
a_get_inactive_region_storage = 1
OR RB.active = 1
)
)
SELECT
DISTINCT R.id_region
FROM partsltd_prod.Shop_Region R
INNER JOIN Recursive_CTE_Region_Storage r_RS
ON R.id_region = r_RS.id_region_parent
OR R.id_region = r_RS.id_region_child
;
END IF;
END IF;
DELETE FROM tmp_Split;
-- Plants
INSERT INTO tmp_Plant_Storage (
id_plant
, id_region
)
SELECT
DISTINCT P.id_plant
, A.id_region
FROM tmp_Stock_Item t_SI
INNER JOIN partsltd_prod.Shop_Storage_Location SL ON t_SI.id_location_storage = SL.id_location
INNER JOIN partsltd_prod.Shop_Plant P ON SL.id_plant = P.id_plant
INNER JOIN partsltd_prod.Shop_Address A ON P.id_address = A.id_address
;
-- Storage Locations
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
CALL partsltd_prod.p_split(v_guid, a_ids_location_storage, ',', a_debug);
DELETE FROM tmp_Split;
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM partsltd_prod.Split_Temp
WHERE 1=1
AND GUID = v_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( v_guid );
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Region R ON t_S.as_int = R.id_region
WHERE
ISNULL(t_S.as_int)
OR ISNULL(R.id_region)
) THEN
INSERT INTO tmp_Msg_Error (
-- guid,
id_type,
code,
msg
)
SELECT
-- v_guid,
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive region IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Region R ON t_S.as_int = R.id_region
WHERE
ISNULL(t_S.as_int)
OR ISNULL(R.id_region)
;
ELSE
INSERT INTO tmp_Location_Storage (
id_location
, id_plant
)
WITH RECURSIVE Recursive_CTE_Location_Storage AS (
SELECT
SL.id_location AS id_location_parent,
NULL AS id_location_child
FROM tmp_Split t_S
RIGHT JOIN partsltd_prod.Shop_Storage_Location SL
ON t_S.as_int = SL.id_location
AND (
a_get_all_location_storage = 1
OR NOT ISNULL(t_S.as_int)
)
AND (
a_get_inactive_location_storage = 1
OR SL.active = 1
)
INNER JOIN tmp_Stock_Item t_SI ON SL.id_location = t_SI.id_location_storage
UNION
SELECT
SLB.id_location_parent,
SLB.id_location_child
FROM partsltd_prod.Shop_Storage_Location_Branch SLB
INNER JOIN Recursive_CTE_Location_Storage r_LS
ON SLB.id_location_parent = r_LS.id_location_child
AND (
a_get_inactive_location_storage
OR SLB.active = 1
)
)
SELECT
DISTINCT SL.id_location
, SL.id_plant
FROM partsltd_prod.Shop_Storage_Location SL
INNER JOIN Recursive_CTE_Location_Storage r_LS
ON SL.id_location = r_LS.id_location_parent
OR SL.id_location = r_LS.id_location_child
;
END IF;
END IF;
DELETE FROM tmp_Split;
/*
-- Permissions
IF EXISTS (SELECT * FROM tmp_Stock_Item LIMIT 1) THEN
SET v_id_permission_product := (SELECT id_permission FROM partsltd_prod.Shop_Permission WHERE code = 'STORE_PRODUCT' LIMIT 1);
SET v_ids_product_permission := (SELECT GROUP_CONCAT(id_product SEPARATOR ',') FROM tmp_Permutation WHERE NOT ISNULL(id_product));
-- SET v_ids_permutation_permission := (SELECT GROUP_CONCAT(id_permutation SEPARATOR ',') FROM tmp_Shop_Product WHERE NOT ISNULL(id_permutation));
-- SELECT v_guid, a_id_user, false, v_id_permission_product, v_id_access_level_view, v_ids_product_permission;
-- select * FROM partsltd_prod.Shop_Calc_User_Temp;
CALL p_shop_calc_user(
v_guid
, a_id_user
, false -- a_get_inactive_users
, v_id_permission_product
, v_id_access_level_view
, v_ids_product_permission
, 0 -- a_debug
);
-- select * FROM partsltd_prod.Shop_Calc_User_Temp;
UPDATE tmp_Stock_Item t_SI
INNER JOIN partsltd_prod.Shop_Calc_User_Temp UE_T
ON t_SI.id_product = UE_T.id_product
AND UE_T.GUID = v_guid
SET t_SI.can_view = UE_T.can_view,
t_SI.can_edit = UE_T.can_edit,
t_SI.can_admin = UE_T.can_admin
;
DELETE t_SI
FROM tmp_Stock_Item t_SI
/ *
LEFT JOIN partsltd_prod.Shop_Calc_User_Temp UE_T
ON t_SI.id_product = UE_T.id_product
AND UE_T.GUID = v_guid
* /
WHERE
/ *
FIND_IN_SET(t_SI.id_product, (
SELECT GROUP_CONCAT(UET.id_product SEPARATOR ',')
FROM partsltd_prod.Shop_Calc_User_Temp UET)
) = 0 # id_product NOT LIKE CONCAT('%', (SELECT GROUP_CONCAT(id_product SEPARATOR '|') FROM partsltd_prod.Shop_Calc_User_Temp), '%');
* /
/ *
ISNULL(UE_T.id_product)
OR IFNULL(UE_T.can_view, 0) = 0
* /
t_SI.id_product NOT IN (
SELECT id_product
FROM partsltd_prod.Shop_Calc_User_Temp UE_T
WHERE
GUID = v_guid
AND IFNULL(can_view, 0) = 1
)
;
# CALL p_shop_clear_calc_user(v_guid);
# DROP TABLE IF EXISTS Shop_Calc_User_Temp;
DELETE FROM partsltd_prod.Shop_Calc_User_Temp
WHERE GUID = v_guid
;
END IF;
*/
/*
select * FROM partsltd_prod.Shop_stock_item;
select * from tmp_Stock_Item;
select * from tmp_Permutation;
select * from tmp_Location_Storage;
select * from Shop_Storage_Location;
select * from tmp_Plant_Storage;
select * from tmp_Region_Storage;
*/
-- Returns
-- SET v_now := NOW();
# Stock Items
SELECT
t_SI.id_stock,
t_SI.id_permutation,
P.id_product,
P.id_category,
t_SI.id_location_storage,
t_PS.id_plant,
PLANT.id_address AS id_address_plant,
t_RS.id_region AS id_region_plant,
SL.code AS code_storage_location,
SL.name AS name_storage_location,
PLANT.code AS code_plant,
PLANT.name AS name_plant,
SI.id_currency_cost,
CURRENCY.symbol AS symbol_currency_cost,
CURRENCY.code AS code_currency_cost,
SI.cost_local_VAT_excl,
SI.cost_local_VAT_incl,
SI.date_purchased,
SI.date_received,
SI.is_sealed,
SI.date_unsealed,
SI.date_expiration,
SI.is_consumed,
SI.date_consumed,
SI.active,
/*
t_SI.active_permutation,
t_SI.active_product,
t_SI.active_category,
*/
t_PP.can_view,
t_PP.can_edit,
t_PP.can_admin
FROM tmp_Stock_Item t_SI
INNER JOIN partsltd_prod.Shop_Stock_Item SI ON t_SI.id_stock = SI.id_stock
INNER JOIN tmp_Permutation t_PP ON t_SI.id_permutation = t_PP.id_permutation
INNER JOIN partsltd_prod.Shop_Product P ON t_PP.id_product = P.id_product
INNER JOIN tmp_Location_Storage t_LS ON t_SI.id_location_storage = t_LS.id_location
INNER JOIN tmp_Plant_Storage t_PS ON t_LS.id_plant = t_PS.id_plant
INNER JOIN partsltd_prod.Shop_Plant PLANT ON t_PS.id_plant = PLANT.id_plant
INNER JOIN partsltd_prod.Shop_Address A ON PLANT.id_address = A.id_address
INNER JOIN tmp_Region_Storage t_RS ON A.id_region = t_RS.id_region
INNER JOIN partsltd_prod.Shop_Storage_Location SL ON t_LS.id_location = SL.id_location
INNER JOIN partsltd_prod.Shop_Currency CURRENCY ON SI.id_currency_cost = CURRENCY.id_currency
WHERE
IFNULL(t_PP.can_view, 0) = 1
;
# Errors
SELECT
t_ME.display_order,
-- t_ME.guid,
t_ME.id_type,
t_ME.msg,
MET.code,
MET.name,
MET.description
FROM tmp_Msg_Error t_ME
INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET
ON t_ME.id_type = MET.id_type
-- WHERE guid = v_guid
;
/*
# Return arguments for test
SELECT
a_ids_category,
a_get_inactive_category,
a_ids_product,
a_get_inactive_product,
a_get_first_product_only,
a_get_all_product,
a_ids_image,
a_get_inactive_image,
a_get_first_image_only,
a_get_all_image
;
*/
-- Clean up
DROP TEMPORARY TABLE IF EXISTS tmp_Region_Storage;
DROP TEMPORARY TABLE IF EXISTS tmp_Plant_Storage;
DROP TEMPORARY TABLE IF EXISTS tmp_Location_Storage;
DROP TEMPORARY TABLE IF EXISTS tmp_Stock_Item;
DROP TEMPORARY TABLE IF EXISTS tmp_Permutation;
-- DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
CALL partsltd_prod.p_shop_clear_calc_product_permutation ( v_guid );
IF a_debug = 1 THEN
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END IF;
END //
DELIMITER ;;
/*
CALL p_shop_get_many_stock_item (
1, # a_id_user
1, # a_get_all_product_permutation
-- 'nips', # a_guid_permutations
0, # a_get_inactive_product_permutation
'', # a_ids_product_permutation
1, # a_get_all_stock_item
0, # a_get_inactive_stock_item
'', # a_ids_stock_item
1, # a_get_all_region_storage
0, # a_get_inactive_delivery_region
'', # a_ids_region_storage
1, # a_get_all_plant_storage
0, # a_get_inactive_plant_storage
'', # a_ids_plant_storage
1, # a_get_all_location_storage
0, # a_get_inactive_location_storage
'', # a_ids_location_storage
NULL, # a_date_received_to
0, # a_get_sealed_stock_item_only
0, # a_get_unsealed_stock_item_only
0, # a_get_expired_stock_item_only
0, # a_get_nonexpired_stock_item_only
0, # a_get_consumed_stock_item_only
0 # a_get_nonconsumed_stock_item_only
, 0 # a_debug
);
DROP TABLE IF EXISTS tmp_Msg_Error;
select * FROM partsltd_prod.Shop_Storage_Location;
select * FROM partsltd_prod.Shop_product;
select * from TMP_MSG_ERROR;
DROP TABLE TMP_MSG_ERROR;
insert into shop_product_change_set (comment)
values ('set product not subscription - test bool output to python');
update shop_product
set is_subscription = 0,
id_change_set = (select id_change_set FROM partsltd_prod.Shop_product_change_set order by id_change_set desc limit 1)
where id_product = 1
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_save_stock_item;
DELIMITER //
CREATE PROCEDURE p_shop_save_stock_item (
IN a_comment VARCHAR(500)
, IN a_guid BINARY(36)
, IN a_id_user INT
, IN a_debug BIT
)
BEGIN
DECLARE v_code_type_error_bad_data VARCHAR(100);
DECLARE v_id_access_level_edit INT;
DECLARE v_id_change_set INT;
DECLARE v_id_permission_product INT;
DECLARE v_id_type_error_bad_data INT;
DECLARE v_ids_product_permission LONGTEXT;
DECLARE v_time_start TIMESTAMP(6);
DECLARE v_time_expire DATETIME;
DECLARE exit handler for SQLEXCEPTION
BEGIN
-- Get diagnostic information
GET DIAGNOSTICS CONDITION 1
@sqlstate = RETURNED_SQLSTATE
, @errno = MYSQL_ERRNO
, @text = MESSAGE_TEXT
;
-- Rollback the transaction
ROLLBACK;
-- Select the error information
-- SELECT 'Error' AS status, @errno AS error_code, @sqlstate AS sql_state, @text AS message;
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NULL
, code VARCHAR(50) NOT NULL
, msg VARCHAR(4000) NOT NULL
);
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
NULL
, @errno
, @text
;
SELECT *
FROM tmp_Msg_Error;
DROP TABLE IF EXISTS tmp_Msg_Error;
END;
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_time_expire := DATE_ADD(v_time_start, INTERVAL 1000 YEAR);
SET v_code_type_error_bad_data := 'BAD_DATA';
SET v_id_type_error_bad_data := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1);
SET v_id_access_level_edit := (SELECT id_access_level FROM Shop_Access_Level WHERE code = 'EDIT' LIMIT 1);
CALL partsltd_prod.p_validate_guid ( a_guid );
DROP TEMPORARY TABLE IF EXISTS tmp_Stock_Item;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
CREATE TEMPORARY TABLE tmp_Stock_Item (
id_stock INT NOT NULL
, id_category INT NULL
, id_product INT NOT NULL
, id_permutation INT NULL
, id_pairs_variations VARCHAR(4000) NULL
, has_variations BIT NULL
, date_purchased DATETIME NOT NULL
, date_received DATETIME NULL
, id_location_storage INT NOT NULL
, id_currency_cost INT NOT NULL
, cost_local_VAT_incl FLOAT NOT NULL
, cost_local_VAT_excl FLOAT NOT NULL
, is_sealed BIT NOT NULL
, date_unsealed DATETIME NULL
, date_expiration DATETIME NOT NULL
, is_consumed BIT NOT NULL
, date_consumed DATETIME NULL
, active BIT NOT NULL
, can_view BIT NULL
, can_edit BIT NULL
, can_admin BIT NULL
, name_error VARCHAR(1000) NULL
, is_new BIT NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NULL
, code VARCHAR(50) NOT NULL
, msg VARCHAR(4000) NOT NULL
);
-- Get data from Temp table
INSERT INTO tmp_Stock_Item (
id_stock
-- , id_category
, id_product
, id_permutation
, id_pairs_variations
, has_variations
, date_purchased
, date_received
, id_location_storage
, id_currency_cost
, cost_local_VAT_incl
, cost_local_VAT_excl
, is_sealed
, date_unsealed
, date_expiration
, is_consumed
, date_consumed
, active
# , name_error
, is_new
)
SELECT
SI_T.id_stock
-- , IFNULL(SI_T.id_category, P.id_category) AS id_category
, IFNULL(IFNULL(SI_T.id_product, PP.id_product), 0) AS id_product
, IFNULL(IFNULL(SI_T.id_permutation, SI.id_permutation), 0) AS id_permutation
, TRIM(IFNULL(SI_T.id_pairs_variations, ''))
, CASE WHEN TRIM(IFNULL(SI_T.id_pairs_variations, '')) = '' THEN 0 ELSE 1 END AS has_variations
, IFNULL(IFNULL(SI_T.date_purchased, SI.date_purchased), v_time_start) AS date_purchased
, IFNULL(SI_T.date_received, SI.date_received) AS date_received
, IFNULL(IFNULL(SI_T.id_location_storage, SI.id_location_storage), 0) AS id_location_storage
, IFNULL(IFNULL(SI_T.id_currency_cost, SI.id_currency_cost), 0) AS id_currency_cost
, IFNULL(SI_T.cost_local_VAT_incl, SI.cost_local_VAT_incl) AS cost_local_VAT_incl
, IFNULL(SI_T.cost_local_VAT_excl, SI.cost_local_VAT_excl) AS cost_local_VAT_excl
, IFNULL(IFNULL(SI_T.is_sealed, SI.is_sealed), 1) AS is_sealed
, IFNULL(SI_T.date_unsealed, SI.date_unsealed) AS date_unsealed
, IFNULL(IFNULL(SI_T.date_expiration, SI.date_expiration), v_time_expire) AS date_expiration
, IFNULL(IFNULL(SI_T.is_consumed, SI.is_consumed), 0) AS is_consumed
, IFNULL(SI_T.date_consumed, SI.date_consumed) AS date_consumed
, IFNULL(IFNULL(SI_T.active, SI.active), 1) AS active
# , fn_shop_get_product_permutation_name(SI_T.id_permutation)
, CASE WHEN IFNULL(SI_T.id_stock, 0) < 1 THEN 1 ELSE 0 END AS is_new
FROM partsltd_prod.Shop_Stock_Item_Temp SI_T
LEFT JOIN partsltd_prod.Shop_Stock_Item SI ON SI_T.id_stock = SI.id_stock
LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON SI_T.id_permutation = PP.id_permutation
-- LEFT JOIN Shop_Product P ON PP.id_product = P.id_product
WHERE SI_T.guid = a_guid
;
-- Missing Permutation IDs for setting new permutation for stock item
-- With variations
UPDATE tmp_Stock_Item t_SI
INNER JOIN partsltd_prod.Shop_Product P ON t_SI.id_product = P.id_product
SET t_SI.id_permutation = IFNULL(fn_shop_get_id_product_permutation_from_variation_csv_list ( t_SI.id_product, t_SI.id_pairs_variations ), 0)
WHERE 1=1
AND t_SI.id_permutation = 0
AND t_SI.has_variations = 1
;
-- Without variations
UPDATE tmp_Stock_Item t_SI
-- INNER JOIN Shop_Product P ON t_SI.id_product = P.id_product
INNER JOIN partsltd_prod.Shop_Product_Permutation PP ON t_SI.id_product = PP.id_product
SET t_SI.id_permutation = IFNULL(PP.id_permutation, 0)
WHERE 1=1
AND t_SI.id_permutation = 0
AND t_SI.has_variations = 0
;
-- Add stock item error names
UPDATE tmp_Stock_Item t_SI
INNER JOIN partsltd_prod.Shop_Product P ON t_SI.id_product = P.id_product
INNER JOIN partsltd_prod.Shop_Product_Category PC ON P.id_category = PC.id_category
-- INNER JOIN Shop_Product_Permutation PP ON t_SI.id_product = PP.id_product
SET t_SI.name_error = CONCAT(
PC.name,
' - ',
P.name,
' - ',
CASE WHEN IFNULL(t_SI.id_permutation, 0) = 0 THEN '(No permutation)' ELSE fn_shop_get_product_permutation_name ( t_SI.id_permutation ) END
)
;
IF a_debug = 1 THEN
sElect * from tmp_Stock_Item;
END IF;
-- Validation
-- id_stock
IF EXISTS (
SELECT *
FROM tmp_Stock_Item t_SI
LEFT JOIN partsltd_prod.Shop_Stock_Item SI ON t_SI.id_stock = SI.id_stock
WHERE 1=1
AND t_SI.id_stock > 0
AND ISNULL(SI.id_stock)
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT(
'Invalid stock item(s): '
, GROUP_CONCAT(
CONCAT(
IFNULL(t_SI.id_stock, '(No Stock Item)')
, ' - '
, IFNULL(t_SI.name_error, '(No Product)')
) SEPARATOR ', '
)
) AS msg
FROM tmp_Stock_Item t_SI
LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_SI.id_permutation = PP.id_permutation
WHERE 1=1
AND t_SI.id_stock > 0
AND ISNULL(SI.id_stock)
;
END IF;
-- id_product
IF EXISTS (SELECT * FROM tmp_Stock_Item t_SI WHERE t_SI.id_product = 0 LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following stock item(s) do not have a product: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg
FROM tmp_Stock_Item t_SI
WHERE t_SI.id_product = 0
;
END IF;
-- id_permutation
IF EXISTS (
SELECT *
FROM tmp_Stock_Item t_SI
LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_SI.id_permutation = PP.id_permutation
WHERE 1=1
AND (
t_SI.id_permutation = 0
OR PP.active = 0
)
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('A valid permutation could not be found for the variations selected for the following stock item(s): ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg
FROM tmp_Stock_Item t_SI
LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_SI.id_permutation = PP.id_permutation
WHERE 1=1
AND (
t_SI.id_permutation = 0
OR PP.active = 0
)
;
END IF;
-- date_purchased
IF EXISTS (SELECT * FROM tmp_Stock_Item t_SI WHERE ISNULL(t_SI.date_purchased) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following stock item(s) do not have an purchase date: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg
FROM tmp_Stock_Item t_SI
WHERE ISNULL(t_SI.date_purchased)
;
END IF;
-- id_location_storage
IF EXISTS (
SELECT *
FROM tmp_Stock_Item t_SI
INNER JOIN partsltd_prod.Shop_Storage_Location SL
ON t_SI.id_location_storage = SL.id_location
AND SL.active = 1
WHERE ISNULL(SL.id_location)
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following stock item(s) do not have a valid storage location: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg
FROM tmp_Stock_Item t_SI
INNER JOIN partsltd_prod.Shop_Storage_Location SL
ON t_SI.id_location_storage = SL.id_location
AND SL.active = 1
WHERE ISNULL(SL.id_location)
;
END IF;
-- id_currency_cost
IF EXISTS (
SELECT *
FROM tmp_Stock_Item t_SI
INNER JOIN partsltd_prod.Shop_Currency C
ON t_SI.id_currency_cost = C.id_currency
AND C.active = 1
WHERE ISNULL(C.id_currency)
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following stock item(s) do not have a valid cost currency: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg
FROM tmp_Stock_Item t_SI
INNER JOIN partsltd_prod.Shop_Currency C
ON t_SI.id_currency_cost = C.id_currency
AND C.active = 1
WHERE ISNULL(C.id_currency)
;
END IF;
-- cost_local_VAT_excl
IF EXISTS (
SELECT *
FROM tmp_Stock_Item t_SI
WHERE 1=1
AND (
ISNULL(t_SI.cost_local_VAT_excl)
OR t_SI.cost_local_VAT_excl < 0
)
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following stock item(s) do not have a valid cost excluding VAT: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg
FROM tmp_Stock_Item t_SI
WHERE 1=1
AND (
ISNULL(t_SI.cost_local_VAT_excl)
OR t_SI.cost_local_VAT_excl < 0
)
;
END IF;
-- cost_local_VAT_incl
IF EXISTS (
SELECT *
FROM tmp_Stock_Item t_SI
WHERE 1=1
AND (
ISNULL(t_SI.cost_local_VAT_incl)
OR t_SI.cost_local_VAT_incl < 0
)
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following stock item(s) do not have a valid cost including VAT: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg
FROM tmp_Stock_Item t_SI
WHERE 1=1
AND (
ISNULL(t_SI.cost_local_VAT_incl)
OR t_SI.cost_local_VAT_incl < t_SI.cost_local_VAT_excl
)
;
END IF;
-- date_received
IF EXISTS (SELECT * FROM tmp_Stock_Item t_SI WHERE NOT ISNULL(t_SI.date_received) AND t_SI.date_received < t_SI.date_purchased LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following stock item(s) do not have a valid received date: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg
FROM tmp_Stock_Item t_SI
WHERE 1=1
AND NOT ISNULL(t_SI.date_received)
AND t_SI.date_received < t_SI.date_purchased
;
END IF;
-- date_unsealed
IF EXISTS (SELECT * FROM tmp_Stock_Item t_SI WHERE NOT ISNULL(t_SI.date_unsealed) AND t_SI.date_unsealed < t_SI.date_purchased LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following stock item(s) do not have a valid unsealed date: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg
FROM tmp_Stock_Item t_SI
WHERE 1=1
AND NOT ISNULL(t_SI.date_received)
AND t_SI.date_received < t_SI.date_purchased
;
END IF;
-- date_expiration
IF EXISTS (SELECT * FROM tmp_Stock_Item t_SI WHERE NOT ISNULL(t_SI.date_expiration) AND t_SI.date_expiration < t_SI.date_purchased LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following stock item(s) do not have a valid expiration date: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg
FROM tmp_Stock_Item t_SI
WHERE 1=1
AND NOT ISNULL(t_SI.date_expiration)
AND t_SI.date_expiration < t_SI.date_purchased
;
END IF;
-- date_consumed
IF EXISTS (SELECT * FROM tmp_Stock_Item t_SI WHERE NOT ISNULL(t_SI.date_consumed) AND t_SI.date_consumed < t_SI.date_purchased LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following stock item(s) do not have a valid consumed date: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg
FROM tmp_Stock_Item t_SI
WHERE 1=1
AND NOT ISNULL(t_SI.date_consumed)
AND t_SI.date_consumed < t_SI.date_purchased
;
END IF;
-- Permissions
SET v_ids_product_permission := ( SELECT GROUP_CONCAT(t_SI.id_product SEPARATOR ',') FROM tmp_Stock_Item t_SI );
IF NOT ISNULL(v_ids_product_permission) THEN
SET v_id_permission_product = (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_PRODUCT' LIMIT 1);
CALL p_shop_calc_user(
a_guid
, a_id_user
, FALSE -- a_get_inactive_users
, v_id_permission_product
, v_id_access_level_edit
, v_ids_product_permission
, 0 -- a_debug
);
UPDATE tmp_Stock_Item t_SI
INNER JOIN Shop_Product P ON t_SI.id_product = P.id_product
INNER JOIN Shop_Calc_User_Temp UE_T
ON P.id_product = UE_T.id_product
AND UE_T.GUID = a_guid
SET
t_SI.can_view = UE_T.can_view
, t_SI.can_edit = UE_T.can_edit
, t_SI.can_admin = UE_T.can_admin
;
CALL p_shop_clear_calc_user(
a_guid
, 0 -- a_debug
);
IF EXISTS (SELECT * FROM tmp_Stock_Item t_SI WHERE IFNULL(t_SI.can_edit, 0) = 0 LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
guid
, id_type
, code
, msg
)
SELECT
a_guid AS GUID
, v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following stock item(s) do not have product edit permission: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg
FROM tmp_Stock_Item t_SI
WHERE IFNULL(t_SI.can_edit, 0) = 0
;
END IF;
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
START TRANSACTION;
IF NOT ISNULL(v_ids_product_permission) THEN
INSERT INTO Shop_Product_Change_Set (
comment
, updated_last_by
)
VALUES (
a_comment,
a_id_user
)
;
SET v_id_change_set := LAST_INSERT_ID();
-- select * from partsltd_prod.Shop_Stock_Item
UPDATE partsltd_prod.Shop_Stock_Item SI
INNER JOIN tmp_Stock_Item t_SI
ON SI.id_stock = t_SI.id_stock
SET
SI.id_permutation = t_SI.id_permutation
, SI.date_purchased = t_SI.date_purchased
, SI.date_received = t_SI.date_received
, SI.id_location_storage = t_SI.id_location_storage
, SI.id_currency_cost = t_SI.id_currency_cost
, SI.cost_local_VAT_excl = t_SI.cost_local_VAT_excl
, SI.cost_local_VAT_incl = t_SI.cost_local_VAT_incl
, SI.is_sealed = t_SI.is_sealed
, SI.date_unsealed = t_SI.date_unsealed
, SI.date_expiration = t_SI.date_expiration
, SI.is_consumed = t_SI.is_consumed
, SI.date_consumed = t_SI.date_consumed
, SI.active = t_SI.active
, SI.id_change_set = v_id_change_set
;
END IF;
INSERT INTO partsltd_prod.Shop_Stock_Item (
id_permutation
, date_purchased
, date_received
, id_location_storage
, id_currency_cost
, cost_local_VAT_excl
, cost_local_VAT_incl
, is_sealed
, date_unsealed
, date_expiration
, is_consumed
, date_consumed
, active
, created_by
, created_on
)
SELECT
t_SI.id_permutation
, t_SI.date_purchased
, t_SI.date_received
, t_SI.id_location_storage
, t_SI.id_currency_cost
, t_SI.cost_local_VAT_excl
, t_SI.cost_local_VAT_incl
, t_SI.is_sealed
, t_SI.date_unsealed
, t_SI.date_expiration
, t_SI.is_consumed
, t_SI.date_consumed
, t_SI.active
, a_id_user AS created_by
, v_time_start AS created_on
FROM tmp_Stock_Item t_SI
WHERE
is_new = 1
AND active = 1
;
DELETE FROM partsltd_prod.Shop_Stock_Item_Temp
WHERE GUID = a_guid;
COMMIT;
END IF;
# Errors
SELECT *
FROM tmp_Msg_Error t_ME
INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type
;
IF a_debug = 1 THEN
SELECT * from tmp_Stock_Item;
END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_Stock_Item;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
IF a_debug = 1 THEN
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END IF;
END //
DELIMITER ;;
/*
DELETE FROM Shop_Product_Permutation_Temp
WHERE id_permutation = 1
;
INSERT INTO Shop_Product_Permutation_Temp (
id_permutation,
id_product,
description,
cost_local,
id_currency_cost,
profit_local_min,
latency_manufacture,
id_unit_measurement_quantity,
count_unit_measurement_per_quantity_step,
quantity_min,
quantity_max,
quantity_stock,
is_subscription,
id_unit_measurement_interval_recurrence,
count_interval_recurrence,
id_stripe_product,
does_expire_faster_once_unsealed,
id_unit_measurement_interval_expiration_unsealed,
count_interval_expiration_unsealed,
active,
guid
)
VALUES
(
1 -- id_permutation,
, 1 -- id_product,
, 'Good Reddy Teddy' -- description,
, 5.0 -- cost_local,
, 1 -- id_currency_cost,
, 3.0 -- profit_local_min,
, 14 -- latency_manufacture,
, 1 -- id_unit_measurement_quantity,
, 1.0 -- count_unit_measurement_quantity,
, 3.0 -- quantity_min,
, 99.0 -- quantity_max,
, 1.0 -- quantity_stock,
, False -- is_subscription,
, null -- id_unit_measurement_interval_recurrence,
, null -- count_interval_recurrence,
, null -- id_stripe_product,
, False -- does_expire_faster_once_unsealed,
, null -- id_unit_measurement_interval_expiration_unsealed,
, null -- count_interval_expiration_unsealed,
, True -- active,
, 'NIPS' -- guid
)
;
select 'Shop_Product_Permutation_Temp before call';
SELECT * FROM Shop_Product_Permutation_Temp;
SELECT 'Shop_Product_Permutation before call' AS result_name;
select * FROM Shop_Product_Permutation;
CALL p_shop_save_product_permutation (
1, -- 'auth0|6582b95c895d09a70ba10fef', # a_id_user
'Initial data', # a_comment
'NIPS' # a_guid
);
SELECT 'Shop_Product_Permutation_Temp after call' AS result_name;
select * FROM Shop_Product_Permutation_Temp;
SELECT 'Shop_Product_Permutation after call' AS result_name;
select * FROM Shop_Product_Permutation;
DELETE FROM Shop_Product_Permutation_Temp
WHERE id_permutation = 1;
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS partsltd_prod.p_shop_save_stock_item_test;
DELIMITER //
CREATE PROCEDURE p_shop_save_stock_item_test ()
BEGIN
DECLARE v_guid BINARY(36);
DECLARE v_time_start TIMESTAMP(6);
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_guid := 'nips';
SELECT *
FROM partsltd_prod.Shop_Stock_Item
;
SELECT *
FROM partsltd_prod.Shop_Stock_Item_Temp
;
START TRANSACTION;
INSERT INTO partsltd_prod.Shop_Stock_Item_Temp (
id_stock
-- id_category
, id_product
, id_permutation
, id_pairs_variations
-- , has_variations
, date_purchased
, date_received
, id_location_storage
, id_currency_cost
, cost_local_VAT_excl
, cost_local_VAT_incl
, is_sealed
, date_unsealed
, date_expiration
, is_consumed
, date_consumed
, active
, guid
)
VALUES (
-1 -- id_stock
-- 1 -- id_category
, 4 -- id_product
, NULL -- id_permutation
, NULL -- id_pairs_variations
-- , FALSE -- 0 -- has_variations
, '2025-09-05 00:00' -- date_purchased
, NULL -- date_received
, 1 -- id_location_storage
, 1 -- id_currency_cost
, 10 -- cost_local_VAT_excl
, 12 -- cost_local_VAT_incl
, 1 -- is_sealed
, NULL -- date_unsealed
, NULL -- date_expiration
, FALSE -- 0 -- is_consumed
, NULL -- date_consumed
, 1 -- active
, v_guid
);
COMMIT;
SELECT *
FROM partsltd_prod.Shop_Stock_Item_Temp
WHERE GUID = v_guid
;
CALL partsltd_prod.p_shop_save_Stock_Item (
'Test save Stock_Item' -- comment
, v_guid -- guid
, 1 -- id_user
, 0 -- debug
);
SELECT *
FROM partsltd_prod.Shop_Stock_Item
;
SELECT *
FROM partsltd_prod.Shop_Stock_Item_Temp
;
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END //
DELIMITER ;;
CALL partsltd_prod.p_shop_save_stock_item_test ();
DELETE FROM partsltd_prod.Shop_Stock_Item_Temp;
/*
update shop_product p set p.has_variations = 0 where id_product = 4
DROP TABLE IF EXISTS tmp_Msg_Error;
*/-- USE partsltd_prod;
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_get_many_product_price_and_discount_and_delivery_option;
DELIMITER //
CREATE PROCEDURE p_shop_get_many_product_price_and_discount_and_delivery_option (
IN a_id_user INT
, IN a_get_all_product_permutation BIT
, IN a_get_inactive_product_permutation BIT
, IN a_ids_product_permutation TEXT
, IN a_get_all_product_price BIT
, IN a_get_inactive_product_price BIT
, IN a_ids_product_price TEXT
, IN a_product_price_min FLOAT
, IN a_product_price_max FLOAT
, IN a_get_all_currency BIT
, IN a_get_inactive_currency BIT
, IN a_ids_currency VARCHAR(4000)
, IN a_get_all_discount BIT
, IN a_get_inactive_discount BIT
, IN a_ids_discount TEXT
, IN a_get_all_delivery_option BIT
, IN a_get_inactive_delivery_option BIT
, IN a_ids_delivery_option TEXT
, IN a_get_all_delivery_region BIT
, IN a_get_inactive_delivery_region BIT
, IN a_ids_delivery_region TEXT
, IN a_debug BIT
)
BEGIN
-- Argument redeclaration
-- Variable declaration
DECLARE v_has_filter_product_permutation BIT;
DECLARE v_has_filter_product_price BIT;
DECLARE v_has_filter_currency BIT;
DECLARE v_has_filter_discount BIT;
DECLARE v_has_filter_delivery_option BIT;
DECLARE v_has_filter_delivery_region BIT;
DECLARE v_guid BINARY(36);
# DECLARE v_id_user VARCHAR(100);
DECLARE v_ids_permutation_unavailable VARCHAR(4000);
DECLARE v_id_permission_product INT;
DECLARE v_ids_product_permission VARCHAR(4000);
-- DECLARE v_ids_permutation_permission VARCHAR(4000);
DECLARE v_id_access_level_view INT;
-- DECLARE v_now DATETIME;
DECLARE v_id_minimum INT;
DECLARE v_time_start TIMESTAMP(6);
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_guid := UUID();
SET v_id_access_level_view := (SELECT id_access_level FROM Shop_Access_Level WHERE code = 'VIEW');
-- Argument validation + default values
SET a_id_user := TRIM(IFNULL(a_id_user, ''));
SET a_get_all_product_permutation := TRIM(IFNULL(a_get_all_product_permutation, 1));
SET a_get_inactive_product_permutation := TRIM(IFNULL(a_get_inactive_product_permutation, 0));
SET a_ids_product_permutation := TRIM(IFNULL(a_ids_product_permutation, ''));
SET a_get_all_delivery_region := TRIM(IFNULL(a_get_all_delivery_region, 1));
SET a_get_inactive_delivery_region := TRIM(IFNULL(a_get_inactive_delivery_region, 0));
SET a_ids_delivery_region := TRIM(IFNULL(a_ids_delivery_region, ''));
SET a_get_all_currency := TRIM(IFNULL(a_get_all_currency, 1));
SET a_get_inactive_currency := TRIM(IFNULL(a_get_inactive_currency, 0));
SET a_ids_currency := TRIM(IFNULL(a_ids_currency, ''));
SET a_get_all_discount := TRIM(IFNULL(a_get_all_discount, 1));
SET a_get_inactive_discount := TRIM(IFNULL(a_get_inactive_discount, 0));
SET a_ids_discount := TRIM(IFNULL(a_ids_discount, ''));
SET a_debug := IFNULL(a_debug, 0);
IF a_debug = 1 THEN
SELECT
a_id_user
, a_get_all_variation_type
, a_get_inactive_variation_type
, a_get_first_variation_type_only
, a_ids_variation_type
, a_get_all_variation
, a_get_inactive_variation
, a_get_first_variation_only
, a_ids_variation
, a_debug
;
END IF;
-- Temporary tables
DROP TEMPORARY TABLE IF EXISTS tmp_Discount;
DROP TEMPORARY TABLE IF EXISTS tmp_Currency;
DROP TEMPORARY TABLE IF EXISTS tmp_Delivery_Region;
DROP TEMPORARY TABLE IF EXISTS tmp_Shop_Image;
DROP TEMPORARY TABLE IF EXISTS tmp_Shop_Variation;
DROP TEMPORARY TABLE IF EXISTS tmp_Shop_Product;
DROP TEMPORARY TABLE IF EXISTS tmp_Shop_Product_2;
DROP TEMPORARY TABLE IF EXISTS tmp_Category;
DROP TEMPORARY TABLE IF EXISTS tmp_Permutation;
DROP TEMPORARY TABLE IF EXISTS tmp_Product;
CREATE TEMPORARY TABLE tmp_Category (
id_category INT NOT NULL
, display_order INT NOT NULL
);
CREATE TEMPORARY TABLE tmp_Product (
id_category INT NOT NULL
, id_product INT NOT NULL
, display_order INT NOT NULL
);
CREATE TEMPORARY TABLE tmp_Permutation (
id_permutation INT NULL
, id_product INT NOT NULL
, can_view BIT
, can_edit BIT
, can_admin BIT
);
CREATE TEMPORARY TABLE tmp_Price (
id_price INT
, id_permutation INT
);
CREATE TEMPORARY TABLE tmp_Currency (
id_currency INT NOT NULl
/*
active BIT NOT NULL
display_order INT NOT NULL
*/
);
CREATE TEMPORARY TABLE tmp_Discount (
id_discount INT NOT NULL
/*
active BIT NOT NULL,
display_order INT NOT NULL
*/
);
CREATE TEMPORARY TABLE tmp_Delivery_Option (
id_option INT NOT NULL
/*
active BIT NOT NULL,
display_order INT NOT NULL,
requires_delivery_option BIT NOT NULL DEFAULT 0
*/
);
CREATE TEMPORARY TABLE tmp_Delivery_Region (
id_region INT NOT NULL
/*
active BIT NOT NULL,
display_order INT NOT NULL,
requires_delivery_option BIT NOT NULL DEFAULT 0
*/
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
-- guid BINARY(36) NOT NULL,
id_type INT NULL,
code VARCHAR(50) NOT NULL,
msg VARCHAR(4000) NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split (
substring VARCHAR(4000) NOT NULL
, as_int INT NULL
);
DELETE FROM tmp_Split;
-- Parse filters
SET v_has_filter_product_permutation = CASE WHEN a_ids_product_permutation = '' THEN 0 ELSE 1 END;
SET v_has_filter_product_price = CASE WHEN a_ids_product_price = '' THEN 0 ELSE 1 END;
SET v_has_filter_currency = CASE WHEN a_ids_currency = '' THEN 0 ELSE 1 END;
SET v_has_filter_discount = CASE WHEN a_ids_discount = '' THEN 0 ELSE 1 END;
SET v_has_filter_delivery_option = CASE WHEN a_ids_delivery_option = '' THEN 0 ELSE 1 END;
SET v_has_filter_delivery_region = CASE WHEN a_ids_delivery_region = '' THEN 0 ELSE 1 END;
IF a_debug = 1 THEN
SELECT
v_has_filter_product_permutation
, v_has_filter_product_price
, v_has_filter_currency
, v_has_filter_discount
, v_has_filter_delivery_option
, v_has_filter_delivery_region
;
END IF;
CALL partsltd_prod.p_shop_calc_product_permutation (
a_id_user
, 1 -- a_get_all_product_category
, 0 -- a_get_inactive_product_category
, '' -- a_ids_product_category
, 1 -- a_get_all_product
, 0 -- a_get_inactive_product
, '' -- a_ids_product
, a_get_all_product_permutation
, a_get_inactive_product_permutation
, a_ids_product_permutation
, 0
, v_guid -- a_guid
, 0 -- a_debug
);
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
INSERT INTO tmp_Category (
id_category
, display_order
)
SELECT
PC.id_category
, PC.display_order
FROM (SELECT * FROM partsltd_prod.Shop_Product_Category_Temp WHERE GUID = v_guid) PC_T
INNER JOIN partsltd_prod.Shop_Product_Category PC ON PC_T.id_category = PC.id_category
;
INSERT INTO tmp_Product (
id_product
, id_category
, display_order
)
SELECT
P.id_product
, P.id_category
, P.display_order
FROM (SELECT * FROM partsltd_prod.Shop_Product_Temp WHERE GUID = v_guid) P_T
INNER JOIN partsltd_prod.Shop_Product P ON P.id_product = P_T.id_product
;
INSERT INTO tmp_Permutation (
id_permutation
, id_product
, can_view
, can_edit
, can_admin
)
SELECT
PP.id_permutation
, PP.id_product
, PP_T.can_view
, PP_T.can_edit
, PP_T.can_admin
FROM (SELECT * FROM partsltd_prod.Shop_Product_Permutation_Temp WHERE GUID = v_guid) PP_T
INNER JOIN partsltd_prod.Shop_Product_Permutation PP ON PP_T.id_permutation = PP.id_permutation
;
# Product Prices
CALL partsltd_prod.p_split(v_guid, a_ids_product_price, ',', a_debug);
DELETE FROM tmp_Split;
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM partsltd_prod.Split_Temp
WHERE 1=1
AND GUID = v_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( v_guid );
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Product_Price PRICE ON t_S.as_int = PRICE.id_price
WHERE
ISNULL(t_S.as_int)
OR ISNULL(PRICE.id_price)
) THEN
INSERT INTO tmp_Msg_Error (
-- guid,
id_type,
code,
msg
)
SELECT
-- v_guid,
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive product price IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Product_Price PRICE ON t_S.as_int = PRICE.id_price
WHERE
ISNULL(t_S.as_int)
OR ISNULL(PRICE.id_price)
;
ELSE
INSERT INTO tmp_Price (
id_price
, id_permutation
)
SELECT
PRICE.id_price
, PRICE.id_permutation
FROM tmp_Split t_S
RIGHT JOIN partsltd_prod.Shop_Product_Price PRICE ON t_S.as_int = PRICE.id_price
INNER JOIN tmp_Permutation t_PP ON SI.id_permutation = t_PP.id_permutation
WHERE
(
a_get_all_stock_item = 1
OR (
v_has_filter_stock_item = 1
AND NOT ISNULL(t_S.as_int)
)
)
AND (
a_get_inactive_stock_item = 1
OR SI.active = 1
)
;
END IF;
END IF;
DELETE FROM tmp_Split;
INSERT INTO tmp_Shop_Product (
id_permutation,
active_permutation,
display_order_permutation
)
SELECT
PP.id_permutation,
PP.active AS active_permutation,
PP.display_order AS display_order_permutation
FROM Shop_Product P
INNER JOIN Shop_Product_Permutation PP
ON P.id_product = PP.id_product
INNER JOIN Shop_Product_Category C
ON P.id_category = C.id_category
WHERE
# permutations
(
a_get_all_product_permutation
OR (
v_has_filter_product_permutation
AND FIND_IN_SET(PP.id_permutation, a_ids_product_permutation) > 0
)
OR (
a_get_products_quantity_stock_below_min = 1
AND PP.quantity_stock < PP.quantity_min
)
)
AND (
a_get_inactive_product_permutation
OR PP.active
)
;
# Delivery Regions
INSERT INTO tmp_Delivery_Region (
id_region,
active,
display_order,
requires_delivery_option
)
WITH RECURSIVE Recursive_CTE_Delivery_Region AS (
SELECT
DR.id_region AS id_region_parent,
NULL AS id_region_child,
CASE WHEN FIND_IN_SET(DR.id_region, a_ids_delivery_region) > 0 THEN 1 ELSE 0 END AS requires_delivery_option
FROM Shop_Product_Currency_Region_Link PCRL
INNER JOIN Shop_Currency C ON PCRL.id_currency = C.id_currency
INNER JOIN tmp_Shop_Product t_P
ON PCRL.id_product <=> t_P.id_product
AND PCRL.id_permutation <=> t_P.id_permutation
INNER JOIN Shop_Region DR ON PCRL.id_region_purchase = DR.id_region
WHERE
(
a_get_all_delivery_region
OR FIND_IN_SET(DR.id_region, a_ids_delivery_region) > 0
)
AND (
a_get_inactive_delivery_region
OR DR.active = 1
)
UNION
SELECT
DRB.id_region_parent,
DRB.id_region_child,
0 AS requires_delivery_option
FROM Shop_Region_Branch DRB
INNER JOIN Recursive_CTE_Delivery_Region r_DR
ON DRB.id_region_parent = r_DR.id_region_child
AND (
a_get_inactive_delivery_region
OR DRB.active = 1
)
)
SELECT
DR.id_region,
DR.active,
DR.display_order,
requires_delivery_option
FROM Shop_Region DR
INNER JOIN Recursive_CTE_Delivery_Region r_DR
ON DR.id_region = r_DR.id_region_parent
OR DR.id_region = r_DR.id_region_child
;
/*
select * from tmp_delivery_region;
SELECT *
FROM tmp_Shop_Product t_P
WHERE
*(
a_get_all_category
OR a_get_all_product
OR a_get_all_product_permutation
)*
FIND_IN_SET(t_P.id_category, a_ids_category) > 0
OR FIND_IN_SET(t_P.id_product, a_ids_product) > 0
OR FIND_IN_SET(t_P.id_permutation, a_ids_product_permutation) > 0
;
*/
IF v_has_filter_delivery_region THEN
SET v_ids_permutation_unavailable = (
SELECT GROUP_CONCAT(t_P.id_permutation SEPARATOR ', ')
FROM (
SELECT *
FROM tmp_Shop_Product t_P
WHERE
/*(
a_get_all_category
OR a_get_all_produc
OR a_get_all_product_permutation
)*/
FIND_IN_SET(t_P.id_category, a_ids_category) > 0
OR FIND_IN_SET(t_P.id_product, a_ids_product) > 0
OR FIND_IN_SET(t_P.id_permutation, a_ids_product_permutation) > 0
) t_P
LEFT JOIN (
SELECT *
FROM Shop_Product_Currency_Region_Link PCRL
WHERE
(
a_get_all_delivery_region
OR FIND_IN_SET(PCRL.id_region_purchase, a_ids_delivery_region) > 0
)
) PCRL
ON t_P.id_product <=> PCRL.id_product
AND t_P.id_permutation <=> PCRL.id_permutation
LEFT JOIN tmp_Delivery_Region t_DR
ON PCRL.id_region_purchase = t_DR.id_region
AND t_DR.requires_delivery_option = 1
WHERE
ISNULL(t_DR.id_region)
);
IF NOT ISNULL(v_ids_permutation_unavailable) THEN
INSERT INTO tmp_Msg_Error (
guid,
id_type,
code,
msg
)
VALUES (
v_guid,
(SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'PRODUCT_AVAILABILITY' LIMIT 1),
'PRODUCT_AVAILABILITY',
CONCAT('Error: The following permutation IDs are not available in this region: ', IFNULL(v_ids_permutation_unavailable, 'NULL'))
);
END IF;
/*
DELETE FROM tmp_Shop_Product t_P
WHERE t_P.id_permutation NOT IN (
SELECT
id_permutation
FROM Shop_Product_Currency_Region_Link PCL
INNER JOIN tmp_Delivery_Region t_DR
ON PCRL.id_region_purchase = t_DR.id_region
);
*/
END IF;
-- select * from tmp_Shop_Product;
# Currencies
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid) THEN
INSERT INTO tmp_Currency (
id_currency,
active,
display_order
)
SELECT
C.id_currency,
C.active,
C.display_order
FROM Shop_Product_Currency_Region_Link PCRL
INNER JOIN Shop_Currency C ON PCRL.id_currency = C.id_currency
INNER JOIN tmp_Shop_Product t_P
ON PCRL.id_product <=> t_P.id_product
AND PCRL.id_permutation <=> t_P.id_permutation
INNER JOIN tmp_Delivery_Region t_DR ON PCRL.id_region_purchase = t_DR.id_region
WHERE
(
a_get_all_currency
OR FIND_IN_SET(C.id_currency, a_ids_currency) > 0
)
AND (
a_get_inactive_currency
OR (
C.active
AND PCRL.active
)
)
;
-- select * from tmp_Currency;
IF v_has_filter_currency THEN
SET v_ids_permutation_unavailable = (
SELECT GROUP_CONCAT(t_P.id_permutation SEPARATOR ', ')
FROM (
SELECT *
FROM tmp_Shop_Product t_P
WHERE
/*(
a_get_all_category
OR a_get_all_product
OR a_get_all_product_permutation
)*/
FIND_IN_SET(t_P.id_category, a_ids_category) > 0
OR FIND_IN_SET(t_P.id_product, a_ids_product) > 0
OR FIND_IN_SET(t_P.id_permutation, a_ids_product_permutation) > 0
) t_P
INNER JOIN (
SELECT *
FROM Shop_Product_Currency_Region_Link PCRL
WHERE
(
a_get_all_currency
OR FIND_IN_SET(PCRL.id_currency, a_ids_currency) > 0
)
) PCRL
ON t_P.id_permutation = PCRL.id_permutation
LEFT JOIN tmp_Currency t_C
ON PCRL.id_currency = t_C.id_currency
WHERE ISNULL(t_C.id_currency)
);
IF NOT ISNULL(v_ids_permutation_unavailable) THEN
INSERT INTO tmp_Msg_Error (
guid,
id_type,
code,
msg
)
VALUES (
v_guid,
(SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'PRODUCT_AVAILABILITY' LIMIT 1),
'PRODUCT_AVAILABILITY',
CONCAT('Error: The following permutation IDs are not available in this currency: ', IFNULL(v_ids_permutation_unavailable, 'NULL'))
);
END IF;
/*
DELETE FROM tmp_Shop_Product t_P
WHERE t_P.id_permutation NOT IN (
SELECT
id_permutation
FROM Shop_Product_Currency_Region_Link PCL
INNER JOIN tmp_Currency t_C
ON PCRL.id_currency = t_C.id_currency
);
*/
END IF;
END IF;
# Discounts
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid) THEN
INSERT INTO tmp_Discount (
id_discount,
active,
display_order
)
SELECT
D.id_discount,
D.active,
D.display_order
FROM Shop_Discount D
INNER JOIN tmp_Shop_Product t_P
ON D.id_product = t_P.id_product
AND D.id_permutation <=> t_P.id_permutation
WHERE
(
a_get_all_discount
OR FIND_IN_SET(D.id_discount, a_ids_discount) > 0
)
AND (
a_get_inactive_discount
OR D.active
)
;
END IF;
# select 'pre-permission results';
# select * from tmp_Shop_Product;
-- Permissions
IF EXISTS (SELECT * FROM tmp_Shop_Product_Category LIMIT 1) THEN
# SET v_id_user := (SELECT id_user FROM Shop_User WHERE name = CURRENT_USER());
SET v_id_permission_product := (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_PRODUCT' LIMIT 1);
SET v_ids_product_permission := (SELECT GROUP_CONCAT(id_product SEPARATOR ',') FROM tmp_Shop_Product WHERE NOT ISNULL(id_product));
-- SET v_ids_permutation_permission := (SELECT GROUP_CONCAT(id_permutation SEPARATOR ',') FROM tmp_Shop_Product WHERE NOT ISNULL(id_permutation));
-- SELECT v_guid, a_id_user, false, v_id_permission_product, v_id_access_level_view, v_ids_product_permission;
-- select * from Shop_Calc_User_Temp;
CALL p_shop_calc_user(v_guid, a_id_user, false, v_id_permission_product, v_id_access_level_view, v_ids_product_permission);
-- select * from Shop_Calc_User_Temp;
UPDATE tmp_Shop_Product t_P
INNER JOIN Shop_Calc_User_Temp UE_T
ON t_P.id_product = UE_T.id_product
AND UE_T.GUID = v_guid
SET t_P.can_view = UE_T.can_view,
t_P.can_edit = UE_T.can_edit,
t_P.can_admin = UE_T.can_admin
;
-- select * from Shop_Calc_User_Temp;
-- select * from tmp_Shop_Product;
DELETE t_P
FROM tmp_Shop_Product t_P
WHERE
FIND_IN_SET(t_P.id_product, (SELECT GROUP_CONCAT(UET.id_product SEPARATOR ',') FROM Shop_Calc_User_Temp UET)) = 0 # id_product NOT LIKE CONCAT('%', (SELECT GROUP_CONCAT(id_product SEPARATOR '|') FROM Shop_Calc_User_Temp), '%');
OR (
ISNULL(t_P.can_view)
AND (
NOT v_has_filter_category
OR FIND_IN_SET(t_P.id_category, a_ids_category) = 0
)
AND (
NOT v_has_filter_product
OR FIND_IN_SET(t_P.id_product, a_ids_product) = 0
)
AND (
NOT v_has_filter_product_permutation
OR FIND_IN_SET(t_P.id_permutation, a_ids_product_permutation) = 0
)
)
;
CALL p_shop_clear_calc_user(v_guid);
# DROP TABLE IF EXISTS Shop_Calc_User_Temp;
/*
DELETE FROM Shop_Calc_User_Temp UE_T
WHERE UE_T.GUID = v_guid
;
*/
END IF;
-- select * from tmp_Shop_Product;
-- Returns
-- SET v_now := NOW();
# Categories
SELECT
DISTINCT t_C.id_category,
C.name,
C.description,
C.display_order
FROM tmp_Shop_Product_Category t_C
INNER JOIN Shop_Product_Category C
ON t_C.id_category = C.id_category
INNER JOIN tmp_Shop_Product t_P
ON t_C.id_category = t_P.id_category
ORDER BY C.display_order
;
# Products
SELECT
t_P.id_product,
t_P.id_permutation,
t_P.name,
t_P.description,
P.has_variations,
P.id_category,
PP.cost_local,
PP.id_currency_cost,
CURRENCY.code AS code_currency_cost,
CURRENCY.symbol AS symbol_currency_cost,
PP.profit_local_min,
t_P.latency_manufacture,
t_P.quantity_min,
t_P.quantity_max,
t_P.quantity_step,
t_P.quantity_stock,
t_P.id_stripe_product,
t_P.is_subscription,
UM.name_singular AS name_interval_recurrence,
UM.name_plural AS name_plural_interval_recurrence,
PP.count_interval_recurrence,
t_P.display_order_category,
t_P.display_order_product,
t_P.display_order_permutation,
IFNULL(t_P.can_view, 0) AS can_view,
IFNULL(t_P.can_edit, 0) AS can_edit,
IFNULL(t_P.can_admin, 0) AS can_admin
FROM tmp_Shop_Product t_P
INNER JOIN Shop_Product P ON t_P.id_product = P.id_product
INNER JOIN Shop_Product_Permutation PP ON t_P.id_permutation = PP.id_permutation
-- LEFT JOIN Shop_Interval_Recurrence RI ON t_P.id_unit_measurement_interval_recurrence = RI.id_interval
LEFT JOIN Shop_Unit_Measurement UM ON PP.id_unit_measurement_interval_recurrence = UM.id_unit_measurement
INNER JOIN Shop_Currency CURRENCY ON PP.id_currency_cost = CURRENCY.id_currency
ORDER BY t_P.rank_permutation
;
# Variations
SELECT
V.id_variation
, V.code AS code_variation
, V.name AS name_variation
, V.active AS active_variation
, V.display_order
, V.id_type
, VT.code AS code_variation_type
, VT.name AS name_variation_type
, VT.name_plural AS name_plural_variation_type
, VT.active AS active_variation_type
, VT.display_order
, t_P.id_product
, t_P.id_permutation
, t_P.id_category
FROM Shop_Variation V
INNER JOIN Shop_Variation_Type VT ON V.id_type = VT.id_type
INNER JOIN Shop_Product_Permutation_Variation_Link PPVL ON V.id_variation = PPVL.id_variation
INNER JOIN tmp_Shop_Product t_P ON PPVL.id_permutation <=> t_P.id_permutation
WHERE V.active
AND PPVL.active
;
/*
# Permutation variations output
SELECT t_P.id_permutation,
t_P.id_product,
t_P.id_category,
id_variation
FROM Shop_Product_Permutation_Variation_Link PPVL
INNER JOIN tmp_Shop_Product t_P
ON t_P.id_permutation = PPVL.id_permutation
ORDER BY t_P.display_order
;
*/
-- select * from Shop_Product_Currency_Region_Link;
-- select * from shop_currency;
/*
select * from tmp_Currency;
select * from tmp_delivery_region;
select * from tmp_shop_product;
*/
# Product Price
SELECT
PCRL.id_link AS id_price,
t_P.id_permutation,
t_P.id_product,
t_P.id_category,
t_C.id_currency,
C.code AS code_currency,
C.name AS name_currency,
C.symbol AS symbol_currency,
t_DR.id_region,
PCRL.price_local_VAT_incl,
PCRL.price_local_VAT_excl,
ROW_NUMBER() OVER(ORDER BY t_P.rank_permutation, C.display_order) AS display_order
FROM Shop_Product_Currency_Region_Link PCRL
INNER JOIN tmp_Shop_Product t_P
ON PCRL.id_product <=> t_P.id_product
AND PCRL.id_permutation <=> t_P.id_permutation
-- INNER JOIN Shop_Product P ON PCRL.id_product = P.id_product
INNER JOIN tmp_Currency t_C ON PCRL.id_currency = t_C.id_currency
INNER JOIN Shop_Currency C ON t_C.id_currency = C.id_currency
INNER JOIN tmp_Delivery_Region t_DR ON PCRL.id_region_purchase = t_DR.id_region
WHERE (
a_get_inactive_product
AND a_get_inactive_product_permutation
AND a_get_inactive_currency
AND a_get_inactive_delivery_region
OR PCRL.active
)
ORDER BY t_P.rank_permutation
;
/*
# Currency
SELECT
DISTINCT C.id_currency,
C.code,
C.name,
C.factor_from_GBP,
t_C.display_order
FROM Shop_Currency C
INNER JOIN tmp_Currency t_C ON C.id_currency = t_C.id_currency
GROUP BY C.id_currency, t_C.display_order
ORDER BY t_C.display_order
;
*/
# Images
SELECT
t_I.id_image,
t_I.id_product,
t_I.id_permutation,
t_P.id_category,
I.url,
I.active,
I.display_order
FROM tmp_Shop_Image t_I
INNER JOIN Shop_Product_Image I
ON t_I.id_image = I.id_image
INNER JOIN tmp_Shop_Product t_P
ON t_I.id_product = t_P.id_product
AND t_I.id_permutation <=> t_P.id_permutation
ORDER BY t_P.rank_permutation, I.display_order
;
# Delivery options
SELECT
_DO.id_option,
PDOL.id_product,
PDOL.id_permutation,
t_P.id_category,
_DO.code,
_DO.name,
_DO.latency_delivery_min,
_DO.latency_delivery_max,
_DO.quantity_min,
_DO.quantity_max,
GROUP_CONCAT(DR.code SEPARATOR ',') AS codes_region,
GROUP_CONCAT(DR.name SEPARATOR ',') AS names_region,
PDOL.price_local,
PDOL.display_order
FROM Shop_Delivery_Option _DO
INNER JOIN Shop_Product_Permutation_Delivery_Option_Link PDOL
ON _DO.id_option = PDOL.id_delivery_option
AND (
a_get_inactive_delivery_region
OR PDOL.active
)
INNER JOIN tmp_Shop_Product t_P
ON PDOL.id_product = t_P.id_product
AND PDOL.id_permutation <=> t_P.id_permutation
INNER JOIN tmp_Delivery_Region t_DR ON PDOL.id_region = t_DR.id_region
INNER JOIN Shop_Region DR ON t_DR.id_region = DR.id_region
WHERE (
a_get_inactive_delivery_region
OR _DO.active
)
GROUP BY t_P.id_category, t_P.id_product, PDOL.id_permutation, t_P.rank_permutation, DR.id_region, _DO.id_option, PDOL.id_link
ORDER BY t_P.rank_permutation, PDOL.display_order
;
# Discounts
SELECT
D.id_discount,
P.id_category,
D.id_product,
D.id_permutation,
DR.id_region,
C.id_currency,
D.code AS code_discount,
D.name AS name_discount,
D.multiplier,
D.subtractor,
D.apply_multiplier_first,
D.quantity_min,
D.quantity_max,
D.date_start,
D.date_end,
GROUP_CONCAT(DR.code) AS codes_region,
GROUP_CONCAT(DR.name) AS names_region,
GROUP_CONCAT(C.code) AS codes_currency,
GROUP_CONCAT(C.name) AS names_currency,
ROW_NUMBER() OVER(ORDER BY D.display_order) AS display_order
FROM tmp_Discount t_D
INNER JOIN Shop_Discount D ON t_D.id_discount = D.id_discount
INNER JOIN Shop_Product P ON D.id_product = P.id_product
INNER JOIN tmp_Shop_Product t_P
ON D.id_product = t_P.id_product
-- AND D.id_permutation <=> t_P.id_permutation
INNER JOIN Shop_Discount_Region_Currency_Link DRCL
ON D.id_discount = DRCL.id_discount
INNER JOIN tmp_Delivery_Region t_DR ON DRCL.id_region = t_DR.id_region
INNER JOIN Shop_Region DR ON t_DR.id_region = DR.id_region
INNER JOIN tmp_Currency t_C ON DRCL.id_currency = t_C.id_currency
INNER JOIN Shop_Currency C ON t_C.id_currency = C.id_currency
GROUP BY D.id_discount, DR.id_region, C.id_currency
ORDER BY D.display_order, DR.display_order, C.display_order
;
/*
# Delivery Regions
SELECT
t_DR.id_region,
t_P.id_category,
t_P.id_product,
t_P.id_permutation,
DR.code,
DR.name
FROM tmp_Delivery_Region t_DR
INNER JOIN Shop_Delivery_Region DR ON t_DR.id_region = DR.id_region
INNER JOIN Shop_Product_Region_Currency_Link PDRL
ON DR.id_region = PDRL.id_region
AND (
a_get_inactive_delivery_region
OR PDRL.active
)
INNER JOIN tmp_Shop_Product t_P
ON PDRL.id_product = t_P.id_product
AND PDRL.id_permutation <=> t_P.id_permutation
INNER JOIN tmp_Currency t_C ON PDRL.id_currency = t_C.id_currency
ORDER BY t_DR.display_order
;
*/
# Errors
SELECT
*
FROM tmp_Msg_Error t_ME
INNER JOIN Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type
-- WHERE guid = v_guid
;
-- Clean up
DROP TEMPORARY TABLE IF EXISTS tmp_Discount;
DROP TEMPORARY TABLE IF EXISTS tmp_Currency;
DROP TEMPORARY TABLE IF EXISTS tmp_Delivery_Region;
DROP TEMPORARY TABLE IF EXISTS tmp_Shop_Image;
DROP TEMPORARY TABLE IF EXISTS tmp_Shop_Variation;
DROP TEMPORARY TABLE IF EXISTS tmp_Shop_Product;
DROP TEMPORARY TABLE IF EXISTS tmp_Product;
DROP TEMPORARY TABLE IF EXISTS tmp_Shop_Product_2;
DROP TEMPORARY TABLE IF EXISTS tmp_Shop_Product_Category;
DROP TEMPORARY TABLE IF EXISTS tmp_Category;
DROP TEMPORARY TABLE IF EXISTS tmp_Permutation;
DROP TEMPORARY TABLE IF EXISTS tmp_Product;
CALL partsltd_prod.p_shop_clear_calc_product_permutation ( v_guid );
IF a_debug = 1 THEN
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END IF;
END //
DELIMITER ;;
/*
CALL partsltd_prod.p_shop_get_many_product_price_and_discount_and_delivery_option (
IN a_id_user INT,
IN a_get_all_product_permutation BIT,
IN a_get_inactive_product_permutation BIT,
IN a_ids_product_permutation VARCHAR(4000),
IN a_get_all_delivery_region BIT,
IN a_get_inactive_delivery_region BIT,
IN a_ids_delivery_region VARCHAR(4000),
IN a_get_all_currency BIT,
IN a_get_inactive_currency BIT,
IN a_ids_currency VARCHAR(4000),
IN a_get_all_discount BIT,
IN a_get_inactive_discount BIT,
IN a_ids_discount VARCHAR(4000)
);
select * FROM Shop_Calc_User_Temp;
select * from Shop_Product_Permutation;
select * from shop_product_change_set;
insert into shop_product_change_set ( comment ) values ('set stock quantities below minimum for testing');
update shop_product_permutation
set quantity_stock = 0,
id_change_set = (select id_change_set from shop_product_change_set order by id_change_set desc limit 1)
where id_permutation < 5
DROP TABLE IF EXISTS tmp_Msg_Error;
select * from shop_image;
select * from shop_product;
select * from TMP_MSG_ERROR;
DROP TABLE TMP_MSG_ERROR;
insert into shop_product_change_set (comment)
values ('set product not subscription - test bool output to python');
update shop_product
set is_subscription = 0,
id_change_set = (select id_change_set from shop_product_change_set order by id_change_set desc limit 1)
where id_product = 1
select * FROM Shop_Calc_User_Temp;
select distinct guid
-- DELETE
FROM Shop_Calc_User_Temp;
*/
/*
CALL p_shop_get_many_stripe_price_new (
''
)
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_get_many_stripe_price_new;
DELIMITER //
CREATE PROCEDURE p_shop_get_many_stripe_price_new (
IN a_id_user INT
)
BEGIN
DECLARE v_has_filter_user BIT;
DECLARE v_code_error_data VARCHAR(200);
DECLARE v_code_error_permission VARCHAR(200);
DECLARE v_guid BINARY(36);
SET v_code_error_data := (SELECT code FROM Shop_Msg_Error_Type WHERE id_type = 1);
SET v_code_error_permission := (SELECT code FROM Shop_Msg_Error_Type WHERE id_type = 2);
SET v_guid = UUID();
IF a_id_user IS NULL THEN
SET a_id_user = '';
ELSE
SET a_id_user = TRIM(a_id_user);
END IF;
-- Temporary tables
DROP TABLE IF EXISTS tmp_Shop_Product_Currency_Link;
DROP TABLE IF EXISTS tmp_Shop_User;
CREATE TABLE tmp_Shop_User(
id_user INT NOT NULL PRIMARY KEY,
CONSTRAINT FK_tmp_Shop_User_id_user
FOREIGN KEY (id_user)
REFERENCES Shop_User(id_user),
active BIT NOT NULL
);
CREATE TABLE tmp_Shop_Product_Currency_Link (
id_link INT NOT NULL PRIMARY KEY,
CONSTRAINT FK_tmp_Shop_Product_Currency_Link_id_link
FOREIGN KEY (id_link)
REFERENCES Shop_Product_Currency_Link(id_link),
id_product INT NOT NULL,
CONSTRAINT FK_tmp_Shop_Product_Currency_Link_id_product
FOREIGN KEY (id_product)
REFERENCES Shop_Product(id_product),
id_permutation INT NULL,
CONSTRAINT FK_tmp_Shop_Product_Currency_Link_id_permutation
FOREIGN KEY (id_permutation)
REFERENCES Shop_Product_Permutation(id_permutation),
id_currency INT NOT NULL,
CONSTRAINT FK_tmp_Shop_Product_Currency_Link_id_currency
FOREIGN KEY (id_currency)
REFERENCES Shop_Currency(id_currency),
active BIT NOT NULL
);
CREATE TABLE IF NOT EXISTS tmp_Msg_Error ( # IF NOT EXISTS
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
guid BINARY(36) NOT NULL,
code VARCHAR(50) NOT NULL,
# CONSTRAINT chk_tmp_Msg_Error_code CHECK (code IN (SELECT code FROM Shop_Msg_Error_Type)),
/*
id_type INT NOT NULL,
CONSTRAINT FK_tmp_Msg_Error_id_type
FOREIGN KEY (id_type)
REFERENCES Shop_Msg_Error_Type(id_type),
*/
msg VARCHAR(4000) NOT NULL
);
-- Parse filters
SET v_has_filter_user = CASE WHEN a_id_user = '' THEN 0 ELSE 1 END;
-- User permissions
IF v_has_filter_user THEN
INSERT INTO tmp_Shop_User (
id_user,
active
)
SELECT id_user,
active
FROM Shop_User
WHERE id_user LIKE CONCAT('%', a_id_user, '%')
AND active
LIMIT 1
;
SET v_has_filter_user = EXISTS (SELECT id_user FROM tmp_Shop_User LIMIT 1);
SET a_id_user := (SELECT id_user FROM tmp_Shop_User LIMIT 1);
END IF;
IF NOT v_has_filter_user THEN
INSERT INTO tmp_Msg_Error (
guid,
code,
msg
)
VALUES (
v_guid,
v_code_error_data,
'Valid user ID not provided.'
)
;
END IF;
-- Get products
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN
INSERT INTO tmp_Shop_Product_Currency_Link (
id_link,
id_product,
id_permutation,
id_currency,
active
)
SELECT id_link,
id_product,
id_permutation,
id_currency,
active
FROM Shop_Product_Currency_Link
WHERE ISNULL(id_stripe_price)
AND active
;
END IF;
-- Permissions
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN
# SELECT * FROM tmp_Msg_Error LIMIT 1;
CALL p_shop_calc_user (
v_guid, # a_guid
a_id_user, # a_id_user
0, # a_get_inactive_users
CONVERT((SELECT id_permission FROM Shop_Permission WHERE 'STORE_ADMIN' = code), CHAR), # a_ids_permission
(SELECT id_access_level FROM Shop_Access_Level WHERE code = 'ADMIN' AND active), # a_ids_access_level
(SELECT GROUP_CONCAT(DISTINCT id_product SEPARATOR ',') FROM tmp_Shop_Product_Currency_Link), # (SELECT DISTINCT id_product FROM tmp_Shop_Product_Currency_Link) calc_PCL) # a_ids_product
(SELECT GROUP_CONCAT(DISTINCT id_permutation SEPARATOR ',') FROM tmp_Shop_Product_Currency_Link) # a_ids_permutation
);
# SELECT * FROM tmp_Msg_Error LIMIT 1;
IF EXISTS (SELECT can_admin FROM Shop_Calc_User_Temp WHERE guid = v_guid AND NOT can_admin LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
guid,
code,
msg
)
VALUES (
v_guid,
v_code_error_permission,
'User ID does not have permission to get all new stripe prices.'
)
;
END IF;
DELETE FROM Shop_Calc_User_Temp
WHERE guid = v_guid
;
END IF;
-- Returns
IF EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN
DELETE FROM tmp_Shop_Product_Currency_Link;
END IF;
/*
SELECT *
FROM tmp_Shop_User
;
*/
SELECT t_PCL.id_product,
t_PCL.id_permutation,
P.price_GBP_full * C.factor_from_GBP AS unit_price,
C.code AS code_currency,
P.id_stripe_product,
P.is_subscription,
LOWER(RI.code) AS name_recurring_interval,
P.count_interval_recurrence
FROM tmp_Shop_Product_Currency_Link t_PCL
INNER JOIN Shop_Product P
ON t_PCL.id_product = P.id_product
AND P.active
INNER JOIN Shop_Interval_Recurrence RI
ON P.id_unit_measurement_interval_recurrence = RI.id_interval
AND RI.active
INNER JOIN Shop_Currency C
ON t_PCL.id_currency = C.id_currency
AND C.active
WHERE t_PCL.active
;
# Errors
SELECT *
FROM tmp_Msg_Error
WHERE guid = v_guid
;
/*
# Return arguments for test
SELECT
a_id_user
;
*/
-- Clean up
DROP TABLE IF EXISTS tmp_Shop_User;
DROP TABLE IF EXISTS tmp_Shop_Product_Currency_Link;
END //
DELIMITER ;;
/*
CALL p_shop_get_many_stripe_price_new (
''
);
CALL p_shop_get_many_stripe_price_new (
'auth0|6582b95c895d09a70ba10fef'
);
*/
/*
CALL p_shop_edit_user (
'auth0|6582b95c895d09a70ba10fef', # a_id_user
'', # a_name
'', # a_email
0 # a_email_verified
)
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_edit_user;
DELIMITER //
CREATE PROCEDURE p_shop_edit_user (
IN a_id_user INT,
IN a_name VARCHAR(255),
IN a_email VARCHAR(254),
IN a_email_verified BIT
)
BEGIN
-- Argument redeclaration
-- Variable declaration
DECLARE v_has_filter_user BIT;
-- DECLARE v_now DATETIME;
-- Argument validation + default values
IF a_id_user IS NULL THEN
SET a_id_user = '';
ELSE
SET a_id_user = TRIM(a_id_user);
END IF;
IF a_name IS NULL THEN
SET a_name = '';
ELSE
SET a_name = TRIM(a_name);
END IF;
IF a_email IS NULL THEN
SET a_email = '';
ELSE
SET a_email = TRIM(a_email);
END IF;
IF a_email_verified IS NULL THEN
SET a_email_verified = 0;
END IF;
-- Temporary tables
DROP TABLE IF EXISTS tmp_Msg_Error;
DROP TABLE IF EXISTS tmp_Shop_User;
CREATE TABLE tmp_Shop_User (
id_user INT NOT NULL,
CONSTRAINT FK_tmp_Shop_User_id_user
FOREIGN KEY (id_user)
REFERENCES Shop_User(id_user),
active BIT NOT NULL
);
CREATE TABLE tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
id_type INT NOT NULL,
# code VARCHAR(50) NOT NULL,
# CONSTRAINT chk_tmp_Msg_Error_code CHECK (code IN (SELECT code FROM Shop_Msg_Error_Type)),
CONSTRAINT FK_tmp_Msg_Error_id_type
FOREIGN KEY (id_type)
REFERENCES Shop_Msg_Error_Type(id_type),
msg VARCHAR(4000) NOT NULL
);
-- Parse filters
SET v_has_filter_user = CASE WHEN a_id_user = '' THEN 0 ELSE 1 END;
-- User
IF v_has_filter_user THEN
INSERT INTO tmp_Shop_User (
id_user,
active
)
SELECT id_user,
active
FROM Shop_User
WHERE id_user LIKE CONCAT('%', a_id_user, '%')
AND active
LIMIT 1
;
IF NOT EXISTS (SELECT id_user FROM tmp_Shop_User LIMIT 1) THEN
INSERT INTO Shop_User (
id_user,
name,
email,
email_verified
)
VALUES (
a_id_user,
a_name,
a_email,
a_email_verified
);
INSERT INTO tmp_Shop_User (
id_user,
active
)
SELECT id_user,
active
FROM Shop_User
WHERE id_user LIKE CONCAT('%', a_id_user, '%')
AND active
LIMIT 1
;
END IF;
SET a_id_user := (SELECT id_user FROM tmp_Shop_User LIMIT 1);
ELSE
INSERT INTO tmp_Msg_Error (
id_type,
msg
)
VALUES (
(SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1),
'No user ID provided.'
)
;
END IF;
/*
IF NOT EXISTS (SELECT msg FROM tmp_Msg_Error LIMIT 1) THEN
END IF;
*/
-- Returns
# User
SELECT *
FROM tmp_Shop_User
;
# Errors
SELECT *
FROM tmp_Msg_Error
;
/*
# Return arguments for test
SELECT a_id_user,
a_name,
a_email,
a_email_verified
;
*/
-- Clean up
DROP TABLE IF EXISTS tmp_Msg_Error;
DROP TABLE IF EXISTS tmp_Shop_User;
END //
DELIMITER ;;
/*
CALL p_shop_edit_user (
'',
'',
'',
0
)
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_get_many_user;
DELIMITER //
CREATE PROCEDURE p_get_many_user (
IN a_id_user INT
, IN a_id_user_auth0 VARCHAR(200)
, IN a_get_all_user BIT
, IN a_get_inactive_user BIT
, IN a_get_first_user_only BIT
, IN a_ids_user LONGTEXT
, IN a_ids_user_auth0 LONGTEXT
, IN a_debug BIT
)
BEGIN
DECLARE v_id_access_level_admin INT;
DECLARE v_id_access_level_view INT;
DECLARE v_id_permission_store_admin INT;
DECLARE v_id_permission_user INT;
DECLARE v_id_permission_user_admin INT;
DECLARE v_ids_permission_required VARCHAR(4000);
DECLARE v_now DATETIME;
DECLARE v_id_minimum INT;
DECLARE v_code_error_bad_data VARCHAR(50);
DECLARE v_id_type_error_bad_data INT;
DECLARE v_has_filter_user BIT;
DECLARE v_has_filter_user_auth0 BIT;
DECLARE v_guid BINARY(36);
DECLARE v_rank_max INT;
DECLARE v_time_start TIMESTAMP(6);
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_guid := UUID();
SET v_id_access_level_admin := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'ADMIN' LIMIT 1);
SET v_id_access_level_view := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'VIEW' LIMIT 1);
SET v_id_permission_store_admin := (SELECT id_permission FROM partsltd_prod.Shop_Permission WHERE code = 'STORE_ADMIN' LIMIT 1);
SET v_id_permission_user := (SELECT id_permission FROM partsltd_prod.Shop_Permission WHERE code = 'STORE_USER' LIMIT 1);
SET v_id_permission_user_admin := (SELECT id_permission FROM partsltd_prod.Shop_Permission WHERE code = 'STORE_USER_ADMIN' LIMIT 1);
SET v_code_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1);
SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_error_bad_data LIMIT 1);
SET v_ids_permission_required := CONCAT(v_id_permission_user, ',', v_id_permission_user_admin, ',', v_id_permission_store_admin);
SET a_get_all_user := IFNULL(a_get_all_user, 1);
SET a_get_inactive_user := IFNULL(a_get_inactive_user, 0);
SET a_get_first_user_only := IFNULL(a_get_first_user_only, 0);
SET a_ids_user := TRIM(IFNULL(a_ids_user, ''));
SET a_ids_user_auth0 := TRIM(IFNULL(a_ids_user_auth0, ''));
SET a_debug := IFNULL(a_debug, 0);
IF a_debug = 1 THEN
SELECT
a_id_user
, a_id_user_auth0
, a_get_all_user
, a_get_inactive_user
, a_get_first_user_only
, a_ids_user
, a_ids_user_auth0
, a_debug
;
END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_User;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
CREATE TEMPORARY TABLE tmp_User (
id_user INT NULL
, rank_user INT NULL
, can_admin_store BIT NULL
, can_admin_user BIT NULL
);
CREATE TEMPORARY TABLE tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
-- guid BINARY(36) NOT NULL,
id_type INT NOT NULL,
code VARCHAR(50) NOT NULL,
msg VARCHAR(4000) NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split (
substring VARCHAR(4000) NOT NULL
, as_int INT NULL
);
IF ISNULL(a_id_user) AND NOT ISNULL(a_id_user_auth0) THEN
SET a_id_user := (SELECT U.id_user FROM partsltd_prod.Shop_User U WHERE U.id_user_auth0 = a_id_user_auth0 LIMIT 1); -- LIKE CONCAT('%', a_id_user_auth0, '%') LIMIT 1);
END IF;
IF ISNULL(a_id_user) THEN
INSERT INTO tmp_Msg_Error (
id_type,
code,
msg
)
VALUES (
v_id_type_error_bad_data,
v_code_error_bad_data,
CONCAT('User ID required for authorisation.')
)
;
END IF;
SET v_has_filter_user := CASE WHEN a_ids_user = '' THEN 0 ELSE 1 END;
SET v_has_filter_user_auth0 := CASE WHEN a_ids_user_auth0 = '' THEN 0 ELSE 1 END;
IF a_debug = 1 THEN
SELECT
v_has_filter_user
, v_has_filter_user_auth0
;
END IF;
-- User IDs
IF (NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) AND v_has_filter_user = 1) THEN
CALL partsltd_prod.p_split(v_guid, a_ids_user, ',', FALSE);
DELETE FROM tmp_Split;
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM partsltd_prod.Split_Temp
WHERE 1=1
AND GUID = v_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( v_guid );
END IF;
IF (NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) AND v_has_filter_user = 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_User U ON t_S.as_int = U.id_user
WHERE
ISNULL(t_S.as_int)
OR ISNULL(U.id_user)
) THEN
INSERT INTO tmp_Msg_Error (
-- guid,
id_type,
code,
msg
)
SELECT
-- v_guid,
v_id_type_error_bad_data,
v_code_error_bad_data,
CONCAT('Invalid or inactive User IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_User U ON t_S.as_int = U.id_user
WHERE
ISNULL(t_S.as_int)
OR ISNULL(U.id_user)
;
ELSE
INSERT INTO tmp_User (
id_user
, rank_user
)
SELECT
U.id_user
, RANK() OVER (ORDER BY U.id_user DESC) AS rank_user
FROM tmp_Split t_S
RIGHT JOIN partsltd_prod.Shop_User U ON t_S.as_int = U.id_user
WHERE
(
a_get_all_user = 1
OR (
v_has_filter_user = 1
AND NOT ISNULL(t_S.as_int)
)
)
AND (
a_get_inactive_user = 1
OR U.active = 1
)
;
END IF;
END IF;
-- Auth0 User IDs
IF (NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) AND v_has_filter_user_auth0 = 1) THEN
CALL partsltd_prod.p_split(v_guid, a_ids_user_auth0, ',', FALSE);
DELETE FROM tmp_Split;
INSERT INTO tmp_Split (
substring
)
SELECT
substring
FROM partsltd_prod.Split_Temp
WHERE 1=1
AND GUID = v_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( v_guid );
END IF;
IF (NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) AND v_has_filter_user_auth0 = 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_User U ON t_S.substring = U.id_user_auth0
WHERE
ISNULL(t_S.substring)
OR ISNULL(U.id_user_auth0)
) THEN
INSERT INTO tmp_Msg_Error (
-- guid,
id_type,
code,
msg
)
SELECT
-- v_guid,
v_id_type_error_bad_data,
v_code_error_bad_data,
CONCAT('Invalid or inactive Auth0 User IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_User U ON t_S.substring = U.id_user_auth0
WHERE
ISNULL(t_S.substring)
OR ISNULL(U.id_user_auth0)
;
ELSE
SET v_rank_max := IFNULL((SELECT rank_user FROM tmp_User ORDER BY rank_user DESC LIMIT 1), 0);
INSERT INTO tmp_User (
id_user
, rank_user
)
SELECT
U.id_user
, v_rank_max + (RANK() OVER (ORDER BY U.id_user DESC)) AS rank_user
FROM tmp_Split t_S
RIGHT JOIN partsltd_prod.Shop_User U ON t_S.substring = U.id_user_auth0
WHERE
(
a_get_all_user = 1
OR (
v_has_filter_user_auth0 = 1
AND NOT ISNULL(t_S.substring)
)
)
AND (
a_get_inactive_user = 1
OR U.active = 1
)
;
END IF;
END IF;
IF a_debug = 1 THEN
SELECT * FROM tmp_User;
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF a_get_first_user_only THEN
DELETE t_U
FROM tmp_User t_U
WHERE t_U.rank_user > 1
;
END IF;
END IF;
IF a_debug = 1 THEN
SELECT * FROM tmp_User;
END IF;
-- Can admin store
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF a_debug = 1 THEN
SELECT
v_guid -- guid
, a_id_user -- ids_user
, FALSE -- get_inactive_user
, v_id_permission_store_admin -- ids_permission
, v_id_access_level_admin -- ids_access_level
, '' -- ids_product
, 0 -- a_debug
;
SELECT * FROM partsltd_prod.Shop_Calc_User_Temp;
END IF;
CALL partsltd_prod.p_shop_calc_user(
v_guid -- guid
, a_id_user -- ids_user
, FALSE -- get_inactive_user
, v_id_permission_store_admin -- ids_permission
, v_id_access_level_admin -- ids_access_level
, '' -- ids_product
, 0 -- a_debug
);
IF a_debug = 1 THEN
SELECT * FROM partsltd_prod.Shop_Calc_User_Temp WHERE GUID = v_guid;
END IF;
UPDATE tmp_User t_U
INNER JOIN partsltd_prod.Shop_Calc_User_Temp CUT
ON CUT.GUID = v_guid
AND t_U.id_user = CUT.id_user
SET t_U.can_admin_store = CUT.can_admin
;
CALL partsltd_prod.p_shop_clear_calc_user( v_guid, FALSE );
END IF;
-- Can admin user
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF a_debug = 1 THEN
SELECT
v_guid -- guid
, a_id_user -- ids_user
, FALSE -- get_inactive_user
, v_id_permission_user_admin -- ids_permission
, v_id_access_level_admin -- ids_access_level
, '' -- ids_product
, 0 -- a_debug
;
SELECT * FROM partsltd_prod.Shop_Calc_User_Temp;
END IF;
CALL partsltd_prod.p_shop_calc_user(
v_guid -- guid
, a_id_user -- ids_user
, FALSE -- get_inactive_user
, v_id_permission_user_admin -- ids_permission
, v_id_access_level_admin -- ids_access_level
, '' -- ids_product
, 0 -- a_debug
);
IF a_debug = 1 THEN
SELECT * FROM partsltd_prod.Shop_Calc_User_Temp WHERE GUID = v_guid;
END IF;
UPDATE tmp_User t_U
INNER JOIN partsltd_prod.Shop_Calc_User_Temp CUT
ON CUT.GUID = v_guid
AND t_U.id_user = CUT.id_user
SET t_U.can_admin_user = CUT.can_admin
;
CALL partsltd_prod.p_shop_clear_calc_user( v_guid, FALSE );
END IF;
-- Permissions
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF a_debug = 1 THEN
SELECT
v_guid -- guid
, a_id_user -- ids_user
, FALSE -- get_inactive_user
, v_ids_permission_required -- ids_permission
, v_id_access_level_view -- ids_access_level
, '' -- ids_product
, 0 -- a_debug
;
SELECT * FROM partsltd_prod.Shop_Calc_User_Temp;
END IF;
CALL partsltd_prod.p_shop_calc_user(
v_guid -- guid
, a_id_user -- ids_user
, FALSE -- get_inactive_user
, v_ids_permission_required -- ids_permission
, v_id_access_level_view -- ids_access_level
, '' -- ids_product
, 0 -- a_debug
);
IF a_debug = 1 THEN
SELECT * FROM partsltd_prod.Shop_Calc_User_Temp WHERE GUID = v_guid;
END IF;
IF NOT EXISTS (
SELECT can_view
FROM partsltd_prod.Shop_Calc_User_Temp CUT
WHERE 1=1
AND CUT.GUID = v_guid
AND can_view = 1
-- AND FIND_IN_SET(v_ids_permission_required, CUT.id_permission_required) > 0
) THEN
INSERT INTO tmp_Msg_Error (
id_type,
code,
msg
)
VALUES (
v_id_type_error_bad_data,
v_code_error_bad_data,
-- CONCAT('You do not have view permissions for ', (SELECT name FROM partsltd_prod.Shop_Permission WHERE id_permission = v_id_permission_user LIMIT 1))
-- CONCAT('You do not have view permissions for ', (SELECT GROUP_CONCAT(name SEPARATOR ', ') FROM partsltd_prod.Shop_Permission WHERE FIND_IN_SET(v_id_permission_user, id_permission) > 0))
CONCAT('You do not have view permissions for ', (SELECT name FROM partsltd_prod.Shop_Permission P INNER JOIN partsltd_prod.Shop_Calc_User_Temp CUT ON P.id_permission = CUT.id_permission_required WHERE GUID = v_guid AND IFNULL(can_view, 0) = 0 LIMIT 1)) -- WHERE IFNULL(CUT.can_view, 0) = 0
)
;
ELSE
-- INSERT INTO
SET a_debug := a_debug;
END IF;
CALL partsltd_prod.p_shop_clear_calc_user( v_guid, FALSE );
END IF;
-- Returns
/* NULL record required for flask sql_alchemy to detect result set */
IF EXISTS (SELECT * FROM tmp_Msg_Error) THEN
DELETE FROM tmp_User;
INSERT INTO tmp_User ( id_user )
VALUES ( NULL );
END IF;
SELECT
U.id_user
, U.id_user_auth0
, U.firstname
, U.surname
, U.email
, U.is_email_verified
, U.id_currency_default
, U.id_region_default
, U.is_included_VAT_default
, U.is_super_user
, t_U.can_admin_store
, t_U.can_admin_user
FROM tmp_User t_U
INNER JOIN partsltd_prod.Shop_User U ON t_U.id_user = U.id_user
;
# Errors
SELECT
t_ME.display_order,
MET.code,
t_ME.msg,
MET.name,
MET.description
FROM tmp_Msg_Error t_ME
INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET
ON t_ME.id_type = MET.id_type
;
IF a_debug = 1 THEN
SELECT * FROM tmp_User;
END IF;
-- Clean up
DROP TEMPORARY TABLE IF EXISTS tmp_User;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
/*
DELETE FROM partsltd_prod.Shop_Calc_User_Temp
WHERE GUID = v_guid;
*/
IF a_debug = 1 THEN
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END IF;
END //
DELIMITER ;;
CALL p_get_many_user (NULL, 'google-oauth2|109567376920138999933', False, False, False, NULL, 'google-oauth2|109567376920138999933', 0);
/*
NULL # a_id_user
, 'auth0|6582b95c895d09a70ba10fef' # a_id_user_auth0
, 0 # a_get_all_user
, 0 # a_get_inactive_user
, 0 # a_get_first_user_only
, NULL # a_ids_user
, 'auth0|6582b95c895d09a70ba10fef' # a_ids_user_auth0
, 0 -- a_debug
);*/
/*
select * FROM partsltd_prod.Shop_Calc_User_Temp;
delete FROM partsltd_prod.Shop_Calc_User_Temp;
SELECT *
FROM partsltd_prod.Shop_USER;
CALL p_get_many_user(
NULL -- :a_id_user,
, 'auth0|6582b95c895d09a70ba10fef' -- :a_id_user_auth0,
, 1 -- :a_get_all_user,
, 0 -- :a_get_inactive_user,
, 0 -- :a_get_first_user_only,
, NULL -- :a_ids_user,
, 'auth0|6582b95c895d09a70ba10fef' -- :a_ids_user_auth0
);
*/
/*
CALL p_shop_edit_user_basket (
'', # a_id_user
'', # a_ids_permutation_basket
'', # a_quantities_permutation_basket
1, # a_id_permutation_edit
NULL, # a_quantity_permutation_edit
1, # a_sum_not_edit
1, # a_id_currency_edit
1 # a_id_region_purchase
)
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_edit_user_basket;
DELIMITER //
CREATE PROCEDURE p_shop_edit_user_basket (
IN a_id_user INT,
IN a_ids_permutation_basket VARCHAR(4000),
IN a_quantities_permutation_basket VARCHAR(4000),
IN a_id_permutation_edit INT,
IN a_quantity_permutation_edit INT,
IN a_sum_not_edit BIT,
IN a_id_currency INT,
IN a_id_region_purchase INT
)
BEGIN
-- Argument redeclaration
-- Variable declaration
DECLARE v_has_filter_user BIT;
DECLARE v_has_filter_permutation_basket BIT;
DECLARE v_has_filter_permutation_edit BIT;
DECLARE v_has_filter_region BIT;
DECLARE v_has_filter_currency BIT;
DECLARE v_n_id_permutation_basket INT;
DECLARE v_n_quantity_permutation_basket INT;
DECLARE v_row_number INT;
DECLARE v_guid BINARY(36);
# DECLARE v_id_user VARCHAR(100);
DECLARE v_id_permission_product INT;
DECLARE v_ids_permutation_permission VARCHAR(4000);
DECLARE v_now DATETIME;
# DECLARE v_quantity_new INT;
DECLARE v_change_set_used BIT;
DECLARE v_id_change_set INT;
SET v_guid = UUID();
-- Argument validation + default values
IF a_id_user IS NULL THEN
SET a_id_user = '';
ELSE
SET a_id_user = TRIM(a_id_user);
END IF;
IF a_ids_permutation_basket IS NULL THEN
SET a_ids_permutation_basket = '';
ELSE
SET a_ids_permutation_basket = TRIM(a_ids_permutation_basket);
END IF;
IF a_quantities_permutation_basket IS NULL THEN
SET a_quantities_permutation_basket = '';
ELSE
SET a_quantities_permutation_basket = TRIM(a_quantities_permutation_basket);
END IF;
IF a_sum_not_edit IS NULL THEN
SET a_sum_not_edit = 1;
END IF;
-- Temporary tables
DROP TABLE IF EXISTS tmp_Msg_Error;
DROP TABLE IF EXISTS tmp_Shop_Basket;
DROP TEMPORARY TABLE IF EXISTS tmp_Shop_Quantity;
DROP TABLE IF EXISTS tmp_Shop_Product;
DROP TABLE IF EXISTS tmp_Shop_User;
CREATE TABLE tmp_Shop_User (
id_user INT NOT NULL,
CONSTRAINT FK_tmp_Shop_User_id_user
FOREIGN KEY (id_user)
REFERENCES Shop_User(id_user),
active BIT NOT NULL
);
CREATE TABLE tmp_Shop_Product (
id_product INT NOT NULL,
CONSTRAINT FK_tmp_Shop_Product_id_product
FOREIGN KEY (id_product)
REFERENCES Shop_Product(id_product),
id_permutation INT NOT NULL,
CONSTRAINT FK_tmp_Shop_Product_id_permutation
FOREIGN KEY (id_permutation)
REFERENCES Shop_Product_Permutation(id_permutation),
display_order INT NOT NULL,
active INT NOT NULL DEFAULT 1
);
CREATE TEMPORARY TABLE tmp_Shop_Quantity(
quantity INT NOT NULL,
display_order INT NOT NULL,
active INT NOT NULL DEFAULT 1
);
CREATE TABLE tmp_Shop_Basket (
id_category INT NOT NULL,
CONSTRAINT FK_tmp_Shop_Basket_id_category
FOREIGN KEY (id_category)
REFERENCES Shop_Product_Category(id_category),
id_product INT NOT NULL,
CONSTRAINT FK_tmp_Shop_Basket_id_product
FOREIGN KEY (id_product)
REFERENCES Shop_Product(id_product),
id_permutation INT NOT NULL,
CONSTRAINT FK_tmp_Shop_Basket_id_permutation
FOREIGN KEY (id_permutation)
REFERENCES Shop_Product_Permutation(id_permutation),
id_region_purchase INT NOT NULL,
CONSTRAINT FK_tmp_Shop_Basket_id_region_purchase
FOREIGN KEY (id_region_purchase)
REFERENCES Shop_Region(id_region),
id_currency INT NOT NULL,
CONSTRAINT FK_tmp_Shop_Basket_id_currency
FOREIGN KEY (id_currency)
REFERENCES Shop_Currency(id_currency),
quantity INT NOT NULL,
active BIT NOT NULL DEFAULT 1
/*
display_order_category INT NOT NULL,
display_order_product INT 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,
# code VARCHAR(50) NOT NULL,
# CONSTRAINT chk_tmp_Msg_Error_code CHECK (code IN (SELECT code FROM Shop_Msg_Error_Type)),
CONSTRAINT FK_tmp_Msg_Error_id_type
FOREIGN KEY (id_type)
REFERENCES Shop_Msg_Error_Type(id_type),
msg VARCHAR(4000) NOT NULL
);
-- Parse filters
SET v_has_filter_user = NOT (a_id_user = '');
SET v_has_filter_permutation_basket = NOT (a_ids_permutation_basket = '');
SET v_has_filter_permutation_edit = NOT ISNULL(a_id_permutation_edit);
SET v_has_filter_currency = NOT ISNULL(a_id_currency);
SET v_has_filter_region = NOT ISNULL(a_id_region_purchase);
# SET v_quantity_new = CASE WHEN a_sum_not_edit THEN quantity + a_quantity_product_edit ELSE a_quantity_product_edit END;
/*
SELECT v_has_filter_user, v_has_filter_basket
;
*/
-- Currency
IF NOT v_has_filter_currency THEN
INSERT INTO tmp_Msg_Error (
id_type,
guid,
msg
)
VALUES (
(SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1),
v_guid,
'Currency ID not provided.'
)
;
END IF;
IF v_has_filter_currency AND NOT EXISTS ( SELECT * FROM Shop_Currency WHERE id_currency = a_id_currency) THEN
INSERT INTO tmp_Msg_Error (
id_type,
guid,
msg
)
VALUES (
(SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1),
v_guid,
CONCAT('Currency ID not found: ', a_id_currency, '.')
)
;
END IF;
-- Region
IF NOT v_has_filter_region THEN
INSERT INTO tmp_Msg_Error (
id_type,
guid,
msg
)
VALUES (
(SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1),
v_guid,
'Region ID not provided.'
)
;
END IF;
IF v_has_filter_region AND NOT EXISTS ( SELECT * FROM Shop_Region WHERE id_region = a_id_region_purchase) THEN
INSERT INTO tmp_Msg_Error (
id_type,
guid,
msg
)
VALUES (
(SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1),
v_guid,
CONCAT('Region ID not found: ', a_id_region_purchase, '.')
)
;
END IF;
-- User
IF v_has_filter_user THEN
INSERT INTO tmp_Shop_User (
id_user,
active
)
SELECT id_user,
active
FROM Shop_User
WHERE id_user LIKE CONCAT('%', a_id_user, '%')
AND active
LIMIT 1
;
IF NOT EXISTS (SELECT id_user FROM tmp_Shop_User LIMIT 1) THEN
SET v_has_filter_user = 0;
INSERT INTO tmp_Msg_Error (
id_type,
guid,
msg
)
VALUES (
(SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1),
v_guid,
CONCAT('User ID not found: ', a_id_user, '.')
)
;
END IF;
SET a_id_user := (SELECT id_user FROM tmp_Shop_User LIMIT 1);
END IF;
IF v_has_filter_user AND NOT EXISTS (SELECT msg FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN
SET v_change_set_used = 0;
INSERT INTO Shop_User_Change_Set (
comment
)
VALUES (
'edit basket'
);
SET v_id_change_set := (SELECT id_change_set FROM Shop_User_Change_Set ORDER BY id_change_set DESC LIMIT 1);
END IF;
-- Get basket
-- User
IF v_has_filter_user AND NOT EXISTS (SELECT msg FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN
INSERT INTO tmp_Shop_Basket (
id_category,
id_product,
id_permutation,
id_region_purchase,
id_currency,
quantity,
active
/*
display_order_category,
display_order_product
*/
)
SELECT
C.id_category,
UB.id_product,
UB.id_permutation,
UB.id_region_purchase,
UB.id_currency,
UB.quantity,
UB.active
/*
C.display_order,
P.display_order
*/
FROM Shop_User_Basket UB
/*
INNER JOIN tmp_Shop_User t_U
ON UB.id_user = t_U.id_user
*/
INNER JOIN Shop_Product_Permutation PP
ON UB.id_product = PP.id_product
AND PP.active
INNER JOIN Shop_Product P
ON PP.id_product = P.id_product
AND P.active
INNER JOIN Shop_Product_Category C
ON P.id_category = C.id_category
AND C.active
WHERE UB.id_user = a_id_user
;
END IF;
-- Currency
IF EXISTS (SELECT * FROM tmp_Shop_Basket WHERE active LIMIT 1)
AND NOT EXISTS (SELECT msg FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN
IF EXISTS (SELECT * FROM tmp_Shop_Basket WHERE active AND id_currency != a_id_currency) THEN
INSERT INTO tmp_Msg_Error (
id_type,
guid,
msg
)
VALUES (
(SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1),
v_guid,
CONCAT(
'Currency ID does not match currency of other items in basket. Basket currency: ',
(SELECT code FROM Shop_Currency WHERE id_currency = (
SELECT
id_currency
FROM tmp_Shop_Basket
WHERE active
AND id_currency != a_id_currency
LIMIT 1
)),
', new currency: ',
(SELECT code FROM Shop_Currency WHERE id_currency = a_id_currency),
'.'
)
)
;
END IF;
END IF;
-- Region
IF EXISTS (SELECT * FROM tmp_Shop_Basket WHERE active LIMIT 1)
AND NOT EXISTS (SELECT msg FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Shop_Basket
WHERE
active
AND id_region_purchase != a_id_region_purchase
) THEN
INSERT INTO tmp_Msg_Error (
id_type,
guid,
msg
)
VALUES (
(SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1),
v_guid,
CONCAT('Purchase region ID does not match region of other items in basket. Basket currency: ',
(SELECT code FROM Shop_Region WHERE id_region = (
SELECT
id_region_purchase
FROM tmp_Shop_Basket
WHERE active
AND id_region != a_id_region_purchase
LIMIT 1
)),
', new currency: ',
(SELECT code FROM Shop_Region WHERE id_region = a_id_region_purchase),
'.'
)
)
;
END IF;
END IF;
-- String product id, permutation id, quantity list
IF NOT EXISTS (SELECT * FROM tmp_Shop_Basket WHERE active LIMIT 1) AND NOT EXISTS (SELECT msg FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN -- NOT v_has_filter_user AND
# Get product ids
CALL p_split(v_guid, a_ids_permutation_basket, ',');
INSERT INTO tmp_Shop_Product (
id_product, id_permutation, display_order
)
SELECT PP.id_product, ST.substring, ST.display_order
FROM Split_Temp ST
INNER JOIN Shop_Product_Permutation PP
ON ST.substring = PP.id_permutation
-- AND PP.active
;
/*
SELECT substring as id_product, display_order
FROM Split_Temp
;
*/
DROP TABLE Split_Temp;
# Get product quantities
CALL p_split(v_guid, a_quantities_permutation_basket, ',');
INSERT INTO tmp_Shop_Quantity (
quantity, display_order
)
SELECT substring, display_order
FROM Split_Temp
;
/*
SELECT substring AS quantity_product, display_order
FROM Split_Temp
;
*/
DROP TABLE Split_Temp;
# Compare number of product ids to number of quantities
SET v_n_id_permutation_basket := (SELECT display_order FROM tmp_Shop_Product ORDER BY display_order DESC LIMIT 1);
SET v_n_quantity_permutation_basket := (SELECT display_order FROM tmp_Shop_Quantity ORDER BY display_order DESC LIMIT 1);
IF NOT v_n_id_permutation_basket = v_n_quantity_permutation_basket THEN
INSERT INTO tmp_Msg_Error (
id_type,
guid,
msg
)
VALUES (
(SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1),
v_guid,
CONCAT('Number of permutations (', v_n_id_permutation_basket, ') does not equal number of quantities (', v_n_quantity_permutation_basket, ') for basket.')
)
;
ELSE
INSERT INTO tmp_Shop_Basket (
id_category,
id_product,
id_permutation,
id_region_purchase,
id_currency,
quantity
)
SELECT
C.id_category,
P.id_product,
t_P.id_permutation,
a_id_region_purchase,
a_id_currency,
t_Q.quantity
FROM tmp_Shop_Product t_P
INNER JOIN tmp_Shop_Quantity t_Q
ON t_P.display_order = t_Q.display_order
INNER JOIN Shop_Product_Permutation PP
ON t_P.id_permutation = PP.id_permutation
AND PP.active
INNER JOIN Shop_Product P
ON PP.id_product = P.id_product
AND P.active
INNER JOIN Shop_Product_Category C
ON P.id_category = C.id_category
AND C.active
-- RIGHT JOIN tmp_Shop_Basket t_UB ON ISNULL(t_UB.id_product)
-- WHERE t_P.id_product NOT IN (SELECT id_product FROM tmp_Shop_Basket)
;
/*
IF EXISTS(
SELECT *
FROM Shop_Product P
INNER JOIN Shop_Product_Category C
ON P.id_category = C.id_category
INNER JOIN tmp_Shop_Basket t_B
ON P.id_product = t_B.id_product
WHERE C.active = 0 OR P.active = 0 LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type,
guid,
msg
)
VALUES (
(SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1),
v_guid,
CONCAT('No valid product IDs in list: ', a_ids_permutation_basket, '.')
)
;
END IF;
*/
END IF;
END IF;
/*
select v_has_filter_edit;
select * from tmp_Shop_Basket;
select * from tmp_Msg_Error;
*/
# Edit basket product
IF v_has_filter_permutation_edit AND NOT EXISTS (SELECT msg FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN
IF EXISTS (
SELECT *
FROM Shop_Product_Permutation PP
INNER JOIN Shop_Product P
ON PP.id_product = P.id_product
INNER JOIN Shop_Product_Category C
ON P.id_category = C.id_category
WHERE
(
C.active = 0
OR P.active = 0
OR PP.active = 0
)
AND PP.id_permutation = a_id_permutation_edit
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type,
guid,
msg
)
VALUES (
(SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1),
v_guid,
CONCAT('Invalid product ID to edit: ', a_id_product_edit, '.')
)
;
END IF;
END IF;
IF v_has_filter_permutation_edit AND NOT EXISTS (SELECT msg FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Shop_Basket
WHERE
id_permutation = a_id_permutation_edit
) THEN
UPDATE tmp_Shop_Basket
SET quantity = CASE WHEN a_sum_not_edit = 1 THEN IFNULL(quantity, 0) + a_quantity_permutation_edit ELSE a_quantity_permutation_edit END,
active = CASE WHEN CASE WHEN a_sum_not_edit = 1 THEN IFNULL(quantity, 0) + a_quantity_permutation_edit ELSE a_quantity_permutation_edit END = 0 THEN 0 ELSE 1 END
WHERE id_permutation = a_id_permutation_edit
;
IF EXISTS (
SELECT *
FROM tmp_Shop_Basket t_B
WHERE t_B.quantity < 0
) THEN
INSERT INTO tmp_Msg_Error (
id_type,
guid,
msg
)
VALUES (
(SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1),
v_guid,
'Invalid basket quantity.'
)
;
END IF;
IF v_has_filter_user AND NOT EXISTS (SELECT msg FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN
SET v_change_set_used = 1;
UPDATE Shop_User_Basket UB
INNER JOIN tmp_Shop_Basket t_UB
ON UB.id_permutation = a_id_permutation_edit
SET UB.quantity = t_UB.quantity,
UB.active = t_UB.active,
UB.id_change_set_user = v_id_change_set
WHERE UB.id_permutation = a_id_permutation_edit
AND id_user = a_id_user
;
END IF;
ELSE
IF a_quantity_permutation_edit < 0 THEN
INSERT INTO tmp_Msg_Error (
id_type,
guid,
msg
)
VALUES (
(SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1),
v_guid,
'Invalid basket quantity.'
)
;
ELSE
INSERT INTO tmp_Shop_Basket (
id_category,
id_product,
id_permutation,
id_region_purchase,
id_currency,
quantity,
active
)
SELECT
P.id_category,
P.id_product,
PP.id_permutation,
a_id_region_purchase,
a_id_currency,
a_quantity_permutation_edit,
CASE WHEN a_quantity_permutation_edit > 0 THEN 1 ELSE 0 END
FROM Shop_Product_Permutation PP
INNER JOIN Shop_Product P
ON PP.id_product = P.id_product
WHERE id_permutation = a_id_permutation_edit
;
IF v_has_filter_user THEN
IF EXISTS (
SELECT *
FROM Shop_User_Basket UB
WHERE
UB.id_permutation = a_id_permutation_edit
) THEN
SET v_change_set_used = 1;
UPDATE Shop_User_Basket
INNER JOIN tmp_Shop_Basket t_UB ON UB.id_permutation = t_UB.id_permutation
SET UB.quantity = t_UB.quantity,
UB.active = t_UB.active,
UB.id_change_set_user = v_id_change_set
WHERE UB.id_permutation = a_id_permutation_edit
AND id_user = a_id_user
;
ELSE
INSERT INTO Shop_User_Basket (
id_user,
id_product,
id_permutation,
id_region_purchase,
id_currency,
quantity,
active
)
SELECT a_id_user,
t_UB.id_product,
t_UB.id_permutation,
t_UB.id_region_purchase,
t_UB.id_currency,
t_UB.quantity,
t_UB.active
FROM tmp_Shop_Basket t_UB
WHERE id_permutation = a_id_permutation_edit
;
END IF;
END IF;
END IF;
END IF;
END IF;
-- Checks
/*
SELECT * FROM tmp_Shop_Basket;
SELECT
GROUP_CONCAT(t_UB.id_product SEPARATOR ',') AS basket_product_ids
FROM tmp_Shop_Basket t_UB
-- WHERE ISNULL(t_UB.id_permutation)
;
SELECT
GROUP_CONCAT(t_UB.id_permutation SEPARATOR ',') AS basket_permutation_ids
FROM tmp_Shop_Basket t_UB
WHERE NOT ISNULL(t_UB.id_permutation)
;
*/
-- Returns
CALL p_shop_get_many_product (
a_id_user, # a_id_user
1, # a_get_all_categories
'', # a_ids_category
0, # a_get_inactive_categories
0, # a_get_all_products
(
SELECT
GROUP_CONCAT(t_B.id_product SEPARATOR ',')
FROM tmp_Shop_Basket t_B
WHERE active = 1
), # a_ids_product
0, # a_get_inactive_products
0, # a_get_first_product_only
0, # a_get_all_product_permutations
(
SELECT
GROUP_CONCAT(t_B.id_permutation SEPARATOR ',')
FROM tmp_Shop_Basket t_B
WHERE NOT ISNULL(t_B.id_permutation)
AND active = 1
), # a_ids_permutation
0, # a_get_inactive_permutations
0, # a_get_all_images
'', # a_ids_image
0, # a_get_inactive_images
1, # a_get_first_image_only
0, # a_get_all_delivery_region
a_id_region_purchase, # a_ids_delivery_region
0, # a_get_inactive_delivery_region
0, # a_get_all_currency
a_id_currency, # a_ids_currency
0, # a_get_inactive_currency
1, # a_get_all_discount
'', # a_ids_discount
0 # a_get_inactive_discount
);
# Basket
SELECT t_UB.id_category,
t_UB.id_product,
t_UB.id_permutation,
P.name,
PCL.price_local_VAT_incl,
PCL.price_local_VAT_excl,
PCL.id_currency,
t_UB.quantity
FROM tmp_Shop_Basket t_UB
INNER JOIN Shop_Product_Permutation PP
ON t_UB.id_permutation = PP.id_permutation
INNER JOIN Shop_Product P
ON PP.id_product = P.id_product
INNER JOIN Shop_Product_Category C
ON P.id_category = C.id_category
INNER JOIN Shop_Product_Currency_Link PCL
ON PP.id_permutation = PCL.id_permutation
AND PCL.id_region_purchase = a_id_region_purchase
AND PCL.id_currency = a_id_currency
WHERE t_UB.active = 1
ORDER BY C.display_order, P.display_order
;
# Errors
/* Completed by product get many */
SELECT
t_ME.display_order,
t_ME.guid,
t_ME.id_type,
t_ME.msg,
MET.code,
MET.name,
MET.description
FROM tmp_Msg_Error t_ME
INNER JOIN Shop_Msg_Error_Type MET
ON t_ME.id_type = MET.id_type
WHERE GUID = v_guid
;
/*
# Return arguments for test
SELECT
a_ids_category,
a_get_inactive_categories,
a_ids_product,
a_get_inactive_products,
a_get_first_product_only,
a_get_all_products,
a_ids_image,
a_get_inactive_images,
a_get_first_image_only,
a_get_all_images
;
*/
-- Clean up
IF NOT v_change_set_used THEN
DELETE FROM Shop_User_Change_Set
WHERE id_change_set = v_id_change_set
;
END IF;
# DROP TABLE IF EXISTS tmp_Msg_Error;
DELETE FROM tmp_Msg_Error WHERE guid = v_guid;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
DROP TABLE tmp_Msg_Error;
END IF;
DROP TABLE IF EXISTS tmp_Shop_Basket;
DROP TEMPORARY TABLE IF EXISTS tmp_Shop_Quantity;
DROP TABLE IF EXISTS tmp_Shop_Product;
DROP TABLE IF EXISTS tmp_Shop_User;
END //
DELIMITER ;;
/*
CALL p_shop_edit_user_basket (
'', # a_id_user
'', # a_ids_permutation_basket
'', # a_quantities_permutation_basket
2, # a_id_permutation_edit
1, # a_quantity_permutation_edit
1, # a_sum_not_edit
2, # a_id_currency_edit
1 # a_id_region_purchase
);
CALL p_shop_edit_user_basket (
'', # a_id_user
'1', # a_ids_permutation_basket
'9', # a_quantities_permutation_basket
1, # a_id_permutation_edit
69, # a_quantity_permutation_edit
1, # a_sum_not_edit
1, # a_id_currency_edit
1 # a_id_region_purchase
);
CALL p_shop_edit_user_basket (
'auth0|6582b95c895d09a70ba10feF', # a_id_user
'2', # a_ids_permutation_basket
'7', # a_quantities_permutation_basket
2, # a_id_permutation_edit
NULL, # a_quantity_permutation_edit
1, # a_sum_not_edit
1, # a_id_currency_edit
1 # a_id_region_purchase
);
{'a_id_user': 'auth0|6582b95c895d09a70ba10fef',
'a_ids_permutation_basket': '1',
'7', # a_quantities_permutation_basket
'a_id_permutation_edit': 1,
'a_quantity_permutation_edit': 1,
'a_sum_not_edit': 1}
select * from shop_user_basket;
insert into shop_user_change_set (comment)
values( 'deactivate duplicates');
update SHOP_USER_BASKET
set active = 0,
id_change_set_user = (select id_change_set from shop_user_change_set order by id_change_set desc limit 1)
where id_user = 'auth0|6582b95c895d09a70ba10fef'
and id_product = 1
;
select * from shop_user_basket;
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_save_supplier;
DELIMITER //
CREATE PROCEDURE p_shop_save_supplier (
IN a_comment VARCHAR(500)
, IN a_guid BINARY(36)
, IN a_id_user INT
, IN a_debug BIT
)
BEGIN
DECLARE v_code_type_error_bad_data VARCHAR(50);
DECLARE v_code_type_error_no_permission VARCHAR(50);
DECLARE v_id_access_level_edit INT;
DECLARE v_id_change_set INT;
DECLARE v_id_permission_supplier INT;
DECLARE v_id_type_error_bad_data INT;
DECLARE v_id_type_error_no_permission INT;
DECLARE v_time_start TIMESTAMP(6);
DECLARE exit handler for SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
@sqlstate = RETURNED_SQLSTATE
, @errno = MYSQL_ERRNO
, @text = MESSAGE_TEXT
;
ROLLBACK;
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NULL
, code VARCHAR(50) NOT NULL
, msg VARCHAR(4000) NOT NULL
);
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
id_type
, @errno
, @text
FROM partsltd_prod.Shop_Msg_Error_Type MET
WHERE code = 'MYSQL_ERROR'
;
SELECT *
FROM tmp_Msg_Error;
DROP TABLE IF EXISTS tmp_Msg_Error;
END;
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1);
SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1);
SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION' LIMIT 1);
SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission LIMIT 1);
SET v_id_permission_supplier := (SELECT id_permission FROM partsltd_prod.Shop_Permission WHERE code = 'STORE_SUPPLIER' LIMIT 1);
SET v_id_access_level_EDIT := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'EDIT' LIMIT 1);
CALL p_validate_guid ( a_guid );
SET a_comment := TRIM(IFNULL(a_comment, ''));
DROP TEMPORARY TABLE IF EXISTS tmp_Supplier;
DROP TEMPORARY TABLE IF EXISTS tmp_Supplier_Address;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
CREATE TEMPORARY TABLE tmp_Supplier (
id_supplier_temp INT NOT NULL
, id_supplier INT NULL
, id_currency INT NOT NULL
, name_company VARCHAR(255) NOT NULL
, name_contact VARCHAR(255) NULL
, department_contact VARCHAR(255) NULL
, phone_number VARCHAR(50) NULL
, fax VARCHAR(50) NULL
, email VARCHAR(255) NOT NULL
, website VARCHAR(255) NULL
, active BIT NOT NULL
, name_error VARCHAR(1000) NOT NULL
, is_new BIT NOT NULL
);
CREATE TEMPORARY TABLE tmp_Supplier_Address (
id_address INT NOT NULL
, id_supplier INT NOT NULL
, id_region INT NOT NULL
, postcode VARCHAR(20) NOT NULL
, address_line_1 VARCHAR(256) NOT NULL
, address_line_2 VARCHAR(256) NOT NULL
, city VARCHAR(256) NOT NULL
, county VARCHAR(256) NOT NULL
, active BIT NOT NULL
, name_error VARCHAR(1000) NOT NULL
, is_new BIT NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NOT NULL
, code VARCHAR(50) NOT NULL
, msg VARCHAR(4000) NOT NULL
);
INSERT INTO tmp_Supplier (
id_supplier_temp
, id_supplier
, id_currency
, name_company
, name_contact
, department_contact
, phone_number
, fax
, email
, website
, active
, name_error
, is_new
)
SELECT
S_T.id_supplier
, S_T.id_supplier
, S_T.id_currency
, S_T.name_company
, S_T.name_contact
, S_T.department_contact
, S_T.phone_number
, S_T.fax
, S_T.email
, S_T.website
, S_T.active
, IFNULL(S_T.name_company, IFNULL(S_T.email, IFNULL(S_T.website, IFNULL(S_T.name_contact, '(No Supplier)'))))
, IFNULL(S_T.id_supplier, 0) < 1
FROM partsltd_prod.Shop_Supplier_Temp S_T
WHERE GUID = a_guid
;
INSERT INTO tmp_Supplier_Address (
id_address
, id_supplier
, id_region
, postcode
, address_line_1
, address_line_2
, city
, county
, active
, name_error
, is_new
)
SELECT
SA_T.id_address
, SA_T.id_supplier
, SA_T.id_region
, SA_T.postcode
, SA_T.address_line_1
, SA_T.address_line_2
, SA_T.city
, SA_T.county
, SA_T.active
, IFNULL(SA_T.postcode, IFNULL(SA_T.city, IFNULL(SA_T.county, IFNULL(SA_T.address_line_1, IFNULL(SA_T.address_line_2, '(No Supplier)'))))) AS name_error
, IFNULL(SA_T.id_address, 0) < 1 AS is_new
FROM partsltd_prod.Shop_Supplier_Address_Temp SA_T
WHERE GUID = a_guid
;
-- Validation
-- Suppliers
/*
# id_address
IF EXISTS (
SELECT *
FROM tmp_Supplier t_S
LEFT JOIN partsltd_prod.Shop_Address A ON t_S.id_address = A.id_address
WHERE 1=1
AND (
t_S.id_address = 0
OR A.active = 0
)
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT(
'The following supplier(s) have an invalid or inactive Address: '
, GROUP_CONCAT(t_S.name_error SEPARATOR ', ')
) AS msg
FROM tmp_Supplier t_S
LEFT JOIN partsltd_prod.Shop_Address A ON t_S.id_address = A.id_address
WHERE 1=1
AND (
t_S.id_address = 0
OR A.active = 0
)
;
END IF;
*/
# id_currency
IF EXISTS (
SELECT *
FROM tmp_Supplier t_S
LEFT JOIN partsltd_prod.Shop_Currency C ON t_S.id_currency = C.id_currency
WHERE 1=1
AND (
t_S.id_currency = 0
OR C.active = 0
)
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT(
'The following supplier(s) have an invalid or inactive Currency: '
, GROUP_CONCAT(t_S.name_error SEPARATOR ', ')
) AS msg
FROM tmp_Supplier t_S
LEFT JOIN partsltd_prod.Shop_Currency C ON t_S.id_currency = C.id_currency
WHERE 1=1
AND (
t_S.id_currency = 0
OR C.active = 0
)
;
END IF;
# name_company
IF EXISTS (SELECT * FROM tmp_Supplier t_S WHERE ISNULL(t_S.name_company) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following supplier(s) do not have a name: ', GROUP_CONCAT(IFNULL(t_S.name_error, 'NULL') SEPARATOR ', ')) AS msg
FROM tmp_Supplier t_S
WHERE ISNULL(t_S.name_company)
;
END IF;
# email
IF EXISTS (SELECT * FROM tmp_Supplier t_S WHERE ISNULL(t_S.email) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following supplier(s) do not have an email: ', GROUP_CONCAT(IFNULL(t_S.name_error, 'NULL') SEPARATOR ', ')) AS msg
FROM tmp_Supplier t_S
WHERE ISNULL(t_S.email)
;
END IF;
# duplicate
IF EXISTS (SELECT COUNT(*) FROM tmp_Supplier t_S GROUP BY t_S.id_supplier HAVING COUNT(*) > 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following supplier(s) are duplicates: ', GROUP_CONCAT(IFNULL(t_S.name_error, 'NULL') SEPARATOR ', ')) AS msg
FROM tmp_Supplier t_S
GROUP BY t_S.id_supplier
HAVING COUNT(*) > 1
;
END IF;
-- Addresses
# id_supplier
IF EXISTS (
SELECT *
FROM tmp_Supplier_Address t_SA
LEFT JOIN partsltd_prod.Shop_Supplier S ON t_SA.id_supplier = S.id_supplier
WHERE 1=1
AND (
t_SA.id_supplier = 0
OR S.active = 0
)
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT(
'The following supplier address(es) have an invalid or inactive Supplier: '
, GROUP_CONCAT(t_S.name_error SEPARATOR ', ')
) AS msg
FROM tmp_Supplier t_S
LEFT JOIN partsltd_prod.Shop_Supplier S ON t_SA.id_supplier = S.id_supplier
WHERE 1=1
AND (
t_SA.id_supplier = 0
OR S.active = 0
)
;
END IF;
# id_region
IF EXISTS (
SELECT *
FROM tmp_Supplier_Address t_SA
LEFT JOIN partsltd_prod.Shop_Region R ON t_SA.id_region = R.id_region
WHERE 1=1
AND (
t_SA.id_region = 0
OR R.active = 0
)
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT(
'The following supplier address(es) have an invalid or inactive Supplier: '
, GROUP_CONCAT(t_S.name_error SEPARATOR ', ')
) AS msg
FROM tmp_Supplier t_S
LEFT JOIN partsltd_prod.Shop_Region R ON t_SA.id_region = R.id_region
WHERE 1=1
AND (
t_SA.id_region = 0
OR R.active = 0
)
;
END IF;
# duplicate
IF EXISTS (SELECT COUNT(*) FROM tmp_Supplier_Address t_SA GROUP BY t_SA.id_address HAVING COUNT(*) > 1) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT('The following supplier address(es) are duplicates: ', GROUP_CONCAT(IFNULL(t_S.name_error, 'NULL') SEPARATOR ', ')) AS msg
FROM tmp_Supplier_Address t_SA
GROUP BY t_SA.id_address
HAVING COUNT(*) > 1
;
END IF;
-- Permissions
IF a_debug = 1 THEN
SELECT
a_guid
, a_id_user
, FALSE -- get inactive users
, v_id_permission_supplier
, v_id_access_level_edit
, '' -- ids_product
, 0 -- a_debug
;
SELECT * from partsltd_prod.Shop_Calc_User_Temp;
END IF;
CALL p_shop_calc_user(
a_guid
, a_id_user
, FALSE -- get inactive users
, v_id_permission_supplier
, v_id_access_level_edit
, '' -- ids_product
, 0 -- a_debug
);
IF a_debug = 1 THEN
SELECT * from partsltd_prod.Shop_Calc_User_Temp WHERE GUID = a_guid;
END IF;
IF NOT EXISTS (SELECT can_view FROM partsltd_prod.Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = a_guid) THEN
DELETE FROM tmp_Msg_Error;
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
VALUES (
v_id_type_error_no_permission
, v_code_type_error_no_permission
, CONCAT('You do not have view permissions for ', (SELECT name FROM partsltd_prod.Shop_Permission WHERE id_permission = v_id_permission_supplier LIMIT 1))
)
;
END IF;
CALL partsltd_prod.p_shop_clear_calc_user(
a_guid
, 0 -- a_debug
);
IF EXISTS ( SELECT * FROM tmp_Msg_Error LIMIT 1 ) THEN
DELETE FROM tmp_Supplier;
END IF;
-- Transaction
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
START TRANSACTION;
INSERT INTO partsltd_prod.Shop_User_Change_Set (
comment
, updated_last_by
, updated_last_on
)
VALUES (
a_comment
, a_id_user
, v_time_start
);
SET v_id_change_set := LAST_INSERT_ID();
INSERT INTO partsltd_prod.Shop_Supplier (
id_supplier_temp
, id_currency
, name_company
, name_contact
, department_contact
, phone_number
, fax
, email
, website
, active
, id_change_set
)
SELECT
t_S.id_supplier
, t_S.id_currency
, t_S.name_company
, t_S.name_contact
, t_S.department_contact
, t_S.phone_number
, t_S.fax
, t_S.email
, t_S.website
, t_S.active
, v_id_change_set
FROM tmp_Supplier t_S
WHERE t_S.is_new = 1
;
UPDATE tmp_Supplier t_S
INNER JOIN partsltd_prod.Shop_Supplier S ON t_S.id_supplier_temp = S.id_supplier_temp
SET
t_S.id_supplier = S.id_supplier
WHERE t_S.is_new = 1
;
UPDATE tmp_Supplier_Address t_SA
INNER JOIN tmp_Supplier t_S ON t_SA.id_supplier = t_S.id_supplier_temp
SET
t_SA.id_supplier = t_S.id_supplier
WHERE t_S.is_new = 1
;
UPDATE partsltd_prod.Shop_Supplier S
INNER JOIN tmp_Supplier t_S
ON S.id_supplier = t_S.id_supplier
AND t_S.is_new = 0
SET
S.id_currency = t_S.id_currency
, S.name_company = t_S.name_company
, S.name_contact = t_S.name_contact
, S.department_contact = t_S.department_contact
, S.phone_number = t_S.phone_number
, S.fax = t_S.fax
, S.email = t_S.email
, S.website = t_S.website
, S.active = t_S.active
, S.id_change_set = v_id_change_set
/*
S.name_company = a_name_company,
S.name_contact = a_name_contact,
S.department_contact = a_department_contact,
S.id_address = a_id_address,
S.phone_number = a_phone_number,
S.fax = a_fax,
S.email = a_email,
S.website = a_website,
S.id_currency = a_id_currency,
S.active = a_active,
S.id_change_set = v_id_change_set
*/
;
INSERT INTO partsltd_prod.Shop_Supplier_Address (
id_supplier
, id_region
, postcode
, address_line_1
, address_line_2
, city
, county
, active
, id_change_set
)
SELECT
t_SA.id_supplier
, t_SA.id_region
, t_SA.postcode
, t_SA.address_line_1
, t_SA.address_line_2
, t_SA.city
, t_SA.county
, t_SA.active
, v_id_change_set
FROM tmp_Supplier_Address t_SA
WHERE t_SA.is_new = 1
;
UPDATE partsltd_prod.Shop_Supplier_Address SA
INNER JOIN tmp_Supplier_Address t_SA
ON SA.id_address = t_SA.id_address
AND t_SA.is_new = 0
SET
SA.id_supplier = t_SA.id_supplier
, SA.id_region = t_SA.id_region
, SA.postcode = t_SA.postcode
, SA.address_line_1 = t_SA.address_line_1
, SA.address_line_2 = t_SA.address_line_2
, SA.city = t_SA.city
, SA.county = t_SA.county
, SA.active = t_SA.active
, SA.id_change_set = v_id_change_set
;
COMMIT;
END IF;
# Errors
SELECT *
FROM tmp_Msg_Error t_ME
INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type
;
IF a_debug = 1 THEN
SELECT 'A_DEBUG';
SELECT * from tmp_Supplier;
SELECT * from tmp_Supplier_Address;
END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_Supplier;
DROP TEMPORARY TABLE IF EXISTS tmp_Supplier_Address;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
IF a_debug = 1 THEN
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END IF;
END //
DELIMITER ;;
-- SELECT * FROM Shop_Supplier;
delete from shop_supplier_audit where id_supplier = 9;
delete from shop_supplier where id_supplier = 9;
delete from shop_supplier_address_audit where id_address = -4;
delete from shop_supplier_address where id_address = -4;
-- Clear previous proc
DROP PROCEDURE IF EXISTS partsltd_prod.p_shop_save_supplier_test;
DELIMITER //
CREATE PROCEDURE p_shop_save_supplier_test ()
BEGIN
DECLARE v_guid BINARY(36);
DECLARE v_time_start TIMESTAMP(6);
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_guid := 'nips';
SELECT *
FROM partsltd_prod.Shop_Supplier
;
SELECT *
FROM partsltd_prod.Shop_Supplier_Temp
;
SELECT *
FROM partsltd_prod.Shop_Supplier_Address
;
SELECT *
FROM partsltd_prod.Shop_Supplier_Address_Temp
;
START TRANSACTION;
INSERT INTO partsltd_prod.Shop_Supplier_Temp (
id_supplier
, id_currency
, name_company
, name_contact
, department_contact
, phone_number
, fax
, email
, website
, active
, guid
)
/* Test 1 - Insert
VALUES (
-3
, 1
, 'Asda'
, ''
, NULL
, ''
, '123'
, 'test mail'
, 'test url'
, 1 -- active
, v_guid
)
*/
/* Test 2 - Update */
SELECT
id_supplier
, id_currency
, name_company
, 'Nat' AS name_contact
, 'Butchery' AS department_contact
, phone_number
, fax
, email
, website
, active
, v_guid
FROM partsltd_prod.Shop_Supplier S
WHERE S.id_supplier = 2
;
/*
INSERT INTO partsltd_prod.Shop_Supplier_Address_Temp (
id_address
, id_supplier
, id_region
, postcode
, address_line_1
, address_line_2
, city
, county
, active
, GUID
)
/ Test 1 - Insert
VALUES (
-4
, -3
, 1
, 'test postcode'
, 'test'
, 'test'
, 'test'
, 'cunty'
, 1
, v_guid
)
/
/ Test 2 - Update /
SELECT
id_address
, id_supplier
, id_region
, postcode
, address_line_1
, address_line_2
, city
, county
, active
, v_guid
FROM partsltd_prod.Shop_Supplier_Address SA
WHERE SA.id_supplier = 2
;
*/
COMMIT;
SELECT *
FROM partsltd_prod.Shop_Supplier_Temp
WHERE GUID = v_guid
;
SELECT *
FROM partsltd_prod.Shop_Supplier_Address_Temp
WHERE GUID = v_guid
;
CALL partsltd_prod.p_shop_save_supplier (
'Test save Supplier' -- comment
, v_guid -- guid
, 1 -- id_user
, 1 -- debug
);
SELECT *
FROM partsltd_prod.Shop_Supplier_Temp
;
SELECT *
FROM partsltd_prod.Shop_Supplier_Address_Temp
;
SELECT *
FROM partsltd_prod.Shop_Supplier
;
SELECT *
FROM partsltd_prod.Shop_Supplier_Address
;
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END //
DELIMITER ;;
/*
CALL partsltd_prod.p_shop_save_supplier_test ();
DELETE FROM partsltd_prod.Shop_Supplier_Temp;
DELETE FROM partsltd_prod.Shop_Supplier_Address_Temp;
DROP TABLE IF EXISTS tmp_Msg_Error;
Cannot add or update a child row: a foreign key constraint fails (`partsltd_prod`.`shop_supplier`, CONSTRAINT `FK_Shop_Supplier_id_change_set` FOREIGN KEY (`id_change_set`) REFERENCES `shop_sales_and_purchasing_change_set` (`id_change_set`))
*/
DROP PROCEDURE IF EXISTS p_shop_get_many_supplier;
DELIMITER //
CREATE PROCEDURE p_shop_get_many_supplier (
IN a_id_user INT
, IN a_get_all_supplier BIT
, IN a_get_inactive_supplier BIT
, IN a_ids_supplier TEXT
, IN a_debug BIT
)
BEGIN
DECLARE v_code_type_error_bad_data VARCHAR(50);
DECLARE v_code_type_error_no_permission VARCHAR(50);
DECLARE v_guid BINARY(36);
DECLARE v_has_filter_supplier BIT;
DECLARE v_id_access_level_view INT;
DECLARE v_id_permission_supplier INT;
DECLARE v_id_type_error_bad_data INT;
DECLARE v_id_type_error_no_permission INT;
DECLARE v_time_start TIMESTAMP(6);
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_guid := UUID();
SET v_id_access_level_view := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'VIEW' LIMIT 1);
SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1);
SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1);
SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION');
SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission);
SET v_id_permission_supplier := (SELECT id_permission FROM partsltd_prod.Shop_Permission WHERE code = 'STORE_SUPPLIER' LIMIT 1);
SET a_get_all_supplier := IFNULL(a_get_all_supplier, 0);
SET a_get_inactive_supplier := IFNULL(a_get_inactive_supplier, 0);
SET a_ids_supplier := TRIM(IFNULL(a_ids_supplier, ''));
DROP TEMPORARY TABLE IF EXISTS tmp_Supplier;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
DROP TEMPORARY TABLE IF EXISTS tmp_Split;
CREATE TEMPORARY TABLE tmp_Supplier (
id_supplier INT NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
id_type INT NOT NULL,
code VARCHAR(50) NOT NULL,
msg VARCHAR(4000) NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split (
substring VARCHAR(4000) NOT NULL
, as_int INT NULL
);
DELETE FROM tmp_Split;
-- Parse filters
SET v_has_filter_supplier = CASE WHEN a_ids_supplier = '' THEN 0 ELSE 1 END;
IF a_debug = 1 THEN
SELECT
v_has_filter_supplier
;
END IF;
-- Suppliers
IF v_has_filter_supplier = 1 THEN
CALL partsltd_prod.p_split(v_guid, a_ids_supplier, ',', a_debug);
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM partsltd_prod.Split_Temp
WHERE 1=1
AND GUID = v_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( v_guid );
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Supplier S ON t_S.as_int = S.id_supplier
WHERE
ISNULL(t_S.as_int)
OR ISNULL(S.id_supplier)
OR (
S.active = 0
AND a_get_inactive_supplier = 0
)
) THEN
INSERT INTO tmp_Msg_Error (
id_type,
code,
msg
)
SELECT
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive Supplier IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Supplier S ON t_S.as_int = S.id_supplier
WHERE
ISNULL(t_S.as_int)
OR ISNULL(S.id_supplier)
OR (
S.active = 0
AND a_get_inactive_supplier = 0
)
;
ELSE
INSERT INTO tmp_Supplier (
id_supplier
)
SELECT
S.id_supplier
FROM tmp_Split t_S
RIGHT JOIN partsltd_prod.Shop_Supplier S ON t_S.as_int = S.id_supplier
WHERE (
a_get_all_supplier = 1
OR (
v_has_filter_supplier = 1
AND NOT ISNULL(t_S.as_int)
)
)
AND (
a_get_inactive_supplier = 1
OR S.active = 1
)
;
END IF;
END IF;
DELETE FROM tmp_Split;
-- Permissions
IF a_debug = 1 THEN
SELECT
v_guid
, a_id_user
, FALSE -- get inactive users
, v_id_permission_supplier
, v_id_access_level_view
, '' -- ids_product
, 0 -- a_debug
;
SELECT * from Shop_Calc_User_Temp;
END IF;
CALL p_shop_calc_user(
v_guid
, a_id_user
, FALSE -- get inactive users
, v_id_permission_supplier
, v_id_access_level_view
, '' -- ids_product
, 0 -- a_debug
);
IF a_debug = 1 THEN
SELECT * from Shop_Calc_User_Temp;
END IF;
IF NOT EXISTS (SELECT can_view FROM Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = v_guid) THEN
DELETE FROM tmp_Msg_Error;
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
VALUES (
v_id_type_error_no_permission
, v_code_type_error_no_permission
, CONCAT('You do not have view permissions for ', (SELECT name FROM Shop_Permission WHERE id_permission = v_id_permission_supplier LIMIT 1))
)
;
END IF;
IF EXISTS ( SELECT * FROM tmp_Msg_Error LIMIT 1 ) THEN
DELETE FROM tmp_Supplier;
END IF;
-- Returns
# Suppliers
SELECT
t_S.id_supplier,
S.id_currency,
C.code AS code_currency,
C.symbol AS symbol_currency,
S.name_company,
S.name_contact,
S.department_contact,
S.phone_number,
S.fax,
S.email,
S.website,
S.active
FROM tmp_Supplier t_S
INNER JOIN partsltd_prod.Shop_Supplier S ON t_S.id_supplier = S.id_supplier
LEFT JOIN partsltd_prod.Shop_Currency C ON S.id_currency = C.id_currency
;
# Supplier Addresses
SELECT
t_S.id_supplier
, SA.id_address
, SA.id_region
, R.name AS name_region
, SA.postcode
, SA.address_line_1
, SA.address_line_2
, SA.city
, SA.county
, SA.active
FROM tmp_Supplier t_S
INNER JOIN partsltd_prod.Shop_Supplier S ON t_S.id_supplier = S.id_supplier
INNER JOIN partsltd_prod.Shop_Supplier_Address SA ON S.id_supplier = SA.id_supplier
LEFT JOIN partsltd_prod.Shop_Region R ON SA.id_region = R.id_region
;
# Errors
SELECT *
FROM tmp_Msg_Error t_ME
INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type
;
IF a_debug = 1 THEN
SELECT * from tmp_Supplier;
END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_Supplier;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
DROP TEMPORARY TABLE IF EXISTS tmp_Split;
IF a_debug = 1 THEN
CALL p_debug_timing_reporting( v_time_start );
END IF;
END //
DELIMITER ;;
/*
CALL p_shop_get_many_supplier (
1 -- 'auth0|6582b95c895d09a70ba10fef' # a_id_user
, 1 # a_get_all_supplier
, 0 # a_get_inactive_supplier
, '' # a_ids_supplier
, 0 # a_debug
);
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_save_supplier_purchase_order;
DROP TABLE IF EXISTS tmp_Supplier_Purchase_Order_Product_Link;
DROP TABLE IF EXISTS tmp_Msg_Error;
DELIMITER //
CREATE PROCEDURE p_shop_save_supplier_purchase_order (
IN a_comment VARCHAR(500)
, IN a_guid BINARY(36)
, IN a_id_user INT
, IN a_debug BIT
)
BEGIN
DECLARE v_code_type_error_bad_data VARCHAR(50);
DECLARE v_code_type_error_no_permission VARCHAR(50);
DECLARE v_code_type_error_warning VARCHAR(50);
DECLARE v_id_access_level_edit INT;
DECLARE v_id_change_set INT;
DECLARE v_id_permission_supplier_purchase_order VARCHAR(100);
DECLARE v_id_type_error_bad_data INT;
DECLARE v_id_type_error_no_permission INT;
DECLARE v_id_type_error_warning INT;
DECLARE v_ids_product_permission TEXT;
DECLARE v_time_start TIMESTAMP(6);
DECLARE exit handler for SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
@sqlstate = RETURNED_SQLSTATE
, @errno = MYSQL_ERRNO
, @text = MESSAGE_TEXT
;
ROLLBACK;
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NULL
, code VARCHAR(50) NOT NULL
, msg VARCHAR(4000) NOT NULL
);
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
MET.id_type
, @errno
, @text
FROM partsltd_prod.Shop_Msg_Error_Type MET
WHERE code = 'MYSQL_ERROR'
;
SELECT *
FROM tmp_Msg_Error;
DROP TABLE IF EXISTS tmp_Msg_Error;
END;
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1);
SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1);
SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION' LIMIT 1);
SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission LIMIT 1);
SET v_code_type_error_warning := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'WARNING' LIMIT 1);
SET v_id_type_error_warning := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_warning LIMIT 1);
SET v_id_permission_supplier_purchase_order := (SELECT GROUP_CONCAT(id_permission SEPARATOR ',') FROM partsltd_prod.Shop_Permission WHERE code IN ('STORE_SUPPLIER', 'STORE_SUPPLIER_PURCHASE_ORDER', 'STORE_PRODUCT'));
SET v_id_access_level_edit := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'EDIT' LIMIT 1);
CALL p_validate_guid ( a_guid );
SET a_comment := TRIM(IFNULL(a_comment, ''));
DROP TEMPORARY TABLE IF EXISTS tmp_Supplier_Purchase_Order;
DROP TEMPORARY TABLE IF EXISTS tmp_Supplier_Purchase_Order_Product_Link;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
-- Temporary tables
CREATE TEMPORARY TABLE tmp_Supplier_Purchase_Order (
id_order INT NOT NULL PRIMARY KEY
, id_order_temp INT NOT NULL
, id_supplier_ordered INT NOT NULL
, id_currency_cost INT NOT NULL
, cost_total_local_VAT_excl FLOAT NULL
, cost_total_local_VAT_incl FLOAT NULL
, active BIT NOT NULL
, is_new BIT NOT NULL
, name_error VARCHAR(1000) NOT NULL
);
CREATE TEMPORARY TABLE tmp_Supplier_Purchase_Order_Product_Link (
id_link INT NOT NULL PRIMARY KEY
, id_order INT NOT NULL
, id_permutation INT NOT NULL
-- , id_currency_cost INT NOT NULL
, quantity_ordered FLOAT NOT NULL
, id_unit_quantity INT NOT NULL
, quantity_received FLOAT NULL
, latency_delivery_days INT NOT NULL
, display_order INT NOT NULL
, active BIT NOT NULL
, cost_total_local_VAT_excl FLOAT NOT NULL
, cost_total_local_VAT_incl FLOAT NOT NULL
, cost_unit_local_VAT_excl FLOAT NOT NULL
, cost_unit_local_VAT_incl FLOAT NOT NULL
, has_order BIT NULL
, is_new BIT NOT NULL
, name_error VARCHAR(1000) NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NOT NULL
, code VARCHAR(50) NOT NULL
, msg VARCHAR(4000) NOT NULL
);
INSERT INTO tmp_Supplier_Purchase_Order (
id_order
, id_order_temp
, id_supplier_ordered
, id_currency_cost
, active
, is_new
, name_error
)
SELECT
SPO_T.id_order
, SPO_T.id_order
, IFNULL(IFNULL(SPO_T.id_supplier_ordered, SPO.id_supplier_ordered), 0) AS id_supplier_ordered
, IFNULL(IFNULL(SPO_T.id_currency_cost, SPO.id_currency_cost), 0) AS id_currency_cost
, IFNULL(IFNULL(SPO_T.active, SPO.active), 1) AS active
, ISNULL(SPO.id_order) AS is_new
, CONCAT(
IFNULL(S.name_company, '(No Supplier)')
, ' - '
, IFNULL(SPO.created_on, '(No creation date)')
, ' - '
, IFNULL(C.symbol, '(No Currency)')
, ' '
, IFNULL(IFNULL(SPO.cost_total_local_vat_excl, SPO.cost_total_local_vat_incl), '(No cost)')
) AS name_error
FROM partsltd_prod.Shop_Supplier_Purchase_Order_Temp SPO_T
LEFT JOIN partsltd_prod.Shop_Supplier_Purchase_Order SPO ON SPO_T.id_order = SPO.id_order
LEFT JOIN partsltd_prod.Shop_Supplier S ON SPO_T.id_supplier_ordered = S.id_supplier
LEFT JOIN partsltd_prod.Shop_Currency C ON SPO_T.id_currency_cost = C.id_currency
WHERE SPO_T.GUID = a_guid
;
INSERT INTO tmp_Supplier_Purchase_Order_Product_Link (
id_link
, id_order
, id_permutation
-- , id_currency_cost
, id_unit_quantity
, quantity_ordered
, quantity_received
, latency_delivery_days
, display_order
, cost_total_local_VAT_excl
, cost_total_local_VAT_incl
, cost_unit_local_VAT_excl
, cost_unit_local_VAT_incl
, active
, has_order
, is_new
)
SELECT
IFNULL(SPOPL_T.id_link, 0) AS id_link
, IFNULL(IFNULL(SPOPL_T.id_order, SPOPL.id_order), 0) AS id_order
, IFNULL(
IFNULL(
IFNULL(
SPOPL_T.id_permutation
, CASE WHEN NOT ISNULL(SPOPL_T.id_product) AND NOT ISNULL(SPOPL_T.csv_list_variations) THEN
partsltd_prod.fn_shop_get_id_product_permutation_from_variation_csv_list(SPOPL_T.id_product, SPOPL_T.csv_list_variations)
ELSE NULL END
)
, SPOPL.id_permutation
)
, 0
) AS id_permutation
-- , IFNULL(IFNULL(SPOPL_T.id_currency_cost, SPOPL.id_currency_cost), 0) AS id_currency_cost
, IFNULL(IFNULL(SPOPL_T.id_unit_quantity, SPOPL.id_unit_quantity), 0) AS id_unit_quantity
, IFNULL(IFNULL(SPOPL_T.quantity_ordered, SPOPL.quantity_ordered), 0) AS quantity_ordered
, IFNULL(SPOPL_T.quantity_received, SPOPL.quantity_received) AS quantity_received
, IFNULL(SPOPL_T.latency_delivery_days, SPOPL.latency_delivery_days) AS latency_delivery_days
, RANK() OVER (PARTITION BY IFNULL(IFNULL(SPOPL_T.id_order, SPOPL.id_order), 0) ORDER BY IFNULL(IFNULL(SPOPL_T.display_order, SPOPL.display_order), 0)) AS display_order
, IFNULL(IFNULL(SPOPL_T.cost_total_local_VAT_excl, SPOPL.cost_total_local_VAT_excl), 0) AS cost_total_local_VAT_excl
, IFNULL(IFNULL(SPOPL_T.cost_total_local_VAT_incl, SPOPL.cost_total_local_VAT_incl), 0) AS cost_total_local_VAT_incl
, IFNULL(SPOPL_T.cost_total_local_VAT_excl / SPOPL_T.quantity_ordered, SPOPL.cost_unit_local_VAT_excl) AS cost_unit_local_VAT_excl
, IFNULL(SPOPL_T.cost_total_local_VAT_incl / SPOPL_T.quantity_ordered, SPOPL.cost_unit_local_VAT_incl) AS cost_unit_local_VAT_incl
, IFNULL(IFNULL(SPOPL_T.active, SPOPL.active), 1) AS active
, NOT ISNULL(t_SPO.id_order) AS has_order
, IFNULL(SPOPL_T.id_link, 0) < 1 AS is_new
FROM partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link_Temp SPOPL_T
LEFT JOIN partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link SPOPL ON SPOPL_T.id_link = SPOPL.id_link
LEFT JOIN tmp_Supplier_Purchase_Order t_SPO ON SPOPL_T.id_order = t_SPO.id_order
WHERE SPOPL_T.GUID = a_guid
;
UPDATE tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
INNER JOIN partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link_Temp SPOPL_T ON t_SPOPL.id_order = SPOPL_T.id_order
LEFT JOIN partsltd_prod.Shop_Product P ON SPOPL_T.id_product = P.id_product
LEFT JOIN partsltd_prod.Shop_Product_Category PC ON P.id_category = PC.id_category
SET
name_error = CONCAT(
CASE WHEN ISNULL(t_SPOPL.id_permutation) THEN
CASE WHEN ISNULL(SPOPL_T.id_product) THEN
'(No Product Permutation)'
ELSE
CONCAT(
PC.name
, ' - '
, P.name
)
END
ELSE
fn_shop_get_product_permutation_name(t_SPOPL.id_permutation)
END
, ' - x'
, IFNULL(t_SPOPL.quantity_ordered, '(No Quantity)')
)
;
INSERT INTO tmp_Supplier_Purchase_Order (
id_order
, id_order_temp
, id_supplier_ordered
, id_currency_cost
, active
, is_new
)
SELECT
SPO.id_order
, SPO.id_order
, IFNULL(SPO.id_supplier_ordered, 0) AS id_supplier_ordered
, IFNULL(SPO.id_currency_cost, 0) AS id_currency_cost
, SPO.active AS active
, 0 AS is_new
FROM partsltd_prod.Shop_Supplier_Purchase_Order SPO
INNER JOIN tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
ON SPO.id_order = t_SPOPL.id_order
AND t_SPOPL.has_order = 0
;
UPDATE tmp_Supplier_Purchase_Order t_SPO
INNER JOIN (
SELECT
t_SPOPL.id_order
, SUM(t_SPOPL.cost_total_local_VAT_excl) AS cost_total_local_VAT_excl
, SUM(t_SPOPL.cost_total_local_VAT_incl) AS cost_total_local_VAT_incl
FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
GROUP BY t_SPOPL.id_order
) SUM_t_SPOPL ON t_SPO.id_order = SUM_t_SPOPL.id_order
SET
t_SPO.cost_total_local_VAT_excl = SUM_t_SPOPL.cost_total_local_VAT_excl
, t_SPO.cost_total_local_VAT_incl = SUM_t_SPOPL.cost_total_local_VAT_incl
;
-- Validation
-- Supplier Purchase Order
# id_order
IF EXISTS (
SELECT *
FROM tmp_Supplier_Purchase_Order t_SPO
LEFT JOIN partsltd_prod.Shop_Supplier_Purchase_Order SPO ON t_SPO.id_order = SPO.id_order
WHERE 1=1
AND t_SPO.id_order > 0
AND ISNULL(SPO.id_order)
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT(
'A valid ID is required for the following Supplier Purchase Order(s): '
, GROUP_CONCAT(CONCAT(IFNULL(t_SPO.id_stock, '(No Supplier Purchase Order)')) SEPARATOR ', ')
) AS msg
FROM tmp_Supplier_Purchase_Order t_SPO
LEFT JOIN partsltd_prod.Shop_Supplier_Purchase_Order SPO ON t_SPO.id_order = SPO.id_order
WHERE 1=1
AND t_SPO.id_stock > 0
AND ISNULL(SPO.id_stock)
;
END IF;
# id_supplier_ordered
IF EXISTS (
SELECT *
FROM tmp_Supplier_Purchase_Order t_SPO
LEFT JOIN partsltd_prod.Shop_Supplier S ON t_SPO.id_supplier_ordered = S.id_supplier
WHERE 1=1
AND (
ISNULL(S.id_supplier)
OR S.active = 0
)
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT(
'A valid supplier is required for the following Supplier Purchase Order(s): '
, GROUP_CONCAT(CONCAT(IFNULL(t_SPO.id_stock, '(No Supplier Purchase Order)'), ' - ', t_SPO.id_supplier_ordered) SEPARATOR ', ')
) AS msg
FROM tmp_Supplier_Purchase_Order t_SPO
LEFT JOIN partsltd_prod.Shop_Supplier S ON t_SPO.id_supplier_ordered = S.id_supplier
WHERE 1=1
AND (
ISNULL(S.id_supplier)
OR S.active = 0
)
;
END IF;
# id_currency_cost
IF EXISTS (
SELECT *
FROM tmp_Supplier_Purchase_Order t_SPO
LEFT JOIN partsltd_prod.Shop_Currency C ON t_SPO.id_currency_cost = C.id_currency
WHERE 1=1
AND (
ISNULL(C.id_currency)
OR C.active = 0
)
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT(
'A valid currency is required for the following Supplier Purchase Order(s): '
, GROUP_CONCAT(CONCAT(IFNULL(t_SPO.id_stock, '(No Supplier Purchase Order)'), ' - ', t_SPO.id_currency_cost) SEPARATOR ', ')
) AS msg
FROM tmp_Supplier_Purchase_Order t_SPO
LEFT JOIN partsltd_prod.Shop_Currency C ON t_SPO.id_currency_cost = C.id_currency
WHERE 1=1
AND (
ISNULL(C.id_currency)
OR C.active = 0
)
;
END IF;
# id_unit_quantity
IF EXISTS (
SELECT *
FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM ON t_SPOPL.id_unit_quantity = UM.id_unit_measurement
WHERE 1=1
AND (
ISNULL(UM.id_unit_measurement)
OR UM.active = 0
)
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT(
'A valid unit measurement of quantity is required for the following Supplier Purchase Order(s): '
, GROUP_CONCAT(CONCAT(IFNULL(t_SPO.id_stock, '(No Supplier Purchase Order)'), ' - ', t_SPO.id_currency_cost) SEPARATOR ', ')
) AS msg
FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM ON t_SPOPL.id_unit_quantity = UM.id_unit_measurement
WHERE 1=1
AND (
ISNULL(UM.id_unit_measurement)
OR UM.active = 0
)
;
END IF;
# Invalid quantity ordered
IF EXISTS (
SELECT *
FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
WHERE
ISNULL(t_SPOPL.quantity_ordered)
OR t_SPOPL.quantity_ordered <= 0
) THEN
INSERT INTO tmp_Msg_Error (
id_type, code, msg
)
SELECT
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT(
'A valid quantity ordered is required for the following Supplier Purchase Order Item(s): '
, GROUP_CONCAT(t_SPOPL.name_error SEPARATOR ', ')
)
FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
WHERE
ISNULL(t_SPOPL.quantity_ordered)
OR t_SPOPL.quantity_ordered <= 0
;
END IF;
# Invalid quantity received
IF EXISTS (
SELECT *
FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
WHERE t_SPOPL.quantity_received < 0
) THEN
INSERT INTO tmp_Msg_Error (
id_type, code, msg
)
SELECT
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT(
'A valid quantity received is required for the following Supplier Purchase Order Item(s): '
, GROUP_CONCAT(t_SPOPL.name_error, ' - ', t_SPOPL.quantity_received SEPARATOR ', ')
)
FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
WHERE t_SPOPL.quantity_received < 0
;
END IF;
# Invalid delivery latency
IF EXISTS (
SELECT *
FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
WHERE t_SPOPL.latency_delivery_days < 0
) THEN
INSERT INTO tmp_Msg_Error (
id_type, code, msg
)
SELECT
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT(
'A valid delivery latency is required for the following Supplier Purchase Order Item(s): '
, GROUP_CONCAT(t_SPOPL.name_error, ' - ', t_SPOPL.latency_delivery_days SEPARATOR ', ')
)
FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
WHERE t_SPOPL.latency_delivery_days < 0
;
END IF;
-- Duplicates
IF EXISTS (
SELECT
id_permutation
, name_error
, COUNT(*)
FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
GROUP BY id_permutation, name_error
HAVING COUNT(*) > 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type, code, msg
)
SELECT
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Duplicate records: ', GROUP_CONCAT(t_SPOPLC.name_error SEPARATOR ', '))
FROM (
SELECT
id_permutation
, name_error
, COUNT(*)
FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
GROUP BY id_permutation, name_error
HAVING COUNT(*) > 1
) t_SPOPLC
;
END IF;
-- Empty Supplier Purchase Order
IF EXISTS ( SELECT * FROM tmp_Supplier_Purchase_Order t_SPO LEFT JOIN tmp_Supplier_Purchase_Order_Product_Link t_SPOPL ON t_SPO.id_order = t_SPOPL.id_order WHERE ISNULL(t_SPOPL.id_order) ) THEN
INSERT INTO tmp_Msg_Error (
id_type, code, msg
)
SELECT
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT(
'There are no items in the following Supplier Purchase Order(s): '
, GROUP_CONCAT(t_SPO.name_error SEPARATOR ', ')
) AS msg
FROM tmp_Supplier_Purchase_Order t_SPO
LEFT JOIN tmp_Supplier_Purchase_Order_Product_Link t_SPOPL ON t_SPO.id_order = t_SPOPL.id_order
WHERE ISNULL(t_SPOPL.id_order)
;
END IF;
-- Supplier Purchase Order Items without Order
IF EXISTS (
SELECT *
FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
LEFT JOIN tmp_Supplier_Purchase_Order t_SPO ON t_SPOPL.id_order = t_SPO.id_order
WHERE ISNULL(t_SPO.id_order)
) THEN
INSERT INTO tmp_Msg_Error (
id_type, code, msg
)
SELECT
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT(
'There is no order for the following Supplier Purchase Order Item(s): '
, GROUP_CONCAT(t_SPOPL.name_error SEPARATOR ', ')
) AS msg
FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
LEFT JOIN tmp_Supplier_Purchase_Order t_SPO ON t_SPOPL.id_order = t_SPO.id_order
WHERE ISNULL(t_SPO.id_order)
;
END IF;
-- Permissions
SET v_ids_product_permission := (
SELECT
GROUP_CONCAT(DISTINCT PP.id_product SEPARATOR ',')
FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
INNER JOIN partsltd_prod.Shop_Product_Permutation PP ON t_SPOPL.id_permutation = PP.id_permutation
);
IF a_debug = 1 THEN
SELECT
a_guid
, a_id_user
, FALSE -- get inactive users
, v_id_permission_supplier_purchase_order
, v_id_access_level_edit
, v_ids_product_permission -- ids_product
, 0 -- a_debug
;
SELECT * from partsltd_prod.Shop_Calc_User_Temp;
END IF;
CALL p_shop_calc_user(
a_guid
, a_id_user
, FALSE -- get inactive users
, v_id_permission_supplier_purchase_order
, v_id_access_level_edit
, v_ids_product_permission -- ids_product
, 0 -- a_debug
);
IF a_debug = 1 THEN
SELECT * from partsltd_prod.Shop_Calc_User_Temp WHERE GUID = a_guid;
END IF;
IF EXISTS (SELECT * FROM partsltd_prod.Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = a_guid AND IFNULL(UE_T.can_view, 0) = 0) THEN
DELETE FROM tmp_Msg_Error;
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_no_permission
, v_code_type_error_no_permission
, CONCAT(
'You do not have view permissions for '
, GROUP_CONCAT(name SEPARATOR ', ')
) AS msg
FROM partsltd_prod.Shop_Permission PERM
INNER JOIN partsltd_prod.Shop_Calc_User_Temp UE_T
ON PERM.id_permission = UE_T.id_permission
AND UE_T.GUID = a_guid
AND IFNULL(UE_T.can_view, 0) = 0
;
END IF;
CALL partsltd_prod.p_shop_clear_calc_user(
a_guid
, 0 -- a_debug
);
IF EXISTS (
SELECT *
FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
INNER JOIN partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link SPOPL ON t_SPOPL.id_link = SPOPL.id_link
INNER JOIN partsltd_prod.Shop_Stock_Item SI ON SPOPL.id_permutation = SI.id_permutation
WHERE
t_SPOPL.is_new = 0
AND t_SPOPL.quantity_received <> SPOPL.quantity_received
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_warning
, v_code_type_error_warning
, CONCAT(
'The quantity received has changed on the following orders. Please update the stock items appropriately.'
, GROUP_CONCAT(
CONCAT(
t_SPOPL.name_error
, ' - from '
, SPOPL.quantity_received
, ' to '
, t_SPOPL.quantity_received
) SEPARATOR ', '
)
) AS msg
;
END IF;
IF EXISTS ( SELECT * FROM tmp_Msg_Error LIMIT 1 ) THEN
DELETE FROM tmp_Supplier_Purchase_Order;
DELETE FROM tmp_Supplier_Purchase_Order_Product_Link;
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 (
a_comment
, a_id_user
, v_time_start
);
SET v_id_change_set := LAST_INSERT_ID();
INSERT INTO partsltd_prod.Shop_Supplier_Purchase_Order (
id_order_temp
, id_supplier_ordered
, id_currency_cost
, cost_total_local_VAT_excl
, cost_total_local_VAT_incl
, active
, created_by
, created_on
, id_change_set
)
SELECT
t_SPO.id_order_temp
, t_SPO.id_supplier_ordered
, t_SPO.id_currency_cost
, t_SPO.cost_total_local_VAT_excl
, t_SPO.cost_total_local_VAT_incl
, t_SPO.active
, a_id_user
, v_time_start
, v_id_change_set
FROM tmp_Supplier_Purchase_Order t_SPO
INNER JOIN tmp_Supplier_Purchase_Order_Product_Link t_SPOPL ON t_SPO.id_order = t_SPOPL.id_order
WHERE t_SPOPL.is_new = 1
GROUP BY t_SPO.id_order
;
UPDATE partsltd_prod.Shop_Supplier_Purchase_Order SPO
INNER JOIN tmp_Supplier_Purchase_Order t_SPO
ON SPO.id_order = t_SPO.id_order
AND t_SPO.is_new = 0
INNER JOIN tmp_Supplier_Purchase_Order_Product_Link t_SPOPL ON t_SPO.id_order = t_SPOPL.id_order
SET
SPO.id_supplier_ordered = t_SPO.id_supplier_ordered
, SPO.id_currency_cost = t_SPO.id_currency_cost
, SPO.cost_total_local_VAT_excl = t_SPO.cost_total_local_VAT_excl
, SPO.cost_total_local_VAT_incl = t_SPO.cost_total_local_VAT_incl
, SPO.active = t_SPO.active
, SPO.id_change_set = v_id_change_set
;
UPDATE tmp_Supplier_Purchase_Order t_SPO
INNER JOIN partsltd_prod.Shop_Supplier_Purchase_Order SPO ON t_SPO.id_order_temp = SPO.id_order_temp
SET
t_SPO.id_order = SPO.id_order
WHERE t_SPO.is_new = 1
;
UPDATE tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
INNER JOIN tmp_Supplier_Purchase_Order t_SPO ON t_SPOPL.id_order = t_SPO.id_order_temp
SET
t_SPOPL.id_order = t_SPO.id_order
WHERE t_SPO.is_new = 1
;
INSERT INTO Shop_Supplier_Purchase_Order_Product_Link (
id_order
, id_permutation
, id_unit_quantity
, quantity_ordered
, quantity_received
, latency_delivery_days
, display_order
, active
, cost_total_local_VAT_excl
, cost_total_local_VAT_incl
, cost_unit_local_VAT_excl
, cost_unit_local_VAT_incl
, created_by
, created_on
, id_change_set
)
SELECT
t_SPOPL.id_order
, t_SPOPL.id_permutation
, t_SPOPL.id_unit_quantity
, t_SPOPL.quantity_ordered
, t_SPOPL.quantity_received
, t_SPOPL.latency_delivery_days
, t_SPOPL.display_order
, t_SPOPL.active
, t_SPOPL.cost_total_local_VAT_excl
, t_SPOPL.cost_total_local_VAT_incl
, t_SPOPL.cost_unit_local_VAT_excl
, t_SPOPL.cost_unit_local_VAT_incl
, a_id_user
, v_time_start
, v_id_change_set
FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
WHERE t_SPOPL.is_new = 1
;
UPDATE partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link SPOPL
INNER JOIN tmp_Supplier_Purchase_Order_Product_Link t_SPOPL
ON SPOPL.id_link = t_SPOPL.id_link
AND t_SPOPL.is_new = 0
SET
SPOPL.id_order = t_SPOPL.id_order
, SPOPL.id_permutation = t_SPOPL.id_permutation
, SPOPL.id_unit_quantity = t_SPOPL.id_unit_quantity
, SPOPL.quantity_ordered = t_SPOPL.quantity_ordered
, 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.cost_total_local_VAT_excl = t_SPOPL.cost_total_local_VAT_excl
, SPOPL.cost_total_local_VAT_incl = t_SPOPL.cost_total_local_VAT_incl
, SPOPL.cost_unit_local_VAT_excl = t_SPOPL.cost_unit_local_VAT_excl
, SPOPL.cost_unit_local_VAT_incl = t_SPOPL.cost_unit_local_VAT_incl
, SPOPL.id_change_set = v_id_change_set
;
DELETE SPO_T
FROM Shop_Supplier_Purchase_Order_Temp SPO_T
WHERE SPO_T.GUID = a_guid
;
DELETE SPOPL_T
FROM Shop_Supplier_Purchase_Order_Product_Link_Temp SPOPL_T
WHERE SPOPL_T.GUID = a_guid
;
COMMIT;
END IF;
# Errors
SELECT *
FROM tmp_Msg_Error t_ME
INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type
;
IF a_debug = 1 THEN
SELECT * from tmp_Supplier_Purchase_Order;
SELECT * from tmp_Supplier_Purchase_Order_Product_Link;
END IF;
DROP TEMPORARY TABLE tmp_Supplier_Purchase_Order;
DROP TEMPORARY TABLE tmp_Supplier_Purchase_Order_Product_Link;
DROP TEMPORARY TABLE tmp_Msg_Error;
IF a_debug = 1 THEN
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END IF;
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;
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS partsltd_prod.p_shop_save_supplier_purchase_order_test;
DELIMITER //
CREATE PROCEDURE p_shop_save_supplier_purchase_order_test ()
BEGIN
DECLARE v_guid BINARY(36);
DECLARE v_time_start TIMESTAMP(6);
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_guid := 'nips';
SELECT *
FROM partsltd_prod.Shop_Supplier_Purchase_Order
;
SELECT *
FROM partsltd_prod.Shop_Supplier_Purchase_Order_Temp
;
SELECT *
FROM partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link
;
SELECT *
FROM partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link_Temp
;
START TRANSACTION;
DELETE FROM partsltd_prod.Shop_Supplier_Purchase_Order_Temp;
DELETE FROM partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link_Temp;
INSERT INTO partsltd_prod.Shop_Supplier_Purchase_Order_Temp (
id_order
, id_supplier_ordered
, id_currency_cost
, active
, GUID
)
/* Test 1 - Insert */
VALUES (
-1
, 1
, 1
, 1
, v_guid
)
/* Test 2 - Update
SELECT
id_order
, id_supplier_ordered
, id_currency_cost
, active
, v_guid
FROM partsltd_prod.Shop_Supplier_Purchase_Order
WHERE id_order = 6
*/
;
/*
INSERT INTO partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link_Temp (
id_link
, id_order
, id_permutation
, id_unit_quantity
, quantity_ordered
, quantity_received
, latency_delivery_days
, display_order
, active
, cost_total_local_VAT_excl
, cost_total_local_VAT_incl
, GUID
)
;
/ Test 1 - Insert
VALUES (
-1
, -1
, 3
, 3
, 3
, 1
, 7
, 1
, 1
, 5
, 6
, v_guid
)
*/
/* Test 2 - Update
SELECT
id_link
, id_order
, id_permutation
, id_unit_quantity
, 5 AS quantity_ordered
, quantity_received
, latency_delivery_days
, display_order
, active
, cost_total_local_VAT_excl
, cost_total_local_VAT_incl
, v_guid
FROM partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link
WHERE id_order = 6
*/
COMMIT;
SELECT *
FROM partsltd_prod.Shop_Supplier_Purchase_Order_Temp
WHERE GUID = v_guid
;
SELECT *
FROM partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link_Temp
WHERE GUID = v_guid
;
CALL partsltd_prod.p_shop_save_supplier_purchase_order (
'Test save Supplier Purchase Order' -- comment
, v_guid -- guid
, 1 -- id_user
, 1 -- debug
);
SELECT *
FROM partsltd_prod.Shop_Supplier_Purchase_Order_Temp
;
SELECT *
FROM partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link_Temp
;
SELECT *
FROM partsltd_prod.Shop_Supplier_Purchase_Order
;
SELECT *
FROM partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link
;
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END //
DELIMITER ;;
/*
CALL partsltd_prod.p_shop_save_supplier_purchase_order_test ();
DELETE FROM partsltd_prod.Shop_Supplier_Purchase_Order_Temp;
DELETE FROM partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link_Temp;
DROP TABLE IF EXISTS tmp_Msg_Error;
Cannot add or update a child row: a foreign key constraint fails (`partsltd_prod`.`shop_supplier_address`, CONSTRAINT `FK_Shop_Supplier_Address_id_supplier` FOREIGN KEY (`id_supplier`) REFERENCES `shop_supplier` (`id_supplier`) ON UPDATE RESTRICT)
*/
DROP PROCEDURE IF EXISTS p_shop_get_many_supplier_purchase_order;
DELIMITER //
CREATE PROCEDURE p_shop_get_many_supplier_purchase_order (
IN a_id_user INT,
IN a_get_all_supplier BIT,
IN a_get_inactive_supplier BIT,
IN a_ids_supplier TEXT,
IN a_get_all_order BIT,
IN a_get_inactive_order BIT,
IN a_ids_order TEXT,
IN a_ids_permutation TEXT,
IN a_date_from DATETIME,
IN a_date_to DATETIME,
IN a_debug BIT
)
BEGIN
DECLARE v_code_type_error_bad_data VARCHAR(50);
DECLARE v_code_type_error_no_permission VARCHAR(50);
DECLARE v_guid BINARY(36);
DECLARE v_has_filter_supplier BIT;
DECLARE v_has_filter_order BIT;
DECLARE v_has_filter_permutation BIT;
DECLARE v_has_filter_date_from BIT;
DECLARE v_has_filter_date_to BIT;
DECLARE v_id_access_level_view INT;
DECLARE v_ids_permission_supplier_purchase_order VARCHAR(100);
DECLARE v_id_type_error_bad_data INT;
DECLARE v_id_type_error_no_permission INT;
DECLARE v_time_start TIMESTAMP(6);
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_guid := UUID();
SET v_id_access_level_view := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'VIEW' LIMIT 1);
SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1);
SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1);
SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION' LIMIT 1);
SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission LIMIT 1);
SET v_ids_permission_supplier_purchase_order := (SELECT GROUP_CONCAT(id_permission SEPARATOR ',') FROM partsltd_prod.Shop_Permission WHERE code IN ('STORE_SUPPLIER', 'STORE_SUPPLIER_PURCHASE_ORDER', 'STORE_PRODUCT'));
SET a_get_all_supplier := IFNULL(a_get_all_supplier, 1);
SET a_get_inactive_supplier := IFNULL(a_get_inactive_supplier, 0);
SET a_ids_supplier := TRIM(IFNULL(a_ids_supplier, ''));
SET a_get_all_order := IFNULL(a_get_all_order, 1);
SET a_get_inactive_order := IFNULL(a_get_inactive_order, 0);
SET a_ids_order := TRIM(IFNULL(a_ids_order, ''));
SET a_ids_permutation := TRIM(IFNULL(a_ids_permutation, ''));
SET a_date_from := IFNULL(a_date_from, NULL);
SET a_date_to := IFNULL(a_date_to, NULL);
SET a_debug := IFNULL(a_debug, 0);
DROP TEMPORARY TABLE IF EXISTS tmp_Supplier_Purchase_Order_Product_Link;
DROP TEMPORARY TABLE IF EXISTS tmp_Supplier_Purchase_Order;
DROP TEMPORARY TABLE IF EXISTS tmp_Supplier;
DROP TEMPORARY TABLE IF EXISTS tmp_Permutation;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
DROP TEMPORARY TABLE IF EXISTS tmp_Split;
CREATE TEMPORARY TABLE tmp_Supplier (
id_supplier INT NOT NULL PRIMARY KEY
);
CREATE TEMPORARY TABLE tmp_Supplier_Purchase_Order (
id_order INT NOT NULL PRIMARY KEY
);
CREATE TEMPORARY TABLE tmp_Permutation (
id_permutation INT NOT NULL PRIMARY KEY
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
id_type INT NOT NULL,
code VARCHAR(50) NOT NULL,
msg VARCHAR(4000) NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split (
substring VARCHAR(4000) NOT NULL
, as_int INT NULL
);
DELETE FROM tmp_Split;
SET v_has_filter_supplier = CASE WHEN a_ids_supplier = '' THEN 0 ELSE 1 END;
SET v_has_filter_order = CASE WHEN a_ids_order = '' THEN 0 ELSE 1 END;
SET v_has_filter_permutation = CASE WHEN a_ids_permutation = '' THEN 0 ELSE 1 END;
SET v_has_filter_date_from = CASE WHEN ISNULL(a_date_from) THEN 0 ELSE 1 END;
SET v_has_filter_date_to = CASE WHEN ISNULL(a_date_to) THEN 0 ELSE 1 END;
IF a_debug = 1 THEN
SELECT
v_has_filter_supplier,
v_has_filter_order,
v_has_filter_permutation,
v_has_filter_date_from,
v_has_filter_date_to
;
END IF;
-- Permutations
IF v_has_filter_permutation = 1 THEN
CALL partsltd_prod.p_split(v_guid, a_ids_permutation, ',', a_debug);
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM partsltd_prod.Split_Temp
WHERE 1=1
AND GUID = v_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( v_guid );
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_S.as_int = PP.id_permutation
WHERE
ISNULL(t_S.as_int)
OR ISNULL(PP.id_permutation)
OR PP.active = 0
) THEN
INSERT INTO tmp_Msg_Error (
id_type,
code,
msg
)
SELECT
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive permutation IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_S.as_int = PP.id_permutation
WHERE
ISNULL(t_S.as_int)
OR ISNULL(PP.id_permutation)
OR PP.active = 0
;
ELSE
INSERT INTO tmp_Permutation (
id_permutation
)
SELECT
PP.id_permutation
FROM tmp_Split t_S
RIGHT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_S.as_int = PP.id_permutation
WHERE (
v_has_filter_permutation = 0
OR NOT ISNULL(t_S.as_int)
)
;
END IF;
END IF;
DELETE FROM tmp_Split;
-- Suppliers
IF v_has_filter_supplier = 1 THEN
CALL partsltd_prod.p_split(v_guid, a_ids_supplier, ',', a_debug);
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM partsltd_prod.Split_Temp
WHERE 1=1
AND GUID = v_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( v_guid );
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Supplier S ON t_S.as_int = S.id_supplier
WHERE
ISNULL(t_S.as_int)
OR ISNULL(S.id_supplier)
OR (
S.active = 0
AND a_get_inactive_supplier = 0
)
) THEN
INSERT INTO tmp_Msg_Error (
id_type,
code,
msg
)
SELECT
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive Supplier IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Supplier S ON t_S.as_int = S.id_supplier
WHERE
ISNULL(t_S.as_int)
OR ISNULL(S.id_supplier)
OR (
S.active = 0
AND a_get_inactive_supplier = 0
)
;
ELSE
INSERT INTO tmp_Supplier (
id_supplier
)
SELECT
S.id_supplier
FROM tmp_Split t_S
RIGHT JOIN partsltd_prod.Shop_Supplier S ON t_S.as_int = S.id_supplier
WHERE (
a_get_all_supplier = 1
OR (
v_has_filter_supplier = 1
AND NOT ISNULL(t_S.as_int)
)
)
AND (
a_get_inactive_supplier = 1
OR S.active = 1
)
;
END IF;
END IF;
DELETE FROM tmp_Split;
-- Supplier Purchase Orders
IF v_has_filter_order = 1 THEN
CALL partsltd_prod.p_split(v_guid, a_ids_order, ',', a_debug);
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM partsltd_prod.Split_Temp
WHERE 1=1
AND GUID = v_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( v_guid );
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Supplier_Purchase_Order SPO ON t_S.as_int = SPO.id_order
WHERE
ISNULL(t_S.as_int)
OR ISNULL(SPO.id_order)
OR (
SPO.active = 0
AND a_get_inactive_order = 0
)
) THEN
INSERT INTO tmp_Msg_Error (
id_type,
code,
msg
)
SELECT
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive Supplier Purchase Order IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Supplier_Purchase_Order SPO ON t_S.as_int = SPO.id_order
WHERE
ISNULL(t_S.as_int)
OR ISNULL(SPO.id_order)
OR (
SPO.active = 0
AND a_get_inactive_order = 0
)
;
ELSE
INSERT INTO tmp_Supplier_Purchase_Order (
id_order
)
SELECT
SPO.id_order
FROM tmp_Split t_S
RIGHT JOIN partsltd_prod.Shop_Supplier_Purchase_Order SPO ON t_S.as_int = SPO.id_order
INNER JOIN tmp_Supplier t_SUPP ON SPO.id_supplier_ordered = t_SUPP.id_supplier
INNER JOIN partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link SPOPL ON SPO.id_order = SPOPL.id_order
INNER JOIN tmp_Permutation t_PP ON SPOPL.id_permutation = t_PP.id_permutation
WHERE (
a_get_all_order = 1
OR (
v_has_filter_order = 1
AND NOT ISNULL(t_S.as_int)
)
OR (
v_has_filter_supplier = 1
AND NOT ISNULL(t_SUPP.id_supplier)
)
OR (
v_has_filter_permutation = 1
AND NOT ISNULL(t_PP.id_permutation)
)
)
AND (
a_get_inactive_order = 1
OR SPO.active = 1
)
AND (
v_has_filter_date_from = 0
OR SPO.created_on > a_date_from
)
AND (
v_has_filter_date_to = 0
OR SPO.created_on < a_date_to
)
;
END IF;
END IF;
DELETE FROM tmp_Split;
-- Permissions
IF a_debug = 1 THEN
SELECT
v_guid
, a_id_user
, FALSE -- get inactive users
, v_ids_permission_supplier_purchase_order
, v_id_access_level_view
, '' -- ids_product
, 0 -- a_debug
;
SELECT * from partsltd_prod.Shop_Calc_User_Temp;
END IF;
CALL p_shop_calc_user(
v_guid
, a_id_user
, FALSE -- get inactive users
, v_ids_permission_supplier_purchase_order
, v_id_access_level_view
, '' -- ids_product
, 0 -- a_debug
);
IF a_debug = 1 THEN
SELECT * from partsltd_prod.Shop_Calc_User_Temp;
END IF;
IF NOT EXISTS (SELECT can_view FROM partsltd_prod.Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = v_guid) THEN
DELETE FROM tmp_Msg_Error;
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
VALUES (
v_id_type_error_no_permission
, v_code_type_error_no_permission
, CONCAT('You do not have view permissions for ', (SELECT name FROM partsltd_prod.Shop_Permission WHERE id_permission = v_ids_permission_supplier_purchase_order LIMIT 1))
)
;
END IF;
IF EXISTS ( SELECT * FROM tmp_Msg_Error LIMIT 1 ) THEN
DELETE FROM tmp_Permutation;
DELETE FROM tmp_Supplier_Purchase_Order;
END IF;
-- Returns
/*
# Suppliers
SELECT
t_S.id_supplier,
S.name_company,
S.name_contact,
S.department_contact,
S.id_address,
S.phone_number,
S.fax,
S.email,
S.website,
S.id_currency,
t_S.active
FROM tmp_Supplier t_S
INNER JOIN partsltd_prod.Shop_Supplier S
ON t_S.id_supplier = S.id_supplier
;
*/
# Supplier Purchase Order
SELECT
t_SPO.id_order
, SPO.id_supplier_ordered
, S.name_company
, SPO.id_currency_cost
, C.symbol
, C.code
, SPO.cost_total_local_VAT_excl
, SPO.cost_total_local_VAT_incl
, SPO.active
, SPO.created_on
, CONCAT(
SPO.cost_total_local_VAT_excl
, ' on '
, SPO.created_on
) AS name
FROM tmp_Supplier_Purchase_Order t_SPO
INNER JOIN partsltd_prod.Shop_Supplier_Purchase_Order SPO ON SPO.id_order = t_SPO.id_order
LEFT JOIN partsltd_prod.Shop_Supplier S ON SPO.id_supplier_ordered = S.id_supplier
LEFT JOIN partsltd_prod.Shop_Currency C ON SPO.id_currency_cost = C.id_currency
;
# Supplier Purchase Order Product Link
SELECT
SPOPL.id_link
, SPOPL.id_order
, P.id_category
, P.id_product
, SPOPL.id_permutation
, fn_shop_get_product_permutation_name(SPOPL.id_permutation) AS name_permutation
, fn_shop_get_product_permutation_variations_csv(SPOPL.id_permutation) AS csv_id_pairs_variation
-- , SPOPL.id_currency_cost
, SPOPL.id_unit_quantity
, SPOPL.quantity_ordered
, SPOPL.quantity_received
, SPOPL.latency_delivery_days
, SPOPL.display_order
, SPOPL.cost_total_local_VAT_excl
, SPOPL.cost_total_local_VAT_incl
, SPOPL.cost_unit_local_VAT_excl
, SPOPL.cost_unit_local_VAT_incl
, SPOPL.active
FROM tmp_Supplier_Purchase_Order t_SPO
INNER JOIN partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link SPOPL ON t_SPO.id_order = SPOPL.id_order
LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON SPOPL.id_permutation = PP.id_permutation
LEFT JOIN partsltd_prod.Shop_Product P ON PP.id_product = P.id_product
;
# Errors
SELECT *
FROM tmp_Msg_Error t_ME
INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type
;
IF a_debug = 1 THEN
SELECT * from tmp_Supplier_Purchase_Order_Product_Link;
SELECT * from tmp_Supplier_Purchase_Order;
SELECT * from tmp_Supplier;
END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_Supplier_Purchase_Order_Product_Link;
DROP TEMPORARY TABLE IF EXISTS tmp_Supplier_Purchase_Order;
DROP TEMPORARY TABLE IF EXISTS tmp_Supplier;
DROP TEMPORARY TABLE IF EXISTS tmp_Permutation;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
DROP TEMPORARY TABLE IF EXISTS tmp_Split;
IF a_debug = 1 THEN
CALL p_debug_timing_reporting( v_time_start );
END IF;
END //
DELIMITER ;;
/*
CALL p_shop_get_many_supplier_purchase_order (
1, # a_id_user
1, # a_get_all_supplier
0, # a_get_inactive_supplier
'', # a_ids_supplier
1, # a_get_all_order
0, # a_get_inactive_order
'', # a_ids_order
'', # a_ids_permutation
NULL, # a_date_from
NULL # a_date_to
, 0 # a_debug
);
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_save_manufacturing_purchase_order;
DROP TABLE IF EXISTS tmp_Manufacturing_Purchase_Order_Product_Link;
DROP TABLE IF EXISTS tmp_Msg_Error;
DELIMITER //
CREATE PROCEDURE p_shop_save_manufacturing_purchase_order (
IN a_comment VARCHAR(500)
, IN a_guid BINARY(36)
, IN a_id_user INT
, IN a_debug BIT
)
BEGIN
DECLARE v_code_type_error_bad_data VARCHAR(50);
DECLARE v_code_type_error_no_permission VARCHAR(50);
DECLARE v_code_type_error_warning VARCHAR(50);
DECLARE v_id_access_level_edit INT;
DECLARE v_id_change_set INT;
DECLARE v_ids_permission_manufacturing_purchase_order VARCHAR(100);
DECLARE v_id_type_error_bad_data INT;
DECLARE v_id_type_error_no_permission INT;
DECLARE v_id_type_error_warning INT;
DECLARE v_ids_product_permission TEXT;
DECLARE v_time_start TIMESTAMP(6);
DECLARE exit handler for SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
@sqlstate = RETURNED_SQLSTATE
, @errno = MYSQL_ERRNO
, @text = MESSAGE_TEXT
;
ROLLBACK;
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NULL
, code VARCHAR(50) NOT NULL
, msg VARCHAR(4000) NOT NULL
);
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
MET.id_type
, @errno
, @text
FROM partsltd_prod.Shop_Msg_Error_Type MET
WHERE code = 'MYSQL_ERROR'
;
SELECT *
FROM tmp_Msg_Error;
DROP TABLE IF EXISTS tmp_Msg_Error;
END;
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1);
SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1);
SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION' LIMIT 1);
SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission LIMIT 1);
SET v_code_type_error_warning := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'WARNING' LIMIT 1);
SET v_id_type_error_warning := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_warning LIMIT 1);
SET v_ids_permission_manufacturing_purchase_order := (SELECT GROUP_CONCAT(id_permission SEPARATOR ',') FROM partsltd_prod.Shop_Permission WHERE code IN ('STORE_MANUFACTURING_PURCHASE_ORDER', 'STORE_PRODUCT'));
SET v_id_access_level_edit := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'EDIT' LIMIT 1);
CALL p_validate_guid ( a_guid );
SET a_comment := TRIM(IFNULL(a_comment, ''));
DROP TEMPORARY TABLE IF EXISTS tmp_Manufacturing_Purchase_Order;
DROP TEMPORARY TABLE IF EXISTS tmp_Manufacturing_Purchase_Order_Product_Link;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
-- Temporary tables
CREATE TEMPORARY TABLE tmp_Manufacturing_Purchase_Order (
id_order INT NOT NULL PRIMARY KEY
, id_order_temp INT NOT NULL
, id_currency INT NOT NULL
, active BIT NOT NULL
, is_new BIT NOT NULL
, name_error VARCHAR(1000) NOT NULL
, cost_total_local_VAT_excl FLOAT NULL
, cost_total_local_VAT_incl FLOAT NULL
, price_total_local_VAT_excl FLOAT NULL
, price_total_local_VAT_incl FLOAT NULL
);
CREATE TEMPORARY TABLE tmp_Manufacturing_Purchase_Order_Product_Link (
id_link INT NOT NULL PRIMARY KEY
, id_order INT NOT NULL
, id_product INT NULL
, id_permutation INT NULL
, id_unit_quantity INT NOT NULL
, quantity_used FLOAT NOT NULL
, quantity_produced FLOAT NULL
, id_unit_latency_manufacture INT NULL
, latency_manufacture INT NULL
, display_order INT NOT NULL
, active BIT NOT NULL
, cost_unit_local_VAT_excl FLOAT NULL
, cost_unit_local_VAT_incl FLOAT NULL
, cost_total_local_VAT_excl FLOAT NULL
, cost_total_local_VAT_incl FLOAT NULL
, price_unit_local_VAT_excl FLOAT NULL
, price_unit_local_VAT_incl FLOAT NULL
, price_total_local_VAT_excl FLOAT NULL
, price_total_local_VAT_incl FLOAT NULL
, has_order BIT NULL
, is_new BIT NOT NULL
, name_error VARCHAR(1000) NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, id_type INT NOT NULL
, code VARCHAR(50) NOT NULL
, msg VARCHAR(4000) NOT NULL
);
INSERT INTO tmp_Manufacturing_Purchase_Order (
id_order
, id_order_temp
, id_currency
, active
, is_new
, name_error
)
SELECT
MPO_T.id_order
, MPO_T.id_order
, IFNULL(IFNULL(MPO_T.id_currency, MPO.id_currency), 0) AS id_currency
, IFNULL(IFNULL(MPO_T.active, MPO.active), 1) AS active
, IFNULL(MPO_T.id_order, 0) < 1 AS is_new
, CASE WHEN IFNULL(MPO_T.id_order, -1) < 0 THEN
CONCAT('New Manufacturing Purchase Order ', MPO_T.id_order)
ELSE
CONCAT(
IFNULL(IFNULL(MPO_T.id_order, MPO.id_order), '(No Manufacturing Purchase Order)')
, ' - '
, IFNULL(IFNULL(MPO_T.id_currency, MPO.id_currency), '(No Currency)')
)
END AS name_error
FROM partsltd_prod.Shop_Manufacturing_Purchase_Order_Temp MPO_T
LEFT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order MPO ON MPO_T.id_order = MPO.id_order
WHERE MPO_T.GUID = a_guid
;
INSERT INTO tmp_Manufacturing_Purchase_Order_Product_Link (
id_link
, id_order
, id_product
, id_permutation
, id_unit_quantity
, quantity_used
, quantity_produced
, id_unit_latency_manufacture
, latency_manufacture
, display_order
, active
, cost_unit_local_VAT_excl
, cost_unit_local_VAT_incl
, price_unit_local_VAT_excl
, price_unit_local_VAT_incl
, has_order
, is_new
)
SELECT
IFNULL(MPOPL_T.id_link, 0) AS id_link
, IFNULL(IFNULL(MPOPL_T.id_order, MPOPL.id_order), 0) AS id_order
, IFNULL(MPOPL_T.id_product, PP.id_product) AS id_product
, IFNULL(
IFNULL(
IFNULL(
MPOPL_T.id_permutation
, CASE WHEN NOT ISNULL(MPOPL_T.id_product) AND NOT ISNULL(MPOPL_T.csv_list_variations) THEN
partsltd_prod.fn_shop_get_id_product_permutation_from_variation_csv_list(MPOPL_T.id_product, MPOPL_T.csv_list_variations)
ELSE NULL END
)
, MPOPL.id_permutation
)
, 0
) AS id_permutation
, IFNULL(IFNULL(MPOPL_T.id_unit_quantity, MPOPL.id_unit_quantity), 0) AS id_unit_quantity
, MPOPL_T.quantity_used AS quantity_used
, MPOPL_T.quantity_produced AS quantity_produced
, MPOPL_T.id_unit_latency_manufacture AS id_unit_latency_manufacture
, MPOPL_T.latency_manufacture AS latency_manufacture
, IFNULL(MPOPL_T.display_order, RANK() OVER (PARTITION BY IFNULL(IFNULL(MPOPL_T.id_order, MPOPL.id_order), 0) ORDER BY IFNULL(IFNULL(MPOPL_T.display_order, MPOPL.display_order), 0))) AS display_order
, IFNULL(IFNULL(MPOPL_T.active, MPOPL.active), 1) AS active
-- , MPOPL_T.cost_total_local_VAT_excl / MPOPL_T.quantity_used AS cost_unit_local_VAT_excl
-- , MPOPL_T.cost_total_local_VAT_incl / MPOPL_T.quantity_used AS cost_unit_local_VAT_incl
, IFNULL(MPOPL_T.cost_unit_local_VAT_excl, MPOPL.cost_unit_local_VAT_excl) AS cost_unit_local_VAT_excl
, IFNULL(MPOPL_T.cost_unit_local_VAT_incl, MPOPL.cost_unit_local_VAT_incl) AS cost_unit_local_VAT_incl
, IFNULL(MPOPL_T.price_unit_local_VAT_excl, MPOPL.price_unit_local_VAT_excl) AS price_unit_local_VAT_excl
, IFNULL(MPOPL_T.price_unit_local_VAT_incl, MPOPL.price_unit_local_VAT_incl) AS price_unit_local_VAT_incl
, NOT ISNULL(t_MPO.id_order) AS has_order
, IFNULL(MPOPL_T.id_link, 0) < 1 AS is_new
FROM partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link_Temp MPOPL_T
LEFT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link MPOPL ON MPOPL_T.id_link = MPOPL.id_link
LEFT JOIN tmp_Manufacturing_Purchase_Order t_MPO ON MPOPL_T.id_order = t_MPO.id_order
LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON MPOPL.id_permutation = PP.id_permutation
WHERE MPOPL_T.GUID = a_guid
;
UPDATE tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
-- INNER JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link_Temp MPOPL_T ON t_MPOPL.id_order = MPOPL_T.id_order
LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_MPOPL.id_permutation = PP.id_permutation
LEFT JOIN partsltd_prod.Shop_Product P ON PP.id_product = P.id_product
LEFT JOIN partsltd_prod.Shop_Product_Category PC ON P.id_category = PC.id_category
SET
name_error = CONCAT(
CASE WHEN ISNULL(t_MPOPL.id_permutation) THEN
CASE WHEN ISNULL(PP.id_product) THEN
'(No Product Permutation)'
ELSE
CONCAT(
PC.name
, ' - '
, P.name
)
END
ELSE
fn_shop_get_product_permutation_name(PP.id_permutation)
END
, ' - x'
, IFNULL(t_MPOPL.quantity_used, '(No Quantity)')
, ' Used - x'
, IFNULL(t_MPOPL.quantity_produced, '(No Quantity)')
, ' Produced'
)
, cost_total_local_VAT_excl = t_MPOPL.quantity_used * t_MPOPL.cost_unit_local_VAT_excl
, cost_total_local_VAT_incl = t_MPOPL.quantity_used * t_MPOPL.cost_unit_local_VAT_incl
, price_total_local_VAT_excl = t_MPOPL.quantity_produced * t_MPOPL.price_unit_local_VAT_excl
, price_total_local_VAT_incl = t_MPOPL.quantity_produced * t_MPOPL.price_unit_local_VAT_incl
;
-- Insert missing order records
INSERT INTO tmp_Manufacturing_Purchase_Order (
id_order
, id_order_temp
, id_currency
, active
, is_new
, name_error
)
SELECT
MPO.id_order
, MPO.id_order_temp
, MPO.id_currency
, MPO.active
, FALSE AS is_new
, CONCAT(
IFNULL(MPO.id_order, '(No Manufacturing Purchase Order)')
, ' - '
, IFNULL(MPO.id_currency, '(No Currency)')
) AS name_error
FROM partsltd_prod.Shop_Manufacturing_Purchase_Order MPO
INNER JOIN tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
ON MPO.id_order = t_MPOPL.id_order
AND t_MPOPL.has_order = 0
;
UPDATE tmp_Manufacturing_Purchase_Order t_MPO
INNER JOIN (
SELECT
t_MPOPL.id_order
, SUM(t_MPOPL.cost_total_local_VAT_excl) AS cost_total_local_VAT_excl
, SUM(t_MPOPL.cost_total_local_VAT_incl) AS cost_total_local_VAT_incl
, SUM(t_MPOPL.price_total_local_VAT_excl) AS price_total_local_VAT_excl
, SUM(t_MPOPL.price_total_local_VAT_incl) AS price_total_local_VAT_incl
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
GROUP BY t_MPOPL.id_order
) SUM_t_MPOPL ON t_MPO.id_order = SUM_t_MPOPL.id_order
SET
t_MPO.cost_total_local_VAT_excl = SUM_t_MPOPL.cost_total_local_VAT_excl
, t_MPO.cost_total_local_VAT_incl = SUM_t_MPOPL.cost_total_local_VAT_incl
, t_MPO.price_total_local_VAT_excl = SUM_t_MPOPL.price_total_local_VAT_excl
, t_MPO.price_total_local_VAT_incl = SUM_t_MPOPL.price_total_local_VAT_incl
;
-- Validation
-- Manufacturing Purchase Order
# id_order
IF EXISTS (
SELECT *
FROM tmp_Manufacturing_Purchase_Order t_MPO
LEFT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order MPO ON t_MPO.id_order = MPO.id_order
WHERE 1=1
AND t_MPO.id_order > 0
AND ISNULL(MPO.id_order)
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT(
'A valid ID is required for the following Manufacturing Purchase Order(s): '
, GROUP_CONCAT(t_MPO.name_error SEPARATOR ', ')
) AS msg
FROM tmp_Manufacturing_Purchase_Order t_MPO
LEFT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order MPO ON t_MPO.id_order = MPO.id_order
WHERE 1=1
AND t_MPO.id_order > 0
AND ISNULL(MPO.id_order)
;
END IF;
# id_currency
IF EXISTS (
SELECT *
FROM tmp_Manufacturing_Purchase_Order t_MPO
LEFT JOIN partsltd_prod.Shop_Currency C ON t_MPO.id_currency = C.id_currency
WHERE 1=1
AND (
ISNULL(C.id_currency)
OR C.active = 0
)
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT(
'A valid currency is required for the following Manufacturing Purchase Order(s): '
, GROUP_CONCAT(CONCAT(t_MPO.name_error, ' - ', t_MPO.id_currency) SEPARATOR ', ')
) AS msg
FROM tmp_Manufacturing_Purchase_Order t_MPO
LEFT JOIN partsltd_prod.Shop_Currency C ON t_MPO.id_currency = C.id_currency
WHERE 1=1
AND (
ISNULL(C.id_currency)
OR C.active = 0
)
;
END IF;
# id_unit_quantity
IF EXISTS (
SELECT *
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM ON t_MPOPL.id_unit_quantity = UM.id_unit_measurement
WHERE 1=1
AND (
ISNULL(UM.id_unit_measurement)
OR UM.active = 0
)
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT(
'A valid unit measurement of quantity is required for the following Manufacturing Purchase Order(s): '
, GROUP_CONCAT(CONCAT(t_MPOPL.name_error, ' - ', t_MPO.id_unit_quantity) SEPARATOR ', ')
) AS msg
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM ON t_MPOPL.id_unit_quantity = UM.id_unit_measurement
WHERE 1=1
AND (
ISNULL(UM.id_unit_measurement)
OR UM.active = 0
)
;
END IF;
# Invalid quantity used
IF EXISTS (
SELECT *
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
WHERE
ISNULL(t_MPOPL.quantity_used)
OR t_MPOPL.quantity_used <= 0
) THEN
INSERT INTO tmp_Msg_Error (
id_type, code, msg
)
SELECT
v_id_error_type_bad_data,
v_code_error_type_bad_data,
CONCAT(
'A valid quantity used is required for the following Manufacturing Purchase Order Item(s): '
, GROUP_CONCAT(CONCAT(t_MPOPL.name_error, ' - ', t_MPOPL.quantity_used) SEPARATOR ', ')
)
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
WHERE
NOT ISNULL(t_MPOPL.quantity_used)
AND t_MPOPL.quantity_used <= 0
;
END IF;
# Invalid quantity produced
IF EXISTS (
SELECT *
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
WHERE
NOT ISNULL(t_MPOPL.quantity_produced)
AND t_MPOPL.quantity_produced < 0
) THEN
INSERT INTO tmp_Msg_Error (
id_type, code, msg
)
SELECT
v_id_error_type_bad_data,
v_code_error_type_bad_data,
CONCAT(
'A valid quantity produced is required for the following Manufacturing Purchase Order Item(s): '
, GROUP_CONCAT(CONCAT(t_MPOPL.name_error, ' - ', t_MPOPL.quantity_produced) SEPARATOR ', ')
)
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
WHERE
NOT ISNULL(t_MPOPL.quantity_produced)
AND t_MPOPL.quantity_produced < 0
;
END IF;
# id_unit_latency_manufacture
IF EXISTS (
SELECT *
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM ON t_MPOPL.id_unit_latency_manufacture = UM.id_unit_measurement
WHERE
ISNULL(t_MPOPL.id_unit_latency_manufacture)
OR ISNULL(UM.id_unit_measurement)
OR UM.active = 0
LIMIT 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_bad_data
, v_code_type_error_bad_data
, CONCAT(
'A valid unit measurement of manufacture latency is required for the following Manufacturing Purchase Order(s): '
, GROUP_CONCAT(CONCAT(t_MPOPL.name_error, ' - ', t_MPOPL.id_unit_latency_manufacture) SEPARATOR ', ')
) AS msg
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM ON t_MPOPL.id_unit_latency_manufacture = UM.id_unit_measurement
WHERE
ISNULL(t_MPOPL.id_unit_latency_manufacture)
OR ISNULL(UM.id_unit_measurement)
OR UM.active = 0
;
END IF;
# Invalid manufacture latency
IF EXISTS (
SELECT *
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
WHERE t_MPOPL.latency_manufacture < 0
) THEN
INSERT INTO tmp_Msg_Error (
id_type, code, msg
)
SELECT
v_id_error_type_bad_data,
v_code_error_type_bad_data,
CONCAT(
'A valid manufacture latency is required for the following Manufacturing Purchase Order Item(s): '
, GROUP_CONCAT(CONCAT(t_MPOPL.name_error, ' - ', t_MPOPL.latency_manufacture) SEPARATOR ', ')
)
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
WHERE t_MPOPL.latency_manufacture < 0
;
END IF;
# Invalid costs excl VAT
IF EXISTS (
SELECT *
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
WHERE
NOT ISNULL(t_MPOPL.cost_unit_local_VAT_excl)
AND t_MPOPL.cost_unit_local_VAT_excl < 0
) THEN
INSERT INTO tmp_Msg_Error (
id_type, code, msg
)
SELECT
v_id_error_type_bad_data,
v_code_error_type_bad_data,
CONCAT(
'A valid cost excluding VAT is required for the following Manufacturing Purchase Order Item(s): '
, GROUP_CONCAT(CONCAT(t_MPOPL.name_error, ' - ', t_MPOPL.cost_unit_local_VAT_excl) SEPARATOR ', ')
)
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
WHERE
NOT ISNULL(t_MPOPL.cost_unit_local_VAT_excl)
AND t_MPOPL.cost_unit_local_VAT_excl < 0
;
END IF;
# Invalid costs incl VAT
IF EXISTS (
SELECT *
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
WHERE
NOT ISNULL(t_MPOPL.cost_unit_local_VAT_incl)
AND t_MPOPL.cost_unit_local_VAT_incl < 0
) THEN
INSERT INTO tmp_Msg_Error (
id_type, code, msg
)
SELECT
v_id_error_type_bad_data,
v_code_error_type_bad_data,
CONCAT(
'A valid cost including VAT is required for the following Manufacturing Purchase Order Item(s): '
, GROUP_CONCAT(CONCAT(t_MPOPL.name_error, ' - ', t_MPOPL.cost_unit_local_VAT_incl) SEPARATOR ', ')
)
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
WHERE
NOT ISNULL(t_MPOPL.cost_unit_local_VAT_incl)
AND t_MPOPL.cost_unit_local_VAT_incl < 0
;
END IF;
# Invalid prices excl VAT
IF EXISTS (
SELECT *
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
WHERE
NOT ISNULL(t_MPOPL.price_unit_local_VAT_excl)
AND t_MPOPL.price_unit_local_VAT_excl < 0
) THEN
INSERT INTO tmp_Msg_Error (
id_type, code, msg
)
SELECT
v_id_error_type_bad_data,
v_code_error_type_bad_data,
CONCAT(
'A valid price excluding VAT is required for the following Manufacturing Purchase Order Item(s): '
, GROUP_CONCAT(CONCAT(t_MPOPL.name_error, ' - ', t_MPOPL.price_unit_local_VAT_excl) SEPARATOR ', ')
)
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
WHERE
NOT ISNULL(t_MPOPL.price_unit_local_VAT_excl)
AND t_MPOPL.price_unit_local_VAT_excl < 0
;
END IF;
# Invalid prices incl VAT
IF EXISTS (
SELECT *
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
WHERE
NOT ISNULL(t_MPOPL.price_unit_local_VAT_incl)
AND t_MPOPL.price_unit_local_VAT_incl < 0
) THEN
INSERT INTO tmp_Msg_Error (
id_type, code, msg
)
SELECT
v_id_error_type_bad_data,
v_code_error_type_bad_data,
CONCAT(
'A valid price including VAT is required for the following Manufacturing Purchase Order Item(s): '
, GROUP_CONCAT(CONCAT(t_MPOPL.name_error, ' - ', t_MPOPL.price_unit_local_VAT_incl) SEPARATOR ', ')
)
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
WHERE
NOT ISNULL(t_MPOPL.price_unit_local_VAT_incl)
AND t_MPOPL.price_unit_local_VAT_incl < 0
;
END IF;
-- Duplicates
IF EXISTS (
SELECT
id_permutation
, name_error
, COUNT(*)
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
GROUP BY id_permutation
HAVING COUNT(*) > 1
) THEN
INSERT INTO tmp_Msg_Error (
id_type, code, msg
)
SELECT
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_Manufacturing_Purchase_Order_Product_Link t_MPOPL
GROUP BY id_permutation
HAVING COUNT(*) > 1
) t_MPOPLC
;
END IF;
-- Empty Manufacturing Purchase Order
IF EXISTS ( SELECT * FROM tmp_Manufacturing_Purchase_Order t_MPO LEFT JOIN tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL ON t_MPO.id_order = t_MPOPL.id_order WHERE ISNULL(t_MPOPL.id_order) ) THEN
INSERT INTO tmp_Msg_Error (
id_type, code, msg
)
SELECT
v_id_error_type_bad_data,
v_code_error_type_bad_data,
CONCAT(
'There are no items in the following Manufacturing Purchase Order(s): '
, GROUP_CONCAT(t_MPO.name_error SEPARATOR ', ')
) AS msg
FROM tmp_Manufacturing_Purchase_Order t_MPO
LEFT JOIN tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL ON t_MPO.id_order = t_MPOPL.id_order
WHERE ISNULL(t_MPOPL.id_order)
;
END IF;
-- Manufacturing Purchase Order Items without Order
IF EXISTS (
SELECT *
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
LEFT JOIN tmp_Manufacturing_Purchase_Order t_MPO ON t_MPOPL.id_order = t_MPO.id_order
WHERE ISNULL(t_MPO.id_order)
) THEN
INSERT INTO tmp_Msg_Error (
id_type, code, msg
)
SELECT
v_id_error_type_bad_data,
v_code_error_type_bad_data,
CONCAT(
'There is no order for the following Manufacturing Purchase Order Item(s): '
, GROUP_CONCAT(t_MPOPL.name_error SEPARATOR ', ')
) AS msg
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
LEFT JOIN tmp_Manufacturing_Purchase_Order t_MPO ON t_MPOPL.id_order = t_MPO.id_order
WHERE ISNULL(t_MPO.id_order)
;
END IF;
-- Permissions
SET v_ids_product_permission := (
SELECT
GROUP_CONCAT(DISTINCT PP.id_product SEPARATOR ',')
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
INNER JOIN partsltd_prod.Shop_Product_Permutation PP ON t_MPOPL.id_permutation = PP.id_permutation
);
IF a_debug = 1 THEN
SELECT
a_guid
, a_id_user
, FALSE -- get inactive users
, v_ids_permission_manufacturing_purchase_order
, v_id_access_level_edit
, v_ids_product_permission -- ids_product
, 0 -- a_debug
;
SELECT *
FROM partsltd_prod.Shop_Calc_User_Temp
WHERE GUID = a_guid
;
END IF;
CALL p_shop_calc_user(
a_guid
, a_id_user
, FALSE -- get inactive users
, v_ids_permission_manufacturing_purchase_order
, v_id_access_level_edit
, v_ids_product_permission -- ids_product
, 0 -- a_debug
);
IF a_debug = 1 THEN
SELECT * from partsltd_prod.Shop_Calc_User_Temp WHERE GUID = a_guid;
END IF;
IF EXISTS (SELECT * FROM partsltd_prod.Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = a_guid AND IFNULL(UE_T.can_view, 0) = 0) THEN
DELETE FROM tmp_Msg_Error;
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_no_permission
, v_code_type_error_no_permission
, CONCAT(
'You do not have edit permissions for '
, GROUP_CONCAT(name SEPARATOR ', ')
)
FROM partsltd_prod.Shop_Permission PERM
INNER JOIN partsltd_prod.Shop_Calc_User_Temp UE_T
ON PERM.id_permission = UE_T.id_permission
AND UE_T.GUID = a_guid
AND IFNULL(UE_T.can_view, 0) = 0
;
END IF;
CALL partsltd_prod.p_shop_clear_calc_user(
a_guid
, 0 -- a_debug
);
-- Changed quantity used
IF EXISTS (
SELECT *
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
INNER JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link MPOPL ON t_MPOPL.id_link = MPOPL.id_link
INNER JOIN partsltd_prod.Shop_Stock_Item SI ON MPOPL.id_permutation = SI.id_permutation
WHERE
t_MPOPL.is_new = 0
AND t_MPOPL.quantity_used <> MPOPL.quantity_used
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_warning
, v_code_type_error_warning
, CONCAT(
'The quantity used has changed on the following orders. Please update the stock items appropriately.'
, GROUP_CONCAT(
CONCAT(
t_MPOPL.name_error
, ' - from '
, MPOPL.quantity_used
, ' to '
, t_MPOPL.quantity_used
) SEPARATOR ', '
)
) AS msg
;
END IF;
-- Changed quantity produced
IF EXISTS (
SELECT *
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
INNER JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link MPOPL ON t_MPOPL.id_link = MPOPL.id_link
INNER JOIN partsltd_prod.Shop_Stock_Item SI ON MPOPL.id_permutation = SI.id_permutation
WHERE
t_MPOPL.is_new = 0
AND t_MPOPL.quantity_produced <> MPOPL.quantity_produced
) THEN
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
SELECT
v_id_type_error_warning
, v_code_type_error_warning
, CONCAT(
'The quantity produced has changed on the following orders. Please update the stock items appropriately.'
, GROUP_CONCAT(
CONCAT(
t_MPOPL.name_error
, ' - from '
, MPOPL.quantity_produced
, ' to '
, t_MPOPL.quantity_produced
) SEPARATOR ', '
)
) AS msg
;
END IF;
IF EXISTS ( SELECT * FROM tmp_Msg_Error WHERE id_type <> v_id_type_error_warning LIMIT 1 ) THEN
DELETE FROM tmp_Manufacturing_Purchase_Order_Product_Link;
DELETE FROM tmp_Manufacturing_Purchase_Order;
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 (
a_comment
, a_id_user
, v_time_start
);
SET v_id_change_set := LAST_INSERT_ID();
INSERT INTO partsltd_prod.Shop_Manufacturing_Purchase_Order (
id_order_temp
, id_currency
, cost_total_local_VAT_excl
, cost_total_local_VAT_incl
, price_total_local_VAT_excl
, price_total_local_VAT_incl
, active
, created_by
, created_on
, id_change_set
)
SELECT
t_MPO.id_order_temp
, t_MPO.id_currency
, t_MPO.cost_total_local_VAT_excl
, t_MPO.cost_total_local_VAT_incl
, t_MPO.price_total_local_VAT_excl
, t_MPO.price_total_local_VAT_incl
, t_MPO.active
, a_id_user
, v_time_start
, v_id_change_set
FROM tmp_Manufacturing_Purchase_Order t_MPO
INNER JOIN tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL ON t_MPO.id_order = t_MPOPL.id_order
WHERE t_MPO.is_new = 1
;
UPDATE tmp_Manufacturing_Purchase_Order t_MPO
INNER JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order MPO ON t_MPO.id_order_temp = MPO.id_order_temp
SET
t_MPO.id_order = MPO.id_order
WHERE t_MPO.is_new = 1
;
UPDATE tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
INNER JOIN tmp_Manufacturing_Purchase_Order t_MPO ON t_MPOPL.id_order = t_MPO.id_order_temp
SET
t_MPOPL.id_order = t_MPO.id_order
WHERE t_MPO.is_new = 1
;
INSERT INTO Shop_Manufacturing_Purchase_Order_Product_Link (
id_order
, id_permutation
, id_unit_quantity
, quantity_used
, quantity_produced
, id_unit_latency_manufacture
, latency_manufacture
, display_order
, active
, cost_unit_local_VAT_excl
, cost_unit_local_VAT_incl
, price_unit_local_VAT_excl
, price_unit_local_VAT_incl
, created_by
, created_on
, id_change_set
)
SELECT
t_MPOPL.id_order
, t_MPOPL.id_permutation
, t_MPOPL.id_unit_quantity
, t_MPOPL.quantity_used
, t_MPOPL.quantity_produced
, t_MPOPL.id_unit_latency_manufacture
, t_MPOPL.latency_manufacture
, t_MPOPL.display_order
, t_MPOPL.active
, t_MPOPL.cost_unit_local_VAT_excl
, t_MPOPL.cost_unit_local_VAT_incl
, t_MPOPL.price_unit_local_VAT_excl
, t_MPOPL.price_unit_local_VAT_incl
, a_id_user
, v_time_start
, v_id_change_set
FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
WHERE t_MPOPL.is_new = 1
;
UPDATE partsltd_prod.Shop_Manufacturing_Purchase_Order MPO
INNER JOIN tmp_Manufacturing_Purchase_Order t_MPO
ON MPO.id_order = t_MPO.id_order
AND t_MPO.is_new = 0
INNER JOIN tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL ON t_MPO.id_order = t_MPOPL.id_order
SET
MPO.id_currency = t_MPO.id_currency
, MPO.cost_total_local_VAT_excl = t_MPO.cost_total_local_VAT_excl
, MPO.cost_total_local_VAT_incl = t_MPO.cost_total_local_VAT_incl
, MPO.price_total_local_VAT_excl = t_MPO.price_total_local_VAT_excl
, MPO.price_total_local_VAT_incl = t_MPO.price_total_local_VAT_incl
, MPO.active = t_MPO.active
, MPO.id_change_set = v_id_change_set
;
UPDATE partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link MPOPL
INNER JOIN tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL
ON MPOPL.id_link = t_MPOPL.id_link
AND t_MPOPL.is_new = 0
SET
MPOPL.id_order = t_MPOPL.id_order
, MPOPL.id_permutation = t_MPOPL.id_permutation
, MPOPL.id_unit_quantity = t_MPOPL.id_unit_quantity
, MPOPL.quantity_used = t_MPOPL.quantity_used
, MPOPL.quantity_produced = t_MPOPL.quantity_produced
, MPOPL.id_unit_latency_manufacture = t_MPOPL.id_unit_latency_manufacture
, MPOPL.latency_manufacture = t_MPOPL.latency_manufacture
, MPOPL.display_order = t_MPOPL.display_order
, MPOPL.active = t_MPOPL.active
, MPOPL.cost_unit_local_VAT_excl = t_MPOPL.cost_unit_local_VAT_excl
, MPOPL.cost_unit_local_VAT_incl = t_MPOPL.cost_unit_local_VAT_incl
, MPOPL.price_unit_local_VAT_excl = t_MPOPL.price_unit_local_VAT_excl
, MPOPL.price_unit_local_VAT_incl = t_MPOPL.price_unit_local_VAT_incl
, MPOPL.id_change_set = v_id_change_set
;
DELETE MPO_T
FROM partsltd_prod.Shop_Manufacturing_Purchase_Order_Temp MPO_T
WHERE MPO_T.GUID = a_guid
;
DELETE MPOPL_T
FROM partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link_Temp MPOPL_T
WHERE MPOPL_T.GUID = a_guid
;
COMMIT;
END IF;
# Errors
SELECT *
FROM tmp_Msg_Error t_ME
INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type
;
IF a_debug = 1 THEN
SELECT * from tmp_Manufacturing_Purchase_Order;
SELECT * from tmp_Manufacturing_Purchase_Order_Product_Link;
END IF;
DROP TEMPORARY TABLE tmp_Manufacturing_Purchase_Order;
DROP TEMPORARY TABLE tmp_Manufacturing_Purchase_Order_Product_Link;
DROP TEMPORARY TABLE tmp_Msg_Error;
IF a_debug = 1 THEN
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END IF;
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,
quantity_used,
id_unit_quantity,
quantity_produced,
latency_manufacture,
display_order,
active
)
VALUES
(
'NIPS', # guid
-1, # id_link,
-1, # id_order,
1, # id_permutation,
100, # cost_total_local,
1, # id_currency,
1, # quantity_used,
1, # id_unit_quantity,
1, # quantity_produced,
14, # latency_manufacture ,
1, # display_order
1 # active
)
;
SELECT * FROM Shop_Manufacturing_Purchase_Order_Product_Link_Temp;
CALL p_shop_save_manufacturing_purchase_order (
'TEST SAVE'
, 'NIPS' # a_guid
, 1 -- 'auth0|6582b95c895d09a70ba10fef', # a_id_user
, 1 -- a_debug
);
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;
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS partsltd_prod.p_shop_save_Manufacturing_purchase_order_test;
DELIMITER //
CREATE PROCEDURE p_shop_save_Manufacturing_purchase_order_test ()
BEGIN
DECLARE v_guid BINARY(36);
DECLARE v_time_start TIMESTAMP(6);
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_guid := 'nips';
SELECT *
FROM partsltd_prod.Shop_Manufacturing_Purchase_Order
;
SELECT *
FROM partsltd_prod.Shop_Manufacturing_Purchase_Order_Temp
;
SELECT *
FROM partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link
;
SELECT *
FROM partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link_Temp
;
START TRANSACTION;
DELETE FROM partsltd_prod.Shop_Manufacturing_Purchase_Order_Temp;
DELETE FROM partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link_Temp;
INSERT INTO partsltd_prod.Shop_Manufacturing_Purchase_Order_Temp (
id_order
, id_currency
, active
, GUID
)
/* Test 1 - Insert */
VALUES (
-1
, 1
, 1
, v_guid
)
/* Test 2: Alter
SELECT
id_order
, id_currency
, active
, v_guid
FROM partsltd_prod.Shop_Manufacturing_Purchase_Order
WHERE id_order = 6
*/
;-- SELECT * FROM partsltd_prod.Shop_Unit_Measurement;
INSERT INTO partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link_Temp (
id_link
, id_order
, id_permutation
, id_unit_quantity
, quantity_used
, quantity_produced
, id_unit_latency_manufacture
, latency_manufacture
, display_order
, active
, GUID
)
/* Test 1 - Insert */
VALUES (
-1 -- id_link
, -1 -- id_order
, 3 -- id_permutation
, 3 -- id_unit_quantity
, 3 -- quantity_used
, 0 -- quantity_produced
, 4 -- id_unit_latency_manufacture
, 4 -- latency_manufacture
, 1 -- display_order
, 1 -- active
, v_guid --
)
/* Test 2: Alter
SELECT
id_link
, id_order
, id_permutation
, id_unit_quantity
, quantity_used
, quantity_produced
, id_unit_latency_manufacture
, latency_manufacture
, display_order
, active
, v_guid
FROM partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link
WHERE id_order = 6
*/
;
COMMIT;
SELECT *
FROM partsltd_prod.Shop_Manufacturing_Purchase_Order_Temp
WHERE GUID = v_guid
;
SELECT *
FROM partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link_Temp
WHERE GUID = v_guid
;
CALL partsltd_prod.p_shop_save_Manufacturing_purchase_order (
'Test save Manufacturing Purchase Order' -- comment
, v_guid -- guid
, 1 -- id_user
, 1 -- debug
);
SELECT *
FROM partsltd_prod.Shop_Manufacturing_Purchase_Order_Temp
;
SELECT *
FROM partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link_Temp
;
SELECT *
FROM partsltd_prod.Shop_Manufacturing_Purchase_Order
;
SELECT *
FROM partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link
;
CALL partsltd_prod.p_debug_timing_reporting ( v_time_start );
END //
DELIMITER ;;
/*
CALL partsltd_prod.p_shop_save_Manufacturing_purchase_order_test ();
DELETE FROM partsltd_prod.Shop_Manufacturing_Purchase_Order_Temp;
DELETE FROM partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link_Temp;
DROP TABLE IF EXISTS tmp_Msg_Error;
select * from partsltd_prod.Shop_User;
*/
DROP PROCEDURE IF EXISTS p_shop_get_many_manufacturing_purchase_order;
DELIMITER //
CREATE PROCEDURE p_shop_get_many_manufacturing_purchase_order (
IN a_id_user INT,
IN a_get_all_order BIT,
IN a_get_inactive_order BIT,
IN a_ids_order TEXT,
IN a_ids_permutation TEXT,
IN a_date_from DATETIME,
IN a_date_to DATETIME,
IN a_debug BIT
)
BEGIN
DECLARE v_code_type_error_bad_data VARCHAR(50);
DECLARE v_code_type_error_no_permission VARCHAR(50);
DECLARE v_guid BINARY(36);
DECLARE v_has_filter_order BIT;
DECLARE v_has_filter_permutation BIT;
DECLARE v_has_filter_date_from BIT;
DECLARE v_has_filter_date_to BIT;
DECLARE v_id_access_level_view INT;
DECLARE v_ids_permission_manufacturing_purchase_order VARCHAR(100);
DECLARE v_id_type_error_bad_data INT;
DECLARE v_id_type_error_no_permission INT;
DECLARE v_time_start TIMESTAMP(6);
SET v_time_start := CURRENT_TIMESTAMP(6);
SET v_guid := UUID();
SET v_id_access_level_view := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'VIEW' LIMIT 1);
SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1);
SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1);
SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION');
SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission);
SET v_ids_permission_manufacturing_purchase_order := (SELECT GROUP_CONCAT(id_permission SEPARATOR ',') FROM partsltd_prod.Shop_Permission WHERE code IN ('STORE_MANUFACTURING_PURCHASE_ORDER', 'STORE_PRODUCT'));
SET a_get_all_order := IFNULL(a_get_all_order, 1);
SET a_get_inactive_order := IFNULL(a_get_inactive_order, 0);
SET a_ids_order := TRIM(IFNULL(a_ids_order, ''));
SET a_ids_permutation := TRIM(IFNULL(a_ids_permutation, ''));
SET a_date_from := IFNULL(a_date_from, NULL);
SET a_date_to := IFNULL(a_date_to, NULL);
SET a_debug := IFNULL(a_debug, 0);
DROP TEMPORARY TABLE IF EXISTS tmp_Manufacturing_Purchase_Order_Product_Link;
DROP TEMPORARY TABLE IF EXISTS tmp_Manufacturing_Purchase_Order;
DROP TEMPORARY TABLE IF EXISTS tmp_Permutation;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
DROP TEMPORARY TABLE IF EXISTS tmp_Split;
CREATE TEMPORARY TABLE tmp_Manufacturing_Purchase_Order (
id_order INT NOT NULL PRIMARY KEY
);
CREATE TEMPORARY TABLE tmp_Permutation (
id_permutation INT NOT NULL PRIMARY KEY
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
id_type INT NOT NULL,
code VARCHAR(50) NOT NULL,
msg VARCHAR(4000) NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split (
substring VARCHAR(4000) NOT NULL
, as_int INT NULL
);
DELETE FROM tmp_Split;
SET v_has_filter_order = CASE WHEN a_ids_order = '' THEN 0 ELSE 1 END;
SET v_has_filter_permutation = CASE WHEN a_ids_permutation = '' THEN 0 ELSE 1 END;
SET v_has_filter_date_from = CASE WHEN ISNULL(a_date_from) THEN 0 ELSE 1 END;
SET v_has_filter_date_to = CASE WHEN ISNULL(a_date_to) THEN 0 ELSE 1 END;
IF a_debug = 1 THEN
SELECT
v_has_filter_order
, v_has_filter_permutation
, v_has_filter_date_from
, v_has_filter_date_to
;
END IF;
-- Permutations
IF v_has_filter_permutation = 1 THEN
CALL partsltd_prod.p_split(v_guid, a_ids_permutation, ',', a_debug);
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM partsltd_prod.Split_Temp
WHERE 1=1
AND GUID = v_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( v_guid );
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_S.as_int = PP.id_permutation
WHERE
ISNULL(t_S.as_int)
OR ISNULL(PP.id_permutation)
OR PP.active = 0
) THEN
INSERT INTO tmp_Msg_Error (
id_type,
code,
msg
)
SELECT
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive permutation IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_S.as_int = PP.id_permutation
WHERE
ISNULL(t_S.as_int)
OR ISNULL(PP.id_permutation)
OR PP.active = 0
;
ELSE
INSERT INTO tmp_Permutation (
id_permutation
)
SELECT
PP.id_permutation
FROM tmp_Split t_S
RIGHT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_S.as_int = PP.id_permutation
WHERE (
v_has_filter_permutation = 0
OR NOT ISNULL(t_S.as_int)
)
;
END IF;
END IF;
DELETE FROM tmp_Split;
-- Manufacturing Purchase Orders
IF v_has_filter_order = 1 THEN
CALL partsltd_prod.p_split(v_guid, a_ids_order, ',', a_debug);
INSERT INTO tmp_Split (
substring
, as_int
)
SELECT
substring
, CONVERT(substring, DECIMAL(10,0)) AS as_int
FROM partsltd_prod.Split_Temp
WHERE 1=1
AND GUID = v_guid
AND NOT ISNULL(substring)
AND substring != ''
;
CALL partsltd_prod.p_clear_split_temp( v_guid );
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
IF EXISTS (
SELECT *
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order MPO ON t_S.as_int = MPO.id_order
WHERE
ISNULL(t_S.as_int)
OR ISNULL(MPO.id_order)
OR (
MPO.active = 0
AND a_get_inactive_order = 0
)
) THEN
INSERT INTO tmp_Msg_Error (
id_type,
code,
msg
)
SELECT
v_id_type_error_bad_data,
v_code_type_error_bad_data,
CONCAT('Invalid or inactive Manufacturing Purchase Order IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
FROM tmp_Split t_S
LEFT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order MPO ON t_S.as_int = MPO.id_order
WHERE
ISNULL(t_S.as_int)
OR ISNULL(MPO.id_order)
OR (
MPO.active = 0
AND a_get_inactive_order = 0
)
;
ELSE
INSERT INTO tmp_Manufacturing_Purchase_Order (
id_order
)
SELECT
MPO.id_order
FROM tmp_Split t_S
RIGHT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order MPO ON t_S.as_int = MPO.id_order
INNER JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link MPOPL ON MPO.id_order = MPOPL.id_order
INNER JOIN tmp_Permutation t_PP ON MPOPL.id_permutation = t_PP.id_permutation
WHERE (
a_get_all_order = 1
OR (
v_has_filter_order = 1
AND NOT ISNULL(t_S.as_int)
)
OR (
v_has_filter_permutation = 1
AND NOT ISNULL(t_PP.id_permutation)
)
)
AND (
a_get_inactive_order = 1
OR MPO.active = 1
)
AND (
v_has_filter_date_from = 0
OR MPO.created_on > a_date_from
)
AND (
v_has_filter_date_to = 0
OR MPO.created_on < a_date_to
)
;
END IF;
END IF;
DELETE FROM tmp_Split;
-- Permissions
IF a_debug = 1 THEN
SELECT
v_guid
, a_id_user
, FALSE -- get inactive users
, v_ids_permission_manufacturing_purchase_order
, v_id_access_level_view
, '' -- ids_product
, 0 -- a_debug
;
SELECT * FROM partsltd_prod.Shop_Calc_User_Temp;
END IF;
CALL p_shop_calc_user(
v_guid
, a_id_user
, FALSE -- get inactive users
, v_ids_permission_manufacturing_purchase_order
, v_id_access_level_view
, '' -- ids_product
, 0 -- a_debug
);
IF a_debug = 1 THEN
SELECT * FROM partsltd_prod.Shop_Calc_User_Temp;
END IF;
IF NOT EXISTS (SELECT can_view FROM partsltd_prod.Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = v_guid) THEN
DELETE FROM tmp_Msg_Error;
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
VALUES (
v_id_type_error_no_permission
, v_code_type_error_no_permission
, CONCAT('You do not have view permissions for ', IFNULL((SELECT IFNULL(name, '(No Permission Name)') FROM partsltd_prod.Shop_Permission WHERE id_permission LIKE CONCAT('%', v_ids_permission_manufacturing_purchase_order, '%') LIMIT 1), '(No Permissions Found)'))
)
;
END IF;
IF EXISTS ( SELECT * FROM tmp_Msg_Error LIMIT 1 ) THEN
-- DELETE FROM tmp_Manufacturing_Purchase_Order_Product_Link;
DELETE FROM tmp_Manufacturing_Purchase_Order;
END IF;
-- Returns
/*
# Manufacturings
SELECT
t_S.id_manufacturing,
S.name_company,
S.name_contact,
S.department_contact,
S.id_address,
S.phone_number,
S.fax,
S.email,
S.website,
S.id_currency,
t_S.active
FROM tmp_Manufacturing t_S
INNER JOIN partsltd_prod.Shop_Manufacturing S
ON t_S.id_manufacturing = S.id_manufacturing
;
*/
# Manufacturing Purchase Order
SELECT
t_MPO.id_order
, MPO.id_currency
, C.code
, C.symbol
, MPO.cost_total_local_VAT_excl
, MPO.cost_total_local_VAT_incl
, MPO.price_total_local_VAT_excl
, MPO.price_total_local_VAT_incl
, MPO.active
, MPO.created_on
, CONCAT(
MPO.cost_total_local_VAT_excl
, ' on '
, MPO.created_on
) AS name
FROM tmp_Manufacturing_Purchase_Order t_MPO
INNER JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order MPO ON MPO.id_order = t_MPO.id_order
LEFT JOIN partsltd_prod.Shop_Currency C ON MPO.id_currency = C.id_currency
;
# Manufacturing Purchase Order Product Link
SELECT
MPOPL.id_link
, MPOPL.id_order
, P.id_category
, P.id_product
, MPOPL.id_permutation
, fn_shop_get_product_permutation_name(MPOPL.id_permutation) AS name_permutation
, fn_shop_get_product_permutation_variations_csv(MPOPL.id_permutation) AS csv_id_pairs_variation
, MPOPL.id_unit_quantity
, MPOPL.quantity_used
, MPOPL.quantity_produced
, MPOPL.id_unit_latency_manufacture
, MPOPL.latency_manufacture
, MPOPL.display_order
, MPOPL.cost_unit_local_VAT_excl
, MPOPL.cost_unit_local_VAT_incl
, MPOPL.price_unit_local_VAT_excl
, MPOPL.price_unit_local_VAT_incl
, MPOPL.active
FROM tmp_Manufacturing_Purchase_Order t_MPO
INNER JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link MPOPL ON t_MPO.id_order = MPOPL.id_order
LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON MPOPL.id_permutation = PP.id_permutation
LEFT JOIN partsltd_prod.Shop_Product P ON PP.id_product = P.id_product
;
# Errors
SELECT *
FROM tmp_Msg_Error t_ME
INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type
;
IF a_debug = 1 THEN
SELECT * from tmp_Manufacturing_Purchase_Order;
SELECT * from tmp_Permutation;
END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_Manufacturing_Purchase_Order_Product_Link;
DROP TEMPORARY TABLE IF EXISTS tmp_Manufacturing_Purchase_Order;
DROP TEMPORARY TABLE IF EXISTS tmp_Permutation;
DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error;
DROP TEMPORARY TABLE IF EXISTS tmp_Split;
IF a_debug = 1 THEN
CALL p_debug_timing_reporting( v_time_start );
END IF;
END //
DELIMITER ;;
/*
CALL p_shop_get_many_manufacturing_purchase_order (
0 # a_id_user
, 1 # a_get_all_order
, 1 # a_get_inactive_order
, '' # a_ids_order
, '' # a_ids_permutation
, NULL # a_date_from
, NULL # a_date_to
, 0 # a_debug
);
select *
from partsltd_prod.shop_manufacturing_purchase_order
;
select *
from partsltd_prod.shop_manufacturing_purchase_order_product_link
;
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_save_customer;
DELIMITER //
CREATE PROCEDURE p_shop_save_customer (
IN a_guid VARCHAR(500),
IN a_id_user INT,
IN a_comment VARCHAR(500),
IN a_id_customer INT,
IN a_name_company VARCHAR(256),
IN a_name_contact VARCHAR(256),
IN a_department_contact VARCHAR(256),
IN a_id_address INT,
IN a_phone_number VARCHAR(20),
IN a_email VARCHAR(515),
IN a_id_currency INT,
IN a_active BIT
)
BEGIN
DECLARE v_id_error_type_bad_data INT;
DECLARE v_id_error_type_no_permission INT;
DECLARE v_guid_permission BINARY(36);
DECLARE v_id_permission_customer INT;
DECLARE v_id_access_level_EDIT INT;
DECLARE v_has_permission BIT;
DECLARE v_id_change_set INT;
DECLARE v_is_new_customer BIT;
SET v_id_error_type_bad_data := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA');
SET v_guid_permission = UUID();
SET v_id_permission_customer = (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_CUSTOMER' 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;
-- Temporary tables
/*
CREATE TABLE tmp_Shop_Customer (
id_customer INT NOT NULL,
name_company VARCHAR(255) NOT NULL,
name_contact VARCHAR(255) NULL,
department_contact VARCHAR(255) NULL,
id_address INT NOT NULL,
CONSTRAINT FK_tmp_Shop_Customer_id_address
FOREIGN KEY (id_address)
REFERENCES Shop_Address(id_address),
phone_number VARCHAR(50) NULL,
fax VARCHAR(50) NULL,
email VARCHAR(255) NOT NULL,
website VARCHAR(255) NULL,
id_currency INT NOT NULL,
CONSTRAINT FK_tmp_Shop_Customer_id_currency
FOREIGN KEY (id_currency)
REFERENCES Shop_Currency(id_currency),
active BIT NOT NULL,
can_view BIT NOT NULL,
can_edit BIT NOT NULL,
can_admin BIT 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
IF a_id_customer IS NULL THEN
INSERT INTO tmp_Msg_Error (
guid, id_type, msg
)
VALUES
(a_guid, v_id_error_type_bad_data, 'Customer ID must not be null')
;
END IF;
IF a_name_company IS NULL THEN
INSERT INTO tmp_Msg_Error (
guid, id_type, msg
)
VALUES
(a_guid, v_id_error_type_bad_data, 'Customer company name must not be null')
;
END IF;
IF a_id_address IS NULL THEN
INSERT INTO tmp_Msg_Error (
guid, id_type, msg
)
VALUES
(a_guid, v_id_error_type_bad_data, 'Customer address ID must not be null')
;
END IF;
IF a_email IS NULL THEN
INSERT INTO tmp_Msg_Error (
guid, id_type, msg
)
VALUES
(a_guid, v_id_error_type_bad_data, 'Customer email must not be null')
;
END IF;
IF a_active IS NULL THEN
INSERT INTO tmp_Msg_Error (
guid, id_type, msg
)
VALUES
(a_guid, v_id_error_type_bad_data, 'Customer active status must not be null')
;
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
SET v_is_new_customer := CASE WHEN a_id_customer <= 0 THEN 1 ELSE 0 END;
IF (v_is_new_customer = 0 AND NOT EXISTS (SELECT * FROM Shop_Customer C WHERE C.id_customer = a_id_customer)) THEN
INSERT INTO tmp_Msg_Error (
guid, id_type, msg
)
VALUES
(a_guid, v_id_error_type_bad_data, CONCAT('Invalid customer ID: ', a_id_customer))
;
END IF;
END IF;
/*
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
INSERT INTO tmp_Shop_Customer (
id_customer, name_company, name_contact, department_contact, id_address, phone_number, fax, email, website, id_currency, active
)
VALUES
(a_id_customer, 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)
/*
FROM Shop_Customer S
WHERE (NOT v_has_filter_category OR C.id_category LIKE '%' || a_ids_category || '%')
AND (a_get_inactive_categories OR C.active)
*
;
END IF;
*/
-- Permissions
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
CALL p_shop_calc_user(v_guid_permission, a_id_user, 0, v_id_permission_customer, v_id_access_level_edit, '');
/*
UPDATE tmp_Shop_Customer 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;
*/
SET v_has_permission := (SELECT can_edit FROM Shop_Calc_User_Temp WHERE GUID = v_guid_permission);
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_customer
;
END IF;
-- CALL p_shop_clear_calc_user(v_guid_permission);
DELETE FROM Shop_Calc_User_Temp
WHERE GUID = a_guid;
END IF;
-- Transaction
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
INSERT INTO Shop_Sales_And_Purchasing_Change_Set (
comment,
updated_last_by,
updated_last_on
)
VALUES (
CONCAT(
'Save ',
CASE WHEN v_is_new_customer = 1 THEN 'new ' ELSE '' END,
'Customer - ',
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);
START TRANSACTION;
IF (v_is_new_customer = 1) THEN
INSERT INTO Shop_Customer (
-- id_customer,
name_company, name_contact, department_contact, id_address, phone_number, email, id_currency, active, id_change_set
)
VALUES
(
-- a_id_customer,
a_name_company, a_name_contact, a_department_contact, a_id_address, a_phone_number, a_email, a_id_currency, a_active, v_id_change_set
)
/*
FROM Shop_Customer S
WHERE (NOT v_has_filter_category OR C.id_category LIKE '%' || a_ids_category || '%')
AND (a_get_inactive_categories OR C.active)
*/
;
ELSE
UPDATE Shop_Customer C
-- INNER JOIN tmp_Shop_Customer t_S ON S.id_customer = t_S.id_customer
SET
/*
S.name_company = t_S.name_company,
S.name_contact = t_S.name_contact,
S.department_contact = t_S.department_contact,
S.id_address = t_S.id_address,
S.phone_number = t_S.phone_number,
S.fax = t_S.fax,
S.email = t_S.email,
S.website = t_S.website,
S.id_currency = t_S.id_currency,
S.active = t_S.active
*/
C.name_company = a_name_company,
C.name_contact = a_name_contact,
C.department_contact = a_department_contact,
C.id_address = a_id_address,
C.phone_number = a_phone_number,
C.email = a_email,
C.website = a_website,
C.id_currency = a_id_currency,
C.active = a_active,
C.id_change_set = v_id_change_set
;
END IF;
IF EXISTS (SELECT * FROM tmp_Msg_Error) THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END IF;
-- Returns
-- SET v_now = NOW();
# Errors
SELECT *
FROM tmp_Msg_Error
;
-- DROP TABLE tmp_Shop_Customer;
DROP TABLE tmp_Msg_Error;
END //
DELIMITER ;;
/*
CALL p_shop_save_customer (
'NIPS', # a_guid
'auth0|6582b95c895d09a70ba10fef', # a_id_user
'Initial Customer', # a_comment
'-1', # a_id_customer
'good co', # a_name_company
'teddy', # a_name_contact
'manufacturing', # a_department_contact
1, # a_id_address
'BRING BRING', # a_phone_number
'e@mail.com', # a_email
1, # a_id_currency_cost
1 # a_active
);
SELECT * FROM Shop_Customer
;
DELETE FROM Shop_Customer
;
*/
/*
CALL p_shop_get_many_customer (
'', # a_id_user
1, # a_get_all_customer
0, # a_get_inactive_customer
0, # a_get_first_customer_only
'', # a_ids_customer
);
*/
-- Clear previous proc
DROP PROCEDURE IF EXISTS p_shop_get_many_customer;
DELIMITER //
CREATE PROCEDURE p_shop_get_many_customer (
IN a_id_user INT,
IN a_get_all_customer BIT,
IN a_get_inactive_customer BIT,
IN a_get_first_customer_only BIT,
IN a_ids_customer VARCHAR(4000)
)
BEGIN
-- Argument redeclaration
-- Variable declaration
DECLARE v_id_error_type_bad_data INT;
DECLARE v_code_error_type_bad_data VARCHAR(50);
DECLARE v_has_filter_customer BIT;
DECLARE v_guid BINARY(36);
# DECLARE v_id_user VARCHAR(100);
# DECLARE v_ids_permutation_unavailable VARCHAR(4000);
DECLARE v_id_permission_customer INT;
# DECLARE v_ids_product_permission VARCHAR(4000);
# DECLARE v_ids_permutation_permission VARCHAR(4000);
DECLARE v_id_access_level_view INT;
DECLARE v_now DATETIME;
DECLARE v_id_minimum INT;
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_guid := UUID();
SET v_id_access_level_view := (SELECT id_access_level FROM Shop_Access_Level WHERE code = 'VIEW');
-- Argument validation + default values
IF a_id_user IS NULL THEN
SET a_id_user = '';
ELSE
SET a_id_user = TRIM(a_id_user);
END IF;
IF a_get_inactive_customer IS NULL THEN
SET a_get_inactive_customer = 0;
END IF;
IF a_get_first_customer_only IS NULL THEN
SET a_get_first_customer_only = 0;
END IF;
IF a_ids_customer IS NULL THEN
SET a_ids_customer = '';
ELSE
SET a_ids_customer = TRIM(REPLACE(a_ids_customer, '|', ','));
END IF;
SET v_has_filter_customer = CASE WHEN a_ids_customer = '' THEN 0 ELSE 1 END;
IF a_get_all_customer IS NULL THEN
SET a_get_all_customer = NOT v_has_filter_customer;
END IF;
-- Temporary tables
DROP TABLE IF EXISTS tmp_Shop_Customer;
CREATE TABLE tmp_Shop_Customer (
id_customer INT NOT NULL,
CONSTRAINT FK_tmp_Shop_Customer_id_customer
FOREIGN KEY (id_customer)
REFERENCES Shop_Customer(id_customer),
active BIT NOT NULL,
rank_customer INT NULL,
can_view BIT,
can_edit BIT,
can_admin BIT
);
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
);
-- Parse filters
SET v_has_filter_customer = CASE WHEN a_ids_customer = '' THEN 0 ELSE 1 END;
-- select v_has_filter_product, v_has_filter_permutation;
IF v_has_filter_customer = 1 OR a_get_all_customer = 1 THEN
CALL p_split(v_guid, a_ids_customer, ',');
IF EXISTS (SELECT * FROM Split_Temp S_T LEFT JOIN Shop_Customer C ON S_T.substring = C.id_customer WHERE ISNULL(C.id_customer)) THEN
INSERT INTO tmp_Msg_Error (
guid,
id_type,
code,
msg
)
VALUES (
v_guid,
v_id_error_type_bad_data,
v_code_error_type_bad_data,
CONCAT('Invalid customer IDs: ', (SELECT GROUP_CONCAT(C.id_customer) FROM Split_Temp S_T LEFT JOIN Shop_Customer C ON S_T.substring = C.id_customer WHERE ISNULL(C.id_customer)))
)
;
ELSE
INSERT INTO tmp_Shop_Customer (
id_customer,
active,
rank_customer
)
SELECT
C.id_customer,
C.active,
RANK() OVER (ORDER BY C.id_customer ASC) AS rank_customer
FROM Shop_Customer C
LEFT JOIN Split_Temp S_T ON C.id_customer = S_T.substring
WHERE
(
a_get_all_customer = 1
OR NOT ISNULL(S_T.substring)
)
AND (
a_get_inactive_customer = 1
OR C.active = 1
)
;
END IF;
DROP TABLE Split_Temp;
IF a_get_first_customer_only = 1 THEN
DELETE t_C
FROM tmp_Shop_Customer t_C
WHERE t_C.rank_customer > (
SELECT MIN(t_C.rank_customer)
FROM tmp_Shop_Customer t_C
)
;
END IF;
END IF;
-- Permissions
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
# SET v_id_user := (SELECT id_user FROM Shop_User WHERE name = CURRENT_USER());
SET v_id_permission_customer := (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_CUSTOMER' LIMIT 1);
-- SELECT v_guid, a_id_user, false, v_id_permission_product, v_id_access_level_view, v_ids_permutation_permission;
-- select * from Shop_Calc_User_Temp;
CALL p_shop_calc_user(v_guid, a_id_user, FALSE, v_id_permission_customer, v_id_access_level_view, '');
-- select * from Shop_Calc_User_Temp;
IF NOT EXISTS (SELECT can_view FROM Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = v_guid) THEN
INSERT INTO tmp_Msg_Error (
guid,
id_type,
code,
msg
)
VALUES (
v_guid,
v_id_error_type_bad_data,
v_code_error_type_bad_data,
CONCAT('You do not have view permissions for ', IFNULL((SELECT name FROM Shop_Permission WHERE id_permission = v_id_permission_customer LIMIT 1), 'Permission not found'))
)
;
END IF;
END IF;
-- select * from tmp_Shop_Product;
-- Returns
-- SET v_now := NOW();
# customers
SELECT
t_C.id_customer,
C.name_company,
C.name_contact,
C.department_contact,
C.id_address,
C.phone_number,
C.email,
C.id_currency,
C.active
FROM tmp_Shop_Customer t_C
INNER JOIN Shop_Customer C ON t_C.id_customer = C.id_customer
;
# Errors
SELECT
/*
t_ME.display_order,
t_ME.guid,
t_ME.id_type,
t_ME.msg,
MET.code,
MET.name,
MET.description
*/
*
FROM tmp_Msg_Error t_ME
INNER JOIN Shop_Msg_Error_Type MET
ON t_ME.id_type = MET.id_type
WHERE guid = v_guid
;
/*
# Return arguments for test
SELECT
a_ids_category,
a_get_inactive_category,
a_ids_product,
a_get_inactive_product,
a_get_first_product_only,
a_get_all_product,
a_ids_image,
a_get_inactive_image,
a_get_first_image_only,
a_get_all_image
;
*/
# select 'other outputs';
# select * from tmp_Shop_Product;
-- Clean up
DROP TABLE IF EXISTS tmp_Shop_Customer;
DELETE FROM Shop_Calc_User_Temp
WHERE GUID = v_guid
;
END //
DELIMITER ;;
/*
CALL p_shop_get_many_customer (
'', # a_id_user
1, # a_get_all_customer
0, # a_get_inactive_customer
0, # a_get_first_customer_only
'' # a_ids_customer
);
SELECT *
FROM Shop_Customer;
*/