Fix: Product Category, Product, and Product Permutation save and filter.

This commit is contained in:
2024-11-18 18:46:50 +00:00
parent b80be23852
commit 48185da25f
11 changed files with 516 additions and 360 deletions

View File

@@ -500,19 +500,20 @@ class Parameters_Product(Get_Many_Parameters_Base):
# av.val_instance(form, 'form', 'Parameters_Product.from_form', Filters_Product_Permutation) # av.val_instance(form, 'form', 'Parameters_Product.from_form', Filters_Product_Permutation)
has_category_filter = not (form.id_category.data == '0' or form.id_category.data == '' or form.id_category.data is None) has_category_filter = not (form.id_category.data == '0' or form.id_category.data == '' or form.id_category.data is None)
has_product_filter = not (form.id_product.data == '0' or form.id_product.data == '' or form.id_product.data is None) has_product_filter = not (form.id_product.data == '0' or form.id_product.data == '' or form.id_product.data is None)
get_permutations_stock_below_min = av.input_bool(form.is_out_of_stock.data, "is_out_of_stock", "Parameters_Product.from_form") get_permutations_stock_below_min = av.input_bool(form.is_out_of_stock.data, "is_out_of_stock", "Parameters_Product.from_form_filters_product_permutation")
Helper_App.console_log(f'form question: {type(form.is_out_of_stock)}\nbool interpretted: {get_permutations_stock_below_min}\ntype form: {type(form)}') get_inactive = not av.input_bool(form.active.data, "active", "Parameters_Product.from_form_filters_product_permutation")
Helper_App.console_log(f'form question: {type(form.is_out_of_stock)}\nbool interpretted: {get_permutations_stock_below_min}\nform question: {type(form.active)}\nget_inactive:{get_inactive}\ntype form: {type(form)}')
return Parameters_Product( return Parameters_Product(
get_all_product_category = not has_category_filter, get_all_product_category = not has_category_filter,
get_inactive_product_category = False, get_inactive_product_category = get_inactive,
# get_first_product_category_only = False, # get_first_product_category_only = False,
ids_product_category = form.id_category.data if form.id_category.data is not None else '', ids_product_category = form.id_category.data if form.id_category.data is not None else '',
get_all_product = not has_product_filter, get_all_product = not has_product_filter,
get_inactive_product = False, get_inactive_product = get_inactive,
# get_first_product_only = False, # get_first_product_only = False,
ids_product = form.id_product.data if form.id_product.data is not None else '', ids_product = form.id_product.data if form.id_product.data is not None else '',
get_all_permutation = not get_permutations_stock_below_min, get_all_permutation = not get_permutations_stock_below_min,
get_inactive_permutation = False, get_inactive_permutation = get_inactive,
# get_first_permutation_only = False, # get_first_permutation_only = False,
ids_permutation = '', ids_permutation = '',
get_all_image = False, get_all_image = False,

View File

@@ -33,7 +33,8 @@ routes_store_product_permutation = Blueprint('routes_store_product_permutation',
@routes_store_product_permutation.route(Model_View_Store_Product_Permutation.HASH_PAGE_STORE_PRODUCT_PERMUTATIONS, methods=['GET']) @routes_store_product_permutation.route(Model_View_Store_Product_Permutation.HASH_PAGE_STORE_PRODUCT_PERMUTATIONS, methods=['GET'])
def permutations(): def permutations():
Helper_App.console_log('permutations') Helper_App.console_log('permutations')
data = Helper_App.get_request_data(request) data = request.args
# Helper_App.console_log(f'data={data}\nrequest.args={request.args}\nrequest.form={request.form}\nrequest.data={request.data}\nrequest.values={request.values}\nrequest.headers={request.headers}')
try: try:
form_filters = Filters_Product_Permutation.from_json(data) form_filters = Filters_Product_Permutation.from_json(data)
except Exception as e: except Exception as e:

View File

@@ -29,6 +29,7 @@ class Filters_Product_Permutation(Form_Base):
id_category = SelectField('Category', validators=[Optional()], choices=[('', 'All')], default='') id_category = SelectField('Category', validators=[Optional()], choices=[('', 'All')], default='')
id_product = SelectField('Product', validators=[Optional()], choices=[('', 'All')], default='') id_product = SelectField('Product', validators=[Optional()], choices=[('', 'All')], default='')
is_out_of_stock = BooleanField('Out of stock only?') is_out_of_stock = BooleanField('Out of stock only?')
active = BooleanField('Active only?', default=True)
quantity_min = FloatField('Min stock') quantity_min = FloatField('Min stock')
quantity_max = FloatField('Max stock') quantity_max = FloatField('Max stock')
# submit = SubmitField('Submit') # submit = SubmitField('Submit')
@@ -49,6 +50,7 @@ class Filters_Product_Permutation(Form_Base):
id_category={self.id_category.data}, id_category={self.id_category.data},
id_product={self.id_product.data}, id_product={self.id_product.data},
is_out_of_stock={self.is_out_of_stock.data}, is_out_of_stock={self.is_out_of_stock.data},
active={self.active.data},
quantity_min={self.quantity_min.data}, quantity_min={self.quantity_min.data},
quantity_max={self.quantity_max.data}) quantity_max={self.quantity_max.data})
''' '''
@@ -60,6 +62,7 @@ class Filters_Product_Permutation(Form_Base):
form.id_product.choices = [(json[Store_Base.ATTR_ID_PRODUCT], json[Store_Base.ATTR_ID_PRODUCT])] form.id_product.choices = [(json[Store_Base.ATTR_ID_PRODUCT], json[Store_Base.ATTR_ID_PRODUCT])]
form.id_product.data = json[Store_Base.ATTR_ID_PRODUCT] form.id_product.data = json[Store_Base.ATTR_ID_PRODUCT]
form.is_out_of_stock.data = av.input_bool(json[Store_Base.FLAG_IS_OUT_OF_STOCK], Store_Base.FLAG_IS_OUT_OF_STOCK, f'{cls.__name__}.from_json') form.is_out_of_stock.data = av.input_bool(json[Store_Base.FLAG_IS_OUT_OF_STOCK], Store_Base.FLAG_IS_OUT_OF_STOCK, f'{cls.__name__}.from_json')
form.active.data = av.input_bool(json[Store_Base.FLAG_ACTIVE], Store_Base.FLAG_ACTIVE, f'{cls.__name__}.from_json')
form.quantity_min.data = json[Store_Base.FLAG_QUANTITY_MIN] form.quantity_min.data = json[Store_Base.FLAG_QUANTITY_MIN]
form.quantity_max.data = json[Store_Base.FLAG_QUANTITY_MAX] form.quantity_max.data = json[Store_Base.FLAG_QUANTITY_MAX]
return form return form

View File

@@ -65,10 +65,9 @@ BEGIN
-- Clear previous proc results -- Clear previous proc results
DROP TABLE IF EXISTS tmp_Calc_User; DROP TABLE IF EXISTS tmp_Calc_User;
DROP TABLE IF EXISTS tmp_Shop_Calc_User; DROP TABLE IF EXISTS tmp_User_Calc_User;
DROP TABLE IF EXISTS tmp_Product_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;
-- DROP TABLE IF EXISTS tmp_Split;
-- Permanent Table -- Permanent Table
CREATE TEMPORARY TABLE tmp_Calc_User ( CREATE TEMPORARY TABLE tmp_Calc_User (
@@ -92,7 +91,14 @@ BEGIN
-- guid BINARY(36) NOT NULL, -- guid BINARY(36) NOT NULL,
-- rank_product INT NOT NULL -- rank_product INT NOT NULL
); );
CREATE TEMPORARY TABLE tmp_User_Calc_User (
id_user INT NOT NULL
, is_super_user BIT NOT NULL
-- , id_access_level INT
, priority_access_level INT NOT NULL
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error (
display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT, display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
-- guid BINARY(36) NOT NULL, -- guid BINARY(36) NOT NULL,
@@ -131,122 +137,314 @@ BEGIN
; ;
END IF; END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN # Access levels
IF v_has_filter_access_level THEN IF v_has_filter_access_level THEN
CALL partsltd_prod.p_split(a_guid, a_ids_access_level, ',', a_debug); CALL partsltd_prod.p_split(a_guid, a_ids_access_level, ',', a_debug);
INSERT INTO tmp_Split ( INSERT INTO tmp_Split (
substring substring
, as_int , 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 SELECT
substring -- a_guid,
, CONVERT(substring, DECIMAL(10,0)) -- AS as_int v_id_type_error_bad_data,
FROM Split_Temp v_code_type_error_bad_data,
WHERE 1=1 CONCAT('Invalid or inactive access level IDs: ', GROUP_CONCAT(t_S.substring SEPARATOR ', '))
AND GUID = a_guid FROM tmp_Split t_S
AND NOT ISNULL(substring) LEFT JOIN partsltd_prod.Shop_Access_Level AL ON t_S.as_int = AL.id_access_level
AND substring != '' WHERE
; ISNULL(t_S.as_int)
OR ISNULL(AL.id_access_level)
CALL partsltd_prod.p_clear_split_temp( a_guid ); OR AL.active = 0
;
# Invalid IDs ELSE
IF EXISTS ( IF v_has_filter_access_level THEN
SELECT t_S.substring SET v_id_access_level := (
FROM tmp_Split t_S SELECT AL.id_access_level
LEFT JOIN partsltd_prod.Shop_Access_Level AL ON t_S.as_int = AL.id_access_level FROM tmp_Split t_S
WHERE INNER JOIN partsltd_prod.Shop_Access_Level AL
ISNULL(t_S.as_int) ON t_S.as_int = AL.id_access_level
OR ISNULL(AL.id_access_level) AND AL.active
OR AL.active = 0 ORDER BY AL.priority ASC
) THEN LIMIT 1
INSERT INTO tmp_Msg_Error ( );
-- guid, ELSE
id_type, SET v_id_access_level = v_id_access_level_view;
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;
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; 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; DELETE FROM tmp_Split;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN -- Permission IDs
IF v_has_filter_product = 1 THEN IF v_has_filter_permission THEN
CALL partsltd_prod.p_split(a_guid, a_ids_product, ',', a_debug); CALL partsltd_prod.p_split(a_guid, a_ids_permission, ',', a_debug);
INSERT INTO tmp_Split ( INSERT INTO tmp_Split (
substring substring
, as_int , 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 SELECT
substring -- a_guid,
, CONVERT(substring, DECIMAL(10,0)) AS as_int v_id_type_error_bad_data,
FROM Split_Temp v_code_type_error_bad_data,
WHERE 1=1 CONCAT('Invalid or inactive permission IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL'))
AND GUID = a_guid FROM tmp_Split t_S
AND NOT ISNULL(substring) LEFT JOIN partsltd_prod.Shop_Permission PERM ON t_S.as_int = PERM.id_permission
AND substring != '' WHERE
; ISNULL(t_S.as_int)
OR ISNULL(PERM.id_permission)
CALL partsltd_prod.p_clear_split_temp( a_guid ); OR PERM.active = 0
;
# Invalid product IDs ELSE
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 SET v_id_permission_required := (
INSERT INTO tmp_Msg_Error ( SELECT PERM.id_permission
-- guid, FROM partsltd_prod.Shop_Permission PERM
id_type, INNER JOIN partsltd_prod.Shop_Access_Level AL ON PERM.id_access_level_required = AL.id_access_level
code, ORDER BY AL.priority ASC
msg LIMIT 1
) );
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;
END IF; END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN DELETE FROM tmp_Split;
IF (v_has_filter_product = 1 AND EXISTS (SELECT * FROM tmp_Split)) THEN
# Users
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 (a_get_inactive_user = 0 AND 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 (
a_get_inactive_user = 0
AND 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_User_Calc_User (
id_user
-- , id_access_level
, is_super_user
, priority_access_level
)
SELECT
U.id_user
, U.is_super_user
-- , IFNULL(AL_U.id_access_level, v_id_access_level_view) AS id_access_level
, IFNULL(MIN(AL_U.priority), v_priority_access_level_view) AS priority_access_level
FROM tmp_Split t_S
INNER JOIN partsltd_prod.Shop_User U ON t_S.as_int = U.id_user
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
GROUP BY U.id_user
;
INSERT INTO tmp_Calc_User (
id_user
, id_permission_required
, priority_access_level_required
, id_product
, is_super_user
, priority_access_level_user
)
SELECT
t_UCU.id_user
, v_id_permission_required
, v_priority_access_level AS priority_access_level_required
, NULL
, t_UCU.priority_access_level AS priority_access_level_user
, t_UCU.is_super_user AS is_super_user
FROM tmp_User_Calc_User t_UCU
;
/*
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
, v_priority_access_level 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
;
*/
# SET v_has_filter_user = EXISTS ( SELECT * FROM tmp_User_Calc_User LIMIT 1 );
END IF;
DELETE FROM tmp_Split;
# Products
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)) 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 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;
IF (EXISTS (SELECT * FROM tmp_Split)) THEN
INSERT INTO tmp_Product_Calc_User ( INSERT INTO tmp_Product_Calc_User (
id_product, id_product,
-- id_permutation, -- id_permutation,
@@ -294,177 +492,35 @@ BEGIN
); );
END IF; END IF;
END IF; END IF;
DELETE FROM tmp_Split; DELETE FROM tmp_Split;
-- Permission IDs INSERT INTO tmp_Calc_User (
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN id_user
IF v_has_filter_permission THEN , id_permission_required
CALL partsltd_prod.p_split(a_guid, a_ids_permission, ',', a_debug); , priority_access_level_required
, id_product
INSERT INTO tmp_Split ( , is_super_user
substring , priority_access_level_user
, as_int )
) SELECT
SELECT t_U.id_user
substring , v_id_permission_required
, CONVERT(substring, DECIMAL(10,0)) AS as_int , CASE WHEN AL.priority < v_priority_access_level THEN AL.priority ELSE v_priority_access_level END AS priority_access_level_required
FROM Split_Temp , t_P.id_product
WHERE 1=1 , t_U.priority_access_level AS priority_access_level_user
AND GUID = a_guid , t_U.is_super_user AS is_super_user
AND NOT ISNULL(substring) FROM tmp_User_Calc_User t_U
AND substring != '' CROSS JOIN tmp_Product_Calc_User t_P
; LEFT JOIN partsltd_prod.Shop_Access_Level AL ON t_P.id_access_level_required = AL.id_access_level
;
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 -- Calculated fields
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN UPDATE tmp_Calc_User t_CU
UPDATE tmp_Calc_User t_U SET
SET t_CU.can_view = t_CU.is_super_user = 1 OR (t_CU.priority_access_level_user <= v_priority_access_level_view AND t_CU.priority_access_level_user <= t_CU.priority_access_level_required)
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_CU.can_edit = t_CU.is_super_user = 1 OR (t_CU.priority_access_level_user <= v_priority_access_level_edit AND t_CU.priority_access_level_user <= t_CU.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_CU.can_admin = t_CU.is_super_user = 1 OR (t_CU.priority_access_level_user <= v_priority_access_level_admin AND t_CU.priority_access_level_user <= t_CU.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 -- Export data to staging table
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN
@@ -500,6 +556,7 @@ BEGIN
IF a_debug = 1 THEN IF a_debug = 1 THEN
SELECT * FROM tmp_Msg_Error; SELECT * FROM tmp_Msg_Error;
SELECT * FROM tmp_Calc_User; SELECT * FROM tmp_Calc_User;
SELECT * FROM tmp_User_Calc_User;
SELECT * FROM tmp_Product_Calc_User; SELECT * FROM tmp_Product_Calc_User;
SELECT * FROM partsltd_prod.Shop_Calc_User_Temp WHERE GUID = a_guid; SELECT * FROM partsltd_prod.Shop_Calc_User_Temp WHERE GUID = a_guid;
CALL partsltd_prod.p_shop_clear_calc_user ( a_guid, a_debug ); CALL partsltd_prod.p_shop_clear_calc_user ( a_guid, a_debug );
@@ -507,10 +564,11 @@ BEGIN
-- Clean up -- Clean up
DROP TABLE IF EXISTS tmp_Calc_User; DROP TABLE IF EXISTS tmp_Calc_User;
DROP TABLE IF EXISTS tmp_Shop_Calc_User; DROP TABLE IF EXISTS tmp_User_Calc_User;
DROP TABLE IF EXISTS tmp_Product_Calc_User; DROP TABLE IF EXISTS tmp_Product_Calc_User;
DROP TABLE IF EXISTS tmp_Product_p_Shop_User_Eval_Temp; # Don't destroy common tables in nested Stored Procedures!
-- DROP TABLE IF EXISTS tmp_Split; -- DROP TABLE IF EXISTS tmp_Split;
DELETE FROM tmp_Split;
IF a_debug = 1 THEN IF a_debug = 1 THEN
CALL partsltd_prod.p_debug_timing_reporting( v_time_start ); CALL partsltd_prod.p_debug_timing_reporting( v_time_start );
@@ -518,19 +576,20 @@ BEGIN
END // END //
DELIMITER ;; DELIMITER ;;
/* /*
CALL partsltd_prod.p_shop_calc_user ( CALL partsltd_prod.p_shop_calc_user (
'chips ' 'chips '
, NULL , 1
, 0 , 0
, '2' , '2'
, '1' , '1'
, '1,2,3,4,5' , '1,2,3,4,5'
, 0 , 0
); );
SELECT * FROM partsltd_prod.Shop_Calc_User_Temp WHERE GUID = 'chips ';
DELETE FROM partsltd_prod.Shop_Calc_User_Temp WHERE GUID = 'chips ';
-- SELECT * FROM partsltd_prod.Shop_Calc_User_Temp; -- SELECT * FROM partsltd_prod.Shop_Calc_User_Temp;
SELECT * FROM partsltd_prod.Shop_Calc_User_Temp WHERE GUID = 'chips '; SELECT * FROM partsltd_prod.Shop_Calc_User_Temp WHERE GUID = 'chips ';

View File

@@ -126,7 +126,7 @@ BEGIN
SELECT SELECT
v_id_type_error_bad_data v_id_type_error_bad_data
, v_code_type_error_bad_data , v_code_type_error_bad_data
, CONCAT('The following category(s) do not have a code: ', GROUP_CONCAT(t_C.name_error SEPARATOR ', ')) AS msg , CONCAT('The following Product Category(s) do not have a code: ', GROUP_CONCAT(t_C.name_error SEPARATOR ', ')) AS msg
FROM tmp_Category t_C FROM tmp_Category t_C
WHERE ISNULL(t_C.code) WHERE ISNULL(t_C.code)
; ;
@@ -141,7 +141,7 @@ BEGIN
SELECT SELECT
v_id_type_error_bad_data v_id_type_error_bad_data
, v_code_type_error_bad_data , v_code_type_error_bad_data
, CONCAT('The following category(s) do not have a name: ', GROUP_CONCAT(t_C.name_error SEPARATOR ', ')) AS msg , CONCAT('The following Product Category(s) do not have a name: ', GROUP_CONCAT(t_C.name_error SEPARATOR ', ')) AS msg
FROM tmp_Category t_C FROM tmp_Category t_C
WHERE ISNULL(t_C.name) WHERE ISNULL(t_C.name)
; ;
@@ -156,7 +156,7 @@ BEGIN
SELECT SELECT
v_id_type_error_bad_data v_id_type_error_bad_data
, v_code_type_error_bad_data , v_code_type_error_bad_data
, CONCAT('The following category(s) do not have a display order: ', GROUP_CONCAT(t_C.name_error SEPARATOR ', ')) AS msg , CONCAT('The following Product Category(s) do not have a display order: ', GROUP_CONCAT(t_C.name_error SEPARATOR ', ')) AS msg
FROM tmp_Category t_C FROM tmp_Category t_C
WHERE ISNULL(t_C.display_order) WHERE ISNULL(t_C.display_order)
; ;
@@ -165,7 +165,7 @@ BEGIN
-- Permissions -- Permissions
SET v_ids_product_permission := ( SET v_ids_product_permission := (
SELECT GROUP_CONCAT(P.id_product SEPARATOR ',') SELECT GROUP_CONCAT(P.id_product SEPARATOR ',')
FROM Shop_Product P FROM partsltd_prod.Shop_Product P
INNER JOIN tmp_Category t_C INNER JOIN tmp_Category t_C
ON P.id_category = t_C.id_category ON P.id_category = t_C.id_category
AND t_C.is_new = 0 AND t_C.is_new = 0
@@ -185,7 +185,7 @@ BEGIN
; ;
END IF; END IF;
CALL p_shop_calc_user( CALL partsltd_prod.p_shop_calc_user(
a_guid a_guid
, a_id_user , a_id_user
, FALSE -- a_get_inactive_user , FALSE -- a_get_inactive_user
@@ -196,8 +196,8 @@ BEGIN
); );
UPDATE tmp_Category t_C UPDATE tmp_Category t_C
INNER JOIN Shop_Product P ON t_C.id_category = P.id_product INNER JOIN partsltd_prod.Shop_Product P ON t_C.id_category = P.id_product
INNER JOIN Shop_Calc_User_Temp UE_T INNER JOIN partsltd_prod.Shop_Calc_User_Temp UE_T
ON P.id_product = UE_T.id_product ON P.id_product = UE_T.id_product
AND UE_T.GUID = a_guid AND UE_T.GUID = a_guid
SET SET
@@ -205,8 +205,43 @@ BEGIN
, t_C.can_edit = UE_T.can_edit , t_C.can_edit = UE_T.can_edit
, t_C.can_admin = UE_T.can_admin , t_C.can_admin = UE_T.can_admin
; ;
IF EXISTS (SELECT * FROM tmp_Category WHERE IFNULL(can_edit, 0) = 0 AND is_new = 0 LIMIT 1) THEN
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 permission to edit the following Product Catogory(s): ', IFNULL(GROUP_CONCAT(IFNULL(t_C.name_error, 'NULL') SEPARATOR ', '), 'NULL'))
FROM tmp_Category t_C
WHERE
IFNULL(can_edit, 0) = 0
AND is_new = 0
;
END IF;
IF EXISTS (SELECT * FROM partsltd_prod.Shop_Calc_User_Temp WHERE ISNULL(id_product) AND GUID = a_guid AND can_edit = 0 LIMIT 1) THEN
DELETE t_ME
FROM tmp_Msg_Error t_ME
WHERE t_ME.id_type <> v_id_type_error_no_permission
;
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
VALUES (
v_id_type_error_no_permission
, v_code_type_error_no_permission
, 'You do not have permission to edit Product Catogories.'
)
;
END IF;
CALL p_shop_clear_calc_user( CALL partsltd_prod.p_shop_clear_calc_user(
a_guid a_guid
, 0 -- a_debug , 0 -- a_debug
); );

View File

@@ -216,60 +216,90 @@ BEGIN
-- Permissions -- 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);
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);
SET v_id_permission_product = (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_PRODUCT' LIMIT 1);
CALL partsltd_prod.p_shop_calc_user(
CALL partsltd_prod.p_shop_calc_user( a_guid
a_guid , a_id_user
, a_id_user , FALSE -- get_inactive_users
, FALSE -- get_inactive_users , v_id_permission_product
, v_id_permission_product , v_id_access_level_edit
, v_id_access_level_edit , v_ids_product_permission
, v_ids_product_permission , 0 -- debug
, 0 -- debug );
);
UPDATE tmp_Product t_P
UPDATE tmp_Product t_P INNER JOIN partsltd_prod.Shop_Calc_User_Temp UE_T
INNER JOIN Shop_Calc_User_Temp UE_T ON t_P.id_product = UE_T.id_product
ON t_P.id_product = UE_T.id_product AND UE_T.GUID = a_guid
AND UE_T.GUID = a_guid SET
SET t_P.can_view = UE_T.can_view
t_P.can_view = UE_T.can_view , t_P.can_edit = UE_T.can_edit
, t_P.can_edit = UE_T.can_edit , t_P.can_admin = UE_T.can_admin
, t_P.can_admin = UE_T.can_admin ;
;
IF EXISTS (SELECT * FROM tmp_Product WHERE IFNULL(can_edit, 0) = 0 AND is_new = 0 LIMIT 1) THEN
CALL partsltd_prod.p_shop_clear_calc_user( INSERT INTO tmp_Msg_Error (
a_guid id_type
, 0 -- debug , code
); , msg
END IF; )
SELECT
v_id_type_error_no_permission
, v_code_type_error_no_permission
, CONCAT('You do not have permission to edit the following Product(s): ', IFNULL(GROUP_CONCAT(IFNULL(t_P.name_error, 'NULL') SEPARATOR ', '), 'NULL'))
FROM tmp_Product t_P
WHERE
IFNULL(can_edit, 0) = 0
AND is_new = 0
;
END IF; END IF;
IF EXISTS (SELECT * FROM partsltd_prod.Shop_Calc_User_Temp WHERE ISNULL(id_product) AND GUID = a_guid AND can_edit = 0) THEN
DELETE t_ME
FROM tmp_Msg_Error t_ME
WHERE t_ME.id_type <> v_id_type_error_no_permission
;
INSERT INTO tmp_Msg_Error (
id_type
, code
, msg
)
VALUES (
v_id_type_error_no_permission
, v_code_type_error_no_permission
, 'You do not have permission to edit Products'
)
;
END IF;
CALL partsltd_prod.p_shop_clear_calc_user(
a_guid
, 0 -- debug
);
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
START TRANSACTION; START TRANSACTION;
IF NOT ISNULL(v_ids_product_permission) THEN
INSERT INTO partsltd_prod.Shop_Product_Change_Set ( comment ) INSERT INTO partsltd_prod.Shop_Product_Change_Set ( comment )
VALUES ( a_comment ) VALUES ( a_comment )
; ;
SET v_id_change_set := LAST_INSERT_ID(); SET v_id_change_set := LAST_INSERT_ID();
UPDATE partsltd_prod.Shop_Product P UPDATE partsltd_prod.Shop_Product P
INNER JOIN tmp_Product t_P ON P.id_product = t_P.id_product INNER JOIN tmp_Product t_P ON P.id_product = t_P.id_product
SET SET
P.id_category = t_P.id_category P.id_category = t_P.id_category
, P.name = t_P.name , P.name = t_P.name
, P.has_variations = t_P.has_variations , P.has_variations = t_P.has_variations
, P.id_access_level_required = t_P.id_access_level_required , P.id_access_level_required = t_P.id_access_level_required
, P.display_order = t_P.display_order , P.display_order = t_P.display_order
, P.active = t_P.active , P.active = t_P.active
, P.id_change_set = v_id_change_set , P.id_change_set = v_id_change_set
; ;
END IF;
INSERT INTO partsltd_prod.Shop_Product ( INSERT INTO partsltd_prod.Shop_Product (
id_category id_category
@@ -297,7 +327,7 @@ BEGIN
START TRANSACTION; START TRANSACTION;
DELETE FROM partsltd_prod.Shop_Product_Category_Temp DELETE FROM partsltd_prod.Shop_Product_Temp
WHERE GUID = a_guid; WHERE GUID = a_guid;
COMMIT; COMMIT;

View File

@@ -440,11 +440,6 @@ BEGIN
LEFT JOIN Shop_Product P ON t_PP.id_product = P.id_product LEFT JOIN Shop_Product P ON t_PP.id_product = P.id_product
; ;
END IF; END IF;
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 IF EXISTS (SELECT * FROM tmp_Permutation t_P WHERE ISNULL(t_P.can_edit) LIMIT 1) THEN
INSERT INTO tmp_Msg_Error ( INSERT INTO tmp_Msg_Error (
@@ -461,13 +456,36 @@ BEGIN
ISNULL(t_P.can_edit) ISNULL(t_P.can_edit)
; ;
END IF; END IF;
IF EXISTS (SELECT * FROM partsltd_prod.Shop_User_Eval_Temp WHERE ISNULL(id_product) AND GUID = a_guid AND can_edit = 0) THEN
DELETE FROM tmp_Msg_Error
WHERE id_type <> v_id_type_error_no_permission
;
IF a_debug = 1 THEN INSERT INTO tmp_Msg_Error (
SELECT * id_type
FROM partsltd_prod.Shop_Product_Permutation_Variation_Link_Temp , code
WHERE GUID = a_guid , msg
; )
END IF; VALUES (
v_id_type_error_bad_data
, v_code_type_error_bad_data
, 'You do not have permission to edit Product Permutations'
)
;
END IF;
CALL p_shop_clear_calc_user(
a_guid
, 0 -- a_debug
);
IF a_debug = 1 THEN
SELECT *
FROM partsltd_prod.Shop_Product_Permutation_Variation_Link_Temp
WHERE GUID = a_guid
;
END IF;
IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN
START TRANSACTION; START TRANSACTION;

View File

@@ -40,6 +40,15 @@
{% endfor %} {% endfor %}
</div> </div>
</div> </div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}">
<div class="{{ model.FLAG_CONTAINER_INPUT }} {{ model.FLAG_ROW }} {{ model.FLAG_FILTER }}">
{{ model.form_filters.active.label }}
{{ model.form_filters.active() }}
{% for error in model.form_filters.active.errors %}
<p class="error">{{ error }}</p>
{% endfor %}
</div>
</div>
<div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}"> <div class="{{ model.FLAG_CONTAINER }} {{ model.FLAG_COLUMN }}">
<div class="{{ model.FLAG_CONTAINER_INPUT }} {{ model.FLAG_ROW }} {{ model.FLAG_FILTER }}"> <div class="{{ model.FLAG_CONTAINER_INPUT }} {{ model.FLAG_ROW }} {{ model.FLAG_FILTER }}">
{{ model.form_filters.quantity_min.label }} {{ model.form_filters.quantity_min.label }}