From 651a404ba35696d6f8fbaa9677b5b474352eb6cc Mon Sep 17 00:00:00 2001 From: teddy Date: Sat, 5 Oct 2024 21:16:42 +0100 Subject: [PATCH] feat(web): Store Product UI created and hooked up for viewing, editing, and saving. --- README.md | 6 + .../__pycache__/sql_error.cpython-312.pyc | Bin 1960 -> 2082 bytes .../__pycache__/user.cpython-312.pyc | Bin 12604 -> 12606 bytes business_objects/sql_error.py | 10 +- .../store/__pycache__/product.cpython-312.pyc | Bin 24872 -> 27709 bytes .../product_category.cpython-312.pyc | Bin 29525 -> 29597 bytes .../product_variation.cpython-312.pyc | Bin 10691 -> 10479 bytes .../__pycache__/store_base.cpython-312.pyc | Bin 3059 -> 3059 bytes business_objects/store/product.py | 76 ++- business_objects/store/product_category.py | 9 +- business_objects/store/product_variation.py | 12 +- business_objects/user.py | 2 +- .../store/__pycache__/product.cpython-312.pyc | Bin 6061 -> 6078 bytes controllers/store/product.py | 2 +- .../datastore_store_base.cpython-312.pyc | Bin 13098 -> 13513 bytes ...ore_store_product_category.cpython-312.pyc | Bin 4351 -> 4351 bytes ..._store_product_permutation.cpython-312.pyc | Bin 3089 -> 3089 bytes ...datastore_store_stock_item.cpython-312.pyc | Bin 4830 -> 4855 bytes datastores/datastore_store_base.py | 80 +-- datastores/datastore_store_product.py | 69 +- .../datastore_store_product_category.py | 4 +- .../datastore_store_product_permutation.py | 4 +- .../datastore_store_product_variation.py | 54 +- datastores/datastore_store_stock_item.py | 9 +- forms/__pycache__/base.cpython-312.pyc | Bin 2144 -> 2499 bytes .../unit_measurement.cpython-312.pyc | Bin 2857 -> 2857 bytes forms/base.py | 9 +- .../store/__pycache__/product.cpython-312.pyc | Bin 2179 -> 2590 bytes .../product_permutation.cpython-312.pyc | Bin 3814 -> 3831 bytes forms/store/product.py | 11 +- forms/store/product_permutation.py | 4 +- forms/store/stock_item.py | 3 +- .../model_view_base.cpython-312.pyc | Bin 16803 -> 16883 bytes .../model_view_store.cpython-312.pyc | Bin 21359 -> 21359 bytes .../model_view_store_product.cpython-312.pyc | Bin 4858 -> 5548 bytes models/model_view_base.py | 6 +- models/model_view_store.py | 2 +- models/model_view_store_product.py | 15 +- static/MySQL/0000_combine.sql | 16 +- .../7200_p_shop_save_product_category.sql | 96 +-- ...7200_p_shop_save_product_category_test.sql | 2 +- static/MySQL/7203_p_shop_save_product.sql | 287 +++++---- .../MySQL/7203_p_shop_save_product_test.sql | 78 +++ static/MySQL/7206_p_shop_save_permutation.sql | 605 ------------------ .../7206_p_shop_save_product_permutation.sql | 4 +- ...7210_p_shop_get_many_product_variation.sql | 12 +- .../MySQL/7219_p_shop_get_many_stock_item.sql | 2 +- static/MySQL/7400_p_shop_save_supplier.sql | 2 +- ..._shop_get_many_supplier_purchase_order.sql | 2 +- ..._get_many_manufacturing_purchase_order.sql | 2 +- static/MySQL/7421_p_shop_save_customer.sql | 2 +- ...5_p_shop_get_many_customer_sales_order.sql | 2 +- static/MySQL/9000_populate.sql | 7 +- static/PostgreSQL/000_combine.sql | 12 +- static/PostgreSQL/600_p_shop_save_product.sql | 2 +- .../PostgreSQL/602_p_shop_save_supplier.sql | 2 +- .../PostgreSQL/605_p_shop_save_customer.sql | 2 +- .../700_p_shop_get_many_product.sql | 2 +- ..._shop_get_many_supplier_purchase_order.sql | 2 +- ..._get_many_manufacturing_purchase_order.sql | 2 +- ...0_p_shop_get_many_customer_sales_order.sql | 2 +- static/css/pages/store/products.css | 76 +++ static/dist/js/main.bundle.js | 2 +- static/js/api.js | 15 + static/js/dom.js | 26 +- static/js/pages/base_table.js | 15 +- static/js/pages/store/products.js | 150 +++++ static/js/router.js | 5 +- templates/components/store/_row_product.html | 24 +- templates/js/sections/store.js | 5 +- templates/pages/store/_products.html | 10 +- webpack.config.js | 5 + 72 files changed, 873 insertions(+), 992 deletions(-) create mode 100644 static/MySQL/7203_p_shop_save_product_test.sql delete mode 100644 static/MySQL/7206_p_shop_save_permutation.sql create mode 100644 static/css/pages/store/products.css create mode 100644 static/js/pages/store/products.js diff --git a/README.md b/README.md index 1e486389..37bef582 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,12 @@ Website with online store Powered by flask +enter virtual environment: +python -m venv VIRTUAL_ENVIRONMENT_NAME + +run module bundler: +npm run build + host for machine: python -m flask run diff --git a/business_objects/__pycache__/sql_error.cpython-312.pyc b/business_objects/__pycache__/sql_error.cpython-312.pyc index 6424161be08335a7c56be75b116d339dcb224ff6..18727de8567c67f9f9778b15419c1b8d7b52f05d 100644 GIT binary patch delta 405 zcmZ3%zes@ZG%qg~0}w1MU`*Fw-^i!P#Mm;~fGJ^e7?Uv9YDSP0149)1WLqXlM#0Gw znN%l#W0C^0E&^F*%pjH^vnnGuR30eG$-~Kz!q&nN#XGs4*@bb^=;Xn~dpgA>+ z@oZoN!R%lLO?JN`CLsGI$ex#A7Bh&&0wP#}geH3tH;}r;o03^vkds&$pI?-cT6Bv& zGbO&HvLJPGIml3WsUGYV&NcChyFPEKaEWaOJXm(|Km1Snr53NnQ) zxTGjEFTF?%Bq9zXBtQhnWks?;VkJY79EdFgB0%sDPc~+YXXRiOEs~o&oo%+Z5>V+aR^R-T)EtO@HIN~2GktQSrKA>3KF@Ma&I%}A><%Ov814v2PUh}ly&B+}fEg5+y zu~|6^gY>fnmlS2@r5A|+IYpu%LJUNRg9vFLv67)k2E>*E5g;4Egffs(Ts66YO=j{s zwm4RHR?#Av$%5>&wH1I8w^)7iQ&Mvvs#QQ*;3oXyu*uC&Da}c>E7G5Qo!vrMj!|?1 P({zrB9A6oLOt3-#Ww1!T diff --git a/business_objects/__pycache__/user.cpython-312.pyc b/business_objects/__pycache__/user.cpython-312.pyc index 112be66af321ad0af0c96aaaa54bcf66d979b725..06e7cefe1b8638038ec45e53e1467c4b7eb85372 100644 GIT binary patch delta 57 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 diff --git a/business_objects/store/__pycache__/product_variation.cpython-312.pyc b/business_objects/store/__pycache__/product_variation.cpython-312.pyc index 189bfe60437902afc22f0990b6f896bda9b95a72..62365a3e91e3de14c2dab133747eed086d78df67 100644 GIT binary patch delta 568 zcmX>c{63KPG%qg~0}w3HXG~Y#$a_nIF=_G(2^Ck?RF)KG8=yogGmymsXR(4=AXzpL zD}}vS$>${PCo4%wbFl*@nSuCo z&*Y7whLbC#BKT7n=dcAcXfpX}vfYwMjGx>fDLz?AT7Gh@wCm)Z(t?a^lTQPAU!-jq zohBQ~h|4@s(YUT+eNn~whO+u~Wy_1omNztXu4_17)Np<WR5fpC=|50ZzM-IU zLsjd+WH(uN_bi}nQ6`9x1Q8M-A_7K~0~y6GK%$l5fsDds7KIy%s+U<*A4o`FW|6)j z4kp3k4>muL-NeXPuz9llZ6?N|$@xl>-1#6=3P42h=E+J$jBF5r$seReHp{DsF|tAB ztW|TNa>bL^seNz;DZ9mzlUZC+2KczG$)vjp5RF)KG8=yogE0DzkW`V?5;Vd>d ziyf|x1H?+PvL4|SPe2A2%6g8YYRj7qKg>eo?FoPzOpC-rT8B$g}Qi<^hJ%^-1c|?%~ zc%)?*IVNjL%d^D;jVVf)>>}-;6ar*6Fg(!Exvt@SQN#I$uHkiE-;27wH?;JwYq?+4 za=$TouCx@_4OPwSs(hUje%Pi72#K9y)R#Nsdi|mcf zJhGb@8A~?rm%GgbjJw&2lHA20<4Qn8`R4tKMT~3^fz9U1T8wN^@pP43sCfD0TdE(N zK}v41hOssPi()gGEqP V{o=66%}*)KNwq7QGPy>h7yw;QrZNBk diff --git a/business_objects/store/__pycache__/store_base.cpython-312.pyc b/business_objects/store/__pycache__/store_base.cpython-312.pyc index 2a48fe6b6e24353b30b67a269ac538827a6333b1..bdb86d5ee80f6569964baa6fdbac1a2c0cfc146e 100644 GIT binary patch delta 20 acmew?{#l&+G%qg~0}!+&Gj8O5!3_XFj|Hdz delta 20 acmew?{#l&+G%qg~0}xE>WZ204f*Sxq-UZzN diff --git a/business_objects/store/product.py b/business_objects/store/product.py index 785c4670..7f1e460d 100644 --- a/business_objects/store/product.py +++ b/business_objects/store/product.py @@ -56,7 +56,7 @@ class Enum_Status_Stock(Enum): class Product(SQLAlchemy_ABC, Store_Base): NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_PRODUCT NAME_ATTR_OPTION_TEXT = Store_Base.FLAG_NAME - FLAG_HAS_VARIATIONS: ClassVar[str] = 'has-variations-product' + # FLAG_HAS_VARIATIONS: ClassVar[str] = 'has-variations-product' FLAG_INDEX_PERMUTATION_SELECTED: ClassVar[str] = 'index-permutation-selected' FLAG_PRODUCT_VARIATION_TREES: ClassVar[str] = 'variation-trees' @@ -74,6 +74,12 @@ class Product(SQLAlchemy_ABC, Store_Base): # has_variations: bool # index_permutation_selected: int + """ + permutations: list = None + permutation_index: dict = None + variation_trees: list = None + """ + def __init__(self): self.permutations = [] self.permutation_index = {} @@ -179,10 +185,26 @@ class Product(SQLAlchemy_ABC, Store_Base): permutation = Product_Permutation.from_DB_Stripe_price(query_row) product = Product.from_permutation(permutation) return product + """ def from_json(json_basket_item, key_id_product, key_id_permutation): permutation = Product_Permutation.from_json(json_basket_item, key_id_product, key_id_permutation) product = Product.from_permutation(permutation) return product + """ + @classmethod + def from_json(cls, json): + product = cls() + product.id_product = json[cls.ATTR_ID_PRODUCT] + product.display_order = json[cls.FLAG_DISPLAY_ORDER] + product.id_category = json[cls.ATTR_ID_PRODUCT_CATEGORY] + product.name = json[cls.FLAG_NAME] + product.has_variations = av.input_bool(json.get(cls.FLAG_HAS_VARIATIONS, None), cls.FLAG_HAS_VARIATIONS, f'{cls.__name__}.from_json') + product.id_access_level_required = json.get(cls.ATTR_ID_ACCESS_LEVEL, None) + product.active = av.input_bool(json.get(cls.FLAG_ACTIVE, None), cls.FLAG_ACTIVE, f'{cls.__name__}.from_json') + product.can_view = json.get(cls.FLAG_CAN_VIEW, None) + product.can_edit = json.get(cls.FLAG_CAN_EDIT, None) + product.can_admin = json.get(cls.FLAG_CAN_ADMIN, None) + return product def get_permutation_selected(self): try: return self.permutations[self.index_permutation_selected] @@ -288,6 +310,7 @@ class Product(SQLAlchemy_ABC, Store_Base): for permutation in self.permutations: list_rows.append(permutation.to_row_permutation()) return list_rows + """ @classmethod def from_json(cls, json): product = cls() @@ -307,6 +330,7 @@ class Product(SQLAlchemy_ABC, Store_Base): for json_tree in json[cls.FLAG_PRODUCT_VARIATION_TREES]: product.variation_trees.append(Product_Variation_Tree.from_json(json_tree)) return product + """ def to_json(self): return { **self.get_shared_json_attributes(self), @@ -422,7 +446,7 @@ class Parameters_Product(Get_Many_Parameters_Base): def from_form_filters_product(form): # if not (form is Filters_Product_Permutation): raise ValueError(f'Invalid form type: {type(form)}') av.val_instance(form, 'form', 'Parameters_Product.from_form', Filters_Product) - has_filter_category = not (form.id_category.data == '0' or form.id_category.data == '') + has_filter_category = not (form.id_category.data == '0' or form.id_category.data == '' or form.id_category.data is None) is_not_empty = av.input_bool(form.is_not_empty.data, "is_not_empty", "Parameters_Product.from_form_filters_product") active = av.input_bool(form.active.data, "active", "Parameters_Product.from_form_filters_product") return Parameters_Product( @@ -812,4 +836,50 @@ class Parameters_Product(Get_Many_Parameters_Base): @classmethod def from_filters_stock_item(cls, filters_stock_item): return cls.from_form_filters_product_permutation(filters_stock_item) -""" \ No newline at end of file +""" + +class Product_Temp(db.Model, Store_Base): + __tablename__ = 'Shop_Product_Temp' + __table_args__ = { 'extend_existing': True } + id_product: int = db.Column(db.Integer, primary_key=True) + id_category: int = db.Column(db.Integer) + name: str = db.Column(db.String(255)) + has_variations: bool = db.Column(db.Boolean) + id_access_level_required: int = db.Column(db.Integer) + active: bool = db.Column(db.Boolean) + display_order: int = db.Column(db.Integer) + guid: str = db.Column(db.BINARY(36)) + # created_on: datetime = db.Column(db.DateTime) + # created_by: int = db.Column(db.Integer) + + @classmethod + def from_product(cls, product): + row = cls() + row.id_product = product.id_product[0] if isinstance(product.id_product, tuple) else product.id_product + row.id_category = product.id_category[0] if isinstance(product.id_category, tuple) else product.id_category + row.name = product.name[0] if isinstance(product.name, tuple) else product.name + row.has_variations = product.has_variations + row.id_access_level_required = product.id_access_level_required[0] if isinstance(product.id_access_level_required, tuple) else product.id_access_level_required + row.active = product.active + row.display_order = product.display_order + """ + row.guid = product.guid + row.created_on = product.created_on + row.created_by = product.created_by + """ + return row + def to_json(self): + return { + 'id_product': self.id_product, + 'id_category': self.id_category, + 'name': self.name, + 'has_variations': av.input_bool(self.has_variations, self.FLAG_HAS_VARIATIONS, f'{self.__class__.__name__}.to_json'), + 'id_access_level_required': self.id_access_level_required, + 'active': av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json'), + 'display_order': self.display_order, + 'guid': self.guid, + } + """ + 'created_on': self.created_on, + 'created_by': self.created_by + """ diff --git a/business_objects/store/product_category.py b/business_objects/store/product_category.py index edad544d..cf000111 100644 --- a/business_objects/store/product_category.py +++ b/business_objects/store/product_category.py @@ -45,6 +45,12 @@ class Product_Category(SQLAlchemy_ABC, Store_Base): can_admin = db.Column(db.Boolean) created_on = db.Column(db.DateTime) created_by = db.Column(db.Integer) + + """ + products: list = None # [] + product_index: dict = None # {} + """ + def __init__(self): self.products = [] self.product_index = {} @@ -95,6 +101,7 @@ class Product_Category(SQLAlchemy_ABC, Store_Base): # self.product_index[Category.key_product_index_from_ids_product_permutation(product.id_product, product.id_permutation)] = len(self.products) try: self.get_index_product(product) + print(f'category: {self}') raise ValueError(f"{av.error_msg_str(product, 'product', _m, Product)}\nProduct already in category.") except KeyError: self.product_index[product.id_product] = len(self.products) @@ -441,7 +448,7 @@ class Table_Shop_Product_Category(db.Model): created_by: int = db.Column(db.Integer) id_change_set: int = db.Column(db.Integer) """ -class Product_Category_Temp(db.Model): +class Product_Category_Temp(db.Model, Store_Base): __tablename__ = 'Shop_Product_Category_Temp' __table_args__ = { 'extend_existing': True } id_category: int = db.Column(db.Integer, primary_key=True) diff --git a/business_objects/store/product_variation.py b/business_objects/store/product_variation.py index 45998b77..63f1e2a6 100644 --- a/business_objects/store/product_variation.py +++ b/business_objects/store/product_variation.py @@ -120,22 +120,22 @@ class Product_Variation(db.Model, Store_Base): class Product_Variation_Filters(): get_all_variation_type: bool get_inactive_variation_type: bool - get_first_variation_type: bool + # get_first_variation_type: bool ids_variation_type: str get_all_variation: bool get_inactive_variation: bool - get_first_variation: bool + # get_first_variation: bool ids_variation: str def to_json(self): return { 'a_get_all_variation_type': self.get_all_variation_type, 'a_get_inactive_variation_type': self.get_inactive_variation_type, - 'a_get_first_variation_type': self.get_first_variation_type, + # 'a_get_first_variation_type': self.get_first_variation_type, 'a_ids_variation_type': self.ids_variation_type, 'a_get_all_variation': self.get_all_variation, 'a_get_inactive_variation': self.get_inactive_variation, - 'a_get_first_variation': self.get_first_variation, + # 'a_get_first_variation': self.get_first_variation, 'a_ids_variation': self.ids_variation, } @@ -170,11 +170,11 @@ class Product_Variation_Filters(): return Product_Variation_Filters( get_all_variation_type = True, get_inactive_variation_type = False, - get_first_variation_type = False, + # get_first_variation_type = False, ids_variation_type = '', get_all_variation = True, get_inactive_variation = False, - get_first_variation = False, + # get_first_variation = False, ids_variation = '' ) diff --git a/business_objects/user.py b/business_objects/user.py index 9b15cbe5..d6b3f457 100644 --- a/business_objects/user.py +++ b/business_objects/user.py @@ -186,7 +186,7 @@ class User_Filters(): @staticmethod def get_default(datastore_store): - user = datastore_store.get_login_user() + user = datastore_store.get_user_session() return User_Filters( get_all_user = False, get_inactive_user = False, diff --git a/controllers/store/__pycache__/product.cpython-312.pyc b/controllers/store/__pycache__/product.cpython-312.pyc index 08f1f1c8b41acf53707976e011a8d29e7e66b472..26e3517c6a6abcf45fa51f6a6d68009c88d91288 100644 GIT binary patch delta 210 zcmZ3hzfYg z0GeOS0VEWlphy$Qxy1w4QBahhQkq;+~`vFw_F+%`XJx85!9pa|o%~@Z{#Fq~^pIrIwTyUl;?;?lZijwseD=T(z9i7m>AtAFA$SrjG4S!>_1C1P$K|cbTz;L diff --git a/controllers/store/product.py b/controllers/store/product.py index a75c452b..045b0bd5 100644 --- a/controllers/store/product.py +++ b/controllers/store/product.py @@ -158,7 +158,7 @@ def save_product(): objsProduct.append(Product.from_json(product)) # model_save = Model_View_Store_Product() # filters_product=filters_form) print(f'objsProduct={objsProduct}') - Model_View_Store_Product.save_products(data.get('comment', 'No comment'), objsProduct) + save_errors = Model_View_Store_Product.save_products(data.get('comment', 'No comment'), objsProduct) model_return = Model_View_Store_Product(form_filters=form_filters) print('nips') diff --git a/datastores/__pycache__/datastore_store_base.cpython-312.pyc b/datastores/__pycache__/datastore_store_base.cpython-312.pyc index a013c471ac294a6c264aaca61f0422eb276bfe9a..c11041606f3c117f29dcb9d11b73ed5d33e24621 100644 GIT binary patch delta 3887 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 F|6ebd=HvhX delta 3480 zcmZ`+Yit|G5xyfSK93KP;`<>=mPAnx(-P&EEK9Z}J9caN9VfZiVQAi2CUqw%dz4eT zrz&U*ghA9g?zX6lq=^lrNNS^iQT^$U0#4BsP2nFAp%@g105#A*{gI+-;sR}db>=8q zs_GoT?`CIbznPt#-97#(f9JB}f!%Ip;JMMuPW)}p4M%{zdL!|@1=-L0Sw>(5n-q|P zd{C1)DI|yauqNB3h#cjka*U73&3v<_b4YQyg>R8t`Br%wzfErA+cdpXYL`3s4o!AR z3AvN+)Z|7fDR=Q*n(UUk}) zTXMPyCa1gT*J9XPw=N87`5duYhHvN=g9f0Qx2Qn~HUWmAO>XUKsDKN<<$0SC9MCgN z&)E~~L0G=fd6uy-o8k#>iRTlI{`W}#bV|WF3FV`(i=N`4y0^k%j8l(}ph939YtMXG z4MV6u0Imqs#xvTgMC$&YQa_Huu`M=H)lv8c>TFT1#$sx$Fuuj68FVL5x6rKF#08fc z&p?c|M`*+Z)LR?xtBm3l++W+rF1{{!fG1fWv3T9UEdBwCdSlkl*86I2`sY}K(^#J$ zY&B!yIZU|^M3Wl4tUC)!%))Qp@+y;TqVKxK97G3WtEOy55HHP6&^6b^xQk?8jpwpO zablX}MP)F4&AHy1%Sd^pNJH+UzGP2Tm%Uo$u4bi7eo853r*a~3(I2^g$%bgGDRjDO z%L|$MxT2cc$Hd_&>Y_T&c_ZeJ+b z-UHw>B5bL6@O=m1KqMKek*dzvFu2FX5O)8W}4z( zG6u{3(&*>m?n?MXIeg+1WhH#JbbQUo*h3X=dzst*q56;;TC;!|y&ni%c`_;uqe3l} z&{#P%_R-mu(6Q1tSEF5(=;3no@JExCBNxj@F0MphDxFyMw^jV9vOjgtQTC6Nj;?aS z3fErd+HXxh^B$IV>8m<1$nz0E62_) zKl}Vj?1j?F4Uf~6BiZti>`L^~*LdtJbA9(x54l6=ag=>*eX7e*n7J=dvaX_2y=4S^ zMtUoeQ{~91<EkPas+e94H44eB@aP94;MO<=ofD-x$A{{ETZ`GZ^fyHLI5M?lRZ?;jxF@t~C#g zTZ=564lc5>N6yI2%gfHTWpmrVzdXn?zHwGDLRCE28#(PUEZq+q*aiZ36GIoY20>>&tE&(L1L_k@j9r3=MS5VX#3LwF5sttnONhY!D0DyuYHSs48Nz=vnF#9Qe z5Wmk3EWO$CNA~h{w8afi-a>#2hq-1U;sk6p*yiB!Y2hMm)lm<(X1yg?k^`HKh<~%K zw|`5-rgbm1a7V!W|HJjS4YGfwXWBl7H2T}$PyGa}$UDevSkDD2evI%ofMNi^=@MLq zYJ^5RBGlNC*6CQfuVYtu0JJ%rZ2iH!6@9D%?kvsXoeg{7)97p zNo=136dbQQ`)N+0c zyF`GhL5pXCMtcIr+UnAMJ%j8dz1q_rBSo~EMYx7AhwyCx#RC9ms>f7YrVzc~6{3%O z`ivI1r4=jf?mZq2#omkjEV3F5{lnA{v%=BW*jjNV%dX^#t9xzfz1};l!5KNKr{k$! zV<$4V(brO;1-u$b7eY4zexXA0q^zRIV)4qfK)#C_4lbu+KDVyo(eg=Uk$18AD>Sob zGTP9bC`p-2k|q71Rq#vVfEIZzKbR!+qf}v5!5uHVzr!}Pf2C)PjcYm-*A5uyn>z|N zEIw^Sa^%;2udzC~8t41taDBbopGdf&v+BJxtK_FdMafKGDu}tFvVB$&3Bh!cCIm12 zqJO)~haxUytw4gbE8Xl4LAz=dzf}~c6x_QcOkYe#*$ACW_b*^c!SMoVn9L}zNLeX& zMU>}AR2#EN5krMhDU$q*Sk+A{)dp=0X$C!sBebA}d1g+?PC)`mE9$nP&ImP@pPC?T zsA)&gil-MPuQqkulK(Le$?!Kq5{Jn$9U1616jqo5ogEl$ya2cB&EbDC_$FxoUnJpJ AM*si- diff --git a/datastores/__pycache__/datastore_store_product_category.cpython-312.pyc b/datastores/__pycache__/datastore_store_product_category.cpython-312.pyc index 2c962cc47e14cdda9a63883cb450e86377f3a944..28cef3c11cd54971499e67c17bb69ff309f20d33 100644 GIT binary patch delta 98 zcmeyb_+OFhG%qg~0}x!z+{l&1A<0<7Qp1)d0}??6lY2QnN+sv#=BDPA++s_NPcO|( nxy6|npP3S0TAW(6c?Rb}CT_(WVp2CGW#`Mxl-ZoZGn)kf#UC5b delta 84 zcmeyb_+OFhG%qg~0}#|oY~;$~U}npbnH@NlJj$OQ}ar0u_eZ* qmu9Bi;!KRsOo=ZoPA%HZ#Gb{(t$0IB>V~B3e3_Xto69+8F#!NBt{Ei& delta 87 zcmbOzF;Rl|G%qg~0}#l5{*=bMkyo0HnJr6h@<&!-X2u$p$&PHxr7~0EON&#BZgD2Y rC+FwprskF0VoQuqFU?HZ%*39>#4R^pW~R&yNrf9?Qk%;;XE6Z)YtkEH diff --git a/datastores/__pycache__/datastore_store_stock_item.cpython-312.pyc b/datastores/__pycache__/datastore_store_stock_item.cpython-312.pyc index d1624db0399283e4f2bb6a9a4e8e98139fe118ad..030ca917da8e57182739cd7f0c83d41c49e106cd 100644 GIT binary patch delta 200 zcmcbo`dyXpG%qg~0}wnlVN6dG*~llr#@I1go~=@glOctb!nuc;F=+Ef-eN{p30Bo_ hW}7wnt(h5%C#MQ!3b`;cs$Nhu{mKAh6zKr%0s!!PFS`H$ delta 175 zcmeyadQX+_G%qg~0}yP{WlTRIypd0Ujj?UAJX@tk4Qmz$NCFkqu%s~C0EJRmfGk!J zYx5yCTSmSjCLr?`dt!V_YEo(XW?qg-jEwsxFW|J6zM-nQJZ51`2k(UJiyTTflvRMN z%!?cfcQ|-Ab93!sX7t{Cg14BFRghKno5p4bersmN!pSv4nF6+qsuvVZzcK*nA|0UV E0L9-cXaE2J diff --git a/datastores/datastore_store_base.py b/datastores/datastore_store_base.py index c798aa82..947b68dd 100644 --- a/datastores/datastore_store_base.py +++ b/datastores/datastore_store_base.py @@ -20,7 +20,7 @@ from business_objects.store.delivery_option import Delivery_Option from business_objects.store.delivery_region import Delivery_Region from business_objects.store.discount import Discount from business_objects.store.order import Order -from business_objects.store.product import Product, Product_Permutation, Product_Price, Parameters_Product +from business_objects.store.product import Product, Product_Permutation, Parameters_Product from business_objects.sql_error import SQL_Error from business_objects.store.stock_item import Stock_Item from business_objects.user import User, User_Filters, User_Permission_Evaluation @@ -61,8 +61,15 @@ class DataStore_Store_Base(DataStore_Base): av.val_instance(product_filters, 'product_filters', _m, Parameters_Product) argument_dict = product_filters.to_json() user = cls.get_user_session() + """ argument_dict['a_id_user'] = user.id_user # 'auth0|6582b95c895d09a70ba10fef' # id_user argument_dict['a_debug'] = 0 + """ + argument_dict = { + 'a_id_user': user.id_user + , **argument_dict + , 'a_debug': 0 + } print(f'argument_dict: {argument_dict}') print('executing p_shop_get_many_product') result = cls.db_procedure_execute('p_shop_get_many_product', argument_dict) @@ -71,77 +78,57 @@ class DataStore_Store_Base(DataStore_Base): category_list = Product_Category_Container() + print(f'initial category_list: {category_list}') + # Categories result_set_1 = cursor.fetchall() print(f'raw categories: {result_set_1}') - # categories = [Product_Category(row[0], row[1], row[2], row[3]) for row in result_set_1] - # categories = [] - # category_index = {} for row in result_set_1: - new_category = Product_Category.from_DB_get_many_product_catalogue(row) # Product_Category(row[0], row[1], row[2], row[3]) - # category_index[new_category.id_category] = len(categories) - # categories.append(new_category) + new_category = Product_Category.from_DB_get_many_product_catalogue(row) + print(f'new_category: {new_category}') category_list.add_product_category(new_category) - # print(f'categories: {[c.id_category for c in categories]}') + + print(f'category-loaded category_list: {category_list}') # Products cursor.nextset() result_set_2 = cursor.fetchall() - # print(f'products: {result_set_2}') - # products = [] # [Product(**row) for row in result_set_2] - # product_index = {} + print(f'raw products: {result_set_2}') for row in result_set_2: - new_product = Product.from_DB_get_many_product_catalogue(row) # (row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14], row[15], row[16], row[17], row[18], row[19]) - index_category = category_list.get_index_category_from_id(new_product.id_category) - category = category_list.categories[index_category] - category_list.add_product(new_product) - # products.append(new_product) - print(f'category_list: {category_list}') + print(f'row: {row}') + new_product = Product.from_DB_get_many_product_catalogue(row) + print(f'new_product: {new_product}') + try: + category_list.add_product(new_product) + except Exception as e: + print(f'Error adding product: {e}') # Permutations cursor.nextset() result_set_3 = cursor.fetchall() - # print(f'Permutations: {result_set_3}') - permutations = [] # [Product(**row) for row in result_set_2] - # permutation_index = {} for row in result_set_3: - new_permutation = Product_Permutation.from_DB_get_many_product_catalogue(row) # (row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14], row[15], row[16], row[17], row[18], row[19]) - index_category = category_list.get_index_category_from_id(new_permutation.id_category) - category = category_list.categories[index_category] - category_list.add_product_permutation(new_permutation) - print(f'category_list: {category_list}') + new_permutation = Product_Permutation.from_DB_get_many_product_catalogue(row) + try: + category_list.add_product_permutation(new_permutation) + except Exception as e: + print(f'Error adding permutation: {e}') # Product_Variations cursor.nextset() result_set_4 = cursor.fetchall() - # print(f'variations: {result_set_4}') - # variations = [Product_Variation(**row) for row in result_set_4] - variations = [] for row in result_set_4: new_variation = Product_Variation.from_DB_get_many_product_catalogue(row) - variations.append(new_variation) - category_list.add_product_variation(new_variation) - # print(f'variations: {variations}') - # print(f'products: {[p.id_product for p in products]}') + try: + category_list.add_product_variation(new_variation) + except Exception as e: + print(f'Error adding variation: {e}') # Images cursor.nextset() result_set_5 = cursor.fetchall() - # print(f'images: {result_set_5}') - # images = [Image(**row) for row in result_set_5] - images = [] for row in result_set_5: - new_image = Image.from_DB_get_many_product_catalogue(row) # (row[0], row[1], row[2], row[3], row[4]) - images.append(new_image) - # products[product_index[new_image.id_product]].images.append(new_image) - """ - index_category = category_index[new_image.id_category] - index_product = categories[index_category].index_product_from_ids_product_permutation(new_image.id_product, new_image.id_permutation) - categories[index_category].products[index_product].images.append(new_image) - """ + new_image = Image.from_DB_get_many_product_catalogue(row) category_list.add_product_image(new_image) - # print(f'images: {images}') - # print(f'products: {[p.id_product for p in products]}') # Errors cursor.nextset() @@ -181,6 +168,7 @@ class DataStore_Store_Base(DataStore_Base): DataStore_Store_Base.db_cursor_clear(cursor) cursor.close() + print(f'get many category_list: {category_list}') return category_list, errors # categories, category_index """ @@ -283,8 +271,8 @@ class DataStore_Store_Base(DataStore_Base): argument_dict_list = { # 'a_guid': guid 'a_id_user': user.id_user - , 'a_debug': 0 , **variation_filters.to_json() + , 'a_debug': 0 } # argument_dict_list['a_guid'] = guid result = cls.db_procedure_execute('p_shop_get_many_product_variation', argument_dict_list) diff --git a/datastores/datastore_store_product.py b/datastores/datastore_store_product.py index bdf25f78..6fcc8dc5 100644 --- a/datastores/datastore_store_product.py +++ b/datastores/datastore_store_product.py @@ -12,20 +12,8 @@ Datastore for Store Products # internal import lib.argument_validation as av -from business_objects.store.basket import Basket, Basket_Item -from business_objects.store.product_category import Product_Category_Container, Product_Category -from business_objects.store.currency import Currency -from business_objects.store.image import Image -from business_objects.store.delivery_option import Delivery_Option -from business_objects.store.delivery_region import Delivery_Region -from business_objects.store.discount import Discount -from business_objects.store.order import Order -from business_objects.store.product import Product, Product_Permutation, Product_Price, Parameters_Product from business_objects.sql_error import SQL_Error -from business_objects.store.stock_item import Stock_Item -from business_objects.user import User, User_Filters, User_Permission_Evaluation -from business_objects.store.product_variation import Product_Variation, Product_Variation_Filters, Product_Variation_Container -# from datastores.datastore_base import Table_Shop_Product_Category, Table_Shop_Product_Category_Temp +from business_objects.store.product import Product, Product_Permutation, Product_Price, Parameters_Product, Product_Temp from datastores.datastore_store_base import DataStore_Store_Base from helpers.helper_db_mysql import Helper_DB_MySQL # from models.model_view_store_checkout import Model_View_Store_Checkout # circular! @@ -56,6 +44,7 @@ class Table_Shop_Product_Category(db.Model): created_by: int = db.Column(db.Integer) id_change_set: int = db.Column(db.Integer) """ +""" class Row_Shop_Product_Temp(db.Model): __tablename__ = 'Shop_Product_Temp' __table_args__ = { 'extend_existing': True } @@ -80,50 +69,70 @@ class Row_Shop_Product_Temp(db.Model): return row def to_json(self): return { + 'id_product': self.id_product, 'id_category': self.id_category, 'name': self.name, + 'has_variations': self.has_variations, 'id_access_level_required': self.id_access_level_required, 'active': av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json'), 'display_order': self.display_order, 'guid': self.guid, } - +""" class DataStore_Store_Product(DataStore_Store_Base): def __init__(self): super().__init__() @classmethod - def save_categories(cls, comment, categories): - _m = 'DataStore_Store_Product_Category.save_categories' + def save_products(cls, comment, products): + _m = 'DataStore_Store_Product.save_products' print(f'{_m}\nstarting...') - print(f'comment: {comment}\ncategories: {categories}') - # av.val_str(comment, 'comment', _m) - # av.val_list_instances(categories, 'categories', _m, Product_Category, 1) + print(f'comment: {comment}\nproducts: {products}') guid = Helper_DB_MySQL.create_guid() user = cls.get_user_session() rows = [] - id_category_new = 0 - for category in categories: - row = Row_Shop_Product_Temp.from_product(category) - if row.id_category == '': - id_category_new -= 1 - row.id_category = id_category_new + id_product_new = 0 + for product in products: + row = Product_Temp.from_product(product) + if row.id_product == '': + id_product_new -= 1 + row.id_product = id_product_new else: - print(f'row.id_category: {row.id_category}') + print(f'row.id_product: {row.id_product}') row.guid = guid rows.append(row) print(f'rows: {rows}') - - DataStore_Store_Base.upload_bulk(rows, Row_Shop_Product_Temp, 1000) + DataStore_Store_Base.upload_bulk(Product_Temp.__tablename__, rows, 1000) argument_dict_list = { - 'a_id_user': user.id_user, - 'a_guid': guid, 'a_comment': comment, + 'a_guid': guid, + 'a_id_user': user.id_user, + 'a_debug': 0, } save_result = cls.db_procedure_execute('p_shop_save_product', argument_dict_list) + + cursor = save_result # .cursor + print('data received') + + # Errors + # cursor.nextset() + result_set_e = cursor.fetchall() + print(f'raw errors: {result_set_e}') + errors = [] + if len(result_set_e) > 0: + errors = [SQL_Error.from_DB_record(row) for row in result_set_e] # (row[0], row[1]) + for error in errors: + print(f"Error [{error.code}]: {error.msg}") + try: + DataStore_Store_Base.db_cursor_clear(cursor) + except Exception as e: + print(f'Error clearing cursor: {e}') + cursor.close() + save_result.close() print('save procedure executed') + return errors diff --git a/datastores/datastore_store_product_category.py b/datastores/datastore_store_product_category.py index 3a2d103f..553615f7 100644 --- a/datastores/datastore_store_product_category.py +++ b/datastores/datastore_store_product_category.py @@ -89,9 +89,9 @@ class DataStore_Store_Product_Category(DataStore_Store_Base): DataStore_Store_Base.upload_bulk(Product_Category_Temp.__tablename__, rows, 1000) argument_dict_list = { - 'a_id_user': user.id_user, - 'a_guid': guid, 'a_comment': comment, + 'a_guid': guid, + 'a_id_user': user.id_user, } save_result = cls.db_procedure_execute('p_shop_save_product_category', argument_dict_list) save_result.close() diff --git a/datastores/datastore_store_product_permutation.py b/datastores/datastore_store_product_permutation.py index 15121ae8..23ac372a 100644 --- a/datastores/datastore_store_product_permutation.py +++ b/datastores/datastore_store_product_permutation.py @@ -95,9 +95,9 @@ class DataStore_Store_Product_Permutation(DataStore_Store_Base): print('bulk uploaded') argument_dict_list = { - 'a_id_user': user.id_user, 'a_comment': comment, - 'a_guid': guid + 'a_guid': guid, + 'a_id_user': user.id_user, } cls.db_procedure_execute('p_shop_save_product_permutation', argument_dict_list) print('saved product permutations') diff --git a/datastores/datastore_store_product_variation.py b/datastores/datastore_store_product_variation.py index c7163801..e44263a0 100644 --- a/datastores/datastore_store_product_variation.py +++ b/datastores/datastore_store_product_variation.py @@ -27,7 +27,7 @@ from business_objects.store.stock_item import Stock_Item from business_objects.user import User, User_Filters, User_Permission_Evaluation from business_objects.store.product_variation import Product_Variation, Product_Variation_Filters, Product_Variation_Container from datastores.datastore_store_base import DataStore_Store_Base -# from helpers.helper_db_mysql import Helper_DB_MySQL +from helpers.helper_db_mysql import Helper_DB_MySQL # from models.model_view_store_checkout import Model_View_Store_Checkout # circular! from extensions import db # external @@ -41,59 +41,9 @@ from pydantic import BaseModel, ConfigDict from typing import ClassVar from datetime import datetime -# db = SQLAlchemy() class DataStore_Store_Product_Variation(DataStore_Store_Base): - # Global constants - # Attributes def __init__(self, **kwargs): - super().__init__(**kwargs) - - def get_many_product_variation(self, variation_filters): - _m = 'DataStore_Store_Product_Variation.get_many_product_variation' - print(_m) - av.val_instance(variation_filters, 'variation_filters', _m, Product_Variation_Filters) - - guid = Helper_DB_MySQL.create_guid() - # now = datetime.now() - # user = self.get_user_session() - - """ - argument_dict_list = { - 'a_id_user': id_user, - 'a_comment': comment, - 'a_guid': guid - } - """ - user = self.get_user_session() - argument_dict_list = { - # 'a_guid': guid - 'a_id_user': user.id_user - , **variation_filters.to_json() - } - # argument_dict_list['a_guid'] = guid - result = self.db_procedure_execute('p_shop_get_many_product_variation', argument_dict_list) - - cursor = result.cursor - result_set = cursor.fetchall() - - # Product_Variations - variations = Product_Variation_Container() - for row in result_set: - new_variation = Product_Variation.from_DB_variation(row) - variations.add_product_variation(new_variation) - - errors = [] - cursor.nextset() - result_set_e = cursor.fetchall() - print(f'raw errors: {result_set_e}') - if len(result_set_e) > 0: - errors = [SQL_Error.from_DB_record(row) for row in result_set_e] # [SQL_Error(row[0], row[1]) for row in result_set_e] - for error in errors: - print(f"Error [{error.code}]: {error.msg}") - - DataStore_Store_Product_Variation.db_cursor_clear(cursor) - - return variations, errors \ No newline at end of file + super().__init__(**kwargs) \ No newline at end of file diff --git a/datastores/datastore_store_stock_item.py b/datastores/datastore_store_stock_item.py index 28d70b4e..806dab05 100644 --- a/datastores/datastore_store_stock_item.py +++ b/datastores/datastore_store_stock_item.py @@ -58,8 +58,15 @@ class DataStore_Store_Stock_Item(DataStore_Store_Base): av.val_instance(Parameters_Stock_Item, 'Parameters_Stock_Item', _m, Parameters_Stock_Item) argument_dict = Parameters_Stock_Item.to_json() user = self.get_user_session() - argument_dict['a_id_user'] = user.id_user # 1 # 'auth0|6582b95c895d09a70ba10fef' # id_user + """ + argument_dict['a_id_user'] = user.id_user # 'auth0|6582b95c895d09a70ba10fef' # id_user argument_dict['a_debug'] = 0 + """ + argument_dict = { + 'a_id_user': user.id_user + , **argument_dict + , 'a_debug': 0 + } print(f'argument_dict: {argument_dict}') print('executing p_shop_get_many_stock_item') result = self.db_procedure_execute('p_shop_get_many_stock_item', argument_dict) diff --git a/forms/__pycache__/base.cpython-312.pyc b/forms/__pycache__/base.cpython-312.pyc index e5a06a3b1343d682e8bb8dc5c5b2b77989ef9f7f..5ba3183424ed4cdd2500c036250a6a6eb5f4337e 100644 GIT binary patch delta 550 zcmaDLa9Ei4G%qg~0}$A_GNvEi$h(7yF=_HKCS#KnmKKK9APFFd;^1URWldp465#~$ z*^u~LmF$`vn?;$+nHh^G_p-@qFah;31Mz18ATgbRiJ=B=TrfkC5>T*+8%V62e2mSq zzL*opY+!iEFVtPy!BfNo`F8Pge37}FVp88n&vG?{KO++qt(%}Grz z0UKAO4pdMKQm#sOWmieNOm#t5VDpa z{UC=mFgy^DyTC7hfkS@s3^t`yMzD27S|CH29dmN9TgQj6Es{6K*BG%qg~0}$M9XGk~L$h(7y(QEQCCS#dYwiK2YhSeY`Ab`7(TEuaPm$*z^=r@P^1JDDdGkanv-9#S@IUCf%rT?!cUWPvO9;>gVl10n&7@eL!j#UqhIutJNRojeij|2Wl`Vy3 zH6xVI4(7AM`5dX7DQqnat0B@1QCunPEeuiIKv51PQJzXpO|Dz~ZkahHsYS){0Y&*K zrO73?IGhtpQq%K`Dm9sIG2CKy%*oN*#4OLOED1ENND4$qg9sTQp~-lQr8qSwtr+AG zg(8K?PHY`kN3s#t)8WG-^ZT;Wi>A*Zy!VrE_kdp}<%-xUt& z8~kD&d_|zp^3&vTot%?cT%4O)l98WMqzIBz0})z4VkHAu zH`u8~LLgBPApyk2p+KUA;ii!6jI50ro3l2=obWzjdqpU6ax}Z9)F&QBRu`rRtO6gI zSXsqCGc&LWf>}jMlY7|bD(izx0yzt8@GlOVTwuD$Nwq671&V=!x>$Fz4~H7RFr)Z{ L%&!bU3alCcaxj%A delta 330 zcmbOy(k#e#nwOW00SL}YFs3)KZsf~hVoaG_&7|m&&aj4QH8V(xfgy^Oi6NCOg?Tk2 zl+O<4v%vWrshlaSEexw6(hN~tDQqnaQQVd6njDkAG0AO~WtL@D76-}}Nq`7R5FrI5 zG#PKP6sP8-6@v^`D3Y5T%htiJ0A%}V@=Olp(2oY|VFwC8G=lWp;!e&7F zDUt`tsQ`(U3`Ghcwj78Mf)OC=iXDMO3&Twz*%?_IGd5>!h&f?&MaXaRGY(CT&peE* zE=)xVlQlW#Dr6XOzDhkm{&7{GldP#=K}ND;e2jRh7^t#hA5s?-W1Lj2AH`~ ze3e|9%-px6C+o3FPd>oR%f@hv*)b<)^C{*vY}|4{!;7Rrg#6@2E>T8>$AR_ zw*=jM9NpssLmmA>JVPSmeLek(l(30AMiePe{=+5DsJdB(JD!nK9jM4plfOuBatn_} zJ=g*TpimJfhya;f!~-HgW)&%e2sI#ai#s_dvA8%lwIm}yrN{&*vXY?)WKxkTh!BGj zGC)RgI*@2#xG5w%BWq*E=By1dC%jMCUJ;6H@V+T1Gb3`N$7Zh$HYc=C$X*d-44%gc!Ig_`VQG4=J-q}(XAhX~`|KhO8%}*)KNwq6-o;-`sg9Ri5045G+8vpblxjur-(sZo5D zoSIy>q}?Xluu5^=;&4tZNlni$s@!~?c@3MQ4AAf*Nf03mByRCLhJ*ygd%DC21o^v! zI)@a=O6(TCU-m|rz%jNpC*5i&g6+a8ueiF z0Dz5spOm{Zd^T%u7Cm*|Ieab5IY7Ic&3x#%)& z0t7w~hf;QQ>(p(aeuJ1Sjfv4jqhCy%i69zGvn)o;-ozo;xiOu3o(nAXgZJkCd!FBU zd7g8gzBdTJ4}$ZI(^<*rX-~ku&rdsJCMXqBrcz~JpJr1__mf9mOpj=<(dw#LNlbfP z{bTCdB#11=(xX~V8&j_jvB_0%>o3@Si9U8)Oe$!Zz9GG1j_;pieyfGFkiz9+17( zc{24=n3D&iHFd-05&I8*WzL_N@h67O-&fRMs|CCK8zZ@)J1F$Cs&>Wng<@%Mwc)2t z9^4t&>N!t5Bo$41FE3j5_Z-xCNaB}pJWvCd@xwri&rCO}yD6%lops%j+j2NN=km|E z{If23x<=?L){mQQE&NR5~BEZu$lNuunW%P-cW@2NT?GwC+9JiWdpb2P)m`v%(M=8w~Mr=$?~S2ZhGO==I%#mOLj(d>$WYYj*!4_!S{5LT(CK z!hyCO^%sO`q#1wVI89E?-&lun%&r++H7gCB$wOqLcO fSSY-*?KC*b3gMRRyEbq$cyrz38?G{88C(1dIz4Pu delta 1170 zcmZvaTWAw$6vyYAbdt1bOtI~nYK=*gv@?lm+C*Et&}dijhS~>lHGZg;T>O~)2^Hi~)Z_9P>WN&ggUDw2b32Kj)U7XQol-jGukBn< zwiFlt9naqk=hI3j#&QO7MkmBT&gz6`q&{0GeojXwLr|Aaat!3WP6Pw#-uYUzWNIDT z3gGgLXQU4fx&!!(JK>tQt-|B)_e6R< zk-a&8SzRBBNv?O8Lm5?V7;`hf-etPu66z};>1zl+M#{Fn~VmoE4(98;@X{s7G28S!cM1&g^K|OT?EEXHcAeSlAEYC@HJ41k<)^kkhcUyGrJEh1h*t7 zv{nf)R#^c3!5EnXQ)XWAjnC`Aolq;20=7mIrc7L=78y^S3MHXMWIk*Rtu`OWfKwcF zg^$6q%B9&Bvkfhr@St*uGsbGI!_Zc4z&2@bOP{T@oBV0>Kvj6Tc?kIy0`6eZf7R}0 zE6p9RlyWX+71sZ6g%a>pM{v-es`uldPpkd70Bd9=SpjP!o#X|)j)+K{(HL0;>!Lr} zSU;+ddm(cv`k04(HB#{_2HC$#KQZ~jWEk$%EONbIrkTBoj8xlYf!?}V tf=h_LSpa#lS>#`c#SW06%>CF^Vl$+}o`vfRcjS=i9m(#(5sq1U;qQM7WS{^5 diff --git a/models/__pycache__/model_view_store.cpython-312.pyc b/models/__pycache__/model_view_store.cpython-312.pyc index eb267538382646e1c465539e7616de974af8cbfc..9b2631b7495e8b248292ee71e03683271072ab52 100644 GIT binary patch delta 58 zcmaFAjPd<4My}Jmyj%=G@F#pD*Jts`+7fw_|BCBvo++VdHu$CXeYze)|f5r1Q&y-L!bZ+`CA!2$qMUllI^ diff --git a/models/__pycache__/model_view_store_product.cpython-312.pyc b/models/__pycache__/model_view_store_product.cpython-312.pyc index 70dd8b935172007618d067e48431d4f99fe80a1c..d9585874a88412765ea1c06e946c5c4323bdbe25 100644 GIT binary patch delta 2352 zcma)8U2GFa5Z*hVl)MIS2lp%PUqP#rw*m5fkYc9ZtY30^ne$7n$NG5&h>Qr6&Xns!wT7+9 znw0y5n*mn9f_;+IWyHvlJUXJNbJiz{KKZqvbdQjw4>?2W}FSr)?587X<= zcgA62Ch#+^jZKt{fF2sej7`Wpt1Qg1N*3 z3U8o<(?DfPG*_2r_#<3BPM@2+k3ca+Zrt98gLI10b3!1gTm!;ibajB_LL1EtkM2+;T~n z#DmylXf4ySr=mrKqV+!`q?|05c&RLJpsP0gYL%yJBMv!hg;{nIp@1P-ro^~UEzJ`f zdn#78l(B)%F^Lufm+1>N->hopTMao9wJkId906^ZG1W%cCH7*712HxSX(VH;;5LLS z3@52nd9{W_;yLCeTBtM3HoO2Ewwxr{OY*1Q*g&wyz_}`-bSDw>^FD(|INkVj=(pC8 zOSNTfiC#PkJ&iVEWUXeTjc6$607wkb{XPDQ{euQB(;@JlJ;qKE=S~sla`vn}u^Z=M za|^i-VY4Au;qD94XW)71GfUJmTKvu$$hLv(XF)qZIv2z)mk;l=ZttYQMYI&>s$)?_ zn#!QrKrAzpRt5ue)wXGr5ocnG!MTB~-OTYh_l9INlY(d72|FJdB)3R1=rE}tvteTQi zT7@NhWYk5?rWLQ+ zz744vVm7{D=RLFtRaaaVC`ZUl3Q9aBp?ZAH?rC+=HK&ph5^^Rj=wU##UfOxoLy!}6khVFgw@*CaX!BFY0~Ox_qPc{+$)Mkw#|Z3k!jj)7 zSNHbuir$Wbx1;Fo zD|q|X0b}i59A0zyK8{@W7K7b|VE2l@r{L(hF!Inu)_#S2zB+KF_VRc!)L#ho7eo6B zp?xdC{rSL9erO{9S}Z>y=AF_ioWxc>B|t|J`U=ojgrNcq6=CNc*qKkg^%nqXW|)1X z6KxjJXA$;K0J_K7d^G-L&-HV~{v(C{BP%`OTc>|a-A>)8x`ga3uhg;z-Z_VND+^r6djJJKB!#lYcEd}G_ z2%xXsV;cPr$@`dN6$bz0Y-1wW>N-`wpRi>rK<-PwrcpA%ysIs=K$plH0T#f|eBUB_ z&$YGa>Mgi>ufP6PYQ+`K!!X*6zjt*oJbvVAn5U_Xw4~yaagw_rlwz*;J61wyJ%nML#^K=cV!y~BGW!@}6!LkEP&_|anrgt22shbH!q zN3^6;9kLQt2I8@lq@2!(hF*Ly*&z91_ZB<(1b zs^+-rNo7PSDeusTa3(ID6*MVi#bfS0o%DA`I|0!~tRF~=<{5m2?3hVPdyqt?)O>jm of9-B;?YR%S?t|V3pydH*e8`0u?#URln;Bv9o4fu16lhxh1@gNSs{jB1 delta 1797 zcma)7UrZcD7@yg@y_>sZ7Z#2`2jxEmXa!24t&LiNT8@}%h^<-+WqR3N;I8)vXP3|; zd%}YcO{^L^KKjr%o4^C6FFqL)O?~i%v(_`4n)oMuH598BVxlv9?43TCxDVg=%{SlQ z-+VK>d1Sv^{z{U9fPLFf!TI;X>v99Uw%+r~5g7svYA9Kms=8DKK>!FK3ber6Knv=j z4G;GK;F6N{_k}**ItTBBg@6ZMpeOw+U>&8vx;?_X5p8q1rgF5A1( zrhnrg?*=UDW?0=8zz#xOlk=Of)iu`;D>v+}N}T3>we(ZJ9MJ;v@V_liAVrF}P8Lcu zvc4PXO<&#WoUkt3==K6t$e|Tx!9j5i%RJFomR$*#z%UOQ0PMj2zki~IMWV0zD_Q*t zY^Q&s_9n#*&TuGU#*hbz9=6{oGj$0A3(!Rro_GPgA5evP*1%=voeNlj#9=o|nH%s% zl@(yE);O&OSfDz0mqj1s(N8dC!#|WqUAfFzvfx27R$eY>1rx*E^>r3G>_lb&;1XC_ zRuy!hU3R5FNeV85zR=4n-7jS{J&9k7>&y7OnISr!(n)H`jG6IFn%)ccdpRg~`a{QH zuurhzQQI??Oj2A?8)>q|MG{Y&wrDIZ>cmDE$J22WWBN%&J5;D$(ez9Ob0!0v@M*Jy zYRuH=~zm){pvy{uIdJTUTVHj&s{lGc4S^RaVnP1;w7FW zrN@jVqNntJlM(TFnxfZb{*4K0SREq=_-YJ0xxN zTj_X2)(OcF1JA{ircMkSxy8|8x%Uw7rmg&~kwe^bn30uss#HhnT?8&NmGOkl<&!n= zoisvk%U$$m`4qJ(ldD6|ZOJ+$4n(S*4VX~K1H0Y&mCQb65#)cpAc(;N$msV{df8cUMxP!`{2CUPix^ z>!VN8DWx8c&;@1K13{L4s9dfaJ-fo-nbnkT zE@U*q+pr~!)nv>tR6Uu*xDS#^rZxCeGg@pm#6-f$S^7rJM?J0L4BQ!qz*qf95X1@i ztA~k?9g*;-#xd=yraj?z>T2dPBxMX3{Jssa3biHGB!2p1xEUh)SNL>4`wyA6Idoc14bUg%3JKk>SeLMwE!U?$DI`|vlf)nCz DXLW$j diff --git a/models/model_view_base.py b/models/model_view_base.py index 5c77cefc..fb025248 100644 --- a/models/model_view_base.py +++ b/models/model_view_base.py @@ -204,6 +204,7 @@ class Model_View_Base(BaseModel, ABC): session: None = None is_page_store: bool = None is_user_logged_in: bool = None + user: User = None access_levels: list = None model_config = ConfigDict(arbitrary_types_allowed=True) @@ -253,6 +254,7 @@ class Model_View_Base(BaseModel, ABC): datastore_user = DataStore_User() user = datastore_user.get_user_session() + self.user = user self.is_user_logged_in = user.is_logged_in def output_bool(self, boolean): @@ -318,13 +320,13 @@ class Model_View_Base(BaseModel, ABC): return {getattr(obj, key): obj.to_json() for obj in list_objects} @staticmethod def convert_list_objects_to_dict_by_attribute_key_default(list_objects): - if len(list_objects) == 0: + if list_objects is None or len(list_objects) == 0: return {} obj_class = list_objects[0].__class__ return Model_View_Base.convert_list_objects_to_dict_by_attribute_key(list_objects, getattr(obj_class, obj_class.FLAG_NAME_ATTR_OPTION_VALUE)) @staticmethod def convert_list_objects_to_dict_json_by_attribute_key_default(list_objects): - if len(list_objects) == 0: + if list_objects is None or len(list_objects) == 0: return {} obj_class = list_objects[0].__class__ return Model_View_Base.convert_list_objects_to_dict_json_by_attribute_key(list_objects, getattr(obj_class, obj_class.FLAG_NAME_ATTR_OPTION_VALUE)) diff --git a/models/model_view_store.py b/models/model_view_store.py index e8537881..a0a102e3 100644 --- a/models/model_view_store.py +++ b/models/model_view_store.py @@ -104,9 +104,9 @@ class Model_View_Store(Model_View_Base): HASH_STORE_BASKET_LOAD : ClassVar[str] = '/store/basket_load' HASH_GET_STORE_PRODUCT: ClassVar[str] = '/store/product_get' HASH_GET_STORE_PRODUCT_CATEGORY: ClassVar[str] = '/store/category_get' - HASH_SAVE_STORE_PRODUCT: ClassVar[str] = '/store/save_product' HASH_GET_STORE_PRODUCT_PERMUTATION: ClassVar[str] = '/store/permutation_get' HASH_GET_STORE_STOCK_ITEM: ClassVar[str] = '/store/stock_item_get' + HASH_SAVE_STORE_PRODUCT: ClassVar[str] = '/store/save_product' HASH_SAVE_STORE_PRODUCT_CATEGORY: ClassVar[str] = '/store/save_category' HASH_SAVE_STORE_PRODUCT_PERMUTATION: ClassVar[str] = '/store/save_permutation' HASH_SAVE_STORE_STOCK_ITEM: ClassVar[str] = '/store/save_stock_item' diff --git a/models/model_view_store_product.py b/models/model_view_store_product.py index d6b2e9c5..3528adcb 100644 --- a/models/model_view_store_product.py +++ b/models/model_view_store_product.py @@ -19,6 +19,7 @@ Data model for store product view from business_objects.store.product import Product, Parameters_Product from business_objects.store.product_category import Product_Category_Container from datastores.datastore_store_product import DataStore_Store_Product +from forms.access_level import Filters_Access_Level from forms.store.product import Filters_Product from models.model_view_store import Model_View_Store # from routes import bp_home @@ -86,12 +87,17 @@ class Model_View_Store_Product(Model_View_Store): return 'Products' def __init__(self, form_filters, hash_page_current=Model_View_Store.HASH_PAGE_STORE_PRODUCTS): - _m = 'Model_View_Store_Permutation.__init__' + _m = 'Model_View_Store_Product.__init__' print(f'{_m}\nstarting...') super().__init__(hash_page_current=hash_page_current, form_filters=form_filters) + self.access_levels = self.get_many_access_level(Filters_Access_Level()) parameters_product = Parameters_Product.from_form_filters_product(self.form_filters) datastore_store = DataStore_Store_Product() - self.category_list, errors = datastore_store.get_many_product(parameters_product) + self.category_list, errors = datastore_store.get_many_product(parameters_product) + countProducts = 0 + for category in self.category_list.categories: + countProducts += len(category.products) + print(f'category count: {len(self.category_list.categories)}\nproduct count: {countProducts}') self.category_list_filters, errors_filters = datastore_store.get_many_product( Parameters_Product( get_all_product_category = True, @@ -110,7 +116,7 @@ class Model_View_Store_Product(Model_View_Store): ) ) print(f'category filters: {self.category_list_filters.categories}') - self.form_filters.id_category.choices = [('0', 'All')] + [(str(category.id_category), category.name) for category in self.category_list_filters.categories] + self.form_filters.id_category.choices += [(str(category.id_category), category.name) for category in self.category_list_filters.categories] print(f'category options: {self.form_filters.id_category.choices}') self.variation_types, self.variations, errors = self.get_many_product_variation() self.units_measurement = self.get_many_unit_measurement() @@ -118,7 +124,8 @@ class Model_View_Store_Product(Model_View_Store): self.currencies = self.get_many_currency() self.currency_options = [currency.to_json_option() for currency in self.currencies] + print(f'category count: {len(self.category_list.categories)}\nproduct count: {countProducts}') @staticmethod def save_products(comment, list_products): _m = 'Model_View_Store_Product.save_products' - DataStore_Store_Product.save_products(comment, list_products) \ No newline at end of file + return DataStore_Store_Product.save_products(comment, list_products) \ No newline at end of file diff --git a/static/MySQL/0000_combine.sql b/static/MySQL/0000_combine.sql index 9fab3fc2..b25480b3 100644 --- a/static/MySQL/0000_combine.sql +++ b/static/MySQL/0000_combine.sql @@ -7411,7 +7411,7 @@ BEGIN , t_C.can_admin = UE_T.can_admin ; - CALL p_shop_calc_user_clear_temp(a_guid); + CALL p_shop_clear_calc_user(a_guid); END IF; END IF; @@ -7727,7 +7727,7 @@ BEGIN , t_P.can_admin = UE_T.can_admin ; - CALL p_shop_calc_user_clear_temp(a_guid); + CALL p_shop_clear_calc_user(a_guid); END IF; END IF; @@ -11495,7 +11495,7 @@ BEGIN ) ; - # CALL p_shop_calc_user_clear_temp(v_guid); + # 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 @@ -14368,7 +14368,7 @@ BEGIN ; END IF; - -- CALL p_shop_calc_user_clear_temp(v_guid_permission); + -- CALL p_shop_clear_calc_user(v_guid_permission); DELETE FROM Shop_Calc_User_Temp WHERE GUID = a_guid; @@ -15903,7 +15903,7 @@ BEGIN t_P.can_admin = UE_T.can_admin ; - # CALL p_shop_calc_user_clear_temp(v_guid); + # CALL p_shop_clear_calc_user(v_guid); # DROP TABLE IF EXISTS Shop_Calc_User_Temp; DELETE FROM Shop_Calc_User_Temp WHERE GUID = v_guid @@ -17186,7 +17186,7 @@ BEGIN t_P.can_admin = UE_T.can_admin ; - # CALL p_shop_calc_user_clear_temp(v_guid); + # CALL p_shop_clear_calc_user(v_guid); # DROP TABLE IF EXISTS Shop_Calc_User_Temp; DELETE FROM Shop_Calc_User_Temp WHERE GUID = v_guid @@ -17496,7 +17496,7 @@ BEGIN ; END IF; - -- CALL p_shop_calc_user_clear_temp(v_guid_permission); + -- CALL p_shop_clear_calc_user(v_guid_permission); DELETE FROM Shop_Calc_User_Temp WHERE GUID = a_guid; @@ -19071,7 +19071,7 @@ BEGIN t_P.can_admin = UE_T.can_admin ; - # CALL p_shop_calc_user_clear_temp(v_guid); + # CALL p_shop_clear_calc_user(v_guid); # DROP TABLE IF EXISTS Shop_Calc_User_Temp; DELETE FROM Shop_Calc_User_Temp WHERE GUID = v_guid diff --git a/static/MySQL/7200_p_shop_save_product_category.sql b/static/MySQL/7200_p_shop_save_product_category.sql index 989c8b16..6e4d5d39 100644 --- a/static/MySQL/7200_p_shop_save_product_category.sql +++ b/static/MySQL/7200_p_shop_save_product_category.sql @@ -8,9 +8,9 @@ DROP PROCEDURE IF EXISTS p_shop_save_product_category; DELIMITER // CREATE PROCEDURE p_shop_save_product_category ( - IN a_id_user INT, + IN a_comment VARCHAR(500), IN a_guid BINARY(36), - IN a_comment VARCHAR(500) + IN a_id_user INT ) BEGIN DECLARE v_code_type_error_bad_data VARCHAR(100); @@ -206,59 +206,59 @@ BEGIN 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(); + 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; - 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 + 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_now AS created_on + FROM tmp_Category t_C + WHERE is_new = 1 + AND active = 1 ; - 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_now 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; - DELETE FROM Shop_Product_Category_Temp - WHERE GUID = a_guid; - SELECT * FROM tmp_Msg_Error; DROP TEMPORARY TABLE IF EXISTS tmp_Catgory; diff --git a/static/MySQL/7200_p_shop_save_product_category_test.sql b/static/MySQL/7200_p_shop_save_product_category_test.sql index a1a07f07..ba88e966 100644 --- a/static/MySQL/7200_p_shop_save_product_category_test.sql +++ b/static/MySQL/7200_p_shop_save_product_category_test.sql @@ -192,7 +192,7 @@ BEGIN , t_C.can_admin = UE_T.can_admin ; - CALL p_shop_calc_user_clear_temp(a_guid); + CALL p_shop_clear_calc_user(a_guid); END IF; END IF; diff --git a/static/MySQL/7203_p_shop_save_product.sql b/static/MySQL/7203_p_shop_save_product.sql index 7d328ef1..ee5a2a0a 100644 --- a/static/MySQL/7203_p_shop_save_product.sql +++ b/static/MySQL/7203_p_shop_save_product.sql @@ -9,16 +9,19 @@ 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_comment VARCHAR(500) + 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 @@ -35,24 +38,44 @@ BEGIN -- 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 + -- guid + id_type , code , msg ) SELECT - a_guid - , NULL + -- a_guid + (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'MYSQL_ERROR' LIMIT 1) , @errno - , @text + , 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_code_type_error_bad_data := 'BAD_DATA'; + 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); SET a_guid := IFNULL(a_guid, UUID()); + 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 @@ -71,7 +94,7 @@ BEGIN CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT - , guid BINARY(36) NOT NULL + -- , guid BINARY(36) NOT NULL , id_type INT NOT NULL /* CONSTRAINT FK_tmp_Msg_Error_id_type @@ -98,79 +121,115 @@ BEGIN SELECT IFNULL(P_T.id_category, P.id_category) AS id_category , IFNULL(P_T.id_product, 0) AS id_product - , IFNULL(PT.name, P.name) AS name - , IFNULL(PT.has_variations, P.has_variations) AS has_variations - , IFNULL(PT.id_access_level_required, P.id_access_level_required) AS id_access_level_required + , 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(PT.name, IFNULL(P.name, IFNULL(P_T.id_product, '(No Product)'))) AS name_error + , 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 Shop_Product_Tenp P_T - LEFT JOIN Shop_Product P ON P_T.id_product = P.id_product + 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 - INSERT INTO tmp_Msg_Error ( - guid - , id_type - , code - , msg - ) + -- Missing mandatory fields -- id_category - SELECT - a_guid AS GUID - , v_id_type_error_bad_data - , v_code_error_bad_data - , CONCAT('The following product(s) do not have a category: ', GROUP_CONCAT(t_P.name_error SEPARATOR ', ')) - FROM tmp_Product t_P - WHERE ISNULL(t_P.id_category) - UNION + 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 - SELECT - a_guid AS GUID - , v_id_type_error_bad_data - , v_code_error_bad_data - , CONCAT('The following product(s) do not have a name: ', GROUP_CONCAT(t_P.name_error SEPARATOR ', ')) - FROM tmp_Product t_P - WHERE ISNULL(t_P.name) - UNION + 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 - SELECT - a_guid AS GUID - , v_id_type_error_bad_data - , v_code_error_bad_data - , CONCAT('The following product(s) do not have a has-variations setting: ', GROUP_CONCAT(t_P.name_error SEPARATOR ', ')) - FROM tmp_Product t_P - WHERE ISNULL(t_P.has_variations) - UNION + 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 - SELECT - a_guid AS GUID - , v_id_type_error_bad_data - , v_code_error_bad_data - , CONCAT('The following product(s) do not have a required access level ID: ', GROUP_CONCAT(t_P.name_error SEPARATOR ', ')) - FROM tmp_Product t_P - WHERE ISNULL(t_P.id_access_level_required) - UNION + 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 - SELECT - a_guid AS GUID - , v_id_type_error_bad_data - , v_code_error_bad_data - , CONCAT('The following product(s) do not have a display order: ', GROUP_CONCAT(t_P.name_error SEPARATOR ', ')) - FROM tmp_Product t_P - WHERE ISNULL(t_P.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(item SEPARATOR ',') FROM tmp_Shop_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); - CALL p_shop_calc_user(a_guid, a_id_user, v_id_permission_product, v_ids_product_permission); + 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 @@ -182,64 +241,72 @@ BEGIN , t_P.can_admin = UE_T.can_admin ; - CALL p_shop_calc_user_clear_temp(a_guid); + 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 the transaction START TRANSACTION; - - -- Your transaction logic goes here - 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 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 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_now AS created_on - FROM tmp_Product t_P - WHERE is_new = 1 - ; - - -- If we reach here without error, commit the 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; + 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 ;; diff --git a/static/MySQL/7203_p_shop_save_product_test.sql b/static/MySQL/7203_p_shop_save_product_test.sql new file mode 100644 index 00000000..18666a78 --- /dev/null +++ b/static/MySQL/7203_p_shop_save_product_test.sql @@ -0,0 +1,78 @@ + + +-- 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 ( + 4 -- id_product + , 1 -- id_category + , 'Laptops' -- name + , 1 -- has_variations + , 2 -- id_access_level_required + , 2 -- 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; +*/ \ No newline at end of file diff --git a/static/MySQL/7206_p_shop_save_permutation.sql b/static/MySQL/7206_p_shop_save_permutation.sql deleted file mode 100644 index 14d49efe..00000000 --- a/static/MySQL/7206_p_shop_save_permutation.sql +++ /dev/null @@ -1,605 +0,0 @@ - - - - --- Clear previous proc -DROP PROCEDURE IF EXISTS p_shop_save_permutation; - -DROP TABLE IF EXISTS tmp_Shop_Manufacturing_Purchase_Order_Product_Link; -DROP TABLE IF EXISTS tmp_Msg_Error; - -DELIMITER // -CREATE PROCEDURE p_shop_save_permutation ( - IN a_guid VARCHAR(500), - IN a_id_user INT, - IN a_id_order INT, - -- IN a_id_supplier_ordered INT, - IN a_id_currency_cost INT, - IN a_active BIT, - IN a_comment VARCHAR(500) -) -BEGIN - DECLARE v_id_error_type_bad_data INT; - DECLARE v_code_error_type_bad_data VARCHAR(50); - DECLARE v_id_error_type_no_permission INT; - DECLARE v_code_error_type_no_permission VARCHAR(50); - DECLARE v_guid_permission BINARY(36); - -- DECLARE v_id_user VARCHAR(100); - DECLARE v_id_permission_manufacturing_purchase_order INT; - DECLARE v_id_access_level_EDIT INT; - DECLARE v_ids_product VARCHAR(4000); - DECLARE v_ids_product_no_permission VARCHAR(4000); - -- DECLARE v_id_order_new INT; - DECLARE v_id_change_set INT; - DECLARE v_is_new_manufacturing_purchase_order BIT; - - SET SESSION sql_mode = sys.list_drop(@@session.sql_mode, 'ONLY_FULL_GROUP_BY'); - - SET v_code_error_type_bad_data = 'BAD_DATA'; - SET v_id_error_type_bad_data := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_error_type_bad_data LIMIT 1); - SET v_code_error_type_no_permission = 'NO_PERMISSION'; - SET v_id_error_type_no_permission := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_error_type_no_permission LIMIT 1); - SET v_guid_permission = UUID(); - -- SET v_id_user = CURRENT_USER(); - SET v_id_permission_manufacturing_purchase_order := (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_MANUFACTURING_PURCHASE_ORDER' LIMIT 1); - SET v_id_access_level_EDIT := (SELECT id_access_level FROM Shop_Access_Level WHERE code = 'EDIT'); - - -- Argument default values - IF a_guid IS NULL THEN - SET a_guid = UUID(); - END IF; - IF a_active IS NULL THEN - SET a_active = 0; - END IF; - - -- Temporary tables - /* - CREATE TABLE tmp_Shop_Supplier_Purchase_Order ( - id_order INT NOT NULL PRIMARY KEY, - id_supplier_ordered INT NOT NULL, - CONSTRAINT FK_tmp_Shop_Supplier_Purchase_Order_id_supplier_ordered - FOREIGN KEY (id_supplier_ordered) - REFERENCES Shop_Supplier(id_supplier), - cost_total_local FLOAT NOT NULL, - id_currency_cost INT NOT NULL - ); - */ - - CREATE TABLE tmp_Shop_Manufacturing_Purchase_Order_Product_Link ( - id_link INT NOT NULL PRIMARY KEY, - id_order INT NOT NULL, - /* - CONSTRAINT FK_tmp_Supplier_Purchase_Order_Product_Link_id_order - FOREIGN KEY (id_order) - REFERENCES Shop_Manufacturing_Purchase_Order(id_order), - */ - id_permutation INT NOT NULL, - CONSTRAINT FK_tmp_Manuf_Purch_Order_Product_Link_id_permutation - FOREIGN KEY (id_permutation) - REFERENCES Shop_Product_Permutation(id_permutation), - cost_total_local FLOAT NOT NULL, - id_currency_cost INT NOT NULL, - value_produced_total_local FLOAT NOT NULL, - quantity_used FLOAT NOT NULL, - id_unit_quantity INT NOT NULL, - CONSTRAINT FK_tmp_Manuf_Purch_Order_Product_Link_id_unit_quantity - FOREIGN KEY (id_unit_quantity) - REFERENCES Shop_Unit_Measurement(id_unit_measurement), - quantity_produced FLOAT NULL, - latency_manufacture_days INT NOT NULL, - display_order INT NOT NULL, - active BIT NOT NULL, - name_error VARCHAR(200) NOT NULL - ); - - CREATE TABLE IF NOT EXISTS tmp_Msg_Error ( - display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT, - guid 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 - # User ID - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN - IF ISNULL(a_id_user) OR NOT EXISTS (SELECT * FROM Shop_User WHERE id_user = a_id_user) THEN - INSERT INTO tmp_Msg_Error ( - guid, id_type, code, msg - ) - VALUES - (a_guid, v_id_error_type_bad_data, v_code_error_type_bad_data, CONCAT('Invalid User ID: ', IFNULL(a_id_user, 'NULL'))) - ; - END IF; - END IF; - - # Order ID - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN - IF ISNULL(a_id_order) OR ((a_id_order > 0) AND NOT EXISTS (SELECT * FROM Shop_Manufacturing_Purchase_Order WHERE id_order = a_id_order)) THEN - INSERT INTO tmp_Msg_Error ( - guid, id_type, code, msg - ) - VALUES - (a_guid, v_id_error_type_bad_data, v_code_error_type_bad_data, CONCAT('Invalid Manufacturing Purchase Order ID: ', IFNULL(a_id_order, 'NULL'))) - ; - END IF; - END IF; - - /* - # Supplier ID - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN - IF ISNULL(a_id_supplier_ordered) OR NOT EXISTS (SELECT * FROM Shop_Supplier WHERE id_supplier = a_id_supplier_ordered) THEN - INSERT INTO tmp_Msg_Error ( - guid, id_type, code, msg - ) - VALUES - (a_guid, v_id_error_type_bad_data, v_code_error_type_bad_data, CONCAT('Invalid supplier ID: ', IFNULL(a_id_supplier_ordered, 'NULL'))) - ; - END IF; - END IF; - */ - - # Currency ID - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN - IF ISNULL(a_id_currency_cost) OR NOT EXISTS (SELECT * FROM Shop_Currency WHERE id_currency = a_id_currency_cost) THEN - INSERT INTO tmp_Msg_Error ( - guid, id_type, code, msg - ) - VALUES - (a_guid, v_id_error_type_bad_data, v_code_error_type_bad_data, CONCAT('Invalid currency ID: ', IFNULL(a_id_currency, 'NULL'))) - ; - END IF; - END IF; - - # Comment - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN - IF ISNULL(a_comment) OR TRIM(a_comment) = '' THEN - INSERT INTO tmp_Msg_Error ( - guid, id_type, code, msg - ) - VALUES - (a_guid, v_id_error_type_bad_data, v_code_error_type_bad_data, 'A comment must be provided.') - ; - END IF; - END IF; - - - -- Get data from Temp table - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN - SET v_is_new_manufacturing_purchase_order := CASE WHEN a_id_order <= 0 THEN 1 ELSE 0 END; - - INSERT INTO tmp_Shop_Manufacturing_Purchase_Order_Product_Link ( - id_link, - id_order, - id_permutation, - cost_total_local, - id_currency_cost, - quantity_used, - id_unit_quantity, - quantity_produced, - value_produced_total_local, - latency_manufacture_days, - display_order, - active, - name_error - ) - /* - VALUES - (a_id_supplier, a_name_company, a_name_contact, a_department_contact, a_id_address, a_phone_number, a_fax, a_email, a_website, a_id_currency, a_active) - */ - SELECT - MPOPL_T.id_link, - MPOPL_T.id_order, - MPOPL_T.id_permutation, - PP.cost_local * MPOPL_T.quantity_used AS cost_total_local, - MPOPL_T.id_currency_cost, - MPOPL_T.quantity_used, - MPOPL_T.id_unit_quantity, - MPOPL_T.quantity_produced, - (PP.cost_local + PP.profit_local_min) * MPOPL_T.quantity_produced AS value_produced_total_local, - MPOPL_T.latency_manufacture_days, - MPOPL_T.display_order, - MPOPL_T.active, - CONCAT(PP.id_permutation, ' - ', IFNULL(P.name ,'')) AS name_error - FROM Shop_Manufacturing_Purchase_Order_Product_Link_Temp MPOPL_T - INNER JOIN Shop_Product_Permutation PP ON MPOPL_T.id_permutation = PP.id_permutation - INNER JOIN Shop_Product P ON PP.id_product = P.id_product - WHERE MPOPL_T.GUID = a_guid - -- GROUP BY MPOPL_T.id_order, name_error, MPOPL_T.id_link - /* - group by - MPOPL_T.id_link, - MPOPL_T.id_order, - MPOPL_T.id_permutation, - cost_total_local, - MPOPL_T.id_currency_cost, - MPOPL_T.quantity_used, - MPOPL_T.id_unit_quantity, - MPOPL_T.quantity_produced, - value_produced_total_local, - MPOPL_T.latency_manufacture_days, - MPOPL_T.display_order, - MPOPL_T.active, - name_error - */ - -- GROUP BY id_link, P.id_product, PP.id_permutation - -- GROUP BY name_error, ID_LINK, cost_total_local, value_produced_total_local - ; - DELETE MPOPL_T - FROM Shop_Manufacturing_Purchase_Order_Product_Link_Temp MPOPL_T - WHERE MPOPL_T.GUID = a_guid - ; - END IF; - - -- Invalid quantity used - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN - IF EXISTS ( - SELECT * - FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link - WHERE - NOT ISNULL(quantity_used) - AND quantity_used < 0 - ) THEN - INSERT INTO tmp_Msg_Error ( - guid, id_type, code, msg - ) - SELECT - a_guid, - v_id_error_type_bad_data, - v_code_error_type_bad_data, - CONCAT('Invalid quantity used property for the following permutations: ', GROUP_CONCAT(t_MPOPL.name_error SEPARATOR ', ')) - FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL - WHERE t_MPOPL.quantity_used < 0 - ; - END IF; - END IF; - - -- Invalid quantity produced - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN - IF EXISTS ( - SELECT * - FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link - WHERE - NOT ISNULL(quantity_produced) - AND quantity_produced < 0 - ) THEN - INSERT INTO tmp_Msg_Error ( - guid, id_type, code, msg - ) - SELECT - a_guid, - v_id_error_type_bad_data, - v_code_error_type_bad_data, - CONCAT('Invalid quantity produced property for the following permutations: ', GROUP_CONCAT(t_MPOPL.name_error SEPARATOR ', ')) - FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL - WHERE t_MPOPL.quantity_produced < 0 - ; - END IF; - END IF; - - -- Duplicates - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN - IF EXISTS (SELECT id_permutation, name_error, COUNT(*) FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL GROUP BY id_permutation HAVING COUNT(*) > 1) THEN - INSERT INTO tmp_Msg_Error ( - guid, id_type, code, msg - ) - SELECT - a_guid, - v_id_error_type_bad_data, - v_code_error_type_bad_data, - CONCAT('Duplicate records: ', GROUP_CONCAT(t_MPOPLC.name_error SEPARATOR ', ')) - FROM (SELECT id_permutation, name_error, COUNT(*) FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL GROUP BY id_permutation HAVING COUNT(*) > 1) t_MPOPLC - ; - END IF; - END IF; - - - -- Permissions - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN - SET v_ids_product := ( - SELECT GROUP_CONCAT(G.id_product SEPARATOR ',') - FROM ( - SELECT DISTINCT PP.id_product - FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPO - INNER JOIN Shop_Product_Permutation PP ON t_MPO.id_permutation = PP.id_permutation - ) G - ); - - CALL p_shop_calc_user(v_guid_permission, a_id_user, 0, v_id_permission_manufacturing_purchase_order, v_id_access_level_edit, v_ids_product); - - /* - UPDATE tmp_Shop_Supplier t_S - INNER JOIN Shop_Calc_User_Temp TP - ON TP.GUID = v_guid_permission - SET tP.can_view = TP.can_view, - tP.can_edit = TP.can_edit, - tP.can_admin = TP.can_admin; - */ - /* - SET v_has_permission := ( - SELECT can_edit - FROM Shop_Calc_User_Temp - WHERE - GUID = v_guid_permission - AND can_edit = 0 - ); - - IF v_has_permission = 0 THEN - SET v_id_error_type_no_permission := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION'); - INSERT INTO tmp_Msg_Error ( - guid, id_type, msg - ) - SELECT - a_guid, - v_id_error_type_no_permission, - CONCAT('You do not have ', name, ' permissions.') - FROM Shop_Permission - WHERE id_permission = v_id_permission_manufacturing_purchase_order - ; - END IF; - */ - SET v_ids_product_no_permission := ( - SELECT GROUP_CONCAT(PT.id_product SEPARATOR ',') - FROM Shop_Calc_User_Temp PT - WHERE - PT.can_edit = 0 - AND NOT ISNULL(PT.id_product) - ); - IF NOT ISNULL(v_ids_product_no_permission) THEN - INSERT INTO tmp_Msg_Error ( - guid, id_type, code, msg - ) - VALUES ( - a_guid, - v_id_error_type_no_permission, - v_code_error_type_no_permission, - CONCAT('You do not have permission to edit the following product IDs: ', v_ids_product_no_permission) - ) - ; - END IF; - END IF; - - -- Transaction - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN - START TRANSACTION; - INSERT INTO Shop_Sales_And_Purchasing_Change_Set ( - comment, - updated_last_by, - updated_last_on - ) - VALUES ( - CONCAT( - 'Save ', - CASE WHEN v_is_new_manufacturing_purchase_order = 1 THEN 'new ' ELSE '' END, - 'Manufacturing Purchase Order - ', - a_comment - ), - a_id_user, - CURRENT_TIME() - ); - - SET v_id_change_set := (SELECT id_change_set FROM Shop_Sales_And_Purchasing_Change_Set ORDER BY id_change_set DESC LIMIT 1); - - IF (v_is_new_manufacturing_purchase_order = 1) THEN - INSERT INTO Shop_Manufacturing_Purchase_Order ( - -- id_supplier_ordered, - cost_total_local, - id_currency_cost, - value_produced_total_local, - created_by, - id_change_set, - active - ) - SELECT - -- a_id_supplier_ordered, - SUM(t_MPOPL.cost_total_local), - a_id_currency_cost, - SUM(t_MPOPL.value_produced_total_local), - a_id_user, - v_id_change_set, - a_active - FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL - ; - -- SET v_id_order_new - SET a_id_order := (SELECT id_order FROM Shop_Manufacturing_Purchase_Order ORDER BY id_order DESC LIMIT 1); - - INSERT INTO Shop_Manufacturing_Purchase_Order_Product_Link ( - id_order, - id_permutation, - cost_total_local, - value_produced_total_local, - id_currency_cost, - quantity_used, - id_unit_quantity, - quantity_produced, - latency_manufacture_days, - display_order, - active, - created_by, - id_change_set - ) - SELECT - a_id_order, -- v_id_order_new, - id_permutation, - cost_total_local, - value_produced_total_local, - id_currency_cost, - quantity_used, - id_unit_quantity, - quantity_produced, - latency_manufacture_days, - display_order, - active, - a_id_user, - v_id_change_set - FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL - ; - ELSE - UPDATE Shop_Manufacturing_Purchase_Order MPO - INNER JOIN tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL ON MPO.id_order = t_MPOPL.id_order - SET - -- MPO.id_supplier_ordered = a_id_supplier_ordered, - MPO.cost_total_local = SUM(t_MPOPL.cost_total_local), - MPO.value_produced_total_local = SUM(t_MPOPL.value_produced_total_local), - MPO.id_currency = a_id_currency_cost, - MPO.id_change_set = v_id_change_set, - MPO.active = a_active - WHERE MPO.id_order = a_id_order - ; - IF EXISTS (SELECT * FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL INNER JOIN Shop_Manufacturing_Purchase_Order_Product_Link MPOPL ON t_MPOPL.id_link = MPOPL.id_link) THEN - UPDATE Shop_Manufacturing_Purchase_Order_Product_Link MPOPL - INNER JOIN tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL - ON MPOPL.id_link = t_MPOPL.id_link - SET - MPOPL.id_order = t_MPOPL.id_order, - MPOPL.id_permutation = t_MPOPL.id_permutation, - MPOPL.cost_total_local = t_MPOPL.cost_total_local, - MPOPL.value_produced_total_local = t_MPOPL.value_produced_total_local, - MPOPL.id_currency_cost = t_MPOPL.id_currency_cost, - MPOPL.quantity_used = t_MPOPL.quantity_used, - MPOPL.id_unit_quantity = t_MPOPL.id_unit_quantity, - MPOPL.quantity_produced = t_MPOPL.quantity_produced, - MPOPL.latency_manufacture_days = t_MPOPL.latency_manufacture_days, - MPOPL.display_order = t_MPOPL.display_order, - MPOPL.active = t_MPOPL.active, - MPOPL.id_change_set = v_id_change_set - ; - ELSE - INSERT INTO Shop_Manufacturing_Purchase_Order_Product_Link ( - id_order, - id_permutation, - cost_total_local, - value_produced_total_local, - id_currency_cost, - quantity_used, - id_unit_quantity, - quantity_produced, - latency_manufacture_days, - display_order, - active, - created_by, - id_change_set - ) - SELECT - id_order, - id_permutation, - cost_total_local, - value_produced_total_local, - id_currency_cost, - quantity_used, - id_unit_quantity, - quantity_produced, - latency_manufacture_days, - display_order, - active, - a_id_user, - v_id_change_set - FROM tmp_Shop_Manufacturing_Purchase_Order_Product_Link t_MPOPL - WHERE t_MPOPL.id_link < 0 - ; - END IF; - END IF; - - IF EXISTS (SELECT * FROM tmp_Msg_Error) THEN - ROLLBACK; - ELSE - COMMIT; - END IF; - END IF; - - -- Returns - # SET v_now = NOW(); - - # Manufacturing Purchase Orders - SELECT * - FROM Shop_Manufacturing_Purchase_Order - WHERE - id_order = a_id_order - -- GUID = a_guid - ; - - # Manufacturing Purchase Order Product Links - SELECT * - FROM Shop_Manufacturing_Purchase_Order_Product_Link - WHERE - id_order = a_id_order - -- GUID = a_guid - ; - - # Errors - SELECT * - FROM tmp_Msg_Error - ; - - # DROP TABLE tmp_Shop_Manufacturing_Purchase_Order; - DROP TABLE tmp_Shop_Manufacturing_Purchase_Order_Product_Link; - DROP TABLE tmp_Msg_Error; -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_cost, - quantity_used, - id_unit_quantity, - quantity_produced, - latency_manufacture_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_used, - 1, # id_unit_quantity, - 1, # quantity_produced, - 14, # latency_manufacture_days , - 1, # display_order - 1 # active - ) -; - -SELECT * FROM Shop_Manufacturing_Purchase_Order_Product_Link_Temp; - -CALL p_shop_save_manufacturing_purchase_order ( - 'NIPS', # a_guid - 'auth0|6582b95c895d09a70ba10fef', # a_id_user - -1, # a_id_order - 1, # a_id_currency_cost - 1, # a_active - 'Initial data' # a_comment -); - -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; - - -*/ - diff --git a/static/MySQL/7206_p_shop_save_product_permutation.sql b/static/MySQL/7206_p_shop_save_product_permutation.sql index 1468ddd8..e56d960b 100644 --- a/static/MySQL/7206_p_shop_save_product_permutation.sql +++ b/static/MySQL/7206_p_shop_save_product_permutation.sql @@ -6,9 +6,9 @@ DROP PROCEDURE IF EXISTS p_shop_save_product_permutation; DELIMITER // CREATE PROCEDURE p_shop_save_product_permutation ( - IN a_id_user INT, IN a_comment VARCHAR(500), - IN a_guid BINARY(36) + IN a_guid BINARY(36), + IN a_id_user INT ) BEGIN diff --git a/static/MySQL/7210_p_shop_get_many_product_variation.sql b/static/MySQL/7210_p_shop_get_many_product_variation.sql index c684ddae..0cfcb40d 100644 --- a/static/MySQL/7210_p_shop_get_many_product_variation.sql +++ b/static/MySQL/7210_p_shop_get_many_product_variation.sql @@ -26,14 +26,14 @@ BEGIN DECLARE v_id_access_level_view INT; DECLARE v_time_start TIMESTAMP(6); DECLARE v_id_minimum INT; - DECLARE v_code_error_data VARCHAR(50); - DECLARE v_id_type_error_data 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_data := (SELECT code FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1); - SET v_id_type_error_data := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_error_data 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); @@ -282,8 +282,8 @@ BEGIN ) VALUES ( -- v_guid, - v_id_type_error_data, - v_code_error_data, + 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)) ) ; diff --git a/static/MySQL/7219_p_shop_get_many_stock_item.sql b/static/MySQL/7219_p_shop_get_many_stock_item.sql index 86caa1bc..21c21bf2 100644 --- a/static/MySQL/7219_p_shop_get_many_stock_item.sql +++ b/static/MySQL/7219_p_shop_get_many_stock_item.sql @@ -609,7 +609,7 @@ BEGIN ) ; - # CALL p_shop_calc_user_clear_temp(v_guid); + # 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 diff --git a/static/MySQL/7400_p_shop_save_supplier.sql b/static/MySQL/7400_p_shop_save_supplier.sql index df19624f..64f88225 100644 --- a/static/MySQL/7400_p_shop_save_supplier.sql +++ b/static/MySQL/7400_p_shop_save_supplier.sql @@ -184,7 +184,7 @@ BEGIN ; END IF; - -- CALL p_shop_calc_user_clear_temp(v_guid_permission); + -- CALL p_shop_clear_calc_user(v_guid_permission); DELETE FROM Shop_Calc_User_Temp WHERE GUID = a_guid; diff --git a/static/MySQL/7404_p_shop_get_many_supplier_purchase_order.sql b/static/MySQL/7404_p_shop_get_many_supplier_purchase_order.sql index 17a95205..c945e1b7 100644 --- a/static/MySQL/7404_p_shop_get_many_supplier_purchase_order.sql +++ b/static/MySQL/7404_p_shop_get_many_supplier_purchase_order.sql @@ -615,7 +615,7 @@ BEGIN t_P.can_admin = UE_T.can_admin ; - # CALL p_shop_calc_user_clear_temp(v_guid); + # CALL p_shop_clear_calc_user(v_guid); # DROP TABLE IF EXISTS Shop_Calc_User_Temp; DELETE FROM Shop_Calc_User_Temp WHERE GUID = v_guid diff --git a/static/MySQL/7416_p_shop_get_many_manufacturing_purchase_order.sql b/static/MySQL/7416_p_shop_get_many_manufacturing_purchase_order.sql index b04ef5fa..5f55c21c 100644 --- a/static/MySQL/7416_p_shop_get_many_manufacturing_purchase_order.sql +++ b/static/MySQL/7416_p_shop_get_many_manufacturing_purchase_order.sql @@ -528,7 +528,7 @@ BEGIN t_P.can_admin = UE_T.can_admin ; - # CALL p_shop_calc_user_clear_temp(v_guid); + # CALL p_shop_clear_calc_user(v_guid); # DROP TABLE IF EXISTS Shop_Calc_User_Temp; DELETE FROM Shop_Calc_User_Temp WHERE GUID = v_guid diff --git a/static/MySQL/7421_p_shop_save_customer.sql b/static/MySQL/7421_p_shop_save_customer.sql index 07622f00..86b46279 100644 --- a/static/MySQL/7421_p_shop_save_customer.sql +++ b/static/MySQL/7421_p_shop_save_customer.sql @@ -180,7 +180,7 @@ BEGIN ; END IF; - -- CALL p_shop_calc_user_clear_temp(v_guid_permission); + -- CALL p_shop_clear_calc_user(v_guid_permission); DELETE FROM Shop_Calc_User_Temp WHERE GUID = a_guid; diff --git a/static/MySQL/7425_p_shop_get_many_customer_sales_order.sql b/static/MySQL/7425_p_shop_get_many_customer_sales_order.sql index 147c4566..df3abf91 100644 --- a/static/MySQL/7425_p_shop_get_many_customer_sales_order.sql +++ b/static/MySQL/7425_p_shop_get_many_customer_sales_order.sql @@ -627,7 +627,7 @@ BEGIN t_P.can_admin = UE_T.can_admin ; - # CALL p_shop_calc_user_clear_temp(v_guid); + # CALL p_shop_clear_calc_user(v_guid); # DROP TABLE IF EXISTS Shop_Calc_User_Temp; DELETE FROM Shop_Calc_User_Temp WHERE GUID = v_guid diff --git a/static/MySQL/9000_populate.sql b/static/MySQL/9000_populate.sql index 8b366468..c4e1836c 100644 --- a/static/MySQL/9000_populate.sql +++ b/static/MySQL/9000_populate.sql @@ -33,9 +33,10 @@ INSERT INTO Shop_Msg_Error_Type ( code, name, description ) VALUES - ('BAD_DATA', 'Invalid data', 'Rubbish data'), - ('NO_PERMISSION', 'No permission', 'Not authorised'), - ('PRODUCT_AVAILABILITY', 'Product not available', 'Product not available') + ('BAD_DATA', 'Invalid data', 'Rubbish data') + , ('NO_PERMISSION', 'No permission', 'Not authorised') + , ('PRODUCT_AVAILABILITY', 'Product not available', 'Product not available') + , ('MYSQL_ERROR', 'MySQL error', 'MySQL execution error.') ; # File Types diff --git a/static/PostgreSQL/000_combine.sql b/static/PostgreSQL/000_combine.sql index 6aea8b4d..89e2573a 100644 --- a/static/PostgreSQL/000_combine.sql +++ b/static/PostgreSQL/000_combine.sql @@ -6982,7 +6982,7 @@ BEGIN ; END IF; - -- CALL p_shop_calc_user_clear_temp(v_guid_permission); + -- CALL p_shop_clear_calc_user(v_guid_permission); DELETE FROM Shop_Calc_User_Temp WHERE GUID = v_guid; @@ -7878,7 +7878,7 @@ BEGIN */ END IF; - -- CALL p_shop_calc_user_clear_temp(v_guid_permission); + -- CALL p_shop_clear_calc_user(v_guid_permission); DELETE FROM Shop_Calc_User_Temp WHERE GUID = v_guid; @@ -10368,7 +10368,7 @@ BEGIN OR t_P.can_view = FALSE ; - -- CALL p_shop_calc_user_clear_temp(v_guid); + -- CALL p_shop_clear_calc_user(v_guid); -- DROP TABLE IF EXISTS Shop_Calc_User_Temp; DELETE FROM Shop_Calc_User_Temp WHERE GUID = v_guid @@ -12527,7 +12527,7 @@ BEGIN AND UE_T.GUID = v_guid ; - -- CALL p_shop_calc_user_clear_temp(v_guid); + -- CALL p_shop_clear_calc_user(v_guid); -- DROP TABLE IF EXISTS Shop_Calc_User_Temp; DELETE FROM Shop_Calc_User_Temp WHERE GUID = v_guid @@ -13156,7 +13156,7 @@ BEGIN AND UE_T.GUID = v_guid ; - -- CALL p_shop_calc_user_clear_temp(v_guid); + -- CALL p_shop_clear_calc_user(v_guid); -- DROP TABLE IF EXISTS Shop_Calc_User_Temp; DELETE FROM Shop_Calc_User_Temp WHERE GUID = v_guid @@ -14099,7 +14099,7 @@ BEGIN AND UE_T.GUID = v_guid ; - -- CALL p_shop_calc_user_clear_temp(v_guid); + -- CALL p_shop_clear_calc_user(v_guid); -- DROP TABLE IF EXISTS Shop_Calc_User_Temp; DELETE FROM Shop_Calc_User_Temp WHERE GUID = v_guid diff --git a/static/PostgreSQL/600_p_shop_save_product.sql b/static/PostgreSQL/600_p_shop_save_product.sql index a5dc4387..d29a1d12 100644 --- a/static/PostgreSQL/600_p_shop_save_product.sql +++ b/static/PostgreSQL/600_p_shop_save_product.sql @@ -179,7 +179,7 @@ BEGIN tP.can_edit = TP.can_edit, tP.can_admin = TP.can_admin; - CALL p_shop_calc_user_clear_temp(v_guid_permission); + CALL p_shop_clear_calc_user(v_guid_permission); END IF; diff --git a/static/PostgreSQL/602_p_shop_save_supplier.sql b/static/PostgreSQL/602_p_shop_save_supplier.sql index f6bd4f8a..1534a0bf 100644 --- a/static/PostgreSQL/602_p_shop_save_supplier.sql +++ b/static/PostgreSQL/602_p_shop_save_supplier.sql @@ -215,7 +215,7 @@ BEGIN ; END IF; - -- CALL p_shop_calc_user_clear_temp(v_guid_permission); + -- CALL p_shop_clear_calc_user(v_guid_permission); DELETE FROM Shop_Calc_User_Temp WHERE GUID = v_guid; diff --git a/static/PostgreSQL/605_p_shop_save_customer.sql b/static/PostgreSQL/605_p_shop_save_customer.sql index d6492334..79ec88d7 100644 --- a/static/PostgreSQL/605_p_shop_save_customer.sql +++ b/static/PostgreSQL/605_p_shop_save_customer.sql @@ -199,7 +199,7 @@ BEGIN */ END IF; - -- CALL p_shop_calc_user_clear_temp(v_guid_permission); + -- CALL p_shop_clear_calc_user(v_guid_permission); DELETE FROM Shop_Calc_User_Temp WHERE GUID = v_guid; diff --git a/static/PostgreSQL/700_p_shop_get_many_product.sql b/static/PostgreSQL/700_p_shop_get_many_product.sql index ac534d0f..ae671142 100644 --- a/static/PostgreSQL/700_p_shop_get_many_product.sql +++ b/static/PostgreSQL/700_p_shop_get_many_product.sql @@ -822,7 +822,7 @@ BEGIN OR t_P.can_view = FALSE ; - -- CALL p_shop_calc_user_clear_temp(v_guid); + -- CALL p_shop_clear_calc_user(v_guid); -- DROP TABLE IF EXISTS Shop_Calc_User_Temp; DELETE FROM Shop_Calc_User_Temp WHERE GUID = v_guid diff --git a/static/PostgreSQL/706_p_shop_get_many_supplier_purchase_order.sql b/static/PostgreSQL/706_p_shop_get_many_supplier_purchase_order.sql index c4d2d63a..7a146245 100644 --- a/static/PostgreSQL/706_p_shop_get_many_supplier_purchase_order.sql +++ b/static/PostgreSQL/706_p_shop_get_many_supplier_purchase_order.sql @@ -534,7 +534,7 @@ BEGIN AND UE_T.GUID = v_guid ; - -- CALL p_shop_calc_user_clear_temp(v_guid); + -- CALL p_shop_clear_calc_user(v_guid); -- DROP TABLE IF EXISTS Shop_Calc_User_Temp; DELETE FROM Shop_Calc_User_Temp WHERE GUID = v_guid diff --git a/static/PostgreSQL/708_p_shop_get_many_manufacturing_purchase_order.sql b/static/PostgreSQL/708_p_shop_get_many_manufacturing_purchase_order.sql index 85cd8fa1..6cc77ded 100644 --- a/static/PostgreSQL/708_p_shop_get_many_manufacturing_purchase_order.sql +++ b/static/PostgreSQL/708_p_shop_get_many_manufacturing_purchase_order.sql @@ -454,7 +454,7 @@ BEGIN AND UE_T.GUID = v_guid ; - -- CALL p_shop_calc_user_clear_temp(v_guid); + -- CALL p_shop_clear_calc_user(v_guid); -- DROP TABLE IF EXISTS Shop_Calc_User_Temp; DELETE FROM Shop_Calc_User_Temp WHERE GUID = v_guid diff --git a/static/PostgreSQL/710_p_shop_get_many_customer_sales_order.sql b/static/PostgreSQL/710_p_shop_get_many_customer_sales_order.sql index 1242102e..36cd842e 100644 --- a/static/PostgreSQL/710_p_shop_get_many_customer_sales_order.sql +++ b/static/PostgreSQL/710_p_shop_get_many_customer_sales_order.sql @@ -547,7 +547,7 @@ BEGIN AND UE_T.GUID = v_guid ; - -- CALL p_shop_calc_user_clear_temp(v_guid); + -- CALL p_shop_clear_calc_user(v_guid); -- DROP TABLE IF EXISTS Shop_Calc_User_Temp; DELETE FROM Shop_Calc_User_Temp WHERE GUID = v_guid diff --git a/static/css/pages/store/products.css b/static/css/pages/store/products.css new file mode 100644 index 00000000..fcdadac8 --- /dev/null +++ b/static/css/pages/store/products.css @@ -0,0 +1,76 @@ + +#formFilters { + width: 50vh; +} + +#formFilters .container { + max-width: fit-content; +} + +#formFilters .container-input.filter.is_not_empty { + width: 10vh; +} + +#formFilters .container-input.filter.active { + width: 8vh; +} + +/* +#tableMain { + max-width: min(calc(1vh * 79), calc(1vw * 90)); +} +*/ + +#tableMain tbody tr td.display_order, #tableMain thead tr th.display_order { + width: 5vh; + min-width: 5vh; +} +#tableMain tbody tr td.product_category, #tableMain thead tr th.product_category { + width: 15vh; + min-width: 15vh; +} +#tableMain tbody tr td.name, #tableMain thead tr th.name { + width: 15vh; + min-width: 15vh; +} +#tableMain thead tr th.has_variations, #tableMain tbody tr td.has_variations { + width: 5vh; + min-width: 5vh; +} +#tableMain tbody tr td.access_level, #tableMain thead tr th.access_level { + width: 7vh; + min-width: 7vh; +} +#tableMain tbody tr td.active, #tableMain thead tr th.active { + width: 5vh; + min-width: 5vh; +} + +textarea { + width: 95%; +} + +select { + width: 100%; +} + +input { + width: 90%; +} + +td > input, td > select, td > textarea, .container-input > input, .container-input > select, .container-input > textarea { + border: 2px solid var(--c_purple); + border-radius: 0.5vh; +} + +#tableMain tbody tr td button { + padding: 0; + border: 0; + margin: 0; + text-decoration: none; +} + +#tableMain tbody tr td table thead tr th.id_variation_type, #tableMain tbody tr td table tbody tr td.id_variation_type, #tableMain tbody tr td table thead tr th.id_variation, #tableMain tbody tr td table tbody tr td.id_variation { + width: 47.5%; +} + diff --git a/static/dist/js/main.bundle.js b/static/dist/js/main.bundle.js index 7fb44013..fe0503a7 100644 --- a/static/dist/js/main.bundle.js +++ b/static/dist/js/main.bundle.js @@ -1,2 +1,2 @@ /*! For license information please see main.bundle.js.LICENSE.txt */ -(()=>{"use strict";(()=>{function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(e,t){for(var n=0;n0)if(r)t=!1;else if("string"!=typeof e[0])t=!1;else for(var n=0;n0)}},{key:"getDataContentType",value:function(t){var r=null,n="";return e.isEmpty(t)||("string"==typeof t?(r=t,n="application/x-www-form-urlencoded; charset=UTF-8"):(r=JSON.stringify(t),n="application/json; charset=UTF-8")),{Data:r,ContentType:n}}},{key:"arrayContainsItem",value:function(t,r){var n=!1;if(!e.isEmpty(t)&&!e.isEmpty(r))if(t[0]instanceof jQuery){for(var o=0;o=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var l=n.call(a,"catchLoc"),c=n.call(a,"finallyLoc");if(l&&c){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),F(r),h}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var o=n.arg;F(r)}return o}}throw Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:q(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),h}},t}function b(e,t,r,n,o,i,a){try{var u=e[i](a),l=u.value}catch(e){return void r(e)}u.done?t(l):Promise.resolve(l).then(n,o)}function k(e){return function(){var t=this,r=arguments;return new Promise((function(n,o){var i=e.apply(t,r);function a(e){b(i,n,o,a,u,"next",e)}function u(e){b(i,n,o,a,u,"throw",e)}a(void 0)}))}}function P(e,t){for(var r=0;r1&&void 0!==c[1]?c[1]:"GET",o=c.length>2&&void 0!==c[2]?c[2]:null,i=c.length>3&&void 0!==c[3]?c[3]:null,a=e.getUrlFromHash(r,i),u={method:n,headers:{"Content-Type":"application/json","X-CSRFToken":e.getCsrfToken()}},!o||"POST"!==n&&"PUT"!==n&&"PATCH"!==n||(u.body=JSON.stringify(o)),console.log("API request:",n,a,o),t.prev=7,t.next=10,fetch(a,u);case 10:if((l=t.sent).ok){t.next=13;break}throw new Error("HTTP error! status: ".concat(l.status));case 13:return t.next=15,l.json();case 15:return t.abrupt("return",t.sent);case 18:throw t.prev=18,t.t0=t.catch(7),console.error("API request failed:",t.t0),t.t0;case 22:case"end":return t.stop()}}),t,null,[[7,18]])}))),function(e){return f.apply(this,arguments)})},{key:"getUrlFromHash",value:function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;null==t&&(t=hashPageHome),console.log("getUrlFromHash:"),console.log("base url: "+_pathHost+"\nhash: "+t+"\nparams: "+r);var n=e.parameteriseUrl(_pathHost+t,r);return console.log("url: "+n),n}},{key:"parameteriseUrl",value:function(e,t){return t&&(e+="?"+new URLSearchParams(t).toString()),e}},{key:"goToUrl",value:function(e){window.location.href=e}},{key:"goToHash",value:function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=e.getUrlFromHash(t,r);e.goToUrl(n)}},{key:"loginUser",value:(s=k(m().mark((function t(){var r;return m().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return(r={})[keyCallback]=l.getHashPageCurrent(),t.next=4,e.request(hashPageUserLogin,"POST",r);case 4:return t.abrupt("return",t.sent);case 5:case"end":return t.stop()}}),t)}))),function(){return s.apply(this,arguments)})},{key:"getCategories",value:(c=k(m().mark((function t(){return m().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,e.request(hashGetStoreProductCategory);case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}}),t)}))),function(){return c.apply(this,arguments)})},{key:"getCategoriesByFilters",value:(u=k(m().mark((function t(r){return m().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e.goToHash(hashPageStoreProductCategories,r);case 1:case"end":return t.stop()}}),t)}))),function(e){return u.apply(this,arguments)})},{key:"saveCategories",value:(a=k(m().mark((function t(r,n,o){var i;return m().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return(i={})[flagFormFilters]=l.convertForm2JSON(n),i[flagProductCategory]=r,i[flagComment]=o,t.next=6,e.request(hashSaveStoreProductCategory,"POST",i);case 6:return t.abrupt("return",t.sent);case 7:case"end":return t.stop()}}),t)}))),function(e,t,r){return a.apply(this,arguments)})},{key:"getProductPermutations",value:(i=k(m().mark((function t(){return m().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,e.request(hashGetStoreProductPermutation);case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}}),t)}))),function(){return i.apply(this,arguments)})},{key:"getProductPermutationsByFilters",value:(o=k(m().mark((function t(r){return m().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e.goToHash(hashPageStoreProductPermutations,r);case 1:case"end":return t.stop()}}),t)}))),function(e){return o.apply(this,arguments)})},{key:"saveProductPermutations",value:(n=k(m().mark((function t(r,n,o){var i;return m().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return(i={})[flagFormFilters]=l.convertForm2JSON(n),i[flagProductPermutation]=r,i[flagComment]=o,t.next=6,e.request(hashSaveStoreProductPermutation,"POST",i);case 6:return t.abrupt("return",t.sent);case 7:case"end":return t.stop()}}),t)}))),function(e,t,r){return n.apply(this,arguments)})}],r&&P(t,r),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,r,n,o,i,a,u,c,s,f}();function w(e){return w="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},w(e)}function E(e,t){for(var r=0;r at "+r[keyPostcode]+"",document.querySelectorAll(idOverlayInfoBilling).css("display","none"),document.querySelectorAll(idOverlayInfoBilling).querySelector("form").classList.add(flagSubmitted)}else document.querySelectorAll(idContainerInfoDelivery).querySelector("div").innerHTML=""+r[keyNameFull]+" at "+r[keyPostcode]+"",document.querySelectorAll(idOverlayInfoDelivery).css("display","none"),document.querySelectorAll(idOverlayInfoDelivery).querySelector("form").classList.add(flagSubmitted)}},{key:"convertFormBilling2JSON",value:function(e,t){var r;r=document.querySelectorAll(t).querySelector("form"),r=document.querySelectorAll(idOverlayInfoDelivery).querySelector("form"),console.log("converting billing form to json\nform ID: "+r.id),e[keyForm]=convertForm2JSON(r);var n=[keyNameFull,keyPhoneNumber,keyPostcode,keyAddress1,keyAddress2,keyCity,keyCounty];for(var o in console.log("ajaxData:"),console.log(e),e[keyForm][keyInfoIdentical]=getElementValueCurrent(r.querySelector("#"+keyInfoIdentical)),n)t==idOverlayInfoBilling&&e[keyForm][keyInfoIdentical]?e[keyForm][n[o]]=getElementValueCurrent((void 0).querySelector("#"+n[o])):e[keyForm][n[o]]=getElementValueCurrent(r.querySelector("#"+n[o]));return console.log("ajaxData:"),console.log(e),e}},{key:"hookupButtonCheckoutSession",value:function(){var e=document.querySelectorAll(idButtonCheckout);e.classList.remove(flagInitialised),y.initialiseEventHandler(idButtonCheckout,flagInitialised,(function(){e.removeEventListener("click"),e.addEventListener("click",(function(e){var t=h.getLocalStorage(keyBasket),r={};r[keyBasket]=t,r=convertFormBilling2JSON(r,idOverlayInfoDelivery),(r=convertFormBilling2JSON(r,idOverlayInfoBilling))[key_code_currency]=getCurrencySelected(),ajaxJSONData("checkout session",mapHashToController(hashPageStoreCheckout),r,handleResponseCheckout,!1)}))}))}},{key:"handleResponseCheckout",value:function(e){window.location.href=e.data[keyUrlCheckout]}},{key:"hookupButtonFormBillingCopy",value:function(){y.initialiseEventHandler(idButtonFormBillingCopy,flagInitialised,(function(){document.querySelectorAll(idButtonFormBillingCopy).addEventListener("click",(function(e){var t=[keyNameFull,keyPhoneNumber,keyPostcode,keyAddress1,keyAddress2,keyCity,keyCounty],r=document.querySelectorAll(idOverlayInfoBilling).querySelector("form"),n=document.querySelectorAll(idOverlayInfoDelivery).querySelector("form");for(var o in t)r.querySelector("#"+t[o]).value=getElementValueCurrent(n.querySelector("#"+t[o]))}))}))}},{key:"leave",value:function(){!function(e,t,r){var n=Ke(We(e.prototype),"leave",r);return"function"==typeof n?function(e){return n.apply(r,e)}:n}(t,0,this)([])}}])}(F);function Ze(e){return Ze="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ze(e)}function et(e,t){for(var r=0;r3&&void 0!==arguments[3]?arguments[3]:null;return{text:e[t],value:e[r],selected:e[r]==n}}},{key:"getOptionJsonFromObjectJson",value:function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=t[flagNameAttrOptionText],o=t[flagNameAttrOptionValue];return console.log({objectJson:t,keyText:n,keyValue:o}),e.getOptionJsonFromObjectJsonAndKeys(t,n,o,r)}}])}();function yt(e){return yt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},yt(e)}function dt(e,t){for(var r=0;r1&&void 0!==arguments[1]&&arguments[1];if(arguments.length>0&&void 0!==arguments[0]&&arguments[0]){var o=this.getLocalStoragePage()[flagFormFilters],i=this.getFormFilters(),a=l.convertForm2JSON(i);n.areEqualDicts(o,a)||this.callFilterTableContent(o)}else Et(t,"sharedInitialize",this,3)([]),this.hookupFilters(),this.hookupButtonsAddSaveCancel(),this.hookupTableMain(),T.hookup((function(){r?e.saveRecordsTableDirtySinglePageApp():e.saveRecordsTableDirty()}))}},{key:"hookupFilters",value:function(){if(this.constructor===t)throw new Error("Subclass of TableBasePage must implement method hookupFilters().")}},{key:"sharedHookupFilters",value:function(){this.hookupButtonApplyFilters()}},{key:"hookupFilterActive",value:function(){this.hookupFilter(flagActive)}},{key:"hookupFilter",value:function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(e,r){return t.isDirtyFilter(r)},n=idFormFilters+" ."+e;this.hookupEventHandler("change",n,r)}},{key:"hookupButtonApplyFilters",value:function(){var e=this;this.hookupEventHandler("click",idButtonApplyFilters,(function(t,r){t.stopPropagation(),e.getAndLoadFilteredTableContent()}))}},{key:"getAndLoadFilteredTableContent",value:function(){var e=this.getFormFilters(),t=l.convertForm2JSON(e);this.leave(),this.callFilterTableContent(t).catch((function(e){return console.error("Error:",e)}))}},{key:"getFormFilters",value:function(){return document.querySelector(idFormFilters)}},{key:"callbackLoadTableContent",value:function(e){this.getTableMain().querySelector("tbody").querySelectorAll("tr").forEach((function(e){e.remove()}));var t=e.data[flagRows];!n.isEmpty(t)&&t.every((function(e){return e.hasOwnProperty("display_order")}))&&(t=t.sort((function(e,t){return e.display_order-t.display_order}))),t.forEach(this.loadRowTable.bind(this)),this.hookupTableMain()}},{key:"getTableMain",value:function(){return document.querySelector(idTableMain)}},{key:"loadRowTable",value:function(e){throw new Error("Subclass of TableBasePage must implement method loadRowTable().")}},{key:"getAndLoadFilteredTableContentSinglePageApp",value:function(){var e=this,t=this.getFormFilters(),r=l.convertForm2JSON(t);this.callFilterTableContent(r).then((function(t){console.log("Table data received:",t),e.callbackLoadTableContent(t)})).catch((function(e){return console.error("Error:",e)}))}},{key:"hookupButtonsAddSaveCancel",value:function(){this.hookupButtonAddRowTable(),this.hookupButtonSave(),this.hookupButtonCancel(),this.toggleShowButtonsSaveCancel(!1)}},{key:"saveRecordsTableDirty",value:function(){var e=this,t=this.getTableRecords(!0);if(0!=t.length){var r=this.getFormFilters(),n=l.getElementValueCurrent(document.querySelector(idTextareaConfirm));this.callSaveTableContent(t,r,n).then((function(t){t[flagStatus]==flagSuccess?(console.log("Records saved!"),console.log("Data received:",t),e.getAndLoadFilteredTableContent()):(console.log("error: ",t[flagMessage]),bt.show(t[flagMessage]))})).catch((function(e){return console.error("Error:",e)}))}else bt.show("No records to save")}},{key:"getTableRecords",value:function(){var e,t=this,r=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=this.getTableMain(),o=[];return n.querySelectorAll("tbody tr").forEach((function(n){r&&!n.classList.contains(flagDirty)||(e=t.getJsonRow(n),o.push(e))})),o}},{key:"getJsonRow",value:function(e){throw new Error("Subclass of TableBasePage must implement method getJsonRow().")}},{key:"saveRecordsTableDirtySinglePageApp",value:function(){var e=this,t=this.getTableRecords(!0);if(0!=t.length){var r=this.getFormFilters(),n=l.getElementValueCurrent(document.querySelector(idTextareaConfirm));this.callSaveTableContent(t,r,n).then((function(t){t[flagStatus]==flagSuccess?(console.log("Records saved!"),console.log("Data received:",t),e.callbackLoadTableContent(t)):(console.log("error: ",t[flagMessage]),bt.show(t[flagMessage]))})).catch((function(e){return console.error("Error:",e)}))}else bt.show("No records to save")}},{key:"hookupButtonCancel",value:function(){y.initialiseEventHandler(idFormFilters+" button."+flagCancel,flagInitialised,(function(e){e.addEventListener("click",(function(e){e.stopPropagation(),getAndLoadFilteredTableContent()})),e.classList.add(flagCollapsed)}))}},{key:"hookupButtonAddRowTable",value:function(){var e=this;this.hookupEventHandler("click",idFormFilters+" button."+flagAdd,(function(t,r){t.stopPropagation();var n=document.querySelector(idTableMain+" tbody"),o=_rowBlank.cloneNode(!0);o.classList.remove(flagInitialised),o.querySelectorAll("."+flagInitialised).forEach((function(e){e.classList.remove(flagInitialised)})),e.initialiseRowNew(o),n.appendChild(o),e.hookupTableMain()}))}},{key:"initialiseRowNew",value:function(e){throw new Error("Subclass of TableBasePage must implement method initialiseRowNew().")}},{key:"hookupTableMain",value:function(){var e=this;if(this.constructor===t)throw new Error("Must implement hookupTableMain() method.");null==_rowBlank&&y.initialiseEventHandler(idTableMain,flagInitialised,(function(t){e.cacheRowBlank()}))}},{key:"cacheRowBlank",value:function(){var e=idTableMain+" tbody tr."+flagRowNew,t=document.querySelector(e);console.log("row blank temp: ",t),_rowBlank=t.cloneNode(!0),document.querySelectorAll(e).forEach((function(e){e.remove()}))}},{key:"hookupSlidersDisplayOrderTable",value:function(){var e=idTableMain+" tbody tr td."+flagDisplayOrder+" input."+flagSlider+"."+flagDisplayOrder;this.hookupChangeHandlerTableCells(e)}},{key:"hookupChangeHandlerTableCells",value:function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(e,r){t.handleChangeElementCellTable(e,r)};this.hookupEventHandler("change",e,r)}},{key:"handleChangeElementCellTable",value:function(e,t){var r=l.getRowFromElement(t),n=l.getCellFromElement(t);console.log("td: ",n);var o=l.hasDirtyChildrenContainer(r),i=t.classList.contains(flagDirty),a=l.updateAndCheckIsElementDirty(t);if(console.log("isDirtyElement: ",a),console.log("wasDirtyElement: ",i),a!=i){l.handleDirtyElement(n,a);var u=l.hasDirtyChildrenContainer(r);if(console.log("isNowDirtyRow: ",u),console.log("wasDirtyRow: ",o),u!=o){l.handleDirtyElement(r,u);var c=this.getTableRecords(!0),s=c.length>0;console.log("dirty records:",c),console.log("existsDirtyRecord:",s),this.toggleShowButtonsSaveCancel(s)}}}},{key:"hookupChangeHandlerTableCellsWhenNotCollapsed",value:function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(e,r){r.classList.contains(flagCollapsed)||t.handleChangeElementCellTable(e,r)};this.hookupEventHandler("change",e,r)}},{key:"hookupTextareasCodeTable",value:function(){this.hookupChangeHandlerTableCells(idTableMain+" tbody tr td."+flagCode+" textarea")}},{key:"hookupTextareasNameTable",value:function(){this.hookupChangeHandlerTableCells(idTableMain+" tbody tr td."+flagName+" textarea")}},{key:"hookupTextareasDescriptionTable",value:function(){this.hookupChangeHandlerTableCells(idTableMain+" tbody tr td."+flagDescription+" textarea")}},{key:"hookupInputsActiveTable",value:function(){this.hookupChangeHandlerTableCells(idTableMain+" tbody tr td."+flagActive+' input[type="checkbox"]')}},{key:"hookupTdsAccessLevel",value:function(){var e=idTableMain+" tbody td."+flagAccessLevel;this.hookupTableCellDdlPreviews(e,vt.getListFromDict(accessLevels))}},{key:"hookupTableCellDdlPreviews",value:function(e,t){var r=this,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(e,t){r.hookupTableCellDdls(e,t)};this.hookupEventHandler("click",e,(function(o,i){r.handleClickTableCellDdlPreview(o,i,t,e,(function(e,t){n(e,t)}))}))}},{key:"hookupTableCellDdls",value:function(e){var t=this;this.hookupEventHandler("change",e,(function(e,r){t.handleChangeTableCellDdl(e,r)}))}},{key:"handleClickTableCellDdlPreview",value:function(e,t,r,n){var o=this,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:function(e,t){o.hookupTableCellDdls(e,t)};if(!t.querySelector("select")){console.log("click table cell ddl preview");var a=t.cloneNode(!0);t.parentNode.replaceChild(a,t);var u=a.getAttribute(attrValueCurrent);a.innerHTML="";var c,s,f=document.createElement("select");l.setElementValuesCurrentAndPrevious(f,l.getElementAttributeValueCurrent(a)),console.log({optionObjectList:r,cellSelector:n}),r.forEach((function(e){c=ft.getOptionJsonFromObjectJson(e,u),s=l.createOption(c),f.appendChild(s)})),a.appendChild(f),i(n+" select")}}},{key:"handleChangeTableCellDdl",value:function(e,t){var r=l.getRowFromElement(t),n=l.getCellFromElement(t);console.log("td: ",n);var o=l.hasDirtyChildrenContainer(r),i=t.classList.contains(flagDirty),a=l.updateAndCheckIsElementDirty(t);if(console.log("isDirtyElement: ",a),console.log("wasDirtyElement: ",i),a!=i){l.handleDirtyElement(n,a);var u=t.options[t.selectedIndex];l.setElementAttributeValueCurrent(n,u.value);var c=l.hasDirtyChildrenContainer(r);if(console.log("isNowDirtyRow: ",c),console.log("wasDirtyRow: ",o),c!=o){l.handleDirtyElement(r,c);var s=this.getTableRecords(!0),f=s.length>0;console.log("dirty records:",s),console.log("existsDirtyRecord:",f),this.toggleShowButtonsSaveCancel(f)}}}},{key:"hookupTableCellDDlPreviewsWhenNotCollapsed",value:function(e,t){var r=this,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(e,t){r.hookupTableCellDdls(e,t)};this.hookupEventHandler("click",e,(function(o,i){var a=i.querySelector("div");a&&!a.classList.contains(flagCollapsed)&&r.handleClickTableCellDdlPreview(o,i,t,e,(function(e,t){n(e,t)}))}))}},{key:"leave",value:function(){if(this.constructor===t)throw new Error("Must implement leave() method.");Et(t,"leave",this,3)([]);var e=this.getFormFilters(),r={};r[flagFormFilters]=l.convertForm2JSON(e),this.setLocalStoragePage(r)}},{key:"toggleColumnHasClassnameFlag",value:function(e,t,r){var n=this.getTableMain(),o=n.querySelector("th."+e),i=o.classList.contains(r);if(t!=i){var a=n.querySelectorAll("td."+e);l.toggleElementHasClassnameFlag(o,t,r),a.forEach((function(e){l.toggleElementHasClassnameFlag(e,t,r)}))}}}],[{key:"isDirtyFilter",value:function(e){var t=l.updateAndCheckIsElementDirty(e);if(t){var r=document.querySelector(idTableMain+" tbody");r.querySelectorAll("tr").remove(),r.appendChild(document.createElement('
Press "Apply Filters" to refresh the table.
'))}return t}}])}(F);function It(e){return It="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},It(e)}function Ft(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,t){if(e){if("string"==typeof e)return Lt(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Lt(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){u=!0,i=e},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}function Lt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r",e))})),t.addEventListener("change",(function(e){loadPermutations()}))}));var r=document.querySelectorAll(idFilterIsOutOfStock);y.initialiseEventHandler(r,flagInitialised,(function(){r.addEventListener("change",(function(e){loadPermutations()}))}));var n=document.querySelectorAll(idFilterQuantityMin);y.initialiseEventHandler(n,flagInitialised,(function(){n.addEventListener("change",(function(e){loadPermutations()}))}));var o=document.querySelectorAll(idFilterQuantityMax);y.initialiseEventHandler(o,flagInitialised,(function(){o.addEventListener("change",(function(e){loadPermutations()}))}))}},{key:"loadPermutations",value:function(){var e=document.querySelectorAll(idFormFiltersPermutations),t={};t[keyForm]=convertForm2JSON(e),t.csrf_token=t[keyForm].csrf_token,console.log("ajaxData:"),console.log(t),ajaxJSONData("permutations",mapHashToController(hashPageStorePermutationsPost),t,callbackLoadPermutations,!1,{"X-CSRFToken":t.csrf_token})}},{key:"callbackLoadPermutations",value:function(e){console.log("ajax:"),console.log(e.data);var t,r,n,o=document.querySelectorAll(idTableMain);(t=o.querySelector("tbody")).querySelector("tr").remove(),$.each(e.data,(function(e,o){r=_rowBlank.cloneNode(!0),(r=document.querySelectorAll(r)).classList.remove(flagRowNew),console.log("applying data row: ",o),r.querySelector("td."+flagProductCategory+" select").val(o[attrIdProductCategory]),n=r.querySelector("td."+flagProduct+" select"),listProducts.forEach((function(e){e[attrIdProductCategory]==o[attrIdProductCategory]&&n.appendChild(document.createElement("