From 002551c0a962c043cf2555e705609c0d75ae8766 Mon Sep 17 00:00:00 2001 From: teddy Date: Fri, 18 Oct 2024 22:25:07 +0100 Subject: [PATCH] feat(JavaScript): Updated architecture for TableBasePage object with static row ID attribute attached for adding ID against each row added to DOM --- README.md | 1 + __pycache__/app.cpython-312.pyc | Bin 5522 -> 5836 bytes app.py | 4 + .../__pycache__/base.cpython-312.pyc | Bin 4353 -> 4875 bytes .../__pycache__/currency.cpython-312.pyc | Bin 6549 -> 6908 bytes business_objects/address.py | 12 +- business_objects/base.py | 8 + business_objects/currency.py | 9 + business_objects/region.py | 14 +- .../__pycache__/stock_item.cpython-312.pyc | Bin 18179 -> 18189 bytes .../__pycache__/store_base.cpython-312.pyc | Bin 4385 -> 5722 bytes .../store/manufacturing_purchase_order.py | 313 + business_objects/store/stock_item.py | 8 +- business_objects/store/store_base.py | 28 +- business_objects/store/supplier.py | 109 +- business_objects/store/supplier_address.py | 145 + .../store/supplier_purchase_order.py | 289 + .../store/__pycache__/store.cpython-312.pyc | Bin 1919 -> 2029 bytes .../__pycache__/supplier.cpython-312.pyc | Bin 4099 -> 7044 bytes .../store/manufacturing_purchase_order.py | 114 + controllers/store/store.py | 5 +- controllers/store/supplier.py | 134 +- controllers/store/supplier_purchase_order.py | 114 + ...datastore_store_stock_item.cpython-312.pyc | Bin 6137 -> 6128 bytes ...tore_store_manufacturing_purchase_order.py | 132 + datastores/datastore_store_stock_item.py | 7 +- datastores/datastore_store_supplier.py | 93 +- ...datastore_store_supplier_purchase_order.py | 129 + forms/store/manufacturing_purchase_order.py | 38 + forms/store/supplier.py | 34 + forms/store/supplier_purchase_order.py | 38 + .../model_view_base.cpython-312.pyc | Bin 17619 -> 19368 bytes .../model_view_store.cpython-312.pyc | Bin 22454 -> 25132 bytes ..._store_product_permutation.cpython-312.pyc | Bin 5959 -> 5642 bytes ...odel_view_store_stock_item.cpython-312.pyc | Bin 6446 -> 5973 bytes .../model_view_store_supplier.cpython-312.pyc | Bin 1469 -> 3838 bytes models/model_view_base.py | 24 +- models/model_view_store.py | 32 + ...view_store_manufacturing_purchase_order.py | 49 + .../model_view_store_product_permutation.py | 10 - models/model_view_store_stock_item.py | 10 - models/model_view_store_supplier.py | 58 +- ...odel_view_store_supplier_purchase_order.py | 50 + static/MySQL/0000_combine.sql | 6295 +++++++++-------- static/MySQL/0001_destroy.sql | 21 +- static/MySQL/1106_tbl_Shop_Address.sql | 35 +- static/MySQL/1107_tbl_Shop_Address_Audit.sql | 2 - static/MySQL/1400_tbl_Shop_Supplier.sql | 2 + static/MySQL/1402_tbl_Shop_Supplier_Temp.sql | 5 +- .../MySQL/1403_tbl_Shop_Supplier_Address.sql | 29 + .../1404_tbl_Shop_Supplier_Address_Audit.sql | 21 + .../1405_tbl_Shop_Supplier_Address_Temp.sql | 17 + ...p_Supplier_Purchase_Order_Product_Link.sql | 2 +- ..._tbl_Shop_Manufacturing_Purchase_Order.sql | 14 +- ...Shop_Manufacturing_Purchase_Order_Temp.sql | 28 + ...ufacturing_Purchase_Order_Product_Link.sql | 11 +- ...uring_Purchase_Order_Product_Link_Temp.sql | 27 +- static/MySQL/3400_tri_Shop_Supplier.sql | 2 + .../MySQL/3403_tri_Shop_Supplier_Address.sql | 65 + .../3409_tri_Shop_Supplier_Purchase_Order.sql | 12 +- ...p_Supplier_Purchase_Order_Product_Link.sql | 24 +- ..._tri_Shop_Manufacturing_Purchase_Order.sql | 26 +- ...ufacturing_Purchase_Order_Product_Link.sql | 30 +- .../MySQL/6000_p_debug_timing_reporting.sql | 10 +- .../7204_p_shop_calc_product_permutation.sql | 4 +- static/MySQL/7204_p_shop_get_many_product.sql | 9 +- static/MySQL/7400_p_shop_save_supplier.sql | 204 +- .../MySQL/7401_p_shop_get_many_supplier.sql | 54 +- .../7403_p_save_supplier_purchase_order.sql | 74 +- ..._shop_get_many_supplier_purchase_order.sql | 96 +- ...shop_save_manufacturing_purchase_order.sql | 31 +- ..._get_many_manufacturing_purchase_order.sql | 170 +- static/MySQL/9000_populate.sql | 70 +- static/MySQL/temp.txt | 9 +- static/css/components/table.css | 13 + static/css/main.css | 4 - .../store/manufacturing_purchase_order.css | 38 + .../css/pages/store/product_permutations.css | 9 +- static/css/pages/store/supplier.css | 59 + .../pages/store/supplier_purchase_order.css | 40 + static/dist/css/main.bundle.css | 17 +- .../css/store_product_permutations.bundle.css | 9 +- static/dist/js/main.bundle.js | 2 +- static/js/api.js | 45 + static/js/dom.js | 10 +- static/js/pages/base.js | 20 +- static/js/pages/base_table.js | 42 +- .../store/manufacturing_purchase_orders.js | 82 + static/js/pages/store/product_categories.js | 1 + static/js/pages/store/product_permutations.js | 1 + static/js/pages/store/products.js | 1 + static/js/pages/store/stock_items.js | 13 +- .../pages/store/supplier_purchase_orders.js | 82 + static/js/pages/store/suppliers.js | 388 + static/js/router.js | 9 + .../store/_preview_DDL_currency.html | 2 +- .../components/store/_preview_address.html | 13 + ...ew_manufacturing_purchase_order_items.html | 13 + .../store/_preview_order_items.html | 13 + ...review_product_permutation_variations.html | 10 +- .../_row_manufacturing_purchase_order.html | 72 + .../components/store/_row_stock_item.html | 16 +- templates/components/store/_row_supplier.html | 69 + .../store/_row_supplier_purchase_order.html | 64 + templates/js/sections/store.js | 37 + templates/layouts/layout.html | 21 +- templates/pages/core/_admin_home.html | 10 + .../store/_manufacturing_purchase_orders.html | 73 + templates/pages/store/_stock_items.html | 15 +- .../store/_supplier_purchase_orders.html | 73 + templates/pages/store/_suppliers.html | 66 + webpack.config.js | 26 +- 112 files changed, 7280 insertions(+), 3608 deletions(-) create mode 100644 business_objects/store/manufacturing_purchase_order.py create mode 100644 business_objects/store/supplier_address.py create mode 100644 business_objects/store/supplier_purchase_order.py create mode 100644 controllers/store/manufacturing_purchase_order.py create mode 100644 controllers/store/supplier_purchase_order.py create mode 100644 datastores/datastore_store_manufacturing_purchase_order.py create mode 100644 datastores/datastore_store_supplier_purchase_order.py create mode 100644 forms/store/manufacturing_purchase_order.py create mode 100644 forms/store/supplier.py create mode 100644 forms/store/supplier_purchase_order.py create mode 100644 models/model_view_store_manufacturing_purchase_order.py create mode 100644 models/model_view_store_supplier_purchase_order.py create mode 100644 static/MySQL/1403_tbl_Shop_Supplier_Address.sql create mode 100644 static/MySQL/1404_tbl_Shop_Supplier_Address_Audit.sql create mode 100644 static/MySQL/1405_tbl_Shop_Supplier_Address_Temp.sql create mode 100644 static/MySQL/1417_tbl_Shop_Manufacturing_Purchase_Order_Temp.sql create mode 100644 static/MySQL/3403_tri_Shop_Supplier_Address.sql create mode 100644 static/css/pages/store/manufacturing_purchase_order.css create mode 100644 static/css/pages/store/supplier.css create mode 100644 static/css/pages/store/supplier_purchase_order.css create mode 100644 static/js/pages/store/manufacturing_purchase_orders.js create mode 100644 static/js/pages/store/supplier_purchase_orders.js create mode 100644 static/js/pages/store/suppliers.js create mode 100644 templates/components/store/_preview_address.html create mode 100644 templates/components/store/_preview_manufacturing_purchase_order_items.html create mode 100644 templates/components/store/_preview_order_items.html create mode 100644 templates/components/store/_row_manufacturing_purchase_order.html create mode 100644 templates/components/store/_row_supplier.html create mode 100644 templates/components/store/_row_supplier_purchase_order.html create mode 100644 templates/pages/store/_manufacturing_purchase_orders.html create mode 100644 templates/pages/store/_supplier_purchase_orders.html create mode 100644 templates/pages/store/_suppliers.html diff --git a/README.md b/README.md index 7d8050b3..4be183be 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ JavaScript page api router + base - navigation buttons MySQL get save diff --git a/__pycache__/app.cpython-312.pyc b/__pycache__/app.cpython-312.pyc index 96d52adf16a60ae7a79ec179e518e089f68a74fa..5c81800b45fd9ffadfaf940f32a2d73aa7d6ef3e 100644 GIT binary patch delta 1657 zcma)6O>Y}T7@qNFZ70O``m0H+IP1ho{M9%~TRU!uTGvulB#1;S4sx#h4}=`*+w=*XcsZ|(D5J{pyC<50H31cIQGL(Cy(3;y-|x*WY}-P> zY$YKyrS3j2!o^;h`XPNFgm!F78G8pbJ9E%WgS=g*dg~CAf<43BlIwqH#3MA9*$SqS z`v{S(8T>B|E~p>VFN70AS<6&ZZ?iN4`B8^2M2<5fEUKS8zpK)U&9QwCs-M|eH!9=i zg@s+R>0&ziq8uv|%H%p!VpiQZ#ko&`GQBU@oTtO>J8b4()l65Fwr9rog}aHS+gh8w z$T0tP9}?T-=k(ctEbtf=csCl@sCdQI^~_i zog)2C-8F24%MIZw*n-LQ!KU*k zm`ajrqmGS|QLhqQ(#so-)pDiYAnO}zrCNhju9Xd3suBegT6BLDo9dGrjap4x$D~hr z@Uy!ij3roi$>EkzuGLyjt-7{`NlV0pR0$cSZw|i>PttqCH^dy1y?T)MBptpigXE$; z?9!TV#JR{_uFzfI2Md`>b)!zInudvyF}uwi)h+SR5lMz#x+o=}kG>(Lp+s*=lh9AU zm7>l7Gj1j6o)jECY!9r_Ablhqdm+Si;;L3Q-lBg=F+|3AgAvXSnQW<2B?cMigk%xM zb*-#bu3>$f$UQo}ysnWbBgh12y_R^ZzM82RWR*7A}K2VwFC-gNS{A36}vZwB4y{a@ce2z3&%Ktiz7JV2<1(h~fYJ*qW;7S`5 z+F-d2(8067pktu$7+j!#hhB3&8hPuALuT$%f$vMp_1@1$P}6qwV&*! zWmFcuRY^{xX}39pX7H4KR_^l4%RcwzTCOaJOJCJG-CDf24qI$pX;lamfRlJ%pVvSY zT;X@O_48+NfSXEiqHGOVF>7#RdtGgfpjkX?uYSdR#=gRlk{qnqSG&9Rb^aVCRw2L@ z`$l)$8uB(^#jk;STYwG(cHcoS}hp6}53>@(js@_&a>;9D9I^7g&HIR94- zz&iqLlexvuITBZ?O)rx5m;6eqr$7u*H9Ohmm3=ofuuAv?PHK`$tw-2$>-yvH9r9Uj!CrOQ!18@|I~WCzrFGBO5({9vT0 zg+!~7;E%!s{8q%Th2=8NpGM*nEFy8ZT0485)d<1NnY`eLS4So7TOd*B%FHHxsnXN(jq^Iwf>PNw|_Fqx9c_#gchTC*+?Jj>+QNq%3P z$GmBb>wBAEz6p*u!B0(4*^KuG6h0N3<2PfuG=f2pb5wT diff --git a/app.py b/app.py index 6bde399b..b2c2cbb2 100644 --- a/app.py +++ b/app.py @@ -40,11 +40,13 @@ import lib.argument_validation as av from controllers.core import routes_core from controllers.legal import routes_legal from controllers.store.store import routes_store +from controllers.store.manufacturing_purchase_order import routes_store_manufacturing_purchase_order from controllers.store.product import routes_store_product from controllers.store.product_category import routes_store_product_category from controllers.store.product_permutation import routes_store_product_permutation from controllers.store.stock_item import routes_store_stock_item from controllers.store.supplier import routes_store_supplier +from controllers.store.supplier_purchase_order import routes_store_supplier_purchase_order from controllers.user import routes_user # external from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session @@ -125,11 +127,13 @@ with app.app_context(): app.register_blueprint(routes_core) app.register_blueprint(routes_legal) app.register_blueprint(routes_store) +app.register_blueprint(routes_store_manufacturing_purchase_order) app.register_blueprint(routes_store_product) app.register_blueprint(routes_store_product_category) app.register_blueprint(routes_store_product_permutation) app.register_blueprint(routes_store_stock_item) app.register_blueprint(routes_store_supplier) +app.register_blueprint(routes_store_supplier_purchase_order) app.register_blueprint(routes_user) diff --git a/business_objects/__pycache__/base.cpython-312.pyc b/business_objects/__pycache__/base.cpython-312.pyc index bef2ca63dfc61b4c2fefa1c73b8ef14d252ca605..097ed161cc582d3d14c6b46ad1117cd2eb7091d6 100644 GIT binary patch delta 886 zcmZvY%}>){9LHBE)xDJ&jUtL5h%yo90AChSLTHhNt%a?;RiMm1k7E&5eOe+rC^OMS z;|20u#tjZ85>I4DuO2ic2D1z4-{3{PdGdJ*Xi03+&-45~-*5Un>5JyK7y0dA(B~l! zCmhQz1-JOe4D+eH%>1fa219B)WMR!|l0pt7ddLcr>J^uh94D(CE;sDB5%sFer5u-5 zBQB>nZdASIa$}AgSEIy@9~?a4$Vs)+RaB|-dSDm0|I+h;?CGO+!|PzmHQyllv}?Xu zm21RB7ZE*B7rQZpJISQq_zq{y3Z4sRRm2NB%KL&m*qZApDLNP`$L7`GiQOr=x64-uyK4Y2-(3&#<9C36 z;mz8!!PaO|UYRKAtJ4)WinsW4XD&pF(#l{dy_&4Bk=^F@Vq&GO)V11CVcYRnzA@O? zT8zJ5DpkLER$*Jq-}zaF$>C%u%{;&xp_BDX^lpEz`uk|lf&mui;a&6`e+#t)dl}zP I4}nwp15nKECIA2c delta 391 zcmeBHYgFPp&CAQh00e$MeCa>9H}VxQGOBE@XZ*}$#>tSXo#NfXuo@%{1W`Jvx+y+L zd_ADNFA`tB(ofTWvj?jZq~5o&8;0Cx@`xPCm@;v{{T}1~a3> z1`%c;!W1ORR1^wg#{r3ACLp1pP!tZN zZb?l($164YIIkk3+vJzLmYk75K|f7{qL9hjd>`FzaVO^_78mEHmSp6o6h(kE@D!IM zmSiSFh2nuiMTtOSB|{NNE7;H?HV_L$hyZbM*yJw$j>!fB7Lz9l$WG1{^{O5(E)KAVL^OXfhW`g4i-3LJCAE0*PW)AfW&PMQT9SEdg|+s&LxE zUK9&5z-n?ZyRxX1@&d=1IvpH6{5K>N7bwo;0Wx_fPY@N~EYEYBkuh!aZ(derMvKXe zf|`s4o3#Z`GiloZb!+k$*#jxC%Wg5JrUcu!*2hFS46_RIFOm48*ho5iTIY6GZq< x4iHylOxRo`uEWUmL11!^#4*N%$-$D^;)#rmTpdOI6`d6`q`oqMctsjO9RQP_aZCUJ delta 286 zcmexkI@Or(G%qg~0}z}K<4Ug=-pF@=k+E&_dB$WWjTGJ%hA6odJ|HQdDw!gb!r#KU z8l)5mq7+gDfZ~dkf||mcvsiYrPkt%JvpJXdHX~!~W>0=rW=6Bg{z96J>6!kqAVL~M*n!yjj+1*uV;D;| zzY@)61lkZLZqC>+xldf5QEBo%aW8JL`5@mE*-RFes1~pQF`Yn!JBaX}yjVh!(P#5f n2_44CtWsMT<0kKt(iV?kWaR27>aXamm?8C*0mLiP04fIn$xlK- diff --git a/business_objects/address.py b/business_objects/address.py index 78199060..364beea4 100644 --- a/business_objects/address.py +++ b/business_objects/address.py @@ -17,7 +17,7 @@ from business_objects.region import Region from extensions import db # external from typing import ClassVar - +from flask import jsonify class Address(db.Model, Base): FLAG_ADDRESS_LINE_1: ClassVar[str] = 'address_line_1' @@ -59,6 +59,12 @@ class Address(db.Model, Base): address.id_address = query_row[6] address.id_region = query_row[7] return address + @classmethod + def from_DB_supplier(cls, query_row): + address = cls() + address.id_address = query_row[1] + address.postcode = query_row[2] + return address def __repr__(self): return f''' {self.ATTR_ID_ADDRESS}: {self.id_address} @@ -82,6 +88,8 @@ class Address(db.Model, Base): self.FLAG_COUNTY: self.county, self.FLAG_ACTIVE: 1 if av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json') else 0 } + def to_json_str(self): + return jsonify(self.to_json()) @classmethod def from_json(cls, json): print(f'{cls.__name__}.from_json: {json}') @@ -94,4 +102,4 @@ class Address(db.Model, Base): address.city = json[cls.FLAG_CITY], address.county = json[cls.FLAG_COUNTY], address.active = json[cls.FLAG_ACTIVE] - return address + return address \ No newline at end of file diff --git a/business_objects/base.py b/business_objects/base.py index 3247da46..b2957ac5 100644 --- a/business_objects/base.py +++ b/business_objects/base.py @@ -27,14 +27,22 @@ class Base(): FLAG_ACCESS_LEVEL_REQUIRED: ClassVar[str] = 'access_level_required' FLAG_ACTIVE: ClassVar[str] = 'active' FLAG_ADDRESS: ClassVar[str] = 'address' + FLAG_ADDRESS_LINE_1: ClassVar[str] = 'address_line_1' + FLAG_ADDRESS_LINE_2: ClassVar[str] = 'address_line_2' FLAG_CAN_ADMIN: ClassVar[str] = 'can_admin' FLAG_CAN_EDIT: ClassVar[str] = 'can_edit' FLAG_CAN_VIEW: ClassVar[str] = 'can_view' + FLAG_CITY: ClassVar[str] = 'city' FLAG_CODE: ClassVar[str] = 'code' + FLAG_COUNTY: ClassVar[str] = 'county' + FLAG_CREATED_ON: ClassVar[str] = 'created_on' FLAG_CURRENCY: ClassVar[str] = 'currency' FLAG_CURRENCY_COST: ClassVar[str] = 'currency_cost' + FLAG_DATE_FROM: ClassVar[str] = 'date_from' + FLAG_DATE_TO: ClassVar[str] = 'date_to' FLAG_DESCRIPTION: ClassVar[str] = 'description' FLAG_DISPLAY_ORDER: ClassVar[str] = 'display_order' + FLAG_EDIT: ClassVar[str] = 'edit' FLAG_EMAIL: ClassVar[str] = 'email' FLAG_FAX: ClassVar[str] = 'fax' FLAG_GUID: ClassVar[str] = 'guid' diff --git a/business_objects/currency.py b/business_objects/currency.py index 5cfd09c6..3d43ee99 100644 --- a/business_objects/currency.py +++ b/business_objects/currency.py @@ -90,6 +90,15 @@ class Currency(db.Model, Store_Base): currency.code = query_row[13] currency.symbol = query_row[14] return currency + @classmethod + def from_DB_supplier(cls, query_row): + _m = 'Currency.from_DB_supplier' + v_arg_type = 'class attribute' + currency = cls() + currency.id_currency = query_row[1] + currency.symbol = query_row[2] + currency.code = query_row[3] + return currency def __repr__(self): return f''' id: {self.id_currency} diff --git a/business_objects/region.py b/business_objects/region.py index de0cff18..8f3e744e 100644 --- a/business_objects/region.py +++ b/business_objects/region.py @@ -32,13 +32,18 @@ class Region(db.Model, Base): def __init__(self): super().__init__() Base.__init__(self) - self.region = None @classmethod def from_DB_stock_item(cls, query_row): - plant = cls() - plant.id_region = query_row[7] - return plant + region = cls() + region.id_region = query_row[7] + return region + @classmethod + def from_DB_supplier(cls, query_row): + region = cls() + region.id_region = query_row[2] + region.name = query_row[3] + return region def __repr__(self): return f''' {self.ATTR_ID_REGION}: {self.id_region} @@ -78,5 +83,4 @@ class Region(db.Model, Base): region.code = query_row[1] region.name = query_row[2] region.active = av.input_bool(query_row[3], cls.FLAG_ACTIVE, f'{cls.__name__}.from_DB_region') - region.display_order = query_row[4] return region diff --git a/business_objects/store/__pycache__/stock_item.cpython-312.pyc b/business_objects/store/__pycache__/stock_item.cpython-312.pyc index 737bdff6efe95787d2c3d704fa6e89ffe8004a6f..973a93f39238bbff0ff5f88796dcff775307221e 100644 GIT binary patch delta 147 zcmZqfW9;o? Y%XI^fiv}Jycm%HVAPa03RQjX>04M}7%m4rY delta 120 zcmeC}V{GnYq~5o&AF+8;FV_c$-5+TNtIhF6wz* z)b#G)y27D$LsNG}@^v5|EVTKP7!S9s=0zUO6(-lUoiA!T-{29r&VwwlSz76n3IG>j BCTjoy diff --git a/business_objects/store/__pycache__/store_base.cpython-312.pyc b/business_objects/store/__pycache__/store_base.cpython-312.pyc index 39c1b30a5fb87a0663e905fc55714e6c0d4b40e1..ccfd7f24f866588075a975a6b52acb36e7dc1cf0 100644 GIT binary patch delta 2554 zcmaKrPf!zA7{C)*F^VB^6vrTc1W|${2m}O?fN`^imHZ>SQFs>DG`nInB$z)c(`i>_ z?4>gun7zbl?Sz>g==6f)rKgTF?X8#0fR_Ps9xk4Vkom-l|}`}TeN zy|?R~x})(Av-yw#|J-Xw7JfbcsDJpOfoC|eOZV22k>ZIHSa3kn6L|v2{19u6X*>S2o4$_Uz?nrq8+$8Fz z++}bcWT)H}a4hPfoEIF2&Qb0vI3Mbz+!Q#KM-EC}138VHl=FiNpgzh4!G+Ly%7wwr zpnl3lzzJx8aw51W8YE8ra80g*yn$R);4HW~G(oHF#CLB9EN9~!1sK7;6abb)fW zz)5I?a<{?7&?q>ydP_eC8AlhXKpC8Z#wd3O+yc5pxx3&JXq0CaDb5B4jR9mxa>&~uFb|rodoRGL}My&L>L$?&qDN`?;G z$j+)#y%9A%uAXdl=e?Q?xgVuc2fJq~YrdjZH`A)!I_yxLWY|Y=o?w8$MKDY-LU57b5`mjwlE6d25^w}Q0-j)+ zAV3fzm?01dq69Yx<_K;Q%p0y@N@N%#h!ZFT3j_&*`vi*wX@Um?S%N&lBZ6guFEo?+ z+pd*5gW6WGp&?HiY#+nF&>DrmjGV=_rnFu>>6Hm zR(jnf##R_DvM=z|t-Wh(*X))??U1ES?e~?KwxVg{=(@Sg_$nh&s)lIgRQHo>tER%y zHN4ne8J?lapQ)YJ6j(Fu?0w>2wHI7#_*Hv%3exUbzHZ%JUd4gC)LfV<3NP@BPilWz z9F4mpv}UWr_)POzpEo}xr}m6s1>+yn_#*yflFCHp8|_c4!!ltUTs`*Qfd3%qKS*fG AVgLXD delta 1186 zcmZwF+fR~V9Kdm2e8U4G#=#UZOp}8g6!4UZiFis-JfPBJ`R3qNY#0o%S(}3!x3<;> zdv2)A;pT;{E^Ph-ZFQA56gS3I|3q8ss`vM_wr4FazR%0&_j}o%jk4vat?pbVs}Ttw z{mHq=5{7qM=1m9n&*pabbBbQ0@9t(5f=>qFNl z>nApV+9fuEfNc$ZpxO3EhGCM zYa@S>6@o$Jpce0dJw~QgyeqNb&yoXHw-x4aRc#B7SL)BcR_-w^8bOjf@pyELPjK;_ zL@2VJ}O#QY* zBitdO#i@Er+6Ir^5C^0O(gzuU3_{?>iDAeHWE3(6nSe||rXfDaEMyL{00}^rAwdX& z+=Z+`?u+n)%g@zs#UjzZ=)2xoWL4QnKAGDtu}<8qaLHDStntKn>U?7@v8yGzg*{ZxUCo8cAyrw$D8nqb*)MjQA oXVm+e4Y`{Qv*} diff --git a/business_objects/store/manufacturing_purchase_order.py b/business_objects/store/manufacturing_purchase_order.py new file mode 100644 index 00000000..48bb00b6 --- /dev/null +++ b/business_objects/store/manufacturing_purchase_order.py @@ -0,0 +1,313 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Business Objects +Feature: Manufacturing_Purchase_Order Business Object + +Description: +Business object for manufacturing_purchase_order +""" + +# internal +import lib.argument_validation as av +from business_objects.db_base import Get_Many_Parameters_Base +from business_objects.store.store_base import Store_Base +from extensions import db +# external +from pydantic import BaseModel +from typing import ClassVar, Optional +from datetime import datetime + +class Manufacturing_Purchase_Order(db.Model, Store_Base): + NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_MANUFACTURING_PURCHASE_ORDER + NAME_ATTR_OPTION_TEXT: ClassVar[str] = Store_Base.FLAG_NAME + # __tablename__ = 'Shop_Manufacturing_Purchase_Order_Temp' + id_order = db.Column(db.Integer, primary_key=True) + id_currency = db.Column(db.Integer) + cost_total_local_VAT_excl = db.Column(db.Float) + cost_total_local_VAT_incl = db.Column(db.Float) + price_total_local_VAT_excl = db.Column(db.Float) + price_total_local_VAT_incl = db.Column(db.Float) + active = db.Column(db.Boolean) + created_on = db.Column(db.DateTime) + created_by = db.Column(db.Integer) + name = db.Column(db.String(255)) + # items: list = None + def __init__(self): + super().__init__() + Store_Base.__init__(self) + self.items = None + @classmethod + def from_DB_manufacturing_purchase_order(cls, query_row): + manufacturing_purchase_order = cls() + manufacturing_purchase_order.id_order = query_row[0] + manufacturing_purchase_order.id_currency = query_row[1] + manufacturing_purchase_order.cost_total_local_VAT_excl = query_row[2] + manufacturing_purchase_order.cost_total_local_VAT_incl = query_row[3] + manufacturing_purchase_order.price_total_local_VAT_excl = query_row[4] + manufacturing_purchase_order.price_total_local_VAT_incl = query_row[5] + manufacturing_purchase_order.active = av.input_bool(query_row[6], 'active', f'{cls.__name__}.from_DB_manufacturing_purchase_order') + manufacturing_purchase_order.created_on = query_row[7] + manufacturing_purchase_order.name = query_row[8] + return manufacturing_purchase_order + + def __repr__(self): + return f''' +{self.ATTR_ID_MANUFACTURING_PURCHASE_ORDER}: {self.id_order}, +{self.ATTR_ID_CURRENCY}: {self.id_currency}, +{self.FLAG_COST_TOTAL_LOCAL_VAT_EXCL}: {self.cost_total_local_VAT_excl}, +{self.FLAG_COST_TOTAL_LOCAL_VAT_INCL}: {self.cost_total_local_VAT_incl}, +{self.FLAG_PRICE_TOTAL_LOCAL_VAT_EXCL}: {self.price_total_local_VAT_excl}, +{self.FLAG_PRICE_TOTAL_LOCAL_VAT_INCL}: {self.price_total_local_VAT_incl}, +{self.FLAG_ACTIVE}: {self.active}, +{self.FLAG_CREATED_ON}: {self.created_on}, +{self.FLAG_NAME}: {self.name} + ''' + def to_json(self): + return { + **self.get_shared_json_attributes(self), + self.ATTR_ID_MANUFACTURING_PURCHASE_ORDER: self.id_order, + self.ATTR_ID_CURRENCY: self.id_currency, + self.FLAG_COST_TOTAL_LOCAL_VAT_EXCL: self.cost_total_local_VAT_excl, + self.FLAG_COST_TOTAL_LOCAL_VAT_INCL: self.cost_total_local_VAT_incl, + self.FLAG_PRICE_TOTAL_LOCAL_VAT_EXCL: self.price_total_local_VAT_excl, + self.FLAG_PRICE_TOTAL_LOCAL_VAT_INCL: self.price_total_local_VAT_incl, + self.FLAG_ACTIVE: av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json'), + self.FLAG_CREATED_ON: self.created_on, + self.FLAG_NAME: self.name, + } + def to_json_option(self): + return { + 'value': self.id_order, + 'text': self.name, + } + @classmethod + def from_json(cls, json): + print(f'{cls.__name__}.from_json: {json}') + manufacturing_purchase_order = cls() + manufacturing_purchase_order.id_order = json[cls.ATTR_ID_MANUFACTURING_PURCHASE_ORDER] + manufacturing_purchase_order.id_currency = json[cls.ATTR_ID_CURRENCY] + manufacturing_purchase_order.cost_total_local_VAT_excl = json[cls.FLAG_COST_TOTAL_LOCAL_VAT_EXCL] + manufacturing_purchase_order.cost_total_local_VAT_incl = json[cls.FLAG_COST_TOTAL_LOCAL_VAT_INCL] + manufacturing_purchase_order.price_total_local_VAT_excl = json[cls.FLAG_PRICE_TOTAL_LOCAL_VAT_EXCL] + manufacturing_purchase_order.price_total_local_VAT_incl = json[cls.FLAG_PRICE_TOTAL_LOCAL_VAT_INCL] + manufacturing_purchase_order.active = json[cls.FLAG_ACTIVE] + manufacturing_purchase_order.created_on = json[cls.FLAG_CREATED_ON] + manufacturing_purchase_order.name = json[cls.FLAG_NAME] + return manufacturing_purchase_order + def get_items_preview_str(self): + preview = '' + if self.items is not None: + for item in self.items: + if preview != '': + preview += '\n' + preview += f'{item.name_permutation}{f" -(x{item.quantity_used})" if item.quantity_used > 0 else ""}{f" +(x{item.quantity_produced})" if item.quantity_produced > 0 else ""}' + return preview + +class Manufacturing_Purchase_Order_Product_Link(db.Model, Store_Base): + FLAG_LATENCY_MANUFACTURE_DAYS: ClassVar[str] = 'latency_manufacture_days' + FLAG_QUANTITY_PRODUCED: ClassVar[str] = 'quantity_produced' + FLAG_QUANTITY_USED: ClassVar[str] = 'quantity_used' + NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_MANUFACTURING_PURCHASE_ORDER_PRODUCT_LINK + NAME_ATTR_OPTION_TEXT: ClassVar[str] = Store_Base.FLAG_NAME + # __tablename__ = 'Shop_Manufacturing_Purchase_Order_Temp' + id_link = db.Column(db.Integer, primary_key=True) + id_order = db.Column(db.Integer) + id_permutation = db.Column(db.Integer) + id_unit_quantity = db.Column(db.Integer) + name_permutation = db.Column(db.String(255)) + quantity_used = db.Column(db.Float) + quantity_produced = db.Column(db.Float) + latency_manufacture_days = db.Column(db.Integer) + display_order = db.Column(db.Integer) + cost_unit_local_VAT_excl = db.Column(db.Float) + cost_unit_local_VAT_incl = db.Column(db.Float) + price_unit_local_VAT_excl = db.Column(db.Float) + price_unit_local_VAT_incl = db.Column(db.Float) + active = db.Column(db.Boolean) + created_on = db.Column(db.DateTime) + created_by = db.Column(db.Integer) + def __init__(self): + super().__init__() + Store_Base.__init__(self) + @classmethod + def from_DB_manufacturing_purchase_order(cls, query_row): + link = cls() + link.id_link = query_row[0] + link.id_order = query_row[1] + link.id_permutation = query_row[2] + link.name_permutation = query_row[3] + link.id_unit_quantity = query_row[4] + link.quantity_used = query_row[5] + link.quantity_produced = query_row[6] + link.latency_manufacture_days = query_row[7] + link.display_order = query_row[8] + link.cost_unit_local_VAT_excl = query_row[9] + link.cost_unit_local_VAT_incl = query_row[10] + link.price_unit_local_VAT_excl = query_row[11] + link.price_unit_local_VAT_incl = query_row[12] + link.active = query_row[13] + return link + def __repr__(self): + return f''' +{self.ATTR_ID_MANUFACTURING_PURCHASE_ORDER_PRODUCT_LINK}: {self.id_link}, +{self.ATTR_ID_MANUFACTURING_PURCHASE_ORDER}: {self.id_order}, +{self.ATTR_ID_PRODUCT_PERMUTATION}: {self.id_permutation}, +{self.FLAG_NAME}: {self.name_permutation}, +{self.ATTR_ID_UNIT_MEASUREMENT_QUANTITY}: {self.id_unit_quantity}, +{self.FLAG_QUANTITY_USED}: {self.quantity_used}, +{self.FLAG_QUANTITY_PRODUCED}: {self.quantity_produced}, +{self.FLAG_LATENCY_MANUFACTURE_DAYS}: {self.latency_manufacture_days}, +{self.FLAG_DISPLAY_ORDER}: {self.display_order}, +{self.FLAG_COST_UNIT_LOCAL_VAT_EXCL}: {self.cost_unit_local_VAT_excl}, +{self.FLAG_COST_UNIT_LOCAL_VAT_INCL}: {self.cost_unit_local_VAT_incl}, +{self.FLAG_PRICE_UNIT_LOCAL_VAT_EXCL}: {self.price_unit_local_VAT_excl}, +{self.FLAG_PRICE_UNIT_LOCAL_VAT_INCL}: {self.price_unit_local_VAT_incl}, +{self.FLAG_ACTIVE}: {self.active} + ''' + def to_json(self): + return { + **self.get_shared_json_attributes(self), + self.ATTR_ID_MANUFACTURING_PURCHASE_ORDER_PRODUCT_LINK: self.id_link, + self.ATTR_ID_MANUFACTURING_PURCHASE_ORDER: self.id_order, + self.ATTR_ID_PRODUCT_PERMUTATION: self.id_permutation, + self.FLAG_NAME: self.name_permutation, + self.ATTR_ID_UNIT_MEASUREMENT_QUANTITY: self.id_unit_quantity, + self.FLAG_QUANTITY_USED: self.quantity_used, + self.FLAG_QUANTITY_PRODUCED: self.quantity_produced, + self.FLAG_LATENCY_MANUFACTURE_DAYS: self.latency_manufacture_days, + self.FLAG_DISPLAY_ORDER: self.display_order, + self.FLAG_COST_UNIT_LOCAL_VAT_EXCL: self.cost_unit_local_VAT_excl, + self.FLAG_COST_UNIT_LOCAL_VAT_INCL: self.cost_unit_local_VAT_incl, + self.FLAG_PRICE_UNIT_LOCAL_VAT_EXCL: self.price_unit_local_VAT_excl, + self.FLAG_PRICE_UNIT_LOCAL_VAT_INCL: self.price_unit_local_VAT_incl, + self.FLAG_ACTIVE: av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json'), + } + def to_json_option(self): + return { + 'value': self.id_order, + 'text': self.name_permutation, + } + @classmethod + def from_json(cls, json): + print(f'{cls.__name__}.from_json: {json}') + link = cls() + link.id_link = json[cls.ATTR_ID_MANUFACTURING_PURCHASE_ORDER_PRODUCT_LINK] + link.id_order = json[cls.ATTR_ID_MANUFACTURING_PURCHASE_ORDER] + link.id_permutation = json[cls.ATTR_ID_PRODUCT_PERMUTATION] + link.name_permutation = json[cls.FLAG_NAME] + link.id_unit_quantity = json[cls.ATTR_ID_UNIT_MEASUREMENT_QUANTITY] + link.quantity_used = json[cls.FLAG_QUANTITY_USED] + link.quantity_produced = json[cls.FLAG_QUANTITY_PRODUCED] + link.latency_manufacture_days = json[cls.FLAG_LATENCY_MANUFACTURE_DAYS] + link.display_order = json[cls.FLAG_DISPLAY_ORDER] + link.cost_unit_local_VAT_excl = json[cls.FLAG_COST_UNIT_LOCAL_VAT_EXCL] + link.cost_unit_local_VAT_incl = json[cls.FLAG_COST_UNIT_LOCAL_VAT_INCL] + link.active = json[cls.FLAG_ACTIVE] + return link + +class Parameters_Manufacturing_Purchase_Order(Get_Many_Parameters_Base): + a_get_all_order: bool + a_get_inactive_order: bool + a_ids_order: str + a_ids_permutation: str + a_date_from: Optional[datetime] + a_date_to: Optional[datetime] + def __init__(self, **kwargs): + super().__init__(**kwargs) + @classmethod + def get_default(cls): + return cls( + a_get_all_order = True, + a_get_inactive_order = False, + a_ids_order = '', + a_ids_permutation = '', + a_date_from = None, + a_date_to = None + ) + @classmethod + def from_filters_manufacturing_purchase_order(cls, form): + parameters = cls.get_default() + parameters.a_get_inactive_order = form.active.data + parameters.a_date_from = form.date_from.data + parameters.a_date_to = form.date_to.data + return parameters + +class Manufacturing_Purchase_Order_Temp(db.Model, Store_Base): + __tablename__: ClassVar[str] = 'Shop_Manufacturing_Purchase_Order_Temp' + __table_args__ = { 'extend_existing': True } + id_order: int = db.Column(db.Integer, primary_key=True) + id_manufacturing: int = db.Column(db.Integer) + id_currency: int = db.Column(db.Integer) + active: bool = db.Column(db.Boolean) + guid: str = db.Column(db.String(36)) + @classmethod + def from_manufacturing_purchase_order(cls, manufacturing_purchase_order): + row = cls() + row.id_order = manufacturing_purchase_order.id_order + row.id_manufacturing = manufacturing_purchase_order.id_manufacturing + row.id_currency = manufacturing_purchase_order.id_currency + row.active = 1 if manufacturing_purchase_order.active else 0 + return row + def __repr__(self): + return f''' +id_order: {self.id_order} +id_manufacturing: {self.id_manufacturing} +id_currency: {self.id_currency} +active: {self.active} +guid: {self.guid} + ''' + +class Manufacturing_Purchase_Order_Product_Link_Temp(db.Model, Store_Base): + __tablename__: ClassVar[str] = 'Shop_Manufacturing_Purchase_Order_Product_Link_Temp' + __table_args__ = { 'extend_existing': True } + id_link: int = db.Column(db.Integer, primary_key=True) + id_order: int = db.Column(db.Integer) + id_permutation: int = db.Column(db.Integer) + id_unit_quantity: int = db.Column(db.Integer) + quantity_used: float = db.Column(db.Float) + quantity_produced: float = db.Column(db.Float) + latency_manufacture_days: int = db.Column(db.Integer) + display_order: int = db.Column(db.Integer) + cost_unit_local_VAT_excl: float = db.Column(db.Float) + cost_unit_local_VAT_incl: float = db.Column(db.Float) + price_unit_local_VAT_excl: float = db.Column(db.Float) + price_unit_local_VAT_incl: float = db.Column(db.Float) + active: bool = db.Column(db.Boolean) + guid: str = db.Column(db.String(36)) + @classmethod + def from_manufacturing_purchase_order_product_link(cls, manufacturing_purchase_order_product_link): + row = cls() + row.id_link = manufacturing_purchase_order_product_link.id_link + row.id_order = manufacturing_purchase_order_product_link.id_order + row.id_permutation = manufacturing_purchase_order_product_link.id_permutation + row.id_unit_quantity = manufacturing_purchase_order_product_link.id_unit_quantity + row.quantity_used = manufacturing_purchase_order_product_link.quantity_used + row.quantity_produced = manufacturing_purchase_order_product_link.quantity_produced + row.latency_manufacture_days = manufacturing_purchase_order_product_link.latency_manufacture_days + row.display_order = manufacturing_purchase_order_product_link.display_order + row.cost_unit_local_VAT_excl = manufacturing_purchase_order_product_link.cost_unit_local_VAT_excl + row.cost_unit_local_VAT_incl = manufacturing_purchase_order_product_link.cost_unit_local_VAT_incl + row.price_unit_local_VAT_excl = manufacturing_purchase_order_product_link.price_unit_local_VAT_excl + row.price_unit_local_VAT_incl = manufacturing_purchase_order_product_link.price_unit_local_VAT_incl + row.active = 1 if manufacturing_purchase_order_product_link.active else 0 + return row + def __repr__(self): + return f''' +id_link: {self.id_link} +id_order: {self.id_order} +id_permutation: {self.id_permutation} +id_unit_quantity: {self.id_unit_quantity} +quantity_used: {self.quantity_used} +quantity_produced: {self.quantity_produced} +latency_manufacture_days: {self.latency_manufacture_days} +display_order: {self.display_order} +cost_unit_local_VAT_excl: {self.cost_unit_local_VAT_excl} +cost_unit_local_VAT_incl: {self.cost_unit_local_VAT_incl} +price_unit_local_VAT_excl: {self.price_unit_local_VAT_excl} +price_unit_local_VAT_incl: {self.price_unit_local_VAT_incl} +active: {self.active} +guid: {self.guid} + ''' \ No newline at end of file diff --git a/business_objects/store/stock_item.py b/business_objects/store/stock_item.py index 6ecfc783..20ebebfb 100644 --- a/business_objects/store/stock_item.py +++ b/business_objects/store/stock_item.py @@ -112,8 +112,8 @@ class Stock_Item(db.Model, Store_Base): stock_item.date_received = json[cls.FLAG_DATE_RECEIVED] stock_item.id_location_storage = json[cls.ATTR_ID_STORAGE_LOCATION] stock_item.id_currency_cost = json[cls.ATTR_ID_CURRENCY_COST] - stock_item.cost_local_VAT_excl = json[cls.FLAG_COST_LOCAL_VAT_EXCL] - stock_item.cost_local_VAT_incl = json[cls.FLAG_COST_LOCAL_VAT_INCL] + stock_item.cost_local_VAT_excl = json[cls.FLAG_COST_UNIT_LOCAL_VAT_EXCL] + stock_item.cost_local_VAT_incl = json[cls.FLAG_COST_UNIT_LOCAL_VAT_INCL] stock_item.is_sealed = json[cls.FLAG_IS_SEALED] stock_item.date_unsealed = json[cls.FLAG_DATE_UNSEALED] stock_item.date_expiration = json[cls.FLAG_DATE_EXPIRATION] @@ -150,8 +150,8 @@ class Stock_Item(db.Model, Store_Base): self.ATTR_ID_PRODUCT_CATEGORY: self.id_category, self.FLAG_STORAGE_LOCATION: self.storage_location.to_json(), self.FLAG_CURRENCY_COST: self.currency_cost.to_json(), - self.FLAG_COST_LOCAL_VAT_EXCL: self.cost_local_VAT_excl, - self.FLAG_COST_LOCAL_VAT_INCL: self.cost_local_VAT_incl, + self.FLAG_COST_UNIT_LOCAL_VAT_EXCL: self.cost_local_VAT_excl, + self.FLAG_COST_UNIT_LOCAL_VAT_INCL: self.cost_local_VAT_incl, } def has_permutations(self): return len(self.permutations) > 0 diff --git a/business_objects/store/store_base.py b/business_objects/store/store_base.py index 856bc18d..c48fda75 100644 --- a/business_objects/store/store_base.py +++ b/business_objects/store/store_base.py @@ -59,11 +59,13 @@ class I_Store_Base(): class Store_Base(Base): # ATTR_ID_CURRENCY_COST: ClassVar[str] = 'id_currency_cost' ATTR_ID_CUSTOMER: ClassVar[str] = 'id_customer' + ATTR_ID_CUSTOMER_ADDRESS: ClassVar[str] = 'id_address' ATTR_ID_CUSTOMER_SALES_ORDER: ClassVar[str] = 'id_customer_sales_order' ATTR_ID_DELIVERY_OPTION: ClassVar[str] = 'id_delivery_option' ATTR_ID_DISCOUNT: ClassVar[str] = 'id_discount' ATTR_ID_IMAGE: ClassVar[str] = 'id_image' - ATTR_ID_MANUFACTURING_PURCHASE_ORDER: ClassVar[str] = 'id_manufacturing_purchase_order' + ATTR_ID_MANUFACTURING_PURCHASE_ORDER: ClassVar[str] = 'id_order' + ATTR_ID_MANUFACTURING_PURCHASE_ORDER_PRODUCT_LINK: ClassVar[str] = 'id_link' ATTR_ID_PLANT: ClassVar[str] = 'id_plant' ATTR_ID_PRODUCT: ClassVar[str] = 'id_product' ATTR_ID_PRODUCT_CATEGORY: ClassVar[str] = 'id_category' @@ -75,18 +77,29 @@ class Store_Base(Base): ATTR_ID_STOCK_ITEM: ClassVar[str] = 'id_stock_item' ATTR_ID_STORAGE_LOCATION: ClassVar[str] = 'id_location' ATTR_ID_SUPPLIER: ClassVar[str] = 'id_supplier' - ATTR_ID_SUPPLIER_PURCHASE_ORDER: ClassVar[str] = 'id_supplier_purchase_order' - FLAG_COST_LOCAL: ClassVar[str] = 'cost_local' - FLAG_COST_LOCAL_VAT_EXCL: ClassVar[str] = FLAG_COST_LOCAL + '_vat_excl' - FLAG_COST_LOCAL_VAT_INCL: ClassVar[str] = FLAG_COST_LOCAL + '_vat_incl' + ATTR_ID_SUPPLIER_ADDRESS: ClassVar[str] = 'id_address' + ATTR_ID_SUPPLIER_PURCHASE_ORDER: ClassVar[str] = 'id_order' + ATTR_ID_SUPPLIER_PURCHASE_ORDER_PRODUCT_LINK: ClassVar[str] = 'id_link' + ATTR_ID_UNIT_MEASUREMENT_QUANTITY: ClassVar[str] = 'id_unit_quantity' + # FLAG_COST_LOCAL: ClassVar[str] = 'cost_local' + FLAG_COST_TOTAL_LOCAL_VAT_EXCL: ClassVar[str] = 'cost_total_local_vat_excl' + FLAG_COST_TOTAL_LOCAL_VAT_INCL: ClassVar[str] = 'cost_total_local_vat_incl' + FLAG_COST_UNIT_LOCAL_VAT_EXCL: ClassVar[str] = 'cost_unit_local_vat_excl' + FLAG_COST_UNIT_LOCAL_VAT_INCL: ClassVar[str] = 'cost_unit_local_vat_incl' FLAG_CUSTOMER: ClassVar[str] = 'customer' + FLAG_CUSTOMER_ADDRESS: ClassVar[str] = 'customer_address' FLAG_CUSTOMER_SALES_ORDER: ClassVar[str] = 'customer_sales_order' FLAG_DELIVERY_OPTION: ClassVar[str] = 'delivery_option' + FLAG_DISCOUNT: ClassVar[str] = 'discount' FLAG_HAS_VARIATIONS: ClassVar[str] = 'has_variations' FLAG_IS_OUT_OF_STOCK: ClassVar[str] = 'is_out_of_stock' - FLAG_DISCOUNT: ClassVar[str] = 'discount' + FLAG_LATENCY_DELIVERY_DAYS: ClassVar[str] = 'latency_delivery_days' FLAG_MANUFACTURING_PURCHASE_ORDER: ClassVar[str] = 'manufacturing_purchase_order' FLAG_PLANT: ClassVar[str] = 'plant' + FLAG_PRICE_TOTAL_LOCAL_VAT_EXCL: ClassVar[str] = 'price_total_local_vat_excl' + FLAG_PRICE_TOTAL_LOCAL_VAT_INCL: ClassVar[str] = 'price_total_local_vat_incl' + FLAG_PRICE_UNIT_LOCAL_VAT_EXCL: ClassVar[str] = 'price_unit_local_vat_excl' + FLAG_PRICE_UNIT_LOCAL_VAT_INCL: ClassVar[str] = 'price_unit_local_vat_incl' FLAG_PRODUCT: ClassVar[str] = 'product' FLAG_PRODUCT_CATEGORY: ClassVar[str] = 'product_category' FLAG_PRODUCT_IMAGE: ClassVar[str] = 'product_image' @@ -97,9 +110,12 @@ class Store_Base(Base): FLAG_PRODUCT_VARIATION_TYPE: ClassVar[str] = 'product_variation_type' FLAG_QUANTITY_MIN: ClassVar[str] = 'quantity_min' FLAG_QUANTITY_MAX: ClassVar[str] = 'quantity_max' + FLAG_QUANTITY_ORDERED: ClassVar[str] = 'quantity_ordered' + FLAG_QUANTITY_RECEIVED: ClassVar[str] = 'quantity_received' FLAG_STOCK_ITEM: ClassVar[str] = 'stock_item' FLAG_STORAGE_LOCATION: ClassVar[str] = 'storage_location' FLAG_SUPPLIER: ClassVar[str] = 'supplier' + FLAG_SUPPLIER_ADDRESS: ClassVar[str] = 'supplier_address' FLAG_SUPPLIER_PURCHASE_ORDER: ClassVar[str] = 'supplier_purchase_order' FLAG_TEXT: ClassVar[str] = 'text' FLAG_VALUE_TEXT: ClassVar[str] = 'value_text' diff --git a/business_objects/store/supplier.py b/business_objects/store/supplier.py index 7ce5bf23..59260d88 100644 --- a/business_objects/store/supplier.py +++ b/business_objects/store/supplier.py @@ -12,6 +12,9 @@ Business object for supplier # internal import lib.argument_validation as av +from business_objects.store.supplier_address import Supplier_Address +from business_objects.currency import Currency +from business_objects.db_base import Get_Many_Parameters_Base from business_objects.store.store_base import Store_Base from extensions import db # external @@ -27,12 +30,11 @@ class Supplier(db.Model, Store_Base): NAME_ATTR_OPTION_TEXT: ClassVar[str] = Store_Base.FLAG_NAME __tablename__ = 'Shop_Supplier_Temp' id_supplier = db.Column(db.Integer, primary_key=True) - id_address = db.Column(db.Integer) + # id_address = db.Column(db.Integer) id_currency = db.Column(db.Integer) name_company = db.Column(db.String(255)) name_contact = db.Column(db.String(255)) department_contact = db.Column(db.String(255)) - # address phone_number = db.Column(db.String(50)) fax = db.Column(db.String(50)) email = db.Column(db.String(255)) @@ -43,26 +45,29 @@ class Supplier(db.Model, Store_Base): def __init__(self): super().__init__() Store_Base.__init__(self) + self.addresses = [] + self.currency = None @classmethod def from_DB_supplier(cls, query_row): supplier = cls() supplier.id_supplier = query_row[0] - supplier.id_address = query_row[1] - supplier.id_currency = query_row[2] - supplier.name_company = query_row[3] - supplier.name_contact = query_row[4] - supplier.department_contact = query_row[5] - supplier.phone_number = query_row[6] - supplier.fax = query_row[7] - supplier.email = query_row[8] - supplier.website = query_row[9] - supplier.active = query_row[10] + # supplier.id_address = query_row[1] + # supplier.address = Supplier_Address.from_DB_supplier(query_row) + supplier.id_currency = query_row[1] + supplier.currency = Currency.from_DB_supplier(query_row) + supplier.name_company = query_row[4] + supplier.name_contact = query_row[5] + supplier.department_contact = query_row[6] + supplier.phone_number = query_row[7] + supplier.fax = query_row[8] + supplier.email = query_row[9] + supplier.website = query_row[10] + supplier.active = av.input_bool(query_row[11], 'active', f'{cls.__name__}.from_DB_supplier') return supplier def __repr__(self): return f''' id: {self.id_supplier}, -id_address: {self.id_address}, id_currency: {self.id_currency}, name_company: {self.name_company}, name_contact: {self.name_contact}, @@ -72,12 +77,13 @@ fax: {self.fax}, email: {self.email}, website: {self.website}, active: {self.active}, +addresses: {self.addresses} ''' def to_json(self): return { **self.get_shared_json_attributes(self), self.ATTR_ID_SUPPLIER: self.id_supplier, - self.ATTR_ID_ADDRESS: self.id_address, + # self.ATTR_ID_ADDRESS: self.id_address, self.ATTR_ID_CURRENCY: self.id_currency, self.FLAG_NAME_COMPANY: self.name_company, self.FLAG_NAME_CONTACT: self.name_contact, @@ -98,7 +104,6 @@ active: {self.active}, print(f'{cls.__name__}.from_json: {json}') supplier = cls() supplier.id_supplier = json[cls.ATTR_ID_SUPPLIER] - supplier.id_address = json[cls.ATTR_ID_ADDRESS] supplier.id_currency = json[cls.ATTR_ID_CURRENCY] supplier.name_company = json[cls.FLAG_NAME_COMPANY] supplier.name_contact = json[cls.FLAG_NAME_CONTACT] @@ -108,4 +113,78 @@ active: {self.active}, supplier.email = json[cls.FLAG_EMAIL] supplier.website = json[cls.FLAG_WEBSITE] supplier.active = json[cls.FLAG_ACTIVE] + addresses = json.get(cls.FLAG_SUPPLIER_ADDRESS, []) + supplier.addresses = [Supplier_Address.from_json(address) for address in addresses] return supplier + def get_address_active(self): + for address in self.addresses: + if address.active: + return address + return Supplier_Address() + address = Supplier_Address() + address.postcode = '' + return address + +class Parameters_Supplier(Get_Many_Parameters_Base): + a_get_all_supplier: bool + a_get_inactive_supplier: bool + a_ids_supplier: str + def __init__(self, **kwargs): + super().__init__(**kwargs) + @classmethod + def get_default(cls): + return cls( + a_get_all_supplier = True, + a_get_inactive_supplier = False, + a_ids_supplier = '', + ) + @classmethod + def from_filters_supplier(cls, form): + parameters = cls.get_default() + parameters.a_get_inactive_supplier = form.active.data + return parameters + +class Supplier_Temp(db.Model, Store_Base): + __tablename__: ClassVar[str] = 'Shop_Supplier_Temp' + __table_args__ = { 'extend_existing': True } + id_supplier: int = db.Column(db.Integer, primary_key=True) + id_currency: int = db.Column(db.Integer) + # id_address: int = db.Column(db.Integer) + name_company: str = db.Column(db.String(255)) + name_contact: str = db.Column(db.String(255)) + department_contact: str = db.Column(db.String(255)) + phone_number: str = db.Column(db.String(50)) + fax: str = db.Column(db.String(50)) + email: str = db.Column(db.String(255)) + website: str = db.Column(db.String(255)) + active: bool = db.Column(db.Boolean) + guid: str = db.Column(db.String(36)) + @classmethod + def from_supplier(cls, supplier): + row = cls() + row.id_supplier = supplier.id_supplier + row.id_currency = supplier.id_currency + # row.id_address = supplier.id_address + row.name_company = supplier.name_company + row.name_contact = supplier.name_contact + row.department_contact = supplier.department_contact + row.phone_number = supplier.phone_number + row.fax = supplier.fax + row.email = supplier.email + row.website = supplier.website + row.active = 1 if supplier.active else 0 + return row + def __repr__(self): + return f''' +id_supplier: {self.id_supplier} +id_currency: {self.id_currency} +name_company: {self.name_company} +name_contact: {self.name_contact} +department_contact: {self.department_contact} +phone_number: {self.phone_number} +fax: {self.fax} +email: {self.email} +website: {self.website} +active: {self.active} +guid: {self.guid} + ''' \ No newline at end of file diff --git a/business_objects/store/supplier_address.py b/business_objects/store/supplier_address.py new file mode 100644 index 00000000..ddb4013f --- /dev/null +++ b/business_objects/store/supplier_address.py @@ -0,0 +1,145 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Business Objects +Feature: Supplier Address Business Object + +Description: +Business object for supplier address +""" + +# internal +import lib.argument_validation as av +from business_objects.store.store_base import Store_Base +from business_objects.region import Region +from extensions import db +# external +from typing import ClassVar +from flask import jsonify + +class Supplier_Address(db.Model, Store_Base): + FLAG_ADDRESS_LINE_1: ClassVar[str] = 'address_line_1' + FLAG_ADDRESS_LINE_2: ClassVar[str] = 'address_line_2' + FLAG_CITY: ClassVar[str] = 'city' + FLAG_COUNTY: ClassVar[str] = 'county' + NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_ADDRESS + NAME_ATTR_OPTION_TEXT: ClassVar[str] = Store_Base.FLAG_POSTCODE + __tablename__ = 'Shop_Supplier_Address' + id_address = db.Column(db.Integer, primary_key=True) + id_supplier = db.Column(db.Integer) + id_region = db.Column(db.Integer) + postcode = db.Column(db.String(20)) + address_line_1 = db.Column(db.String(256)) + address_line_2 = db.Column(db.String(256)) + city = db.Column(db.String(256)) + county = db.Column(db.String(256)) + active = db.Column(db.Boolean) + + # region = None + + def __init__(self): + super().__init__() + Store_Base.__init__(self) + self.region = Region() + @classmethod + def from_DB_supplier(cls, query_row): + address = cls() + address.id_supplier = query_row[0] + address.id_address = query_row[1] + address.id_region = query_row[2] + address.region = Region.from_DB_supplier(query_row) + address.postcode = query_row[4] + address.address_line_1 = query_row[5] + address.address_line_2 = query_row[6] + address.city = query_row[7] + address.county = query_row[8] + address.active = av.input_bool(query_row[9], 'active', f'{cls.__name__}.from_DB_supplier') + + return address + def __repr__(self): + return f''' +{self.ATTR_ID_ADDRESS}: {self.id_address} +{self.ATTR_ID_SUPPLIER}: {self.id_supplier} +{self.FLAG_REGION}: {self.region} +{self.FLAG_POSTCODE}: {self.postcode} +{self.FLAG_ADDRESS_LINE_1}: {self.address_line_1} +{self.FLAG_ADDRESS_LINE_2}: {self.address_line_2} +{self.FLAG_CITY}: {self.city} +{self.FLAG_COUNTY}: {self.county} +{self.FLAG_ACTIVE}: {self.active} + ''' + def to_json(self): + print(f'{self.__class__.__name__}.to_json\n{self.__dict__}\n{self}') + return { + **self.get_shared_json_attributes(self), + self.ATTR_ID_ADDRESS: self.id_address, + self.ATTR_ID_SUPPLIER: self.id_supplier, + self.FLAG_REGION: self.region.to_json(), + self.FLAG_POSTCODE: self.postcode, + self.FLAG_ADDRESS_LINE_1: self.address_line_1, + self.FLAG_ADDRESS_LINE_2: self.address_line_2, + self.FLAG_CITY: self.city, + self.FLAG_COUNTY: self.county, + self.FLAG_ACTIVE: 1 if av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json') else 0 + } + def to_json_str(self): + return jsonify(self.to_json()) + @classmethod + def from_json(cls, json): + print(f'{cls.__name__}.from_json: {json}') + address = cls() + address.id_address = json[cls.ATTR_ID_ADDRESS] + address.id_supplier = json[cls.ATTR_ID_SUPPLIER] + address.id_region = json[cls.ATTR_ID_REGION] + address.region = Region() + address.region.id_region = json[cls.ATTR_ID_REGION] + address.postcode = json[cls.FLAG_POSTCODE] + address.address_line_1 = json[cls.FLAG_ADDRESS_LINE_1] + address.address_line_2 = json.get(cls.FLAG_ADDRESS_LINE_2, '') + address.city = json[cls.FLAG_CITY] + address.county = json[cls.FLAG_COUNTY] + address.active = json[cls.FLAG_ACTIVE] + return address + + +class Supplier_Address_Temp(db.Model, Store_Base): + __tablename__: ClassVar[str] = 'Shop_Supplier_Address_Temp' + __table_args__ = { 'extend_existing': True } + id_address: int = db.Column(db.Integer, primary_key=True) + id_supplier: int = db.Column(db.Integer) + id_region: int = db.Column(db.Integer) + postcode: str = db.Column(db.String(20)) + address_line_1: str = db.Column(db.String(256)) + address_line_2: str = db.Column(db.String(256)) + city: str = db.Column(db.String(256)) + county: str = db.Column(db.String(256)) + active: bool = db.Column(db.Boolean) + guid: str = db.Column(db.String(36)) + @classmethod + def from_supplier_address(cls, address): + row = cls() + row.id_address = address.id_address + row.id_supplier = address.id_supplier + row.id_region = address.id_region + row.postcode = address.postcode + row.address_line_1 = address.address_line_1 + row.address_line_2 = address.address_line_2 + row.city = address.city + row.county = address.county + row.active = 1 if address.active else 0 + return row + def __repr__(self): + return f''' +id_address: {self.id_address} +id_supplier: {self.id_supplier} +id_region: {self.id_region} +postcode: {self.postcode} +address_line_1: {self.address_line_1} +address_line_2: {self.address_line_2} +city: {self.city} +county: {self.county} +active: {self.active} +guid: {self.guid} + ''' \ No newline at end of file diff --git a/business_objects/store/supplier_purchase_order.py b/business_objects/store/supplier_purchase_order.py new file mode 100644 index 00000000..3009da19 --- /dev/null +++ b/business_objects/store/supplier_purchase_order.py @@ -0,0 +1,289 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Business Objects +Feature: Supplier_Purchase_Order Business Object + +Description: +Business object for supplier_purchase_order +""" + +# internal +import lib.argument_validation as av +from business_objects.db_base import Get_Many_Parameters_Base +from business_objects.store.store_base import Store_Base +from extensions import db +# external +from pydantic import BaseModel +from typing import ClassVar, Optional +from datetime import datetime + +class Supplier_Purchase_Order(db.Model, Store_Base): + NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_SUPPLIER_PURCHASE_ORDER + NAME_ATTR_OPTION_TEXT: ClassVar[str] = Store_Base.FLAG_NAME + # __tablename__ = 'Shop_Supplier_Purchase_Order_Temp' + id_order = db.Column(db.Integer, primary_key=True) + id_supplier = db.Column(db.Integer) + id_currency = db.Column(db.Integer) + cost_total_local_VAT_excl = db.Column(db.Float) + cost_total_local_VAT_incl = db.Column(db.Float) + active = db.Column(db.Boolean) + created_on = db.Column(db.DateTime) + created_by = db.Column(db.Integer) + name = db.Column(db.String(255)) + # items: list = None + def __init__(self): + super().__init__() + Store_Base.__init__(self) + self.items = None + @classmethod + def from_DB_supplier_purchase_order(cls, query_row): + supplier_purchase_order = cls() + supplier_purchase_order.id_order = query_row[0] + supplier_purchase_order.id_supplier = query_row[1] + supplier_purchase_order.id_currency = query_row[2] + supplier_purchase_order.cost_total_local_VAT_excl = query_row[3] + supplier_purchase_order.cost_total_local_VAT_incl = query_row[4] + supplier_purchase_order.active = av.input_bool(query_row[5], 'active', f'{cls.__name__}.from_DB_supplier_purchase_order') + supplier_purchase_order.created_on = query_row[6] + supplier_purchase_order.name = query_row[7] + return supplier_purchase_order + + def __repr__(self): + return f''' +{self.ATTR_ID_SUPPLIER_PURCHASE_ORDER}: {self.id_order}, +{self.ATTR_ID_SUPPLIER}: {self.id_supplier}, +{self.ATTR_ID_CURRENCY}: {self.id_currency}, +{self.FLAG_COST_TOTAL_LOCAL_VAT_EXCL}: {self.cost_total_local_VAT_excl}, +{self.FLAG_COST_TOTAL_LOCAL_VAT_INCL}: {self.cost_total_local_VAT_incl}, +{self.FLAG_ACTIVE}: {self.active}, +{self.FLAG_CREATED_ON}: {self.created_on}, +{self.FLAG_NAME}: {self.name} + ''' + def to_json(self): + return { + **self.get_shared_json_attributes(self), + self.ATTR_ID_SUPPLIER_PURCHASE_ORDER: self.id_order, + self.ATTR_ID_SUPPLIER: self.id_supplier, + self.ATTR_ID_CURRENCY: self.id_currency, + self.FLAG_COST_TOTAL_LOCAL_VAT_EXCL: self.cost_total_local_VAT_excl, + self.FLAG_COST_TOTAL_LOCAL_VAT_INCL: self.cost_total_local_VAT_incl, + self.FLAG_ACTIVE: av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json'), + self.FLAG_CREATED_ON: self.created_on, + self.FLAG_NAME: self.name, + } + def to_json_option(self): + return { + 'value': self.id_order, + 'text': self.name, + } + @classmethod + def from_json(cls, json): + print(f'{cls.__name__}.from_json: {json}') + supplier_purchase_order = cls() + supplier_purchase_order.id_order = json[cls.ATTR_ID_SUPPLIER_PURCHASE_ORDER] + supplier_purchase_order.id_supplier = json[cls.ATTR_ID_SUPPLIER] + supplier_purchase_order.id_currency = json[cls.ATTR_ID_CURRENCY] + supplier_purchase_order.cost_total_local_VAT_excl = json[cls.FLAG_COST_TOTAL_LOCAL_VAT_EXCL] + supplier_purchase_order.cost_total_local_VAT_incl = json[cls.FLAG_COST_TOTAL_LOCAL_VAT_INCL] + supplier_purchase_order.active = json[cls.FLAG_ACTIVE] + supplier_purchase_order.created_on = json[cls.FLAG_CREATED_ON] + supplier_purchase_order.name = json[cls.FLAG_NAME] + return supplier_purchase_order + +class Supplier_Purchase_Order_Product_Link(db.Model, Store_Base): + NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.ATTR_ID_SUPPLIER_PURCHASE_ORDER_PRODUCT_LINK + NAME_ATTR_OPTION_TEXT: ClassVar[str] = Store_Base.FLAG_NAME + __tablename__ = 'Shop_Supplier_Purchase_Order_Temp' + id_link = db.Column(db.Integer, primary_key=True) + id_order = db.Column(db.Integer) + id_permutation = db.Column(db.Integer) + id_unit_quantity = db.Column(db.Integer) + name_permutation = db.Column(db.String(255)) + quantity_ordered = db.Column(db.Float) + quantity_received = db.Column(db.Float) + latency_delivery_days = db.Column(db.Integer) + display_order = db.Column(db.Integer) + cost_total_local_VAT_excl = db.Column(db.Float) + cost_total_local_VAT_incl = db.Column(db.Float) + active = db.Column(db.Boolean) + created_on = db.Column(db.DateTime) + created_by = db.Column(db.Integer) + def __init__(self): + super().__init__() + Store_Base.__init__(self) + @classmethod + def from_DB_supplier_purchase_order(cls, query_row): + link = cls() + link.id_link = query_row[0] + link.id_order = query_row[1] + link.id_permutation = query_row[2] + link.name_permutation = query_row[3] + link.id_unit_quantity = query_row[4] + link.quantity_ordered = query_row[5] + link.quantity_received = query_row[6] + link.latency_delivery_days = query_row[7] + link.display_order = query_row[8] + link.cost_total_local_VAT_excl = query_row[9] + link.cost_total_local_VAT_incl = query_row[10] + link.active = query_row[11] + return link + def __repr__(self): + return f''' +{self.ATTR_ID_SUPPLIER_PURCHASE_ORDER_PRODUCT_LINK}: {self.id_link}, +{self.ATTR_ID_SUPPLIER_PURCHASE_ORDER}: {self.id_order}, +{self.ATTR_ID_PRODUCT_PERMUTATION}: {self.id_permutation}, +{self.FLAG_NAME}: {self.name_permutation}, +{self.ATTR_ID_UNIT_MEASUREMENT_QUANTITY}: {self.id_unit_quantity}, +{self.FLAG_QUANTITY_ORDERED}: {self.quantity_ordered}, +{self.FLAG_QUANTITY_RECEIVED}: {self.quantity_received}, +{self.FLAG_LATENCY_DELIVERY_DAYS}: {self.latency_delivery_days}, +{self.FLAG_DISPLAY_ORDER}: {self.display_order}, +{self.FLAG_COST_TOTAL_LOCAL_VAT_EXCL}: {self.cost_total_local_VAT_excl}, +{self.FLAG_COST_TOTAL_LOCAL_VAT_INCL}: {self.cost_total_local_VAT_incl}, +{self.FLAG_ACTIVE}: {self.active} + ''' + def to_json(self): + return { + **self.get_shared_json_attributes(self), + self.ATTR_ID_SUPPLIER_PURCHASE_ORDER_PRODUCT_LINK: self.id_link, + self.ATTR_ID_SUPPLIER_PURCHASE_ORDER: self.id_order, + self.ATTR_ID_PRODUCT_PERMUTATION: self.id_permutation, + self.FLAG_NAME: self.name_permutation, + self.ATTR_ID_UNIT_MEASUREMENT_QUANTITY: self.id_unit_quantity, + self.FLAG_QUANTITY_ORDERED: self.quantity_ordered, + self.FLAG_QUANTITY_RECEIVED: self.quantity_received, + self.FLAG_LATENCY_DELIVERY_DAYS: self.latency_delivery_days, + self.FLAG_DISPLAY_ORDER: self.display_order, + self.FLAG_COST_TOTAL_LOCAL_VAT_EXCL: self.cost_total_local_VAT_excl, + self.FLAG_COST_TOTAL_LOCAL_VAT_INCL: self.cost_total_local_VAT_incl, + self.FLAG_ACTIVE: av.input_bool(self.active, self.FLAG_ACTIVE, f'{self.__class__.__name__}.to_json'), + } + def to_json_option(self): + return { + 'value': self.id_order, + 'text': self.name_permutation, + } + @classmethod + def from_json(cls, json): + print(f'{cls.__name__}.from_json: {json}') + link = cls() + link.id_link = json[cls.ATTR_ID_SUPPLIER_PURCHASE_ORDER_PRODUCT_LINK] + link.id_order = json[cls.ATTR_ID_SUPPLIER_PURCHASE_ORDER] + link.id_permutation = json[cls.ATTR_ID_PRODUCT_PERMUTATION] + link.name_permutation = json[cls.FLAG_NAME] + link.id_unit_quantity = json[cls.ATTR_ID_UNIT_MEASUREMENT_QUANTITY] + link.quantity_ordered = json[cls.FLAG_QUANTITY_ORDERED] + link.quantity_received = json[cls.FLAG_QUANTITY_RECEIVED] + link.latency_delivery_days = json[cls.FLAG_LATENCY_DELIVERY_DAYS] + link.display_order = json[cls.FLAG_DISPLAY_ORDER] + link.cost_total_local_VAT_excl = json[cls.FLAG_COST_TOTAL_LOCAL_VAT_EXCL] + link.cost_total_local_VAT_incl = json[cls.FLAG_COST_TOTAL_LOCAL_VAT_INCL] + link.active = json[cls.FLAG_ACTIVE] + return link + +class Parameters_Supplier_Purchase_Order(Get_Many_Parameters_Base): + a_get_all_supplier: bool + a_get_inactive_supplier: bool + a_ids_supplier: str + a_get_all_order: bool + a_get_inactive_order: bool + a_ids_order: str + a_ids_permutation: str + a_date_from: Optional[datetime] + a_date_to: Optional[datetime] + def __init__(self, **kwargs): + super().__init__(**kwargs) + @classmethod + def get_default(cls): + return cls( + a_get_all_supplier = True, + a_get_inactive_supplier = False, + a_ids_supplier = '', + a_get_all_order = True, + a_get_inactive_order = False, + a_ids_order = '', + a_ids_permutation = '', + a_date_from = None, + a_date_to = None + ) + @classmethod + def from_filters_supplier_purchase_order(cls, form): + parameters = cls.get_default() + parameters.a_get_inactive_order = form.active.data + parameters.a_date_from = form.date_from.data + parameters.a_date_to = form.date_to.data + return parameters + +class Supplier_Purchase_Order_Temp(db.Model, Store_Base): + __tablename__: ClassVar[str] = 'Shop_Supplier_Purchase_Order_Temp' + __table_args__ = { 'extend_existing': True } + id_order: int = db.Column(db.Integer, primary_key=True) + id_supplier: int = db.Column(db.Integer) + id_currency: int = db.Column(db.Integer) + active: bool = db.Column(db.Boolean) + guid: str = db.Column(db.String(36)) + @classmethod + def from_supplier_purchase_order(cls, supplier_purchase_order): + row = cls() + row.id_order = supplier_purchase_order.id_order + row.id_supplier = supplier_purchase_order.id_supplier + row.id_currency = supplier_purchase_order.id_currency + row.active = 1 if supplier_purchase_order.active else 0 + return row + def __repr__(self): + return f''' +id_order: {self.id_order} +id_supplier: {self.id_supplier} +id_currency: {self.id_currency} +active: {self.active} +guid: {self.guid} + ''' + +class Supplier_Purchase_Order_Product_Link_Temp(db.Model, Store_Base): + __tablename__: ClassVar[str] = 'Shop_Supplier_Purchase_Order_Product_Link_Temp' + __table_args__ = { 'extend_existing': True } + id_link: int = db.Column(db.Integer, primary_key=True) + id_order: int = db.Column(db.Integer) + id_permutation: int = db.Column(db.Integer) + id_unit_quantity: int = db.Column(db.Integer) + quantity_ordered: float = db.Column(db.Float) + quantity_received: float = db.Column(db.Float) + latency_delivery_days: int = db.Column(db.Integer) + display_order: int = db.Column(db.Integer) + cost_total_local_VAT_excl: float = db.Column(db.Float) + cost_total_local_VAT_incl: float = db.Column(db.Float) + active: bool = db.Column(db.Boolean) + guid: str = db.Column(db.String(36)) + @classmethod + def from_supplier_purchase_order_product_link(cls, supplier_purchase_order_product_link): + row = cls() + row.id_link = supplier_purchase_order_product_link.id_link + row.id_order = supplier_purchase_order_product_link.id_order + row.id_permutation = supplier_purchase_order_product_link.id_permutation + row.id_unit_quantity = supplier_purchase_order_product_link.id_unit_quantity + row.quantity_ordered = supplier_purchase_order_product_link.quantity_ordered + row.quantity_received = supplier_purchase_order_product_link.quantity_received + row.latency_delivery_days = supplier_purchase_order_product_link.latency_delivery_days + row.display_order = supplier_purchase_order_product_link.display_order + row.cost_total_local_VAT_excl = supplier_purchase_order_product_link.cost_total_local_VAT_excl + row.cost_total_local_VAT_incl = supplier_purchase_order_product_link.cost_total_local_VAT_incl + row.active = 1 if supplier_purchase_order_product_link.active else 0 + return row + def __repr__(self): + return f''' +id_link: {self.id_link} +id_order: {self.id_order} +id_permutation: {self.id_permutation} +id_unit_quantity: {self.id_unit_quantity} +quantity_ordered: {self.quantity_ordered} +quantity_received: {self.quantity_received} +latency_delivery_days: {self.latency_delivery_days} +display_order: {self.display_order} +cost_total_local_VAT_excl: {self.cost_total_local_VAT_excl} +cost_total_local_VAT_incl: {self.cost_total_local_VAT_incl} +active: {self.active} +guid: {self.guid} + ''' \ No newline at end of file diff --git a/controllers/store/__pycache__/store.cpython-312.pyc b/controllers/store/__pycache__/store.cpython-312.pyc index 7735cdd9afeffb64407e4340791a9fee1750648e..934b6cbcba9e04d4a964e2048a7a34800bd9371c 100644 GIT binary patch delta 561 zcmYjL&ubGw7@e8jY}T~v=GP`o+N4d8rVCXs_8|UfJctEBq~3-?Si3{mFq15^8&Rp~ z!Coq;Va^`(R`e!_;Gf_nNKcFZfCmp+M9_oItOOjGH}8G#``&ziPJXqmkCv4K^1Mp& zeKN6X@cX25?IE+V4S^4Ro#t5q7g!M&Q=OqDR>o!KU?RD1PBnzKS3I=k@^h)+$7Dx=0E;F5;W+7$(ME5dRu`95YCI2=t(Xyw@DO^ zh7l3#+Ee&We9&GrAE4NtjqV}ec$1xl-vX{FcJwva5c_(2^?t<*LmKRQaWER59e8)V zXqN|J?83xk0VDCfkjQ~U{X&bYL|5Yt`S2A9i5U|XQZFWvCgqCwq3`F`B&*9C-4u^A z=i7F3y1emzd}LpJwDoze^n7dD**u!-PWA4wYyvmjw)m7G8)`hRJ|ph8IIU9ELau?#_DxPITZy}1q-Uj?Dd8oBfTE4DVgD; zaZLCr<*P*x0e2PeNcd%5WFvn}$z^^{{5F^b7O5>XOhHV06hWRzsCRFqV%bd)qB0~13kZwhCs%xWf( zO$-cCvZ=CJwh%TlnaY%92j)-wsKKbPS&FfXk&%1yQl{?7R?K~jb0(i;p34%Vw$zNHl1vQz9WPm!0RM{0tOl@Y7VBY|WOceTyr#q9ir1I5R)5xQHJpQ6vB)Zt;{B<>X{0=@ldv z6{i*ng2aU;Utm*b6rTKpP0d>bBp?bR#6W~NkhsMWAD@?)n;IWqBmv^G7Uh?gq!uZG z{8skhtdw&t9W@YrJZtv(#SU| zKHjJJdB3uY-=#G1O-eK0tOWRg(!#eWt$eEz{a=X&OcPP90-L&kMJC!cJ zOX=pjY1t$1Q8=EXv{&v?dih>TH$cBWzE9c9?^X8k`)HkA?&teiBn8DrY5yJ8SSx=( zI*^K)8&Jz7dup~;GAYrwzSp9QsN*b2WaG z+9oGZCud;U9%_j%!a=&HaV8}tv|$du>FCUCjQcxjUQKF}JDSz5XE1Hx#>AyK7P*T_ zQIsVulRgwvlG=4QVKTpIEG3d^GLz<_X_1?eR4I-V*ST3KaXp=pGYiXHY+2PLMddCe zfmssW?poV07hPQBW-?hVnO<;@OK~lWB|3CW%V3F%WfvFaq=ab~Np-tNB{hMQiyDkK z>^`4PYRR~qT#-~xyDo9#a$LQ^#R*FyPP!cAR7o@15}EY1w4a&cIMC|ygYiOi)8hhc6&9vGl41Mzt%hkz}vaac-=Ff~})q8ulkmSAtF zM0FANgw7rW<*IAUQbF(0^Nf8M)!my zFG^T|J)0!5L>N^|DpJU!+vwVLpD`!FoRjWIshM>0+OqDz(wkXH)%4bFT?AFbu=#qk z3d<3$;fx}PNjOv3|7G2YC8MA_vRD?bWw7p0C6yev?m8o9rA6S?bWb9SL98ag-iKJ7 z73XzZCJy%q3hpha$nn71e~P2qd?`-va;VGt_!%kQ$%J+^NtE zav_cMp~|_FilIKFQR`0H_9EQ7%GAx1%`w~NS=|ZK zimjq6VD(p-x0%~-8u=2lgl<``pd}{cnABb7L8vPZdWgf^N(0;!MYv|%?~^P3%E2Yz z+``v0inOwOF}@(F1N0;Zsz<4YuWO17m&T?LHNXy-a>%RO=qVfqrMb~eB1`OrItO-i0ml^uRA}z?q?(P(TujS~$qW~H zB@&sVrd0sbItQvT2S!N48CfP0>C)%Sy$dfcV~)&=Bzxem{v#yspwFzXwU}XD19<42FK-{bJJwZ7ZgBsIf}~J*c|%hP15eb}T8Gn-V6bM{kSH&dvzu zM}_H`snJVkXN9xT*|Bp|GgoxqwiZm>q~Sk2;}@dmgxG9!_EJpu(!zN3{Dn(1W0lgy zu~;m6ZVZ#N!~4iMMz7eVvuB}6cTt|v=xmf)blsB_tNWxow2VMJSjeth={ku{=x(|O zfvkXfA>C;@2Tbm|O7_SA-8e-0`;7gsip5c=Jw$r01F`|v;b|#*`U{@^_m_&EfpOwx;TMQms^FH?NF8jg-U%2FZWuv`oT`qSI7P<$^-A4=EM~mG<#rETC-`Zp? z4K0uT9c6z{!Qb=#fpYKJLhsp=GFOAHW zN8*K%IIS5j1cvWs9?Ip(cwsW0zc`;ik=V3ZxTfdG($>6*EW4V)ukCv2?p(?Ltu@3Tr`5TMn8!Lqy zEB`t8R$f^6@IW~-UWkl8be1PB7bY$jC-_2ye>C_OjN0agQT-km)#dqovx{kH`7eLq zi%q*h{NJ-y6v;84f9451Lsr#ij+=U#R58 z_FmLE?m<7_yJu_&-Lvi)JB{x3MIBJ}ib1d>j}#*J63#V}O3pVuLgR@~a{rW)q*b;ChjUeDBeFL@LGbY!7_OVs4$io)bq7~l z*V<7V-K0cIy@{_|k2S|`UC#mnC&-SXt6(C)tyof3M`_9e$U~4G{dNR5UjqCLx_!Wk z>PEHYEL%s_$cY;gxe8I2ve(Y- zP72^gb$tLgT;{A+?K%6`!VS0C8{kIu*;IGhfBL5E1UIVBs?<(!!~VC08-D^)IKIJp z|9s8x)Pp&j( z=2L3b;hoeSiHt&?VJmLnGUh1s#07$$H^Z!iGDrRnJl=f`Gr3xqWc_;8E}86wGX($5ahK8ULr zP^3|XnN_E+>J|VzH3Wf&3D*coIFg(o$w^2;PJD{c1SJ?~qG8KE;Mbr*_fX*#9OR|% zX8=n`RP{|qoG|*ORkCfYAE5I)hU2|=C8rPP;e`@{Pk38KQ%^e&5P}%=#!T%~1 zbhU8oDy=zM@E^T90KT)c5!`aX2X48+2VlU}_^x~X`1;HF#{QCX|KqlfwT8!SJ{r5=XSBHnHz<<%<1;H^`pe-Kas}Tz z({Szxx)(Y#1lj%GXdh$`Y`y0O8XxR;5PHBy(j%_(7R!T^BNL}A4~H0_AD*&78hS-{ z2!fbN2!g(6KC6-#t17@%hG3%_rty%lsqBWr1c-(BQWHQKq;vF!t6}4!-z4!;Dxs=g zhW<8Pry)}aEE%CwP)Fmj5tNhjVTc{kFpf}pSdg%0^G=m){3eYU>9%Vm#*B$F8F3`~ zW}udXpdU=4e08BFf@3g=E8r$b0OH@$q%?`1s+c%eOo9fw7ebw6HZ;zOiEF~d7wJ7D zf=U`7#416MiA1#3Fr9#qfT%dcl1Mm4=XUHzLfmFIV$3lCP?$g(Ou`2wv`YiRs_qno zbX<`H0h4HgZll3Ey?r7Yn-Heqkpu6bsToKs#x7>qpdf9B(CfBl`V7(AXlpF``gU$= zX8r{|hmjC9Lob{s;0&{}bP9`5M}o5I|3Ct&%P>z_H)H*M2V!1*f(DiPqVn5!(PNi_vs0s0ffeS*SI(BUWO*e57bK#^Y|->=(x^1a9J4i(!*^Qh%hrnSs; z7MRX_*U@shNKz1oeZ7_49s|(H)9CY zw9%>uR;{{`T4^J-m3r92R@p-iJ?x=})vCLy)E;m_G8$p!&`MQrq)C-3d+GPa9!!#r zdh5u3-~XHUzW2VL`Eykjhu~>$tDgHu6+(Zbg!8z|$Wwtq=o2I(0m+Qas*J`8tmYD2 znpJzkd6D)Dy>?mwsF5&qlJaAjR(|P ztxl-3aZZhBQ6XyMLA73M5E^Veq&8|zLbHumsV&+8;eggEv}y;1gIb%=rnL+08ZYo# zhtQ#Q3Y}V)(4}iG2wkf+@-W)Dw3+K zVuLs5F+ZkC#v(6KlaxeNj_?LHOR|)no>k_u#OCuel7VF&)=bTCdPyOATEl7c2rt1V zWIU^+>72_tPhf3;_72#R0ci&47??>WPjFg>rNQ1ZszjBR!8i7dMh1K`tH3Kv#Z<8o z=l)5LAm*}s;CDHjGOfA^iAWkYF)>7k7bzp+1SVS6w3ixVEDn5;S`;tAi-4*c(}^ZJ zjsZr^Rb9ractgR<;(6E?u)_OTwj+Vp{3>t%938I-ouyoWoz3ZF1!m}eqteUkJ@A^| zOB>+c!)gW-5l;SEENFS`Q?qJH-V_~gTD}ECPb;%4mXF{&S!|eA!z(JHVG_7DR>XjV z5NC<5iLwH>5pK?k5cBk5P!5^i5{}RUo%xlg8R#`;-wbSyd3gpi=$Obs1?8Ae znV&Oj>^=)u2v$)(lO(`3_nHSZ54@rVWX_%Q z$lizaT;XAm87pB3$^M+{^MEr;0-5cO#N-`pq0_-CaG$ih!ga8H(zhI51$-)OnJ#3uI{Mv+jIDY9FDv%tyf3dV#omIpVa@v^ zZ=wvBnPpU3V=Q!S)gw!$^v-G!asgxtz=!zNDoXHD>P{9ihrG%yK{=6m%3KYXV>SgL z8=u!TJhs|#UV`cXmXP~XSXqJuKeNI^X)%ees+h#N)s~Djhm8R{&lJ1sX&fR@M3Q-t_C=y6x zqG;9Gvq7d7^)$S52I{O;s~BR|fIJH|cn-^=k|y-VlLl(a&0$l7BDjc6t5MN1Ix)rf z6XVy)JQ3=&W`#=%HX%YbHLbwt-4wQqFR7(-(ez;j$F2-t6cdxflT!&RWD{eP_1ex5KaXY71{FN$x3Ocr7ISL z4Z8Vq_who#FqE8vT^dPDTb1N^8jlb-nB<6_%F>E%B%zYcL8;ZCR3vXGMpjb!gqf8U zogX|pIGD7X9}$|LB$R+;GP~O~c2z zk8dKDr%gDn$DJ8tMCcWBaGRjozV6{>*0M*^ThoT`#JtD}-9}q1FeJTcOVFo+E{x zk$lg{my>@wvDq_`4|T6!d+^?NsJ0O5%!fLEd+yPxFQ&Fa7oJt4aQjC4nJ=fdYA$d1 zFYg5FemP!<4&1wt(&ujn@0Yo0fu)Of!a^ANeTq^0}7UyA5hRL(icQ;v;Rh@>NflBu8U6i!We)P z`!GE6F8a#fHyS`+9X}1@AK!J4dR<=!0%J|Cuj|f?MO@!hF@S#)@xT~6Y57D^)>9B> zZ8KSeHim|%&(P-Ch}%~ro+6DRzAm(vK>~C#{teQ-R8&eOy>C)0??r?L+V1-ZE%w&o|E0b! zUI{JpR_B{6_U#@%0g+WVZ?}U+yaZ_@MyjcxQB`K*5}C8ZSS)8a+P+1;i^)n$mS>iJ z01(A-~Yi4LC!(05JuhEKm~Ks2=~Fdh|3MHCo*XPlpaV(85krdm6qD zAi;N0(qoq*JL!;KV8G=D&39mU;XezG&Z_tvnF5k_dB!hbfE&*+Pgss|KW{}$lF6g# zB05z>hl*&hh)xvISP|VQqGS=hUqrDY>VED<%m*}Z_eO|bz#k+2F^U(_@gh3;7!Bsp z;1e%u>e%Qw^+oSy%TwIXIuaP diff --git a/controllers/store/manufacturing_purchase_order.py b/controllers/store/manufacturing_purchase_order.py new file mode 100644 index 00000000..189d1d20 --- /dev/null +++ b/controllers/store/manufacturing_purchase_order.py @@ -0,0 +1,114 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: App Routing +Feature: Store Manufacturing_Purchase_Order Routes + +Description: +Initializes the Flask application, sets the configuration based on the environment, and defines two routes (/ and /about) that render templates with the specified titles. +""" + +# internal +from business_objects.store.manufacturing_purchase_order import Manufacturing_Purchase_Order +from forms.store.manufacturing_purchase_order import Filters_Manufacturing_Purchase_Order +from models.model_view_store_manufacturing_purchase_order import Model_View_Store_Manufacturing_Purchase_Order +from helpers.helper_app import Helper_App +import lib.argument_validation as av +# external +from datetime import datetime +from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session, Blueprint, current_app +from extensions import db, oauth +from urllib.parse import quote_plus, urlencode +from authlib.integrations.flask_client import OAuth +from authlib.integrations.base_client import OAuthError +from urllib.parse import quote, urlparse, parse_qs +import requests + +routes_store_manufacturing_purchase_order = Blueprint('routes_store_manufacturing_purchase_order', __name__) + +@routes_store_manufacturing_purchase_order.route(Model_View_Store_Manufacturing_Purchase_Order.HASH_PAGE_STORE_MANUFACTURING_PURCHASE_ORDERS, methods=['GET']) +def manufacturing_purchase_orders(): + print('manufacturing_purchase_orders') + try: + form_filters = Filters_Manufacturing_Purchase_Order.from_json(request.args) + except Exception as e: + print(f'Error: {e}') + form_filters = Filters_Manufacturing_Purchase_Order() + print(f'form_filters={form_filters}') + model = Model_View_Store_Manufacturing_Purchase_Order(form_filters) + if not model.is_user_logged_in: + return redirect(url_for('routes_core.home')) + return render_template('pages/store/_manufacturing_purchase_orders.html', model = model, datetime = datetime) + +@routes_store_manufacturing_purchase_order.route(Model_View_Store_Manufacturing_Purchase_Order.HASH_GET_STORE_MANUFACTURING_PURCHASE_ORDER, methods=['POST']) +def filter_manufacturing_purchase_order(): + data = Helper_App.get_request_data(request) + try: + form_filters = Filters_Manufacturing_Purchase_Order.from_json(data) + if not form_filters.validate_on_submit(): + error_keys = list(form_filters.errors.keys()) + try: + error_keys.remove(Manufacturing_Purchase_Order.ATTR_ID_PRODUCT_CATEGORY) + except: + pass + try: + error_keys.remove(Manufacturing_Purchase_Order.ATTR_ID_PRODUCT) + except: + pass + if error_keys: + return jsonify({ + Model_View_Store_Manufacturing_Purchase_Order.FLAG_STATUS: Model_View_Store_Manufacturing_Purchase_Order.FLAG_FAILURE, + Model_View_Store_Manufacturing_Purchase_Order.FLAG_MESSAGE: f'Form invalid.\n{form_filters.errors}' + }) + model = Model_View_Store_Manufacturing_Purchase_Order(filters_manufacturing_purchase_order = form_filters) + if not model.is_user_logged_in: + raise Exception('User not logged in.') + return jsonify({ + Model_View_Store_Manufacturing_Purchase_Order.FLAG_STATUS: Model_View_Store_Manufacturing_Purchase_Order.FLAG_SUCCESS, + Model_View_Store_Manufacturing_Purchase_Order.FLAG_DATA: model.category_list.to_json() + }) + except Exception as e: + return jsonify({ + Model_View_Store_Manufacturing_Purchase_Order.FLAG_STATUS: Model_View_Store_Manufacturing_Purchase_Order.FLAG_FAILURE, + Model_View_Store_Manufacturing_Purchase_Order.FLAG_MESSAGE: f'Bad data received by controller.\n{e}' + }) + +@routes_store_manufacturing_purchase_order.route(Model_View_Store_Manufacturing_Purchase_Order.HASH_SAVE_STORE_MANUFACTURING_PURCHASE_ORDER, methods=['POST']) +def save_manufacturing_purchase_order(): + data = Helper_App.get_request_data(request) + try: + form_filters = Filters_Manufacturing_Purchase_Order.from_json(data[Model_View_Store_Manufacturing_Purchase_Order.FLAG_FORM_FILTERS]) + print(f'form_filters: {form_filters}') + + manufacturing_purchase_orders = data[Model_View_Store_Manufacturing_Purchase_Order.FLAG_MANUFACTURING_PURCHASE_ORDER] + if len(manufacturing_purchase_orders) == 0: + return jsonify({ + Model_View_Store_Manufacturing_Purchase_Order.FLAG_STATUS: Model_View_Store_Manufacturing_Purchase_Order.FLAG_FAILURE, + Model_View_Store_Manufacturing_Purchase_Order.FLAG_MESSAGE: f'No stock items.' + }) + print(f'manufacturing_purchase_orders={manufacturing_purchase_orders}') + objs_manufacturing_purchase_order = [] + for manufacturing_purchase_order in manufacturing_purchase_orders: + objs_manufacturing_purchase_order.append(Manufacturing_Purchase_Order.from_json(manufacturing_purchase_order)) + print(f'objs_manufacturing_purchase_order={objs_manufacturing_purchase_order}') + save_errors = Model_View_Store_Manufacturing_Purchase_Order.save_manufacturing_purchase_orders(data.get('comment', 'No comment'), objs_manufacturing_purchase_order) + if len(save_errors) > 0: + return jsonify({ + Model_View_Store_Manufacturing_Purchase_Order.FLAG_STATUS: Model_View_Store_Manufacturing_Purchase_Order.FLAG_FAILURE, + Model_View_Store_Manufacturing_Purchase_Order.FLAG_MESSAGE: f'Save errors: {save_errors}' + }) + model_return = Model_View_Store_Manufacturing_Purchase_Order(filters_manufacturing_purchase_order_old = form_filters) + if not model_return.is_user_logged_in: + raise Exception('User not logged in.') + return jsonify({ + Model_View_Store_Manufacturing_Purchase_Order.FLAG_STATUS: Model_View_Store_Manufacturing_Purchase_Order.FLAG_SUCCESS, + Model_View_Store_Manufacturing_Purchase_Order.FLAG_DATA: model_return.category_list.to_json() + }) + except Exception as e: + return jsonify({ + Model_View_Store_Manufacturing_Purchase_Order.FLAG_STATUS: Model_View_Store_Manufacturing_Purchase_Order.FLAG_FAILURE, + Model_View_Store_Manufacturing_Purchase_Order.FLAG_MESSAGE: f'Bad data received by controller.\n{e}' + }) + \ No newline at end of file diff --git a/controllers/store/store.py b/controllers/store/store.py index f97b4a32..5dae6b13 100644 --- a/controllers/store/store.py +++ b/controllers/store/store.py @@ -14,7 +14,7 @@ Initializes the Flask application, sets the configuration based on the environme # internal from models.model_view_store import Model_View_Store # external -from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session, Blueprint, current_app +from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session, Blueprint, current_app, Response from extensions import db, oauth from urllib.parse import quote_plus, urlencode from authlib.integrations.flask_client import OAuth @@ -27,4 +27,5 @@ routes_store = Blueprint('routes_store', __name__) def scripts_section_store(): hash_page_current = request.args.get('hash_page_current', default = Model_View_Store.HASH_SCRIPTS_SECTION_STORE, type = str) model = Model_View_Store(hash_page_current=hash_page_current) - return render_template('js/sections/store.js', model = model) \ No newline at end of file + template = render_template('js/sections/store.js', model = model) + return Response(template, mimetype='application/javascript') \ No newline at end of file diff --git a/controllers/store/supplier.py b/controllers/store/supplier.py index 63c1aaea..2242ab57 100644 --- a/controllers/store/supplier.py +++ b/controllers/store/supplier.py @@ -10,62 +10,106 @@ Description: Initializes the Flask application, sets the configuration based on the environment, and defines two routes (/ and /about) that render templates with the specified titles. """ - # internal -from business_objects.store.product import Product, Parameters_Product, Product_Permutation -from business_objects.store.stock_item import Stock_Item -from forms.forms import Form_Supplier -from models.model_view_base import Model_View_Base -from models.model_view_store import Model_View_Store +from business_objects.store.supplier import Supplier +from forms.store.supplier import Filters_Supplier from models.model_view_store_supplier import Model_View_Store_Supplier -from models.model_view_store_product_category import Model_View_Store_Product_Category -from models.model_view_store_product_permutation import Model_View_Store_Product_Permutation -from models.model_view_store_stock_item import Model_View_Store_Stock_Item from helpers.helper_app import Helper_App import lib.argument_validation as av # external +from datetime import datetime from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session, Blueprint, current_app from extensions import db, oauth from urllib.parse import quote_plus, urlencode from authlib.integrations.flask_client import OAuth from authlib.integrations.base_client import OAuthError from urllib.parse import quote, urlparse, parse_qs +import requests +routes_store_supplier = Blueprint('routes_store_supplier', __name__) -routes_store_supplier= Blueprint('routes_store_supplier', __name__) - - -@routes_store_supplier.route('/supplier', methods=['GET']) -def supplier(): +@routes_store_supplier.route(Model_View_Store_Supplier.HASH_PAGE_STORE_SUPPLIERS, methods=['GET']) +def suppliers(): + print('suppliers') try: - data = request.json - except: - data = {} - print(f'data={data}') - form_data = data[Model_View_Store_Supplier.key_form] - print(f'form_data: {form_data}') - form = Form_Supplier(**form_data) - print('form acquired') - print(form.__repr__) - if form.validate_on_submit(): - print('valid form') - # model = input_JSON_basket(model, data) - # if not logged in: - try: - model = Model_View_Store_Supplier(form) - if not model.is_user_logged_in: - # return redirect(url_for('routes_user.login', data = jsonify({ Model_View_Store_Supplier.FLAG_CALLBACK: Model_View_Store_Supplier.HASH_PAGE_STORE_SUPPLIERS }))) - return redirect(url_for('routes_core.home')) - # print('importing basket') - # model.import_JSON_basket(data) - model.get_basket(data) - permutation_id, quantity = model.import_JSON_basket_item(data, form) - model.basket_item_edit(permutation_id, quantity, False) # new_basket = - except Exception as e: - return jsonify({Model_View_Base.FLAG_STATUS: Model_View_Base.FLAG_FAILURE, Model_View_Base.FLAG_MESSAGE: f'Bad data received by controller.\n{e}'}) - # return jsonify(Success = True, data = { html_block: render_template(), Model_View_Store.key_basket: new_basket }) - # html_block = render_template('_block_store_basket.html', model = model) - # print(f'html_block:\n{html_block}') - # return jsonify(Success = True, data = { 'html_block': html_block, 'basket': {'items': model.basket.to_json_list()}}) - return render_template('pages/store/_supplier.html', model = model) - return jsonify({Model_View_Base.FLAG_STATUS: Model_View_Base.FLAG_FAILURE, Model_View_Base.FLAG_MESSAGE: f'Invalid supplier details.\n{form.errors}'}) + form_filters = Filters_Supplier.from_json(request.args) + except Exception as e: + print(f'Error: {e}') + form_filters = Filters_Supplier() + print(f'form_filters={form_filters}') + model = Model_View_Store_Supplier(form_filters) + if not model.is_user_logged_in: + return redirect(url_for('routes_core.home')) + return render_template('pages/store/_suppliers.html', model = model, datetime = datetime) + +@routes_store_supplier.route(Model_View_Store_Supplier.HASH_GET_STORE_SUPPLIER, methods=['POST']) +def filter_supplier(): + data = Helper_App.get_request_data(request) + try: + form_filters = Filters_Supplier.from_json(data) + if not form_filters.validate_on_submit(): + error_keys = list(form_filters.errors.keys()) + try: + error_keys.remove(Supplier.ATTR_ID_PRODUCT_CATEGORY) + except: + pass + try: + error_keys.remove(Supplier.ATTR_ID_PRODUCT) + except: + pass + if error_keys: + return jsonify({ + Model_View_Store_Supplier.FLAG_STATUS: Model_View_Store_Supplier.FLAG_FAILURE, + Model_View_Store_Supplier.FLAG_MESSAGE: f'Form invalid.\n{form_filters.errors}' + }) + model = Model_View_Store_Supplier(filters_supplier = form_filters) + if not model.is_user_logged_in: + raise Exception('User not logged in.') + return jsonify({ + Model_View_Store_Supplier.FLAG_STATUS: Model_View_Store_Supplier.FLAG_SUCCESS, + Model_View_Store_Supplier.FLAG_DATA: {supplier.id_supplier: supplier.to_json() for supplier in model.suppliers} + }) + except Exception as e: + return jsonify({ + Model_View_Store_Supplier.FLAG_STATUS: Model_View_Store_Supplier.FLAG_FAILURE, + Model_View_Store_Supplier.FLAG_MESSAGE: f'Bad data received by controller.\n{e}' + }) + +@routes_store_supplier.route(Model_View_Store_Supplier.HASH_SAVE_STORE_SUPPLIER, methods=['POST']) +def save_supplier(): + data = Helper_App.get_request_data(request) + try: + form_filters = Filters_Supplier.from_json(data[Model_View_Store_Supplier.FLAG_FORM_FILTERS]) + print(f'form_filters: {form_filters}') + + suppliers = data[Model_View_Store_Supplier.FLAG_SUPPLIER] + if len(suppliers) == 0: + return jsonify({ + Model_View_Store_Supplier.FLAG_STATUS: Model_View_Store_Supplier.FLAG_FAILURE, + Model_View_Store_Supplier.FLAG_MESSAGE: f'No stock items.' + }) + print(f'suppliers={suppliers}') + objs_supplier = [] + for supplier in suppliers: + objs_supplier.append(Supplier.from_json(supplier)) + print(f'objs_supplier={objs_supplier}') + + save_errors = Model_View_Store_Supplier.save_suppliers(data.get('comment', 'No comment'), objs_supplier) + if len(save_errors) > 0: + return jsonify({ + Model_View_Store_Supplier.FLAG_STATUS: Model_View_Store_Supplier.FLAG_FAILURE, + Model_View_Store_Supplier.FLAG_MESSAGE: f'Save errors: {save_errors}' + }) + model_return = Model_View_Store_Supplier(form_filters_old = form_filters) + if not model_return.is_user_logged_in: + raise Exception('User not logged in.') + return jsonify({ + Model_View_Store_Supplier.FLAG_STATUS: Model_View_Store_Supplier.FLAG_SUCCESS, + Model_View_Store_Supplier.FLAG_DATA: {supplier.id_supplier: supplier.to_json() for supplier in model_return.suppliers} + }) + except Exception as e: + return jsonify({ + Model_View_Store_Supplier.FLAG_STATUS: Model_View_Store_Supplier.FLAG_FAILURE, + Model_View_Store_Supplier.FLAG_MESSAGE: f'Bad data received by controller.\n{e}' + }) + \ No newline at end of file diff --git a/controllers/store/supplier_purchase_order.py b/controllers/store/supplier_purchase_order.py new file mode 100644 index 00000000..f5ddd903 --- /dev/null +++ b/controllers/store/supplier_purchase_order.py @@ -0,0 +1,114 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: App Routing +Feature: Store Supplier_Purchase_Order Routes + +Description: +Initializes the Flask application, sets the configuration based on the environment, and defines two routes (/ and /about) that render templates with the specified titles. +""" + +# internal +from business_objects.store.supplier_purchase_order import Supplier_Purchase_Order +from forms.store.supplier_purchase_order import Filters_Supplier_Purchase_Order +from models.model_view_store_supplier_purchase_order import Model_View_Store_Supplier_Purchase_Order +from helpers.helper_app import Helper_App +import lib.argument_validation as av +# external +from datetime import datetime +from flask import Flask, render_template, jsonify, request, render_template_string, send_from_directory, redirect, url_for, session, Blueprint, current_app +from extensions import db, oauth +from urllib.parse import quote_plus, urlencode +from authlib.integrations.flask_client import OAuth +from authlib.integrations.base_client import OAuthError +from urllib.parse import quote, urlparse, parse_qs +import requests + +routes_store_supplier_purchase_order = Blueprint('routes_store_supplier_purchase_order', __name__) + +@routes_store_supplier_purchase_order.route(Model_View_Store_Supplier_Purchase_Order.HASH_PAGE_STORE_SUPPLIER_PURCHASE_ORDERS, methods=['GET']) +def supplier_purchase_orders(): + print('supplier_purchase_orders') + try: + form_filters = Filters_Supplier_Purchase_Order.from_json(request.args) + except Exception as e: + print(f'Error: {e}') + form_filters = Filters_Supplier_Purchase_Order() + print(f'form_filters={form_filters}') + model = Model_View_Store_Supplier_Purchase_Order(form_filters) + if not model.is_user_logged_in: + return redirect(url_for('routes_core.home')) + return render_template('pages/store/_supplier_purchase_orders.html', model = model, datetime = datetime) + +@routes_store_supplier_purchase_order.route(Model_View_Store_Supplier_Purchase_Order.HASH_GET_STORE_SUPPLIER_PURCHASE_ORDER, methods=['POST']) +def filter_supplier_purchase_order(): + data = Helper_App.get_request_data(request) + try: + form_filters = Filters_Supplier_Purchase_Order.from_json(data) + if not form_filters.validate_on_submit(): + error_keys = list(form_filters.errors.keys()) + try: + error_keys.remove(Supplier_Purchase_Order.ATTR_ID_PRODUCT_CATEGORY) + except: + pass + try: + error_keys.remove(Supplier_Purchase_Order.ATTR_ID_PRODUCT) + except: + pass + if error_keys: + return jsonify({ + Model_View_Store_Supplier_Purchase_Order.FLAG_STATUS: Model_View_Store_Supplier_Purchase_Order.FLAG_FAILURE, + Model_View_Store_Supplier_Purchase_Order.FLAG_MESSAGE: f'Form invalid.\n{form_filters.errors}' + }) + model = Model_View_Store_Supplier_Purchase_Order(filters_supplier_purchase_order = form_filters) + if not model.is_user_logged_in: + raise Exception('User not logged in.') + return jsonify({ + Model_View_Store_Supplier_Purchase_Order.FLAG_STATUS: Model_View_Store_Supplier_Purchase_Order.FLAG_SUCCESS, + Model_View_Store_Supplier_Purchase_Order.FLAG_DATA: model.category_list.to_json() + }) + except Exception as e: + return jsonify({ + Model_View_Store_Supplier_Purchase_Order.FLAG_STATUS: Model_View_Store_Supplier_Purchase_Order.FLAG_FAILURE, + Model_View_Store_Supplier_Purchase_Order.FLAG_MESSAGE: f'Bad data received by controller.\n{e}' + }) + +@routes_store_supplier_purchase_order.route(Model_View_Store_Supplier_Purchase_Order.HASH_SAVE_STORE_SUPPLIER_PURCHASE_ORDER, methods=['POST']) +def save_supplier_purchase_order(): + data = Helper_App.get_request_data(request) + try: + form_filters = Filters_Supplier_Purchase_Order.from_json(data[Model_View_Store_Supplier_Purchase_Order.FLAG_FORM_FILTERS]) + print(f'form_filters: {form_filters}') + + supplier_purchase_orders = data[Model_View_Store_Supplier_Purchase_Order.FLAG_SUPPLIER_PURCHASE_ORDER] + if len(supplier_purchase_orders) == 0: + return jsonify({ + Model_View_Store_Supplier_Purchase_Order.FLAG_STATUS: Model_View_Store_Supplier_Purchase_Order.FLAG_FAILURE, + Model_View_Store_Supplier_Purchase_Order.FLAG_MESSAGE: f'No stock items.' + }) + print(f'supplier_purchase_orders={supplier_purchase_orders}') + objs_supplier_purchase_order = [] + for supplier_purchase_order in supplier_purchase_orders: + objs_supplier_purchase_order.append(Supplier_Purchase_Order.from_json(supplier_purchase_order)) + print(f'objs_supplier_purchase_order={objs_supplier_purchase_order}') + save_errors = Model_View_Store_Supplier_Purchase_Order.save_supplier_purchase_orders(data.get('comment', 'No comment'), objs_supplier_purchase_order) + if len(save_errors) > 0: + return jsonify({ + Model_View_Store_Supplier_Purchase_Order.FLAG_STATUS: Model_View_Store_Supplier_Purchase_Order.FLAG_FAILURE, + Model_View_Store_Supplier_Purchase_Order.FLAG_MESSAGE: f'Save errors: {save_errors}' + }) + model_return = Model_View_Store_Supplier_Purchase_Order(filters_supplier_purchase_order_old = form_filters) + if not model_return.is_user_logged_in: + raise Exception('User not logged in.') + return jsonify({ + Model_View_Store_Supplier_Purchase_Order.FLAG_STATUS: Model_View_Store_Supplier_Purchase_Order.FLAG_SUCCESS, + Model_View_Store_Supplier_Purchase_Order.FLAG_DATA: model_return.category_list.to_json() + }) + except Exception as e: + return jsonify({ + Model_View_Store_Supplier_Purchase_Order.FLAG_STATUS: Model_View_Store_Supplier_Purchase_Order.FLAG_FAILURE, + Model_View_Store_Supplier_Purchase_Order.FLAG_MESSAGE: f'Bad data received by controller.\n{e}' + }) + \ No newline at end of file diff --git a/datastores/__pycache__/datastore_store_stock_item.cpython-312.pyc b/datastores/__pycache__/datastore_store_stock_item.cpython-312.pyc index fdc41dd885f65e4c7251d410dbef7b55b56ef6df..4f7aca6a5342fe51378e4aa1bb71dc23b20f84d2 100644 GIT binary patch delta 98 zcmeyV|3RPcG%qg~0}ve8&Y!L=zL77Fh4ISdT9(F5tSgxrzfE4nVa@!2M||>oj!woq zn=3iDFf+Pt*5lpI#+bSJnXohys~D^5C!@`5VhV!Z delta 109 zcmeyM|5KmuG%qg~0}#9smu-VQD5-X;#%wHk<#7K4cUsVq_G%plJG) L0mLYh2AU55MXw;G diff --git a/datastores/datastore_store_manufacturing_purchase_order.py b/datastores/datastore_store_manufacturing_purchase_order.py new file mode 100644 index 00000000..60f89c53 --- /dev/null +++ b/datastores/datastore_store_manufacturing_purchase_order.py @@ -0,0 +1,132 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: DataStores +Feature: Store Manufacturing Purchase Order Purchase Order DataStore + +Description: +Datastore for Store Manufacturing Purchase Order Purchase Orders +""" + +# internal +# from routes import bp_home +import lib.argument_validation as av +from business_objects.sql_error import SQL_Error +from business_objects.store.manufacturing_purchase_order import Manufacturing_Purchase_Order, Manufacturing_Purchase_Order_Product_Link, Parameters_Manufacturing_Purchase_Order, Manufacturing_Purchase_Order_Temp, Manufacturing_Purchase_Order_Product_Link_Temp +from datastores.datastore_store_base import DataStore_Store_Base +from helpers.helper_db_mysql import Helper_DB_MySQL +from extensions import db +# external +# from abc import ABC, abstractmethod, abstractproperty +from flask_sqlalchemy import SQLAlchemy +from sqlalchemy import text +import stripe +import os +from flask import Flask, session, current_app +from pydantic import BaseModel, ConfigDict +from typing import ClassVar +from datetime import datetime + + +class DataStore_Store_Manufacturing_Purchase_Order(DataStore_Store_Base): + + def __init__(self): + super().__init__() + + def get_many_manufacturing_purchase_order(self, parameters_manufacturing_purchase_order): + _m = 'DataStore_Store_Manufacturing_Purchase_Order.get_many_manufacturing_purchase_order' + av.val_instance(parameters_manufacturing_purchase_order, 'parameters_manufacturing_purchase_order', _m, Parameters_Manufacturing_Purchase_Order) + argument_dict = parameters_manufacturing_purchase_order.to_json() + user = self.get_user_session() + 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_manufacturing_purchase_order') + result = self.db_procedure_execute('p_shop_get_many_manufacturing_purchase_order', argument_dict) + cursor = result.cursor + print('data received') + + # Manufacturing_Purchase_Orders + result_set_1 = cursor.fetchall() + print(f'raw manufacturing_purchase_orders: {result_set_1}') + manufacturing_purchase_orders = [] + for row in result_set_1: + new_manufacturing_purchase_order = Manufacturing_Purchase_Order.from_DB_manufacturing_purchase_order(row) + manufacturing_purchase_orders.append(new_manufacturing_purchase_order) + + # Manufacturing_Purchase_Orders Items + result_set_1 = cursor.fetchall() + print(f'raw manufacturing_purchase_order_product_links: {result_set_1}') + order_product_links = [] + for row in result_set_1: + new_link = Manufacturing_Purchase_Order_Product_Link.from_DB_manufacturing_purchase_order(row) + manufacturing_purchase_orders.append(new_manufacturing_purchase_order) + + # 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}") + + DataStore_Store_Manufacturing_Purchase_Order.db_cursor_clear(cursor) + + return manufacturing_purchase_orders, errors + + @classmethod + def save_manufacturing_purchase_orders(cls, comment, manufacturing_purchase_orders): + _m = 'DataStore_Store_Manufacturing_Purchase_Order.save_manufacturing_purchase_orders' + av.val_str(comment, 'comment', _m) + + guid = Helper_DB_MySQL.create_guid_str() + now = datetime.now() + user = cls.get_user_session() + rows_order = [] + for manufacturing_purchase_order in manufacturing_purchase_orders: + row = Manufacturing_Purchase_Order_Temp.from_manufacturing_purchase_order(manufacturing_purchase_order) + row.guid = guid + rows_order.append(row) + print(f'order rows: {rows_order}') + DataStore_Store_Base.upload_bulk(Manufacturing_Purchase_Order_Temp.__tablename__, rows_order, 1000) + print('bulk uploaded orders') + + rows_link = [] + for manufacturing_purchase_order in manufacturing_purchase_orders: + for link in manufacturing_purchase_order.items: + row = Manufacturing_Purchase_Order_Product_Link_Temp.from_manufacturing_purchase_order_product_link(link) + row.guid = guid + rows_link.append(row) + print(f'link rows: {rows_link}') + DataStore_Store_Base.upload_bulk(Manufacturing_Purchase_Order_Product_Link_Temp.__tablename__, rows_link, 1000) + print('bulk uploaded links') + + argument_dict_list = { + 'a_comment': comment, + 'a_guid': guid, + 'a_id_user': user.id_user, + 'a_debug': 0 + } + result = cls.db_procedure_execute('p_shop_save_manufacturing_purchase_order', argument_dict_list) + print('saved manufacturing purchase orders') + + # Errors + cursor = result.cursor + 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] + for error in errors: + print(f"Error [{error.code}]: {error.msg}") + + DataStore_Store_Manufacturing_Purchase_Order.db_cursor_clear(cursor) + return errors diff --git a/datastores/datastore_store_stock_item.py b/datastores/datastore_store_stock_item.py index 683f64bd..a629b7aa 100644 --- a/datastores/datastore_store_stock_item.py +++ b/datastores/datastore_store_stock_item.py @@ -47,10 +47,6 @@ 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 # 'auth0|6582b95c895d09a70ba10fef' # id_user - argument_dict['a_debug'] = 0 - """ argument_dict = { 'a_id_user': user.id_user , **argument_dict @@ -64,11 +60,10 @@ class DataStore_Store_Stock_Item(DataStore_Store_Base): result = self.db_procedure_execute('p_shop_get_many_stock_item', argument_dict) cursor = result.cursor print('data received') - # categories, category_index = DataStore_Store_Stock_Item.input_many_product(cursor) category_list, errors = DataStore_Store_Stock_Item.input_many_stock_item(cursor, category_list) DataStore_Store_Stock_Item.db_cursor_clear(cursor) - return category_list, errors # categories, category_index + return category_list, errors def input_many_stock_item(cursor, category_list): diff --git a/datastores/datastore_store_supplier.py b/datastores/datastore_store_supplier.py index e0f2aeaa..8a947879 100644 --- a/datastores/datastore_store_supplier.py +++ b/datastores/datastore_store_supplier.py @@ -4,20 +4,20 @@ Author: Edward Middleton-Smith Precision And Research Technology Systems Limited Technology: DataStores -Feature: Store Stock Item DataStore +Feature: Store Supplier DataStore Description: -Datastore for Store Stock Items +Datastore for Store Suppliers """ # internal # from routes import bp_home import lib.argument_validation as av from business_objects.sql_error import SQL_Error +from business_objects.store.supplier_address import Supplier_Address, Supplier_Address_Temp from business_objects.store.supplier import Supplier, Parameters_Supplier, Supplier_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! from extensions import db # external # from abc import ABC, abstractmethod, abstractproperty @@ -30,54 +30,46 @@ from pydantic import BaseModel, ConfigDict from typing import ClassVar from datetime import datetime -# db = SQLAlchemy() - class DataStore_Store_Supplier(DataStore_Store_Base): - # Global constants - # Attributes def __init__(self): super().__init__() - # Stock Items - def get_many_supplier(self, parameters_supplier, category_list): - # redundant argument validation? + def get_many_supplier(self, parameters_supplier): _m = 'DataStore_Store_Supplier.get_many_supplier' av.val_instance(parameters_supplier, 'parameters_supplier', _m, Parameters_Supplier) argument_dict = parameters_supplier.to_json() user = self.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 } - ids_permutation = category_list.get_csv_ids_permutation() - print(f'ids_permutation: {ids_permutation}') - argument_dict['a_ids_product_permutation'] = ids_permutation print(f'argument_dict: {argument_dict}') print('executing p_shop_get_many_supplier') result = self.db_procedure_execute('p_shop_get_many_supplier', argument_dict) cursor = result.cursor print('data received') - # categories, category_index = DataStore_Store_Supplier.input_many_product(cursor) - category_list, errors = DataStore_Store_Supplier.input_many_supplier(cursor, category_list) - DataStore_Store_Supplier.db_cursor_clear(cursor) - - return category_list, errors # categories, category_index - - - def input_many_supplier(cursor, category_list): - _m = 'DataStore_Store_Supplier.input_many_supplier' + + # Suppliers result_set_1 = cursor.fetchall() - print(f'raw categories: {result_set_1}') + print(f'raw suppliers: {result_set_1}') + suppliers = [] + supplier_indexes = {} for row in result_set_1: new_supplier = Supplier.from_DB_supplier(row) - category_list.add_supplier(new_supplier) # , row) + supplier_indexes[new_supplier.id_supplier] = len(suppliers) + suppliers.append(new_supplier) + + # Supplier Addresses + cursor.nextset() + result_set_1 = cursor.fetchall() + print(f'raw supplier addresses: {result_set_1}') + for row in result_set_1: + new_address = Supplier_Address.from_DB_supplier(row) + index_supplier = supplier_indexes[new_address.id_supplier] + suppliers[index_supplier].addresses.append(new_address) # Errors cursor.nextset() @@ -88,44 +80,42 @@ class DataStore_Store_Supplier(DataStore_Store_Base): 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}") - """ - if len(errors) > 0: - for error in errors: - if error.code == 'PRODUCT_AVAILABILITY': - ids_permutation_unavailable = DataStore_Store_Supplier.get_ids_permutation_from_error_availability(error.msg) - for id_permutation in ids_permutation_unavailable: - index_category = category_list.get_index_category_from_id_permutation(id_permutation) - category = category_list.categories[index_category] - index_product = category.get_index_product_from_id_permutation(id_permutation) - product = category.products[index_product] - index_permutation = product.get_index_permutation_from_id(id_permutation) - permutation = product.permutations[index_permutation] - permutation.is_available = False - if 'region' in error.msg or 'currency' in error.msg: - permutation.is_unavailable_in_currency_or_region = True - """ + DataStore_Store_Supplier.db_cursor_clear(cursor) - return category_list, errors # categories, category_index - + + return suppliers, errors + @classmethod def save_suppliers(cls, comment, suppliers): _m = 'DataStore_Store_Supplier.save_suppliers' + print(f'{_m}\n{suppliers}') av.val_str(comment, 'comment', _m) guid = Helper_DB_MySQL.create_guid_str() now = datetime.now() user = cls.get_user_session() + rows = [] for supplier in suppliers: - # row = permutation.to_temporary_record() row = Supplier_Temp.from_supplier(supplier) row.guid = guid - rows.append(row) - + rows.append(row) print(f'rows: {rows}') DataStore_Store_Base.upload_bulk(Supplier_Temp.__tablename__, rows, 1000) - print('bulk uploaded') + print('bulk uploaded suppliers') + + rows = [] + for supplier in suppliers: + print(f'supplier: {supplier}') + for supplier_address in supplier.addresses: + row = Supplier_Address_Temp.from_supplier_address(supplier_address) + row.guid = guid + rows.append(row) + print(f'rows: {rows}') + + DataStore_Store_Base.upload_bulk(Supplier_Address_Temp.__tablename__, rows, 1000) + print('bulk uploaded supplier addresses') argument_dict_list = { 'a_comment': comment, @@ -134,7 +124,7 @@ class DataStore_Store_Supplier(DataStore_Store_Base): 'a_debug': 0 } result = cls.db_procedure_execute('p_shop_save_supplier', argument_dict_list) - print('saved product permutations') + print('saved suppliers') # Errors cursor = result.cursor @@ -146,5 +136,6 @@ class DataStore_Store_Supplier(DataStore_Store_Base): 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}") + DataStore_Store_Supplier.db_cursor_clear(cursor) return errors diff --git a/datastores/datastore_store_supplier_purchase_order.py b/datastores/datastore_store_supplier_purchase_order.py new file mode 100644 index 00000000..dead5a98 --- /dev/null +++ b/datastores/datastore_store_supplier_purchase_order.py @@ -0,0 +1,129 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: DataStores +Feature: Store Supplier Purchase Order Purchase Order DataStore + +Description: +Datastore for Store Supplier Purchase Order Purchase Orders +""" + +# internal +# from routes import bp_home +import lib.argument_validation as av +from business_objects.sql_error import SQL_Error +from business_objects.store.supplier_purchase_order import Supplier_Purchase_Order, Supplier_Purchase_Order_Product_Link, Parameters_Supplier_Purchase_Order, Supplier_Purchase_Order_Temp, Supplier_Purchase_Order_Product_Link_Temp +from datastores.datastore_store_base import DataStore_Store_Base +from helpers.helper_db_mysql import Helper_DB_MySQL +from extensions import db +# external +# from abc import ABC, abstractmethod, abstractproperty +from flask_sqlalchemy import SQLAlchemy +from sqlalchemy import text +import stripe +import os +from flask import Flask, session, current_app +from pydantic import BaseModel, ConfigDict +from typing import ClassVar +from datetime import datetime + + +class DataStore_Store_Supplier_Purchase_Order(DataStore_Store_Base): + + def __init__(self): + super().__init__() + + def get_many_supplier_purchase_order(self, parameters_supplier_purchase_order): + _m = 'DataStore_Store_Supplier_Purchase_Order.get_many_supplier_purchase_order' + av.val_instance(parameters_supplier_purchase_order, 'parameters_supplier_purchase_order', _m, Parameters_Supplier_Purchase_Order) + argument_dict = parameters_supplier_purchase_order.to_json() + user = self.get_user_session() + 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_supplier_purchase_order') + result = self.db_procedure_execute('p_shop_get_many_supplier_purchase_order', argument_dict) + cursor = result.cursor + print('data received') + + # Supplier_Purchase_Orders + result_set_1 = cursor.fetchall() + print(f'raw supplier_purchase_orders: {result_set_1}') + supplier_purchase_orders = [] + for row in result_set_1: + new_supplier_purchase_order = Supplier_Purchase_Order.from_DB_supplier_purchase_order(row) + supplier_purchase_orders.append(new_supplier_purchase_order) # , row) + + # 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}") + + DataStore_Store_Supplier_Purchase_Order.db_cursor_clear(cursor) + + return supplier_purchase_orders, errors + + @classmethod + def save_supplier_purchase_orders(cls, comment, supplier_purchase_orders): + _m = 'DataStore_Store_Supplier_Purchase_Order.save_supplier_purchase_orders' + av.val_str(comment, 'comment', _m) + + guid = Helper_DB_MySQL.create_guid_str() + now = datetime.now() + user = cls.get_user_session() + rows_order = [] + for supplier_purchase_order in supplier_purchase_orders: + row = Supplier_Purchase_Order_Temp.from_supplier_purchase_order(supplier_purchase_order) + row.guid = guid + rows_order.append(row) + print(f'order rows: {rows_order}') + DataStore_Store_Base.upload_bulk(Supplier_Purchase_Order_Temp.__tablename__, rows_order, 1000) + print('bulk uploaded orders') + + rows_link = [] + for supplier_purchase_order in supplier_purchase_orders: + for link in supplier_purchase_order.items: + row = Supplier_Purchase_Order_Product_Link_Temp.from_supplier_purchase_order_product_link(link) + row.guid = guid + rows_link.append(row) + print(f'link rows: {rows_link}') + DataStore_Store_Base.upload_bulk(Supplier_Purchase_Order_Product_Link_Temp.__tablename__, rows_link, 1000) + print('bulk uploaded links') + + argument_dict_list = { + 'a_comment': comment, + 'a_guid': guid, + 'a_id_user': user.id_user, + 'a_debug': 0 + } + result = cls.db_procedure_execute('p_shop_save_supplier_purchase_order', argument_dict_list) + print('saved supplier purchase orders') + + # Errors + cursor = result.cursor + cursor.nextset() + result_set_e = cursor.fetchall() + print(f'raw errors: {result_set_e}') + errors = [] + warnings = [] + if len(result_set_e) > 0: + for row in result_set_e: + new_error = SQL_Error.from_DB_record(row) + if new_error.code == 'WARNING': + warnings.append(new_error) + else: + errors.append(new_error) + print(f"Error [{new_error.code}]: {new_error.msg}") + + cls.db_cursor_clear(cursor) + return errors, warnings diff --git a/forms/store/manufacturing_purchase_order.py b/forms/store/manufacturing_purchase_order.py new file mode 100644 index 00000000..720b82f0 --- /dev/null +++ b/forms/store/manufacturing_purchase_order.py @@ -0,0 +1,38 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Backend +Feature: Forms - Manufacturing Purchase Order Filters data input + +Description: +Defines Flask-WTF forms for handling manufacturing purchase order filter input. +""" + +# internal +from business_objects.store.store_base import Store_Base +from forms.base import Form_Base +import lib.argument_validation as av +# external +from flask_wtf import FlaskForm +from wtforms import StringField, TextAreaField, SubmitField, BooleanField, IntegerField, SelectField, FloatField, DateField +from wtforms.validators import InputRequired, NumberRange, Regexp, DataRequired, Optional +from flask_wtf.recaptcha import RecaptchaField +from abc import ABCMeta, abstractmethod + + +class Filters_Manufacturing_Purchase_Order(Form_Base): + active = BooleanField("Active only?", default = True) + date_from = DateField('Date from') + date_to = DateField('Date to') + def __repr__(self): + return f'Filters_Manufacturing_Purchase_Order(active={self.active.data}, date_from={self.date_from.data}, date_to={self.date_to.data})' + @classmethod + def from_json(cls, json): + _m = f'{cls.__name__}.from_json' + form = cls() + form.active.data = av.input_bool(json[Store_Base.FLAG_ACTIVE], 'active', _m) + form.date_from.data = json[Store_Base.FLAG_DATE_FROM] + form.date_to.data = json[Store_Base.FLAG_DATE_TO] + return form \ No newline at end of file diff --git a/forms/store/supplier.py b/forms/store/supplier.py new file mode 100644 index 00000000..5ae4b600 --- /dev/null +++ b/forms/store/supplier.py @@ -0,0 +1,34 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Backend +Feature: Forms - Supplier Filters data input + +Description: +Defines Flask-WTF forms for handling supplier filter input. +""" + +# internal +from business_objects.store.store_base import Store_Base +from forms.base import Form_Base +import lib.argument_validation as av +# external +from flask_wtf import FlaskForm +from wtforms import StringField, TextAreaField, SubmitField, BooleanField, IntegerField, SelectField, FloatField +from wtforms.validators import InputRequired, NumberRange, Regexp, DataRequired, Optional +from flask_wtf.recaptcha import RecaptchaField +from abc import ABCMeta, abstractmethod + + +class Filters_Supplier(Form_Base): + active = BooleanField("Active only?", default = True) + def __repr__(self): + return f'Filters_Supplier(active={self.active.data})' + @classmethod + def from_json(cls, json): + _m = f'{cls.__name__}.from_json' + form = cls() + form.active.data = av.input_bool(json[Store_Base.FLAG_ACTIVE], 'active', _m) + return form \ No newline at end of file diff --git a/forms/store/supplier_purchase_order.py b/forms/store/supplier_purchase_order.py new file mode 100644 index 00000000..ebe7b6e2 --- /dev/null +++ b/forms/store/supplier_purchase_order.py @@ -0,0 +1,38 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: Backend +Feature: Forms - Supplier Purchase Order Filters data input + +Description: +Defines Flask-WTF forms for handling supplier purchase order filter input. +""" + +# internal +from business_objects.store.store_base import Store_Base +from forms.base import Form_Base +import lib.argument_validation as av +# external +from flask_wtf import FlaskForm +from wtforms import StringField, TextAreaField, SubmitField, BooleanField, IntegerField, SelectField, FloatField, DateField +from wtforms.validators import InputRequired, NumberRange, Regexp, DataRequired, Optional +from flask_wtf.recaptcha import RecaptchaField +from abc import ABCMeta, abstractmethod + + +class Filters_Supplier_Purchase_Order(Form_Base): + active = BooleanField("Active only?", default = True) + date_from = DateField('Date from') + date_to = DateField('Date to') + def __repr__(self): + return f'Filters_Supplier_Purchase_Order(active={self.active.data}, date_from={self.date_from.data}, date_to={self.date_to.data})' + @classmethod + def from_json(cls, json): + _m = f'{cls.__name__}.from_json' + form = cls() + form.active.data = av.input_bool(json[Store_Base.FLAG_ACTIVE], 'active', _m) + form.date_from.data = json[Store_Base.FLAG_DATE_FROM] + form.date_to.data = json[Store_Base.FLAG_DATE_TO] + return form \ No newline at end of file diff --git a/models/__pycache__/model_view_base.cpython-312.pyc b/models/__pycache__/model_view_base.cpython-312.pyc index ff19d858d9e66865fd4f5996916bafa972822baf..e6492ab5f008e099f7dd02a795e75ff92e33e5ea 100644 GIT binary patch delta 6098 zcmaKw3tUuH9>=*em!~|!0UeR&@S5Q%FGU{G03#21$$;r8oq)OGATWAo@RbI(R$5zO zrwn>1_VSrw^l-Cm%N|=#1Z+t$rAvvkWn|No45Fn8zk;d}4>{{H8G&pC6s z@^NU3u=^pw|9w9{A2;^NEScQgJNKZ!PN|3q7?`bGC5V!;MN3zDsDgtecgbTKE0R3T zsysL#zvN>0SZa$gKxmt8alEb+=boC^c3SKH*9+xb{WD&{d90A83()BRM;5l4!qbs=; zlL9We$(3|L(s@0XEXF%5A$rc4(A`W5IoE)$krZ*R37we~b526Hlo&YIjBXj3>vWxL z`krPB$`(?>6)s2DN=iA`hOV8Ian6cv1u5s;N^~-r$2l81JE`DYM;^Psn|T$fNpDqt9hcmW$sMGgb9bWK zOcro%3pn=8AHeVT1}?eFmGna*ETm~ZD%~P3zX!YBO9_W-&F$r8?OL-!Cd(c?a<`8RXP!nYiF2Q!`<&d) zxfAG4k~=u}H*{Z+J304vbYGIqPUn0xeTDLCvV|-B2fA;_U7Y(Tx^KzdockBLQ{?xY z`!~Ap$UU4pjqZDLFXzrU-%Mx8eVqIO3ccOT=SVkaf5hSE$yUz&gzjf@Kj$u>yGSVK z{)6rp@&M<4MR%!_Ja|QR3uZUa>?n|J6THIZmE@rbUUYeP(lfz(xV$Ino#4H|d%H;< zk|(>1H?E(Z_>hOCM^H_24fG+8f=A~&?jDo2qwyOzJ6y(p-1JFitO*!5JEh0bTn9$s zCOyGA2X+hlC+`#BUk3IePfAZoPcyCB`mX1dG3{YgKnP_F18nlR2hhbEje185>R z^E{eJ&b)voiZd^w(Ofp6?Dj9AioUFvIn*tz_0h%-3TmBEyDEtyWwUsp~$1Jjjdb&IGzuz>Cj-0M3DM;BGsS21avoEYYhqF7&NFwL#4 zu5>tWhSzn~bi?Gep`v8A*d5+jXDBYKbNDzUsP9L zTUJ$Ks;RFnD%Beers~>aL#=V3F}OzP47}Xe*s)?os|C8Kuj*o~uc@ghVqg^6FbV{8^)Vn7Q zZ!i=Z%jygRx2Pi&#i6M-*p$?!4t8vlWRtC-RkE3^&i#mG%Plq4=t~T)4JoQ;8&heh zH5v642BT{uXm3bFU5u+y8^67#6|Vig+%Wm-hW~$uUkYgyG!d@OHrEFKrm2=*ny&Vn zutx*Ip=U(l+X1hrZ3^K>x+A(qI8RSUPZ55io-vxp3+&g+;cKy(TCL5^lG$Wwmw#qT zC(450<|hA0%VJ_<6maUnuuffRHA}6g1r}+wsgOM_DJC|;VmFyC4BQ_xO-T9`#wr|2 zn_YIew^~}rsOhY$Etsh;w@(5lch9&wiz^K|&x#x#P1g3MmS))vhOr+vY_vTtMF^)K#Dy!c-k9o~ zhV01-WN%jHnuP2N!^S7z3fD!_{eHn>$PdK5SL2shVM3ENdD>w`&6hJ?+;fI=k(iB|yP6KnQ~) zu!HTM&D16}*g9mXO=`ExxFc6}45LSMDZ*TON|ywUrYA_kuXJNVqJr(>frKidg8q_V z_j9e<3#JxBPb8@6w#0xbQS3hBTgC1h%dXdD(!m6+U#rDtH(6KM*^+J5^mJkuOpcbrY6&OlL~}d>Ycnl#x;+4RwzdT zw7(gW&W421oRnZXDWzDbAE-&0B%~xjEsknu?e{30H}$qQwwRh)8*DcIn{#Bb4q5a_ zY6<((-ebm6n0fn*7iOif9y$*>6T z^2{RWd|zg{kV_qzTKE>ltR%ro)3Wffb0&RRK_Pn9Kqol7%?)=e|Bb?R)7629k2;e5bVt@(I0B8i50TQ4YU;!)#v;x`y@P*4O05ZT1 zSOr)Efd9ym*8^^K3uEkp)7t=>0Cxa31MZ?9&WbPTh0})tj{qJ6YzOQB>;yakcnYu! zum=Et*2vEQ4gh>9$xf3F!RgC@!+=)+uL6z$UIY9Q@H*fPz)`@PfVTi|1Kt7r3Ggo9 zJ;3{bV}K9nk!(%p7@U3#_!RIt;3VJ+z?Xop0p9?=1)KtW2lyUv25=Ve1K=D0UYc?s zU^3t*28Rf5VtmWX7eL~xOr+7X<2#iCyM`CN90&*o!21(lX>u4lbNJfWE5Xv#CfS!+ z&2lt^@J5mGmluD}GT<@`FdI++C&wqwo-P27kk z>(@fUfdxuO8J_zacS|ewCZ(AFkQa*4x%qx_Mc*ZA;sLUtWmd zU)Ve-&gj=3$~ed-(M;p=ZwyOeYY6RG)@SQ&gEizY9uyOIFYIsHvv^2cOuO)-V{qfokMvS)7KP~nq8$ixTmf>&Of)!fl4&5;}Fs^W5$(Ot;ww)Cma KxxpDess9BZi0%&n delta 4547 zcmZXW33OD|8OP_%mI-7rOePK?I|^@BiKV-n;L; zdvbKQ(!WiKdMz??lurJZ)kigNs6HL#H0aky1d9#pl`fAJVpWrB9xG!t%oAHCj~*M? zn2RHKJ;X6*CpQ+ZXD*)HIIuI9KrRu+GM9u-HMF?pK?Ka#b;YwVnFgf5IObBxr9lF7 zsqHQAHdDUXmcmql4r?t)b2vdK+?H0E;1<-&O8@@QH^ z%M7v3Y%Nb`Nj_B+(;q*^A1&l|~GF}K~o^7%B|0w@v(EY_~cELlv+O;F6-5^^^~33EVhDU>p| zjNEc4V{Qex1}JB4CAmhZ74kn_S6=32hrZRa86|RG6%xUEOFrB#oxel1Y+}AQ~4cmBXeEkx?whRo5|e?bHw>kR+WE#cT;i?%wyH}lG_UNncGJ0 zK3Krqc5?T_LgpSor!HzaiP!2}%#s~cy%TO?u7_MNED>i%Tgz`|$%B+U1i;)ba=T$E zbA9CYz%mgNVV$>}C67|_7_4A!FS&itz}$Xv2Vf<02gx0RMsYgATE2=UM<{t5nwUFE z?ihHOJ5KHds6vUfmak^X6O{ZKnwdLA?li1n?l^a$tmW%j@)t^8hYie~BX=HdW$v%!`eCE!jj~pDvgGfSyaBf{H$d(mu!*@4x^SK6 zO}JfLl2>sD%Pvs;Md)H~klZEcX6|ir@4#k}7i}%SlO^v_avAPo?tO9}z!v5{B=-^A zEjCA6yY6Ahrqx6Lyodsjz#_o>@u@AHw~{nYznr1yZj zNM>J-^meE_W$$0u)9ch8&sQhEKB35tPHu0|tNub2o^Q73PN0#$?~m}HT&!=m=-?sG zcapn2|CZeC`Hy5@xUNU>jPhLDqQD+%{a3agRv(dV-H$WDqhu6j9wVb4F}S_LUQz~D zw2zFDnf+u;%p4$NX67K7FlG*su`qL(O!)W4B2WLzjYE#n!NxID6>-5jQ!Ivp};5YU;ig-5u#o*y_CMEb(Lb6_rOHK;zNN!YuC8?hp zl{bRU3A^;lMe&?tt}-ZMoN>w};c%v46yfzZwECKxRZoMrU3*(9r&0S*9<+<1 z#hEesBW!*q(P&UGytL{9b$H{N(CY_+#Fplbe*zM)Nf7mZofG@s`8n`9>i zfAX&6q>8+-&I~zetT>Y$qhyQo*;&K09WSCK)XM_RAQ6h`X!i#E4Q*X;4n#ILQlazcBmE*#R%5qfYvN)KNrI)Mtdd_TRvPjAeM2_6Gd{cCxbfM(h#Z$S_ zaiefP`A177&l@G%oo;a@#}V1;^#>Y!w*=%Z`%6VkUII>@lh-i3eo82;Sq(G>0@^Wy zhO>kWYt@a~Xq?Y5e8+UZp=@!*oh?4ht5hmPX8y_ak?Xil7HZ*$nExA+FNY+Gr3E(O zDyUVegX;=LD`Tu!OQV|P^vCqtD6zvGXT~)R70LmH;-Y)HQY$7FuEq=9S@>kp^>T>Q ztl4qoScF{`Yqp z#5#l@(Sg{2*oe3daXSLHWNou9QSvTq-i^2yu@!M2V!OCjHc@>Tn~xwO5RW1rL+nND zL+nQ!KpaFILL5dMK|GE)ia3TijyQohiTD-b3DH`fSMW48pF#W)aRzY~@jT*1#7l^m z5w9ZtEc6v=6(MZCiFga~Ps9bpAR-1a260IuWW>FcHf8M{l<$hY6|Sz2v58x<_ATNX z0yjU}k2JF)2S)hi_v~$IQv+*!9xXyD+72}O^60BcK$nC_LpTuGh+G7|-EvQsppA|` zHbjQ}Gx#rCM15sQc&aj^2lMBjGp6i!94$DI-EW*Pc2wnv3ssXvVQsX?sE!pos}e+S z^(tYVk{O&cB~B568W11XED>$Br$pY=7osxr&l&A~j{OCD01}}8|?$}N!>U0xciMs14(J;jJBRYzcFn<7S?V} z$3hv;9nLRV6Hj^mW-aZmA2dY{n5CL2wOUx+`Z!o##x&|MZd02`6=^}q?DQok2I$G5V YZI+ldtIpbGRNOt@{njsa*rKQLKYXW4TL1t6 diff --git a/models/__pycache__/model_view_store.cpython-312.pyc b/models/__pycache__/model_view_store.cpython-312.pyc index 07edb8d53e6999e231c9df886b5eba2025ecd364..9cfa9ef6155e9143135724b93454812349e834b5 100644 GIT binary patch delta 6393 zcmaKw4OCRuwa2+|9cExa4GbU(&Hy4KAP5-Iq5{JR$fwNU$5nD2=Z?yRFYgQniOFb! z#uz^^CrQyH29q?RHA+HiOjcKucBN@vo7WDdEo7RmBr9EM-|JV}x02<{d+YV>z2~AQ zl*n@ZIrIDNv*+A%&mCrY{hDy)9U=Z_ad9yb@MAhNf6u!6UWxxSD)Q&^*ndT3B`Hx- zv`6&JSpe3fQ^Yd-t!EXYC2bCl6`d5r`RK6sCNV*mV2b68UNb3Z5{#TNXgx2KB(gWe zxU?AR8!N?gHAbqL>orr~d7O#UOa__xoQc;=78)kaF&gG-B%5jzxY~JS61~gFm^d?E zGkItdk~ni089h65cVd#1%!!1s@D|dP6wV}SQ~o)}VlZh{C0NDEbjIi;%{J*QLNeQ@ zOD$AV`eBcybgsn$EK*XX#T;9R%z*dhZ#s)%k=D49uEoODrD>*$-ZC%R7@Zy_Y<;vP zdNGZ&*y(7C!5kiY>#6d6sI+MIBd{5oZ6>=&Z;Z|)qGttqiy`t;fz%J8lH`rVn>%9uuD`4}8WU;rv=7-1L zy=4Cv>~hV{jj@#4C!u9ML*kT%IdHrPn47Map z*gwIp)aLe)EsHfq->uoESc_qmHuoUe6JSd<`yANSnmvTpRLo!^H^ot#F=`{yhx^nGYy(~iHw6Yjb!xR5i(BBG->8CnO4p;Yvu}>&79e! znX6>BaHd5wqhz*n#-W*4$!z0{lT4QPH8K)sS~YW>%y!Of*31nuJ2tW&y|V_n3$r4Eku z5Zfnpa!e)Wle#$OC)O)ge5v6IsM96Lqq zv~*Bo0sQtcNbrpG09W`pF(y68u_uT!nc4E%Ef_*?`kWTP9BTcEhr-cdg+vMX&^#6t=v#94+zpAwEZr; zKBHWLd|Y`Mk||dqpHQwrKB>H+j6&U0$}8~d+sdm05qZ*(G6pZsDz8DFQ@#iJv~nHt z87O`oil03e(I-gf9TCqj!{ljOWv{Q@%udc%bn3}(VaG*jV>4uBxtRDy*)i0?H-jDl{}-(^dzek>Jr$SlO(^0Y6ey459;rrZauR?izKQr$89XIM? z>IZ>DzWMZSg;MxN*yq+(WzJSVByz@WQX6gkQ0Pi@(%egb!-<3hOg3 zF^u4F6oSQ=7YbACM`oLFc}!>V3$avn9sL+Pl93ZjrEkFNehd4g#v=TKg)-`(I6L!? zg77+_4wDAoz__ODo%Qx?aN6PPO(RGT9UAHD89#|cJ}&R{`T%Jxm{6R?C&}0 z!Wf%pT@AfAT1$o1>|yITv~69sQK&tIO{OsBVSIoQ!uT!5hY(g#rN#!Y4>~F?zf1iH z-Nz6<5yA{V>InN|Zl17_nexs<>(}z`7lij%;quPAaFtdAwNUBJ-eT95x5H8v6!Zw2 z*ztnD3YXb|!k6G0%q#3AuS2?4__1ny(<=)*bi5j*wqy| z!frOXVgtN=dQs9G^LyYnsF9HUap7$<Kuqrbh{$=`aG)oH$(;ux{yCHq4a3t7g%Dfvu~3(wN^AbYn|KF582bDD}t2Vt=V7SWc4i+pJV(T<4ugWAwqh$%kSCKtsYS01lG1XSx1}y1?yj( z89sBrhpPTewy!)>=oou{_0J+<1BS|mB8C5CE7t#@oi6LI*p9aLH#nNa#xa{+9lajA zs&=a?9;D~2$7&yb7lT^>KPn#mP%?{KpTc^|t-|-l z&Xr#ivOfiCjijv#8M}M^J-vR}-|csGs4wAs0q4W9>8@NS{F+^@OowCe)`kV_vr1cu zHgyivgyN^KUvBSGJbl_(2t@%73GUk`fwkExg%8-U%?gcvYI{Mr$hxZ5=;*P`WLK-K z!tdBrRgv~C@s&EZ%)V0il3yZ6*Nx2LP_6QHZlTxM4 ze2#V27Ocku9GWZ3uC6Y)5%>w=lVvp>sESXNx){TZVZq42$i&FP5ZTAIDdk2SS}~Sk z_@cU?XdccPDZY?DA=a_s<|H;)Z%SNKHMypJ zd`){$%o)iUExrV@oxNCp9VOe z#@aV65YkplL2>Cw%4p`Lv^|EzAy!V6 z?F@>`MruYKmtc2yPUV*c#nfqAHnnC4clUNoRdxi$!qJ=?#jn84>|pP=tW8^96%-c@ z?H%@=?VJ#+rq=EXin$|ON8Oj8`!1$;{6zRA3p#GXAD(}6{vUqZd2e%P>dSc2E@R+l h@K^e>&Tgf*!?R9pVNF{$&##UaiU$Kln(NvgT$QQsx=UqVBa82EQ+T82w<&!m>8KZ?m^bcH3M z=?Ygvi|8pqwo#sKBv!+eNL_n4Z;yg;qbx~+M_0wc`^K0Jrr^6f<>~tLrkHg#B1By3 zG;uR@agjW3Cd>(wr6|E=$kCi7=ns=~VuI{WpQcuvu9lg{#l!WYxW(#>5gJmWu6ZUk ztFekj=gkt`JR2@c&j{{7juX5;T=vCtPH`7b)BPM>tppKAk8gdHR9#%6h%5e95WXsN zb#azp9DIi3N#ZPnU6Q3_!M&24GdsxcifL-4>1w5joN>&bBls$EDrX5EBG2WV0ud%z zvI@>amIb#X&*Ln^s7cP5&slP}P1ARluJ5#99Gu7e1tR|*@2CH72JTljB^U?ijrq9CstP|YjpE25bd`ywoveA$SVaWMaxnVX9?`cs|5EV7YiOo zUM=FUBCiqr5ZNv`B1V=<1m_`_3T{VUD|i&SOz?T+a>4hI*9m?cBl{|X>^?Wmp4RK; zww~hDN~J;PRdKIcY1DZ&+^bcZbY30z>Xl}l*TB6-pVFc;o4DDmwCcPT?zJi#blwK; zwJB{nubq2}(ysG1a&MEO=)4Z@bt)UV=fhdy7o>xmo0UzvKqvRMC>=Vli+iflsqsA~(uZMfjDVud(FZbMvQ|E2|-9N^ZVJv$9 z-?ys=QFo|^PJ+B@^&D^6N$H!jv1gcLxiMmf6M;*oB zQyBchA;V6lyx3&0orW86*{~%(6a4WH;bB63{*3Z!`#MKyT~o88x~|k-9k6`MaJ1T+ z9c68$x)zv9e8)d!sbv1BeKuMF}$W3G(*pb_qK$QdLA(z%a>~(s32L~Lzs@4F1%1vbx z@J((3)?Sgff+fMWyn9%-bV(&!@1Y`Zlh9u>+BK4QNZuv6j$$)vyl{lugB4Y$*Qvcn zZ8uOnMieW4v}5q$(kzw%q4`r-`uq928M^?f%lc>0C~XnEgvL9270xc}#i2;chgcr$ zT>ejX0(w^b5a(bnD9fLu(q~Zu#=c&Umrv3b8ce@KZB)Y(io$!Pz<9V=5D$|D>8u=X z6qIB4(S-?N)(hBHu7#kE!~~bkN`o)7YHy;a`JiO=((ng_e}vtuOP0_;wU0>5BvT|| zC;_Qgbqsr4n)U%%5hQ#fcj4332jT)05?xi+?r3PS*EX+jZr85E;Wc^eV|Z&#sgLhA zANT|%e*FLJrx#g!l^T9a@*&ChNPd74Fm*Y-uAV_{m-a7ujnZvzAPfgJs0Fu!kHgsO zb@hAVFc4RVKCs7b4xY-}Fm6w0)&4i_cS3N94y>IBVZVmC>#nJM;`gaTzW8qu{fzpG zY<2bxyUKVUbo>HFT0mR)lidhJbq{L&j^OfYe1<=#bc*(bqwqn{>9ALnv(x@V6&KmU zTj<+D_!6n0jyQ= z!Sf!9>l0vIPmTmsRh6)-aJLsG;qnefM7Sz^Q zF>J6VF&Jisqcw}zFW_>`yr;slYE!NJE=ZcI2k)21L&u9wKR&cr9QlY9Uan3S%{Spl zt;`E_Vjt0Une+H*n1ylL43sBhrt~;U&!%+n)IGy)!@;^NOuk%q5|hj7SK+_T8 zP=+@Vk43=qAapNchcuKy;hrYZ3$PL>P&Q#7siF z$oE2{RSm>A99?}*kEhGk*XMB9n05veJ&Uo)uqL?pDO8ChgIYRG2E!No4G+?C_SK%O zm}nZWxo^yY%}N5SXo-g{EpI?;tL@arcnE0?{(RIr41eAb?|)@O8iPNy-S$6j&tv}Q zHd+`=ZCVvmbk~?X(RQxuOvim=5u|mj0$;~Xb`Q!szrb6(+VKtjaw&H9C!eBW(0=n# geQ7G{A5@3?T*caQxZ!M#?FnZ~Px}6ApeGOeAL}4?ivR!s diff --git a/models/__pycache__/model_view_store_product_permutation.cpython-312.pyc b/models/__pycache__/model_view_store_product_permutation.cpython-312.pyc index dea5d6ed1c6a1ca91e6c5a93279c34789f4c3e73..ebeed7d23e1a78b71fa0b3a67f174f3ff97bfcea 100644 GIT binary patch delta 373 zcmX@E*QLXEnwOW00SJ;-^QSimY~)+URR0dhZD*LykjfCnn8Fan6v~jo7{#2*lFFLG zWCN4~^4P#UW+;z6l>;cp0_Aand8|+#S1LD9jt#_1GS<~HxHu5cFs{aJ!wlhp;NM(p(Oks#(3S~%PjABk|QiW6aS{POXSs)N4k}8^|Gr53SQjx!fGfF&FB1Hg6 zRtj=9?$yVc>mCl zcz?I};1GXjZ)}>2V4(13Z;@(7M%&59MGZw<7#X7& PFKAnTWdO5^Z&DUuqJE?`HM*es+bsa23JsV#_hJY^pp!X%c{rM=w=e^?rxQuiBF~3>wL??l(QP*iQr6+B_Uh&` z^lT{PP{`1YW+aPzn5dg%jD|EySzma~PZlQLCaE7%HV|#+->GTF7>%Yg);-XTZV#lb zvE%SzhKLous(-AW5aWa&={7z+A9R$maS@uN3^9hqq~GG_&9m6y_snzd7>qq+*Wi;k z2?=8_3n(FZn~?jN8$@mh#Kh}ZMeNZCaib_s-PDhx1XM?;u2AK`Pf{i>##$mw5f)dh zemk%4v3QTNbjD8db!+wdL>y>M12;)Rn%<2)wj~;c5ZO&>5D;Qxb`{zLLtI*1U4xN{ z7zyzn;`bBujeoM<8e;&d>_J{5#EYkd%pdo!;N@e&NG+cKr@pax3tr$*VS|*j=Ra-;Rshj5?ARea}ugJq^^pSxQIIin~6tqOu|!gR=lJe zl*?8=OSx_3CjqE=Y!$SWmnjkgzuWf1mh#yuLYfTn+cIiF0b9i^6|_~{QXyOMmI^aP zdZfq}_XIMwDhZOje5{@S9aqsdw~D0bR(B;u`lQ$|A_PePHn)i?10^mKH+LL^O_4%R zd}&zuX*`pk6>^JsDl6p96&9B#(o;22*Ds3nl5WtI^r`fSEa9qXkTs1qM)py~#lm!X zO6Ux2P)({=jr~l%S;B>~fD1FYBowADbb@uP)eWqzV%^ZHSN6YQp`4u;^1?En%g=Y9 zuhvD?kc|dbWVI98Y_r*=|FYudA6BCZo{?(?p*k)Ss?-h9kTtafKl6{R?RT{T8$kEj zxZa9f$SvbyZgH+GWQBZTzO?(o@d%-@UE+H0MhP<)xQ~+N$ABDh2nI%=K?XVA%AIUIDRvf$`W2yC9HRWE?Le#Cs> z=rQH9~r!E%a zEbwfTvnIoAvM;25v&bhCRtG5SMav6Q2Te8_^pL6ZhowAoI!LJTpg|jceZ_oFr<_P)?EEHgzq=FFI^s&_j80B8Q*jAx7P3Kx0Scf6Ccb^ z{L=_Kp9N%kX&Lg}hdnvecYwK8DGk{V@1z2EqDD^BHPe%v;Aat9LVH7FUpXtYcK!sv C^*+l0 diff --git a/models/__pycache__/model_view_store_supplier.cpython-312.pyc b/models/__pycache__/model_view_store_supplier.cpython-312.pyc index dc768bbc7909a9845e6d47b5754e88efdfda2bd2..c73b5cd9f25248f7c1a22e8d2aca63a7c7151da9 100644 GIT binary patch literal 3838 zcma)9-)|Gi9iLsV?X~0B`9&NONHz&2_^$B*SJV`^yILe9P!d8MxZ(?pjCYc(wf35s zO(2m|<>9L4R89>K6`ZP5d9COlK%ZJ&Ut0B{_L;-h3RI-(9{LvGQ19-k-&uR@1cKC& zyz~8j=R5PAAD{1M#{Xz;_9H0cziwUl0;GR)#VPKZ@FESu9i*ZJQUz7ig^ZXG1unaE zS4K)mwk+xHj3?pAcoSY*ck6P-m+;xLNB3u%5&>KG>dl#8A}AmcjU!e57^yxY-gi}F zB|qyBxN2~piIYRX5-3-4Earkd7fYk`{9Zfnh4BOPk+V|2eZ$;2MgnU2Lv8l^D zO}5vR)#iW+Csmaa#t5_gsU=EDHl=~wQj=G(VS|xb0f1lz&sSk#wQSe0p{tgck_A95 zvwY6b%xYcAY9_-Ol4OAT49S{S=W8ZxY8jFO?CdBURWBs?+(9csM4Va;+E7*;;QoQb zUSdR_XS}QOJw0`N?ji#i&k>%|bLX>UlxoXlZq!IE@z87z7-0dxp3$-kbC)!>l+=~D zxuj}_a`f=gqjNS%U?7RPWG**n=N+q7m}eYjJh8B|x@d02a+{i|lhwXAo>SCzH~`(@@_F5Kzj=8m@TYXRmirMCi8y@T9QjGV42%cl{2j;^*T1nnge+_*Kg%{yh5B zhfrS33x9Oouh|8Z7xD<#W0>GkEoqyp9j#jDQJT--mEuHOlgwtP$-(uSJMT`19BZS_ zOHQvjmN#yc+N`Gf7RznP@Z$S4Zn&k}YC>``{`^n3P9~v|H{R)gZ&&kRgOxvNHm0 zg=WeTX6>1$Mx8_InM8S-TdfPk#F=DvrD5k7*k*SqiE`vwLDRr#W@KvwMfpL}AaC(C zD9u}QvYIrtKCTt2hpKWG<*7l&$aqp3G?|89y{BKfu;&O4~ za;Y~_kb55QKUUiR>3_G}KUVA?E1bSu>Q5Bq-VNzi@UCY|a`^&VGV19ocONcx zA1-wtg@#b&XXpRDu@E;Ag?- zNbpUI8xxhKwf`ctEKG>ct5xCZeEDjwcs2LvwDZ2*)&-bXba)tU zak#lcQI=e8TpTRo;>nSPR~N=r><3?QkSte9XO=f*Wb8{bsB6ru=?~HJQ55Q3bH&RRcoxttD#xL&TLh~>{DKu0HMarR(Vrb++_%G2?=t4oh zKsgge_R)8tviums?YN}F{H*}S*Wn_qt%mOh<_`7IYSsTIOFnavtzl0Rwz`jnpt z&k~$vJ8Oy_hSshuip(SbHa8@d-Q~8y~~* z+4D2-y*NF6?#$Rs+|DSg$xb?Wk zq5_tz_T7wPa@q2jD>=BZY!KRuqg^mib*-Fezn4!|0sKBa3o3tCv0?ZCp$Nh=(Jx3Z kyOD7037Ys9I`ae_d4djnje5S34hb_tK{@;qalsz$fAfIkx&QzG delta 883 zcmY*X&r1|h9RI%Anc10fe`x+(A=oIfDcFL9E@BzvkAo6yChX-g?mTs3c4vDtYYD=7 zFw($-Eae|zhk~v`_by6AFeG^C)S(rXq(k(5Gal?6KJWYee!lPf^ZmWN+m`v9P8)#d z^-p7AM&8Qwk?F0$8)lM#O>D*0DtbvLAi+4;>KfQdChsJKKS0S?)=Yit?XO05%CnhE zpE&F}ePH>_Bw_mnQ!((kuytB|p$RHeFkX&>$9SFz zjvu4`3buhkiP%t*W`HG_Y?EQMvwMmyt-;Ru!;-24OFnHsS1(-iWF6*-omj(`*5L&y z8AUMVFxT8o=G0K0$1<8@@)ar6nx6czvmc-O3c@NJW^>0PQ1iXf)3}bp8?p_7utaAg zu>zauxgxEQcVtJ3tpt|Al%`E7>{zt?MOw2K7%kU1#|dy9eUMT7dX4c=qtvN70i~wQ z)5t_Lzl2h#Q(AT{->1}_G1VQylyI6)tcjz4T}raDMh^Fyk;(T$8x5bnqIX~JEAsLsEOaP|@ojovSE@1c@D zl8DlOoB%b`5>iW56|I$lTO;2Jv-^eF-$0Z}aui|ILlkKmJ4sS%du1%F2ist-Ux+Tc z)DXXK4u4-z&wC~6Rn+0lD+)xQxHNF=^vv0-FE;0 diff --git a/models/model_view_base.py b/models/model_view_base.py index 80c1d5ec..02ddd5cb 100644 --- a/models/model_view_base.py +++ b/models/model_view_base.py @@ -49,31 +49,42 @@ class Model_View_Base(BaseModel, ABC): FLAG_ACCESS_LEVEL_REQUIRED: ClassVar[str] = Product_Category.FLAG_ACCESS_LEVEL_REQUIRED FLAG_ACTIVE: ClassVar[str] = Base.FLAG_ACTIVE FLAG_ADD: ClassVar[str] = 'add' + # FLAG_ADD_DELETE: ClassVar[str] = 'add-delete' + FLAG_ADDRESS: ClassVar[str] = Base.FLAG_ADDRESS + FLAG_ADDRESS_LINE_1: ClassVar[str] = Base.FLAG_ADDRESS_LINE_1 + FLAG_ADDRESS_LINE_2: ClassVar[str] = Base.FLAG_ADDRESS_LINE_2 FLAG_BOOL_FALSE: ClassVar[str] = 'false' FLAG_BOOL_TRUE: ClassVar[str] = 'true' FLAG_CANCEL: ClassVar[str] = 'button-cancel' - # FLAG_CONTACT_US: ClassVar[str] = 'button-contact' - FLAG_CLOSE_TEMPORARY_ELEMENT: ClassVar[str] = 'button-temporary-element-close' FLAG_CALLBACK: ClassVar[str] = 'callback' FLAG_CARD: ClassVar[str] = 'card' + FLAG_CITY: ClassVar[str] = Base.FLAG_CITY + FLAG_CLOSE_TEMPORARY_ELEMENT: ClassVar[str] = 'button-temporary-element-close' FLAG_CODE: ClassVar[str] = Base.FLAG_CODE FLAG_COLLAPSED: ClassVar[str] = 'collapsed' FLAG_COLLAPSIBLE: ClassVar[str] = 'collapsible' FLAG_COLUMN: ClassVar[str] = 'column' FLAG_COMMENT: ClassVar[str] = 'comment' + # FLAG_CONTACT_US: ClassVar[str] = 'button-contact' FLAG_CONTAINER: ClassVar[str] = 'container' FLAG_CONTAINER_INPUT: ClassVar[str] = FLAG_CONTAINER + '-input' + FLAG_COUNTY: ClassVar[str] = Base.FLAG_COUNTY FLAG_CURRENCY: ClassVar[str] = 'currency' FLAG_DATA: ClassVar[str] = 'data' + FLAG_DATE_FROM: ClassVar[str] = Base.FLAG_DATE_FROM + FLAG_DATE_TO: ClassVar[str] = Base.FLAG_DATE_TO FLAG_DELETE: ClassVar[str] = 'delete' FLAG_DESCRIPTION: ClassVar[str] = Base.FLAG_DESCRIPTION FLAG_DETAIL: ClassVar[str] = 'detail' FLAG_DIALOG: ClassVar[str] = 'dialog' # try element FLAG_DIRTY: ClassVar[str] = 'dirty' FLAG_DISPLAY_ORDER: ClassVar[str] = Base.FLAG_DISPLAY_ORDER + FLAG_EDIT: ClassVar[str] = 'edit' + FLAG_EMAIL: ClassVar[str] = Base.FLAG_EMAIL FLAG_ERROR: ClassVar[str] = 'error' FLAG_EXPANDED: ClassVar[str] = 'expanded' FLAG_FAILURE: ClassVar[str] = 'failure' + FLAG_FAX: ClassVar[str] = Base.FLAG_FAX FLAG_FILTER: ClassVar[str] = 'filter' FLAG_FORM: ClassVar[str] = 'form' FLAG_FORM_FILTERS: ClassVar[str] = 'form-filters' @@ -93,18 +104,23 @@ class Model_View_Base(BaseModel, ABC): FLAG_NAV_HOME: ClassVar[str] = 'navHome' FLAG_NAV_SERVICES: ClassVar[str] = 'navServices' FLAG_NAV_STORE_HOME: ClassVar[str] = 'navStoreHome' + FLAG_NAV_STORE_MANUFACTURING_PURCHASE_ORDERS: ClassVar[str] = 'navStoreManufacturingPurchaseOrders' FLAG_NAV_STORE_PRODUCTS: ClassVar[str] = 'navStoreProducts' FLAG_NAV_STORE_PRODUCT_CATEGORIES: ClassVar[str] = 'navStoreProductCategories' FLAG_NAV_STORE_PRODUCT_PERMUTATIONS: ClassVar[str] = 'navStoreProductPermutations' FLAG_NAV_STORE_PRODUCT_PRICES: ClassVar[str] = 'navStoreProductPrices' FLAG_NAV_STORE_PRODUCT_VARIATIONS: ClassVar[str] = 'navStoreProductVariations' FLAG_NAV_STORE_STOCK_ITEMS: ClassVar[str] = 'navStoreStockItems' + FLAG_NAV_STORE_SUPPLIERS: ClassVar[str] = 'navStoreSuppliers' + FLAG_NAV_STORE_SUPPLIER_PURCHASE_ORDERS: ClassVar[str] = 'navStoreSupplierPurchaseOrders' FLAG_NAV_USER_ACCOUNT: ClassVar[str] = 'navUserAccount' FLAG_NAV_USER_ADMIN: ClassVar[str] = 'navUserAdmin' FLAG_NAV_USER_LOGIN: ClassVar[str] = 'navUserLogin' FLAG_NAV_USER_LOGOUT: ClassVar[str] = 'navUserLogout' FLAG_OVERLAY: ClassVar[str] = 'overlay' FLAG_PAGE_BODY: ClassVar[str] = 'page-body' + FLAG_PHONE_NUMBER: ClassVar[str] = Base.FLAG_PHONE_NUMBER + FLAG_POSTCODE: ClassVar[str] = Base.FLAG_POSTCODE FLAG_ROW: ClassVar[str] = 'row' FLAG_ROW_NEW: ClassVar[str] = 'row-new' FLAG_ROWS: ClassVar[str] = Base.FLAG_ROWS @@ -117,6 +133,7 @@ class Model_View_Base(BaseModel, ABC): FLAG_SUCCESS: ClassVar[str] = 'success' FLAG_TEMPORARY_ELEMENT: ClassVar[str] = 'temporary-element' FLAG_USER: ClassVar[str] = User.FLAG_USER + FLAG_WEBSITE: ClassVar[str] = Base.FLAG_WEBSITE # flagIsDatePicker: ClassVar[str] = 'is-date-picker' HASH_APPLY_FILTERS_STORE_PRODUCT_PERMUTATION: ClassVar[str] = '/store/permutation_filter' HASH_CALLBACK_LOGIN: ClassVar[str] = '/callback-login' @@ -132,7 +149,9 @@ class Model_View_Base(BaseModel, ABC): HASH_PAGE_SERVICES: ClassVar[str] = '/services' # HASH_PAGE_STORE_ADMIN: ClassVar[str] = '/store/admin' HASH_PAGE_STORE_BASKET: ClassVar[str] = '/store/basket' + HASH_PAGE_STORE_CUSTOMER_SALES_ORDERS: ClassVar[str] = '/store/customer_sales_orders' HASH_PAGE_STORE_HOME: ClassVar[str] = '/store' + HASH_PAGE_STORE_MANUFACTURING_PURCHASE_ORDERS: ClassVar[str] = '/store/manufacturing_purchase_orders' HASH_PAGE_STORE_PRODUCT_CATEGORIES: ClassVar[str] = '/store/categories' HASH_PAGE_STORE_PRODUCTS: ClassVar[str] = '/store/products' HASH_PAGE_STORE_PRODUCT_PERMUTATIONS: ClassVar[str] = '/store/permutations' @@ -140,6 +159,7 @@ class Model_View_Base(BaseModel, ABC): HASH_PAGE_STORE_PRODUCT_VARIATIONS: ClassVar[str] = '/store/variations' HASH_PAGE_STORE_STOCK_ITEMS: ClassVar[str] = '/store/stock_items' HASH_PAGE_STORE_SUPPLIERS: ClassVar[str] = '/store/suppliers' + HASH_PAGE_STORE_SUPPLIER_PURCHASE_ORDERS: ClassVar[str] = '/store/supplier_purchase_orders' HASH_PAGE_USER_ACCOUNT: ClassVar[str] = '/user' HASH_PAGE_USER_ADMIN: ClassVar[str] = '/user/admin' HASH_PAGE_USER_LOGIN: ClassVar[str] = '/login' diff --git a/models/model_view_store.py b/models/model_view_store.py index 421fc860..604a8532 100644 --- a/models/model_view_store.py +++ b/models/model_view_store.py @@ -42,8 +42,12 @@ from abc import abstractmethod class Model_View_Store(Model_View_Base): # Global constants ATTR_FORM_TYPE: ClassVar[str] = 'form-type' + ATTR_ID_CUSTOMER: ClassVar[str] = 'id-customer' + ATTR_ID_CUSTOMER_ADDRESS: ClassVar[str] = Store_Base.ATTR_ID_CUSTOMER_ADDRESS + ATTR_ID_CUSTOMER_SALES_ORDER: ClassVar[str] = 'id-customer-sales-order' ATTR_ID_DELIVERY_OPTION: ClassVar[str] = Store_Base.ATTR_ID_DELIVERY_OPTION ATTR_ID_DISCOUNT: ClassVar[str] = Store_Base.ATTR_ID_DISCOUNT + ATTR_ID_MANUFACTURING_PURCHASE_ORDER: ClassVar[str] = Store_Base.ATTR_ID_MANUFACTURING_PURCHASE_ORDER ATTR_ID_PLANT: ClassVar[str] = 'id-plant' ATTR_ID_PRODUCT : ClassVar[str] = Product.ATTR_ID_PRODUCT # 'id-product' ATTR_ID_PRODUCT_CATEGORY: ClassVar[str] = Product.ATTR_ID_PRODUCT_CATEGORY @@ -53,15 +57,27 @@ class Model_View_Store(Model_View_Base): ATTR_ID_PRODUCT_VARIATION_TYPE : ClassVar[str] = Product_Variation.ATTR_ID_PRODUCT_VARIATION_TYPE # 'id-variation-type' ATTR_ID_STOCK_ITEM: ClassVar[str] = Store_Base.ATTR_ID_STOCK_ITEM ATTR_ID_STORAGE_LOCATION: ClassVar[str] = Store_Base.ATTR_ID_STORAGE_LOCATION + ATTR_ID_SUPPLIER: ClassVar[str] = Store_Base.ATTR_ID_SUPPLIER + ATTR_ID_SUPPLIER_ADDRESS: ClassVar[str] = Store_Base.ATTR_ID_SUPPLIER_ADDRESS + ATTR_ID_SUPPLIER_PURCHASE_ORDER: ClassVar[str] = Store_Base.ATTR_ID_SUPPLIER_PURCHASE_ORDER FLAG_BUTTON_BASKET_ADD : ClassVar[str] = Model_View_Base.FLAG_SUBMIT + '.buttonAddToBasket' FLAG_BUTTON_BUY_NOW : ClassVar[str] = 'buttonBuyNow' + """ FLAG_COST_LOCAL: ClassVar[str] = Store_Base.FLAG_COST_LOCAL FLAG_COST_LOCAL_VAT_EXCL: ClassVar[str] = Store_Base.FLAG_COST_LOCAL_VAT_EXCL FLAG_COST_LOCAL_VAT_INCL: ClassVar[str] = Store_Base.FLAG_COST_LOCAL_VAT_INCL + """ + FLAG_COST_TOTAL_LOCAL_VAT_EXCL: ClassVar[str] = Store_Base.FLAG_COST_TOTAL_LOCAL_VAT_EXCL + FLAG_COST_TOTAL_LOCAL_VAT_INCL: ClassVar[str] = Store_Base.FLAG_COST_TOTAL_LOCAL_VAT_INCL + FLAG_COST_UNIT_LOCAL_VAT_EXCL: ClassVar[str] = Store_Base.FLAG_COST_UNIT_LOCAL_VAT_EXCL + FLAG_COST_UNIT_LOCAL_VAT_INCL: ClassVar[str] = Store_Base.FLAG_COST_UNIT_LOCAL_VAT_INCL FLAG_COUNT_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED: ClassVar[str] = Product_Permutation.FLAG_COUNT_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED FLAG_COUNT_UNIT_MEASUREMENT_INTERVAL_RECURRENCE: ClassVar[str] = Product_Permutation.FLAG_COUNT_UNIT_MEASUREMENT_INTERVAL_RECURRENCE FLAG_COUNT_UNIT_MEASUREMENT_PER_QUANTITY_STEP: ClassVar[str] = Product_Permutation.FLAG_COUNT_UNIT_MEASUREMENT_PER_QUANTITY_STEP FLAG_CURRENCY_COST: ClassVar[str] = Product_Permutation.FLAG_CURRENCY_COST + FLAG_CUSTOMER: ClassVar[str] = Store_Base.FLAG_CUSTOMER + FLAG_CUSTOMER_ADDRESS: ClassVar[str] = Store_Base.FLAG_CUSTOMER_ADDRESS + FLAG_CUSTOMER_SALES_ORDER: ClassVar[str] = Store_Base.FLAG_CUSTOMER_SALES_ORDER FLAG_DATE_CONSUMED: ClassVar[str] = Stock_Item.FLAG_DATE_CONSUMED FLAG_DATE_EXPIRATION: ClassVar[str] = Stock_Item.FLAG_DATE_EXPIRATION FLAG_DATE_PURCHASED: ClassVar[str] = Stock_Item.FLAG_DATE_PURCHASED @@ -77,6 +93,7 @@ class Model_View_Store(Model_View_Base): FLAG_IS_SEALED: ClassVar[str] = Stock_Item.FLAG_IS_SEALED FLAG_IS_SUBSCRIPTION: ClassVar[str] = Product_Permutation.FLAG_IS_SUBSCRIPTION FLAG_LATENCY_MANUFACTURE_DAYS: ClassVar[str] = Product_Permutation.FLAG_LATENCY_MANUFACTURE_DAYS + FLAG_MANUFACTURING_PURCHASE_ORDER: ClassVar[str] = Store_Base.FLAG_MANUFACTURING_PURCHASE_ORDER FLAG_NAME_PLURAL_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED: ClassVar[str] = Product_Permutation.FLAG_NAME_PLURAL_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED FLAG_NAME_PLURAL_UNIT_MEASUREMENT_INTERVAL_RECURRENCE: ClassVar[str] = Product_Permutation.FLAG_NAME_PLURAL_UNIT_MEASUREMENT_INTERVAL_RECURRENCE FLAG_NAME_PLURAL_UNIT_MEASUREMENT_QUANTITY: ClassVar[str] = Product_Permutation.FLAG_NAME_PLURAL_UNIT_MEASUREMENT_QUANTITY @@ -84,6 +101,10 @@ class Model_View_Store(Model_View_Base): FLAG_NAME_SINGULAR_UNIT_MEASUREMENT_INTERVAL_RECURRENCE: ClassVar[str] = Product_Permutation.FLAG_NAME_SINGULAR_UNIT_MEASUREMENT_INTERVAL_RECURRENCE FLAG_NAME_SINGULAR_UNIT_MEASUREMENT_QUANTITY: ClassVar[str] = Product_Permutation.FLAG_NAME_SINGULAR_UNIT_MEASUREMENT_QUANTITY FLAG_PLANT: ClassVar[str] = Store_Base.FLAG_PLANT + FLAG_PRICE_TOTAL_LOCAL_VAT_EXCL: ClassVar[str] = Store_Base.FLAG_PRICE_TOTAL_LOCAL_VAT_EXCL + FLAG_PRICE_TOTAL_LOCAL_VAT_INCL: ClassVar[str] = Store_Base.FLAG_PRICE_TOTAL_LOCAL_VAT_INCL + FLAG_PRICE_UNIT_LOCAL_VAT_EXCL: ClassVar[str] = Store_Base.FLAG_PRICE_UNIT_LOCAL_VAT_EXCL + FLAG_PRICE_UNIT_LOCAL_VAT_INCL: ClassVar[str] = Store_Base.FLAG_PRICE_UNIT_LOCAL_VAT_INCL FLAG_PRODUCT: ClassVar[str] = Store_Base.FLAG_PRODUCT FLAG_PRODUCT_CATEGORY: ClassVar[str] = Store_Base.FLAG_PRODUCT_CATEGORY FLAG_PRODUCT_PERMUTATION: ClassVar[str] = Store_Base.FLAG_PRODUCT_PERMUTATION @@ -99,6 +120,9 @@ class Model_View_Store(Model_View_Base): FLAG_REGION: ClassVar[str] = Store_Base.FLAG_REGION FLAG_STOCK_ITEM: ClassVar[str] = Store_Base.FLAG_STOCK_ITEM FLAG_STORAGE_LOCATION: ClassVar[str] = Store_Base.FLAG_STORAGE_LOCATION + FLAG_SUPPLIER: ClassVar[str] = Store_Base.FLAG_SUPPLIER + FLAG_SUPPLIER_ADDRESS: ClassVar[str] = Store_Base.FLAG_SUPPLIER_ADDRESS + FLAG_SUPPLIER_PURCHASE_ORDER: ClassVar[str] = Store_Base.FLAG_SUPPLIER_PURCHASE_ORDER FLAG_SYMBOL_CURRENCY_COST: ClassVar[str] = Product_Permutation.FLAG_SYMBOL_CURRENCY_COST FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED: ClassVar[str] = Product_Permutation.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX_UNIT_MEASUREMENT_INTERVAL_RECURRENCE: ClassVar[str] = Product_Permutation.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX_UNIT_MEASUREMENT_INTERVAL_RECURRENCE @@ -109,15 +133,23 @@ class Model_View_Store(Model_View_Base): FLAG_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED: ClassVar[str] = Product_Permutation.FLAG_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED FLAG_UNIT_MEASUREMENT_INTERVAL_RECURRENCE: ClassVar[str] = Product_Permutation.FLAG_UNIT_MEASUREMENT_INTERVAL_RECURRENCE FLAG_UNIT_MEASUREMENT_QUANTITY: ClassVar[str] = Product_Permutation.FLAG_UNIT_MEASUREMENT_QUANTITY + HASH_GET_STORE_CUSTOMER_SALES_ORDER: ClassVar[str] = '/store/customer_sales_order_get' + HASH_GET_STORE_MANUFACTURING_PURCHASE_ORDER: ClassVar[str] = '/store/manufacturing_purchase_order_get' HASH_GET_STORE_PRODUCT: ClassVar[str] = '/store/product_get' HASH_GET_STORE_PRODUCT_CATEGORY: ClassVar[str] = '/store/category_get' HASH_GET_STORE_PRODUCT_PERMUTATION: ClassVar[str] = '/store/permutation_get' HASH_GET_STORE_STOCK_ITEM: ClassVar[str] = '/store/stock_item_get' + HASH_GET_STORE_SUPPLIER: ClassVar[str] = '/store/supplier_get' + HASH_GET_STORE_SUPPLIER_PURCHASE_ORDER: ClassVar[str] = '/store/supplier_purchase_order_get' HASH_PAGE_STORE_BASKET : ClassVar[str] = '/store/basket' + HASH_SAVE_STORE_CUSTOMER_SALES_ORDER: ClassVar[str] = '/store/save_customer_sales_order' + HASH_SAVE_STORE_MANUFACTURING_PURCHASE_ORDER: ClassVar[str] = '/store/save_manufacturing_purchase_order' 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' + HASH_SAVE_STORE_SUPPLIER: ClassVar[str] = '/store/save_supplier' + HASH_SAVE_STORE_SUPPLIER_PURCHASE_ORDER: ClassVar[str] = '/store/save_supplier_purchase_order' HASH_STORE_BASKET_ADD : ClassVar[str] = '/store/basket_add' HASH_STORE_BASKET_DELETE : ClassVar[str] = '/store/basket_delete' HASH_STORE_BASKET_EDIT : ClassVar[str] = '/store/basket_edit' diff --git a/models/model_view_store_manufacturing_purchase_order.py b/models/model_view_store_manufacturing_purchase_order.py new file mode 100644 index 00000000..fd0fafbe --- /dev/null +++ b/models/model_view_store_manufacturing_purchase_order.py @@ -0,0 +1,49 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: View Models +Feature: Manufacturing Purchase Order View Model + +Description: +Data model for manufacturing purchase order view page +""" + +# internal +from models.model_view_store import Model_View_Store +from datastores.datastore_store_manufacturing_purchase_order import DataStore_Store_Manufacturing_Purchase_Order +from business_objects.store.manufacturing_purchase_order import Manufacturing_Purchase_Order, Parameters_Manufacturing_Purchase_Order +from forms.store.manufacturing_purchase_order import Filters_Manufacturing_Purchase_Order +import lib.argument_validation as av + +class Model_View_Store_Manufacturing_Purchase_Order(Model_View_Store): + currencies: list = None + currency_options: list = None + form_filters: Filters_Manufacturing_Purchase_Order = None + form_filters_old: Filters_Manufacturing_Purchase_Order + manufacturing_purchase_orders: list = None + units_measurement: list = None + units_measurement_time: list = None + + @property + def title(self): + return 'Store Manufacturing Purchase Order' + + def __init__(self, form_filters_old, hash_page_current=Model_View_Store.HASH_PAGE_STORE_MANUFACTURING_PURCHASE_ORDERS): + _m = 'Model_View_Store_Manufacturing.__init__' + print(f'{_m}\nstarting...') + super().__init__(hash_page_current = hash_page_current, form_filters_old = form_filters_old) + self.form_filters = form_filters_old # Filters_Manufacturing_Purchase_Order.from_json(form_filters_old.to_json()) + parameters_manufacturing_purchase_order = Parameters_Manufacturing_Purchase_Order.from_filters_manufacturing_purchase_order(form_filters_old) + datastore_manufacturing_purchase_order = DataStore_Store_Manufacturing_Purchase_Order() + self.manufacturing_purchase_orders, errors = datastore_manufacturing_purchase_order.get_many_manufacturing_purchase_order(parameters_manufacturing_purchase_order) + self.units_measurement = self.get_many_unit_measurement() + self.units_measurement_time = [unit_measurement for unit_measurement in self.units_measurement if unit_measurement.is_unit_of_time] + self.currencies = self.get_many_currency() + self.currency_options = [currency.to_json_option() for currency in self.currencies] + + @classmethod + def save_manufacturing_purchase_orders(cls, comment, list_orders): + _m = f'{cls.__name__}.save_manufacturing_purchase_orders' + return DataStore_Store_Manufacturing_Purchase_Order().save_manufacturing_purchase_orders(comment, list_orders) \ No newline at end of file diff --git a/models/model_view_store_product_permutation.py b/models/model_view_store_product_permutation.py index 62cae7b9..70bfea99 100644 --- a/models/model_view_store_product_permutation.py +++ b/models/model_view_store_product_permutation.py @@ -25,16 +25,6 @@ from pydantic import BaseModel from typing import ClassVar class Model_View_Store_Product_Permutation(Model_View_Store): - """ - ID_FILTER_CATEGORY: ClassVar[str] = 'id_category' - ID_FILTER_PRODUCT: ClassVar[str] = 'id_product' - ID_FILTER_IS_OUT_OF_STOCK: ClassVar[str] = 'is_out_of_stock' - ID_FILTER_QUANTITY_MIN: ClassVar[str] = 'quantity_min' - ID_FILTER_QUANTITY_MAX: ClassVar[str] = 'quantity_max' - """ - # ID_Filters_Product_Permutation: ClassVar[str] = 'Filters_Product_Permutation' - # KEY_PERMUTATIONS: ClassVar[str] = 'permutations' - category_list: Product_Category_Container = None category_list_filters: Product_Category_Container = None currencies: list = None diff --git a/models/model_view_store_stock_item.py b/models/model_view_store_stock_item.py index 95e193e7..0b6c726a 100644 --- a/models/model_view_store_stock_item.py +++ b/models/model_view_store_stock_item.py @@ -25,16 +25,6 @@ from pydantic import BaseModel from typing import ClassVar class Model_View_Store_Stock_Item(Model_View_Store): - """ - ID_FILTER_CATEGORY: ClassVar[str] = 'id_category' - ID_FILTER_PRODUCT: ClassVar[str] = 'id_product' - ID_FILTER_IS_OUT_OF_STOCK: ClassVar[str] = 'is_out_of_stock' - ID_FILTER_QUANTITY_MIN: ClassVar[str] = 'quantity_min' - ID_FILTER_QUANTITY_MAX: ClassVar[str] = 'quantity_max' - ID_Form_Filters_Permutation: ClassVar[str] = 'Form_Filters_Permutation' - """ - KEY_PERMUTATIONS: ClassVar[str] = 'permutations' - category_list: Product_Category_Container = None category_list_filters: Product_Category_Container = None currencies: list = None diff --git a/models/model_view_store_supplier.py b/models/model_view_store_supplier.py index c210fb1c..d9bf074a 100644 --- a/models/model_view_store_supplier.py +++ b/models/model_view_store_supplier.py @@ -11,28 +11,52 @@ Data model for supplier view page """ # internal -from models.model_view_base import Model_View_Base from models.model_view_store import Model_View_Store -# from routes import bp_home -from lib import argument_validation as av -from forms.forms import Form_Supplier - +from datastores.datastore_store_supplier import DataStore_Store_Supplier +from business_objects.store.supplier import Supplier, Parameters_Supplier +from forms.store.supplier import Filters_Supplier +import lib.argument_validation as av # external +from typing import ClassVar class Model_View_Store_Supplier(Model_View_Store): - # Attributes - form: Form_Supplier + FLAG_DEPARTMENT_CONTACT: ClassVar[str] = Supplier.FLAG_DEPARTMENT_CONTACT + FLAG_NAME_COMPANY: ClassVar[str] = Supplier.FLAG_NAME_COMPANY + FLAG_NAME_CONTACT: ClassVar[str] = Supplier.FLAG_NAME_CONTACT + supplier_addresses: list = None + currencies: list = None + currency_options: list = None + form_filters: Filters_Supplier = None + form_filters_old: Filters_Supplier + regions: list = None + suppliers: list = None + units_measurement: list = None + units_measurement_time: list = None @property def title(self): - return 'Supplier' + return 'Store Supplier' - """ - def __new__(cls, db, info_user, app, form): - # Initialiser - validation - _m = 'Model_View_Supplier.__new__' - av.val_instance(form, 'form', _m, FlaskForm) - return super(Model_View_Supplier, cls).__new__(cls, db, info_user, app) - """ - def __init__(self,form, hash_page_current=Model_View_Base.HASH_PAGE_STORE_SUPPLIERS): - super().__init__(hash_page_current=hash_page_current, form=form) + def __init__(self, form_filters_old, hash_page_current=Model_View_Store.HASH_PAGE_STORE_SUPPLIERS): + _m = 'Model_View_Store_Supplier.__init__' + print(f'{_m}\nstarting...') + super().__init__(hash_page_current = hash_page_current, form_filters_old = form_filters_old) + self.form_filters = form_filters_old # Filters_Supplier.from_json(form_filters_old.to_json()) + parameters_supplier = Parameters_Supplier.from_filters_supplier(self.form_filters) + datastore_supplier = DataStore_Store_Supplier() + self.suppliers, errors = datastore_supplier.get_many_supplier(parameters_supplier) + + """ + self.units_measurement = self.get_many_unit_measurement() + self.units_measurement_time = [unit_measurement for unit_measurement in self.units_measurement if unit_measurement.is_unit_of_time] + """ + self.currencies = self.get_many_currency() + self.currency_options = [currency.to_json_option() for currency in self.currencies] + self.supplier_addresses = {} + for supplier in self.suppliers: + self.supplier_addresses[supplier.id_supplier] = [address.to_json() for address in supplier.addresses] if supplier.addresses else [] + self.regions = self.get_many_region() + @classmethod + def save_suppliers(cls, comment, list_suppliers): + _m = f'{cls.__name__}.save_suppliers' + return DataStore_Store_Supplier().save_suppliers(comment, list_suppliers) \ No newline at end of file diff --git a/models/model_view_store_supplier_purchase_order.py b/models/model_view_store_supplier_purchase_order.py new file mode 100644 index 00000000..b06f0127 --- /dev/null +++ b/models/model_view_store_supplier_purchase_order.py @@ -0,0 +1,50 @@ +""" +Project: PARTS Website +Author: Edward Middleton-Smith + Precision And Research Technology Systems Limited + +Technology: View Models +Feature: Supplier Purchase Order View Model + +Description: +Data model for supplier purchase order view page +""" + +# internal +from models.model_view_store import Model_View_Store +from datastores.datastore_store_supplier_purchase_order import DataStore_Store_Supplier_Purchase_Order +from business_objects.store.supplier_purchase_order import Supplier_Purchase_Order, Parameters_Supplier_Purchase_Order +from forms.store.supplier_purchase_order import Filters_Supplier_Purchase_Order +import lib.argument_validation as av + +class Model_View_Store_Supplier_Purchase_Order(Model_View_Store): + currencies: list = None + currency_options: list = None + form_filters: Filters_Supplier_Purchase_Order = None + form_filters_old: Filters_Supplier_Purchase_Order + supplier_purchase_orders: list = None + units_measurement: list = None + units_measurement_time: list = None + + @property + def title(self): + return 'Store Supplier Purchase Order' + + def __init__(self, form_filters_old, hash_page_current=Model_View_Store.HASH_PAGE_STORE_SUPPLIER_PURCHASE_ORDERS): + _m = 'Model_View_Store_Supplier.__init__' + print(f'{_m}\nstarting...') + super().__init__(hash_page_current = hash_page_current, form_filters_old = form_filters_old) + self.form_filters = form_filters_old # Filters_Supplier_Purchase_Order.from_json(form_filters_old.to_json()) + parameters_supplier_purchase_order = Parameters_Supplier_Purchase_Order.from_filters_supplier_purchase_order(self.form_filters) + datastore_supplier_purchase_order = DataStore_Store_Supplier_Purchase_Order() + self.supplier_purchase_orders, errors = datastore_supplier_purchase_order.get_many_supplier_purchase_order(parameters_supplier_purchase_order) + + self.units_measurement = self.get_many_unit_measurement() + self.units_measurement_time = [unit_measurement for unit_measurement in self.units_measurement if unit_measurement.is_unit_of_time] + self.currencies = self.get_many_currency() + self.currency_options = [currency.to_json_option() for currency in self.currencies] + + @classmethod + def save_supplier_purchase_orders(cls, comment, list_orders): + _m = f'{cls.__name__}.save_supplier_purchase_orders' + return DataStore_Store_Supplier_Purchase_Order().save_supplier_purchase_orders(comment, list_orders) \ No newline at end of file diff --git a/static/MySQL/0000_combine.sql b/static/MySQL/0000_combine.sql index c6747853..910a2fec 100644 --- a/static/MySQL/0000_combine.sql +++ b/static/MySQL/0000_combine.sql @@ -16,29 +16,42 @@ DROP TABLE IF EXISTS tmp_Price; DROP TABLE IF EXISTS tmp_Shop_User; DROP TABLE IF EXISTS tmp_Shop_Order; DROP TABLE IF EXISTS tmp_Shop_Product; +DROP TABLE IF EXISTS tmp_Product; +DROP TABLE IF EXISTS tmp_Product_Permutation; +DROP TABLE IF EXISTS tmp_Permutation; DROP TABLE IF EXISTS tmp_Shop_Product_p_shop_calc_user; DROP TABLE IF EXISTS tmp_Shop_Product_p_Shop_Calc_User; DROP TABLE IF EXISTS tmp_Shop_Image; +DROP TABLE IF EXISTS tmp_Image; +DROP TABLE IF EXISTS tmp_Product_Image; DROP TABLE IF EXISTS tmp_Shop_Variation; +DROP TABLE IF EXISTS tmp_Variation; +DROP TABLE IF EXISTS tmp_Variation_Type; DROP TABLE IF EXISTS tmp_Shop_Discount; DROP TABLE IF EXISTS tmp_Discount; DROP TABLE IF EXISTS tmp_Shop_Category; +DROP TABLE IF EXISTS tmp_Category; DROP TABLE IF EXISTS tmp_Shop_Product_Category; +DROP TABLE IF EXISTS tmp_Product_Category; DROP TABLE IF EXISTS tmp_Shop_Product_Currency_Region_Link; DROP TABLE IF EXISTS tmp_Shop_Product_Currency_Link; DROP TABLE IF EXISTS tmp_User_Role_Link; DROP TABLE IF EXISTS tmp_Shop_Basket; DROP TABLE IF EXISTS tmp_Shop_Supplier_Purchase_Order_Product_Link; +DROP TABLE IF EXISTS tmp_Supplier_Purchase_Order_Product_Link; DROP TABLE IF EXISTS tmp_Shop_Supplier_Purchase_Order; +DROP TABLE IF EXISTS tmp_Supplier_Purchase_Order; DROP TABLE IF EXISTS tmp_Shop_Supplier; +DROP TABLE IF EXISTS tmp_Supplier; DROP TABLE IF EXISTS tmp_Shop_Manufacturing_Purchase_Order_Product_Link; +DROP TABLE IF EXISTS tmp_Manufacturing_Purchase_Order_Product_Link; DROP TABLE IF EXISTS tmp_Shop_Manufacturing_Purchase_Order; +DROP TABLE IF EXISTS tmp_Manufacturing_Purchase_Order; DROP TABLE IF EXISTS tmp_Shop_Customer; DROP TABLE IF EXISTS tmp_Shop_Customer_Sale_Order_Product_Link; DROP TABLE IF EXISTS tmp_Shop_Customer_Sale_Order; - # Delete old tables DROP TABLE IF EXISTS Split_Temp; DROP TABLE IF EXISTS Split_Key_Value_Pair_Csv_Temp; @@ -62,6 +75,7 @@ DROP TABLE IF EXISTS Shop_Manufacturing_Purchase_Order_Product_Link_Temp; DROP TABLE IF EXISTS Shop_Manufacturing_Purchase_Order_Product_Link_Audit; DROP TABLE IF EXISTS Shop_Manufacturing_Purchase_Order_Product_Link; +DROP TABLE IF EXISTS Shop_Manufacturing_Purchase_Order_Temp; DROP TABLE IF EXISTS Shop_Manufacturing_Purchase_Order_Audit; DROP TABLE IF EXISTS Shop_Manufacturing_Purchase_Order; @@ -69,9 +83,14 @@ DROP TABLE IF EXISTS Shop_Supplier_Purchase_Order_Product_Link_Temp; DROP TABLE IF EXISTS Shop_Supplier_Purchase_Order_Product_Link_Audit; DROP TABLE IF EXISTS Shop_Supplier_Purchase_Order_Product_Link; +DROP TABLE IF EXISTS Shop_Supplier_Purchase_Order_Temp; DROP TABLE IF EXISTS Shop_Supplier_Purchase_Order_Audit; DROP TABLE IF EXISTS Shop_Supplier_Purchase_Order; +DROP TABLE IF EXISTS Shop_Supplier_Address_Temp; +DROP TABLE IF EXISTS Shop_Supplier_Address_Audit; +DROP TABLE IF EXISTS Shop_Supplier_Address; + DROP TABLE IF EXISTS Shop_Supplier_Temp; DROP TABLE IF EXISTS Shop_Supplier_Audit; DROP TABLE IF EXISTS Shop_Supplier; @@ -663,20 +682,29 @@ CREATE TABLE IF NOT EXISTS Shop_Region_Branch_Temp ( SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Address'; CREATE TABLE Shop_Address ( - id_address INT NOT NULL AUTO_INCREMENT PRIMARY KEY, - id_region INT NOT NULL, - postcode VARCHAR(20) NOT NULL, - address_line_1 VARCHAR(256) NOT NULL, - address_line_2 VARCHAR(256) NOT NULL, - city VARCHAR(256) NOT NULL, - county VARCHAR(256) NOT NULL, - active BIT NOT NULL DEFAULT 1, - created_on DATETIME, - created_by INT, - id_change_set INT, - CONSTRAINT FK_Shop_Address_id_change_set + id_address INT NOT NULL AUTO_INCREMENT PRIMARY KEY + , id_region INT NOT NULL + , CONSTRAINT FK_Shop_Address_id_region + FOREIGN KEY (id_region) + REFERENCES partsltd_prod.Shop_Region(id_region) + /* + , id_supplier INT NULL + , CONSTRAINT FK_Shop_Address_id_supplier + FOREIGN KEY (id_supplier) + REFERENCES partsltd_prod.Shop_Supplier(id_supplier) + */ + , postcode VARCHAR(20) NOT NULL + , address_line_1 VARCHAR(256) NOT NULL + , address_line_2 VARCHAR(256) NOT NULL + , city VARCHAR(256) NOT NULL + , county VARCHAR(256) NOT NULL + , active BIT NOT NULL DEFAULT 1 + , created_on DATETIME + , created_by INT + , id_change_set INT + , CONSTRAINT FK_Shop_Address_id_change_set FOREIGN KEY (id_change_set) - REFERENCES Shop_User_Change_Set(id_change_set) + REFERENCES partsltd_prod.Shop_User_Change_Set(id_change_set) ); # Plant @@ -702,8 +730,6 @@ CREATE TABLE IF NOT EXISTS Shop_Plant ( # Address Audits - - SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Address_Audit'; CREATE TABLE IF NOT EXISTS Shop_Address_Audit ( @@ -2402,8 +2428,6 @@ CREATE TABLE IF NOT EXISTS Shop_User_Order_Status_Audit ( ); # Supplier - - SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier'; CREATE TABLE IF NOT EXISTS Shop_Supplier ( @@ -2411,24 +2435,26 @@ CREATE TABLE IF NOT EXISTS Shop_Supplier ( name_company VARCHAR(255) NOT NULL, name_contact VARCHAR(255) NULL, department_contact VARCHAR(255) NULL, + /* id_address INT NOT NULL, CONSTRAINT FK_Shop_Supplier_id_address - FOREIGN KEY (id_address) + FOREIGN KEY (id_address) REFERENCES Shop_Address(id_address), - phone_number VARCHAR(50) NULL, + */ + phone_number VARCHAR(50) NULL, fax VARCHAR(50) NULL, email VARCHAR(255) NOT NULL, website VARCHAR(255) NULL, id_currency INT NOT NULL, CONSTRAINT FK_Shop_Supplier_id_currency - FOREIGN KEY (id_currency) + FOREIGN KEY (id_currency) REFERENCES Shop_Currency(id_currency), active BIT NOT NULL DEFAULT 1, created_on DATETIME, created_by INT, id_change_set INT, CONSTRAINT FK_Shop_Supplier_id_change_set - FOREIGN KEY (id_change_set) + FOREIGN KEY (id_change_set) REFERENCES Shop_User_Change_Set(id_change_set) ); @@ -2454,6 +2480,89 @@ CREATE TABLE IF NOT EXISTS Shop_Supplier_Audit ( REFERENCES Shop_User_Change_Set(id_change_set) ); +# Supplier Staging + +SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Temp'; + +CREATE TABLE IF NOT EXISTS Shop_Supplier_Temp ( + id_supplier INT NOT NULL, + name_company VARCHAR(255) NOT NULL, + name_contact VARCHAR(255) NULL, + department_contact VARCHAR(255) NULL, + -- id_address INT NOT NULL, + phone_number VARCHAR(50) NULL, + fax VARCHAR(50) NULL, + email VARCHAR(255) NOT NULL, + website VARCHAR(255) NULL, + id_currency INT NOT NULL, + active BIT NULL, + GUID BINARY(36) NOT NULL +); + +# Supplier Addresses + +SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Address'; + +CREATE TABLE Shop_Supplier_Address ( + id_address INT NOT NULL AUTO_INCREMENT PRIMARY KEY + , id_supplier INT NOT NULL + , CONSTRAINT FK_Shop_Supplier_Address_id_supplier + FOREIGN KEY (id_supplier) + REFERENCES partsltd_prod.Shop_Supplier(id_supplier) + ON UPDATE RESTRICT + , id_region INT NOT NULL + , CONSTRAINT FK_Shop_Supplier_Address_id_region + FOREIGN KEY (id_region) + REFERENCES partsltd_prod.Shop_Region(id_region) + , postcode VARCHAR(20) NOT NULL + , address_line_1 VARCHAR(256) NOT NULL + , address_line_2 VARCHAR(256) NOT NULL + , city VARCHAR(256) NOT NULL + , county VARCHAR(256) NOT NULL + , active BIT NOT NULL DEFAULT 1 + , created_on DATETIME + , created_by INT + , id_change_set INT + , CONSTRAINT FK_Shop_Supplier_Address_id_change_set + FOREIGN KEY (id_change_set) + REFERENCES partsltd_prod.Shop_User_Change_Set(id_change_set) +); +# Supplier Addresses Staging + +SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Address_Temp'; + +CREATE TABLE Shop_Supplier_Address_Temp ( + id_address INT NOT NULL AUTO_INCREMENT PRIMARY KEY + , id_supplier INT NOT NULL + , id_region INT NOT NULL + , postcode VARCHAR(20) NOT NULL + , address_line_1 VARCHAR(256) NOT NULL + , address_line_2 VARCHAR(256) NOT NULL + , city VARCHAR(256) NOT NULL + , county VARCHAR(256) NOT NULL + , active BIT NOT NULL DEFAULT 1 + , GUID BINARY(36) NOT NULL +); +# Supplier Address Audits + +SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Address_Audit'; + +CREATE TABLE IF NOT EXISTS Shop_Supplier_Address_Audit ( + id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + id_address INT NOT NULL, + CONSTRAINT FK_Shop_Supplier_Address_Audit_id_address + FOREIGN KEY (id_address) + REFERENCES Shop_Supplier_Address(id_address) + ON UPDATE RESTRICT, + name_field VARCHAR(50), + value_prev VARCHAR(500), + value_new VARCHAR(500), + id_change_set INT NOT NULL, + CONSTRAINT FK_Shop_Supplier_Address_Audit_id_change_set + FOREIGN KEY (id_change_set) + REFERENCES Shop_User_Change_Set(id_change_set) + ON UPDATE RESTRICT +); # Supplier Purchase Order @@ -2472,8 +2581,9 @@ CREATE TABLE IF NOT EXISTS Shop_Supplier_Purchase_Order ( FOREIGN KEY (id_supplier_fulfilled) REFERENCES Shop_Supplier(id_supplier), */ - cost_total_local FLOAT NOT NULL, id_currency_cost INT NOT NULL, + cost_total_local_VAT_excl FLOAT NOT NULL, + cost_total_local_VAT_incl FLOAT NOT NULL, /* latency_delivery INT NOT NULL, quantity_ordered FLOAT NOT NULL, @@ -2517,6 +2627,17 @@ CREATE TABLE IF NOT EXISTS Shop_Supplier_Purchase_Order_Audit ( REFERENCES Shop_Sales_And_Purchasing_Change_Set(id_change_set) ); +# Supplier Purchase Order Staging + +SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Purchase_Order_Temp'; + +CREATE TABLE IF NOT EXISTS Shop_Supplier_Purchase_Order_Temp ( + id_order INT NOT NULL, + id_supplier_ordered INT NOT NULL, + id_currency_cost INT NOT NULL, + active BIT NULL +); + # Supplier Purchase Order Product Link @@ -2533,17 +2654,20 @@ CREATE TABLE IF NOT EXISTS Shop_Supplier_Purchase_Order_Product_Link ( CONSTRAINT FK_Shop_Supplier_Purchase_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, - quantity_ordered FLOAT NOT NULL, + -- id_currency_cost INT NOT NULL, id_unit_quantity INT NOT NULL, CONSTRAINT FK_Shop_Supplier_Purchase_Order_Product_Link_id_unit_quantity FOREIGN KEY (id_unit_quantity) REFERENCES Shop_Unit_Measurement(id_unit_measurement), + quantity_ordered FLOAT NOT NULL, quantity_received FLOAT NULL, latency_delivery_days INT NOT NULL, display_order INT NOT NULL, active BIT NOT NULL, + cost_total_local_VAT_excl FLOAT NOT NULL, + cost_total_local_VAT_incl FLOAT NOT NULL, + cost_unit_local_VAT_excl FLOAT NOT NULL, + cost_unit_local_VAT_incl FLOAT NOT NULL, created_on DATETIME, created_by INT, updated_last_on DATETIME NULL, @@ -2585,43 +2709,39 @@ CREATE TABLE IF NOT EXISTS Shop_Supplier_Purchase_Order_Product_Link_Audit ( SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Purchase_Order_Product_Link_Temp'; CREATE TABLE IF NOT EXISTS Shop_Supplier_Purchase_Order_Product_Link_Temp ( - id_link INT NOT NULL PRIMARY KEY, - GUID BINARY(36) NOT NULL, - id_order INT NOT NULL, - /* - CONSTRAINT FK_Supplier_Purchase_Order_Product_Link_Temp_id_order - FOREIGN KEY (id_order) - REFERENCES Shop_Supplier_Purchase_Order(id_order), - */ - id_permutation INT NOT NULL, - CONSTRAINT FK_Supplier_Purchase_Order_Product_Link_Temp_id_permutation - FOREIGN KEY (id_permutation) - REFERENCES Shop_Product_Permutation(id_permutation), - cost_total_local FLOAT NOT NULL, - id_currency_cost INT NOT NULL, - quantity_ordered FLOAT NOT NULL, - id_unit_quantity INT NOT NULL, - CONSTRAINT FK_Supplier_Purchase_Order_Product_Link_Temp_id_unit_quantity - FOREIGN KEY (id_unit_quantity) - REFERENCES Shop_Unit_Measurement(id_unit_measurement), - quantity_received FLOAT NULL, - latency_delivery_days INT NOT NULL, - display_order INT NOT NULL, - active BIT NOT NULL + id_link INT NOT NULL PRIMARY KEY + , id_order INT NOT NULL + , id_permutation INT NOT NULL + , id_currency_cost INT NOT NULL + , id_unit_quantity INT NOT NULL + , quantity_ordered FLOAT NOT NULL + , quantity_received FLOAT NULL + , latency_delivery_days INT NOT NULL + , display_order INT NOT NULL + , active BIT NOT NULL + , cost_total_local_VAT_excl FLOAT NOT NULL + , cost_total_local_VAT_incl FLOAT NOT NULL + , GUID BINARY(36) NOT NULL ); - # Manufacturing Purchase Order - - SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Manufacturing_Purchase_Order'; CREATE TABLE IF NOT EXISTS Shop_Manufacturing_Purchase_Order ( id_order INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + /* cost_total_local FLOAT NOT NULL, id_currency_cost INT NOT NULL, - value_produced_total_local FLOAT NOT NULL, + */ + id_currency INT NOT NULL, + CONSTRAINT FK_Manufacturing_Purchase_Order_id_currency + FOREIGN KEY (id_currency) + REFERENCES Shop_Currency(id_currency), + cost_total_local_VAT_excl FLOAT NOT NULL, + cost_total_local_VAT_incl FLOAT NOT NULL, + price_total_local_VAT_excl FLOAT NOT NULL, + price_total_local_VAT_incl FLOAT NOT NULL, /* latency_delivery INT NOT NULL, quantity_ordered FLOAT NOT NULL, @@ -2665,6 +2785,34 @@ CREATE TABLE IF NOT EXISTS Shop_Manufacturing_Purchase_Order_Audit ( REFERENCES Shop_Sales_And_Purchasing_Change_Set(id_change_set) ); +# Manufacturing Purchase Order Temp + +SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Manufacturing_Purchase_Order_Temp'; + +CREATE TABLE IF NOT EXISTS Shop_Manufacturing_Purchase_Order_Temp ( + id_order INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + /* + cost_total_local FLOAT NOT NULL, + */ + id_currency_cost INT NOT NULL, + cost_total_local_VAT_excl FLOAT NOT NULL, + cost_total_local_VAT_incl FLOAT NOT NULL, + price_total_local_VAT_excl FLOAT NOT NULL, + price_total_local_VAT_incl FLOAT NOT NULL, + /* + latency_delivery INT NOT NULL, + quantity_ordered FLOAT NOT NULL, + id_unit_quantity INT NOT NULL, + CONSTRAINT FK_Shop_Manufacturing_Purchase_Order_id_unit_quantity + FOREIGN KEY (id_unit_quantity) + REFERENCES Shop_Unit_Measurement(id_unit), + quantity_received INT NULL, + display_order INT NOT NULL, + */ + active BIT NOT NULL DEFAULT 1, + GUID BINARY(36) NOT NULL +); + # Manufacturing Purchase Order Product Link @@ -2681,16 +2829,17 @@ CREATE TABLE IF NOT EXISTS Shop_Manufacturing_Purchase_Order_Product_Link ( CONSTRAINT FK_Manufacturing_Purchase_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, + cost_unit_local_VAT_excl FLOAT NOT NULL, + cost_unit_local_VAT_incl FLOAT NOT NULL, + price_unit_local_VAT_excl FLOAT NOT NULL, + price_unit_local_VAT_incl FLOAT NOT NULL, id_unit_quantity INT NOT NULL, CONSTRAINT FK_Manufacturing_Purchase_Order_id_unit_quantity FOREIGN KEY (id_unit_quantity) REFERENCES Shop_Unit_Measurement(id_unit_measurement), - latency_manufacture_days INT NOT NULL, + quantity_used FLOAT NOT NULL, quantity_produced FLOAT NOT NULL, + latency_manufacture_days INT NOT NULL, display_order INT NOT NULL, active BIT NOT NULL, created_on DATETIME, @@ -2727,8 +2876,6 @@ CREATE TABLE IF NOT EXISTS Shop_Manufacturing_Purchase_Order_Product_Link_Audit # Manufacturing Purchase Order Product Link Temp - - -- DROP TABLE Shop_Manufacturing_Purchase_Order_Product_Link_Temp; -- SELECT * FROM Shop_Manufacturing_Purchase_Order_Product_Link_Temp; @@ -2736,28 +2883,19 @@ SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning CREATE TABLE IF NOT EXISTS Shop_Manufacturing_Purchase_Order_Product_Link_Temp ( id_link INT NOT NULL PRIMARY KEY, - GUID BINARY(36) NOT NULL, id_order INT NOT NULL, - /* - CONSTRAINT FK_Manuf_Purch_Order_Product_Link_Temp_id_order - FOREIGN KEY (id_order) - REFERENCES Shop_Manufacturing_Purchase_Order(id_order), - */ id_permutation INT NOT NULL, - CONSTRAINT FK_Manuf_Purch_Order_Product_Link_Temp_id_permutation - FOREIGN KEY (id_permutation) - REFERENCES Shop_Product_Permutation(id_permutation), - cost_total_local FLOAT NOT NULL, - id_currency_cost INT NOT NULL, - quantity_used FLOAT NOT NULL, id_unit_quantity INT NOT NULL, - CONSTRAINT FK_Manuf_Purch_Order_Product_Link_Temp_id_unit_quantity - FOREIGN KEY (id_unit_quantity) - REFERENCES Shop_Unit_Measurement(id_unit_measurement), - quantity_produced FLOAT NULL, + quantity_used FLOAT NOT NULL, latency_manufacture_days INT NOT NULL, + quantity_produced FLOAT NOT NULL, display_order INT NOT NULL, - active BIT NOT NULL + active BIT NOT NULL, + cost_unit_local_VAT_excl FLOAT NULL, + cost_unit_local_VAT_incl FLOAT NULL, + price_unit_local_VAT_excl FLOAT NULL, + price_unit_local_VAT_incl FLOAT NULL, + GUID BINARY(36) NOT NULL ); # Customer @@ -5324,10 +5462,12 @@ BEGIN SELECT NEW.id_supplier, 'department_contact', OLD.department_contact, NEW.department_contact, NEW.id_change_set WHERE NOT OLD.department_contact <=> NEW.department_contact UNION + /* # Changed id_address SELECT NEW.id_supplier, 'id_address', OLD.id_address, NEW.id_address, NEW.id_change_set WHERE NOT OLD.id_address <=> NEW.id_address UNION + */ # Changed phone_number SELECT NEW.id_supplier, 'phone_number', OLD.phone_number, NEW.phone_number, NEW.id_change_set WHERE NOT OLD.phone_number <=> NEW.phone_number @@ -5351,6 +5491,70 @@ BEGIN END // DELIMITER ;; +# Shop Supplier Address + +DROP TRIGGER IF EXISTS before_insert_Shop_Supplier_Address; +DROP TRIGGER IF EXISTS before_update_Shop_Supplier_Address; + + +DELIMITER // +CREATE TRIGGER before_insert_Shop_Supplier_Address +BEFORE INSERT ON Shop_Supplier_Address +FOR EACH ROW +BEGIN + SET NEW.created_on := IFNULL(NEW.created_on, NOW()); + SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1)); +END // +DELIMITER ;; + + +DELIMITER // +CREATE TRIGGER before_update_Shop_Supplier_Address +BEFORE UPDATE ON Shop_Supplier_Address +FOR EACH ROW +BEGIN + IF OLD.id_change_set <=> NEW.id_change_set THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'New change Set ID must be provided.'; + END IF; + + INSERT INTO Shop_Supplier_Address_Audit ( + id_address, + name_field, + value_prev, + value_new, + id_change_set + ) + # Changed region + SELECT NEW.id_address, 'id_region', OLD.id_region, NEW.id_region, NEW.id_change_set + WHERE NOT OLD.id_region <=> NEW.id_region + UNION + # Changed postcode + SELECT NEW.id_address, 'postcode', OLD.postcode, NEW.postcode, NEW.id_change_set + WHERE NOT OLD.postcode <=> NEW.postcode + UNION + # Changed address_line_1 + SELECT NEW.id_address, 'address_line_1', OLD.address_line_1, NEW.address_line_1, NEW.id_change_set + WHERE NOT OLD.address_line_1 <=> NEW.address_line_1 + UNION + # Changed address_line_2 + SELECT NEW.id_address, 'address_line_2', OLD.address_line_2, NEW.address_line_2, NEW.id_change_set + WHERE NOT OLD.address_line_2 <=> NEW.address_line_2 + UNION + # Changed city + SELECT NEW.id_address, 'city', OLD.city, NEW.city, NEW.id_change_set + WHERE NOT OLD.city <=> NEW.city + UNION + # Changed county + SELECT NEW.id_address, 'county', OLD.county, NEW.county, NEW.id_change_set + WHERE NOT OLD.county <=> NEW.county + UNION + # Changed active + SELECT NEW.id_address, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set + WHERE NOT (OLD.active <=> NEW.active) + ; +END // +DELIMITER ;; # Shop Unit of Measurement @@ -5530,14 +5734,18 @@ BEGIN # Changed id_supplier_ordered SELECT NEW.id_order, 'id_supplier_ordered', OLD.id_supplier_ordered, NEW.id_supplier_ordered, NEW.id_change_set WHERE NOT OLD.id_supplier_ordered <=> NEW.id_supplier_ordered - UNION - # Changed cost_total_local - SELECT NEW.id_order, 'cost_total_local', OLD.cost_total_local, NEW.cost_total_local, NEW.id_change_set - WHERE NOT OLD.cost_total_local <=> NEW.cost_total_local UNION # Changed id_currency_cost SELECT NEW.id_order, 'id_currency_cost', OLD.id_currency_cost, NEW.id_currency_cost, NEW.id_change_set WHERE NOT OLD.id_currency_cost <=> NEW.id_currency_cost + UNION + # Changed cost_total_local_VAT_excl + SELECT NEW.id_order, 'cost_total_local_VAT_excl', OLD.cost_total_local_VAT_excl, NEW.cost_total_local_VAT_excl, NEW.id_change_set + WHERE NOT OLD.cost_total_local_VAT_excl <=> NEW.cost_total_local_VAT_excl + UNION + # Changed cost_total_local_VAT_incl + SELECT NEW.id_order, 'cost_total_local_VAT_incl', OLD.cost_total_local_VAT_incl, NEW.cost_total_local_VAT_incl, NEW.id_change_set + WHERE NOT OLD.cost_total_local_VAT_incl <=> NEW.cost_total_local_VAT_incl /* UNION # Changed latency_delivery @@ -5605,15 +5813,13 @@ BEGIN SELECT NEW.id_link, 'id_permutation', OLD.id_permutation, NEW.id_permutation, NEW.id_change_set WHERE NOT OLD.id_permutation <=> NEW.id_permutation UNION - # Changed cost_total_local - SELECT NEW.id_link, 'cost_total_local', OLD.cost_total_local, NEW.cost_total_local, NEW.id_change_set - WHERE NOT OLD.cost_total_local <=> NEW.cost_total_local - UNION + /* # Changed id_currency_cost SELECT NEW.id_link, 'id_currency_cost', OLD.id_currency_cost, NEW.id_currency_cost, NEW.id_change_set WHERE NOT OLD.id_currency_cost <=> NEW.id_currency_cost UNION - # Changed quantity_ordered + */ + # Changed quantity_ordered SELECT NEW.id_link, 'quantity_ordered', OLD.quantity_ordered, NEW.quantity_ordered, NEW.id_change_set WHERE NOT OLD.quantity_ordered <=> NEW.quantity_ordered UNION @@ -5636,6 +5842,22 @@ BEGIN # Changed active SELECT NEW.id_link, 'active', OLD.active, NEW.active, NEW.id_change_set WHERE NOT OLD.active <=> NEW.active + UNION + # Changed cost_total_local_VAT_excl + SELECT NEW.id_link, 'cost_total_local_VAT_excl', OLD.cost_total_local_VAT_excl, NEW.cost_total_local_VAT_excl, NEW.id_change_set + WHERE NOT OLD.cost_total_local_VAT_excl <=> NEW.cost_total_local_VAT_excl + UNION + # Changed cost_total_local_VAT_incl + SELECT NEW.id_link, 'cost_total_local_VAT_incl', OLD.cost_total_local_VAT_incl, NEW.cost_total_local_VAT_incl, NEW.id_change_set + WHERE NOT OLD.cost_total_local_VAT_incl <=> NEW.cost_total_local_VAT_incl + UNION + # Changed cost_unit_local_VAT_excl + SELECT NEW.id_link, 'cost_unit_local_VAT_excl', OLD.cost_unit_local_VAT_excl, NEW.cost_unit_local_VAT_excl, NEW.id_change_set + WHERE NOT OLD.cost_unit_local_VAT_excl <=> NEW.cost_unit_local_VAT_excl + UNION + # Changed cost_unit_local_VAT_incl + SELECT NEW.id_link, 'cost_unit_local_VAT_incl', OLD.cost_unit_local_VAT_incl, NEW.cost_unit_local_VAT_incl, NEW.id_change_set + WHERE NOT OLD.cost_unit_local_VAT_incl <=> NEW.cost_unit_local_VAT_incl ; END // DELIMITER ;; @@ -5676,17 +5898,25 @@ BEGIN value_new, id_change_set ) - # Changed cost_total_local - SELECT NEW.id_order, 'cost_total_local', OLD.cost_total_local, NEW.cost_total_local, NEW.id_change_set - WHERE NOT OLD.cost_total_local <=> NEW.cost_total_local + # Changed id_currency + SELECT NEW.id_order, 'id_currency', OLD.id_currency, NEW.id_currency, NEW.id_change_set + WHERE NOT OLD.id_currency <=> NEW.id_currency UNION - # Changed value_produced_total_local - SELECT NEW.id_order, 'value_produced_total_local', OLD.value_produced_total_local, NEW.value_produced_total_local, NEW.id_change_set - WHERE NOT OLD.value_produced_total_local <=> NEW.value_produced_total_local + # Changed cost_total_local_VAT_excl + SELECT NEW.id_order, 'cost_total_local_VAT_excl', OLD.cost_total_local_VAT_excl, NEW.cost_total_local_VAT_excl, NEW.id_change_set + WHERE NOT OLD.cost_total_local_VAT_excl <=> NEW.cost_total_local_VAT_excl UNION - # Changed id_currency_cost - SELECT NEW.id_order, 'id_currency_cost', OLD.id_currency_cost, NEW.id_currency_cost, NEW.id_change_set - WHERE NOT OLD.id_currency_cost <=> NEW.id_currency_cost + # Changed cost_total_local_VAT_incl + SELECT NEW.id_order, 'cost_total_local_VAT_incl', OLD.cost_total_local_VAT_incl, NEW.cost_total_local_VAT_incl, NEW.id_change_set + WHERE NOT OLD.cost_total_local_VAT_incl <=> NEW.cost_total_local_VAT_incl + UNION + # Changed price_total_local_VAT_excl + SELECT NEW.id_order, 'price_total_local_VAT_excl', OLD.price_total_local_VAT_excl, NEW.price_total_local_VAT_excl, NEW.id_change_set + WHERE NOT OLD.price_total_local_VAT_excl <=> NEW.price_total_local_VAT_excl + UNION + # Changed price_total_local_VAT_incl + SELECT NEW.id_order, 'price_total_local_VAT_incl', OLD.price_total_local_VAT_incl, NEW.price_total_local_VAT_incl, NEW.id_change_set + WHERE NOT OLD.price_total_local_VAT_incl <=> NEW.price_total_local_VAT_incl UNION # Changed active SELECT NEW.id_order, 'active', OLD.active, NEW.active, NEW.id_change_set @@ -5739,25 +5969,33 @@ BEGIN SELECT NEW.id_link, 'id_permutation', OLD.id_permutation, NEW.id_permutation, NEW.id_change_set WHERE NOT OLD.id_permutation <=> NEW.id_permutation UNION - # Changed cost_total_local - SELECT NEW.id_link, 'cost_total_local', OLD.cost_total_local, NEW.cost_total_local, NEW.id_change_set - WHERE NOT OLD.cost_total_local <=> NEW.cost_total_local - UNION - # Changed id_currency_cost - SELECT NEW.id_link, 'id_currency_cost', OLD.id_currency_cost, NEW.id_currency_cost, NEW.id_change_set - WHERE NOT OLD.id_currency_cost <=> NEW.id_currency_cost + # Changed id_unit_quantity + SELECT NEW.id_link, 'id_unit_quantity', OLD.id_unit_quantity, NEW.id_unit_quantity, NEW.id_change_set + WHERE NOT OLD.id_unit_quantity <=> NEW.id_unit_quantity UNION # Changed quantity_used SELECT NEW.id_link, 'quantity_used', OLD.quantity_used, NEW.quantity_used, NEW.id_change_set WHERE NOT OLD.quantity_used <=> NEW.quantity_used - UNION - # Changed id_unit_quantity - SELECT NEW.id_link, 'id_unit_quantity', OLD.id_unit_quantity, NEW.id_unit_quantity, NEW.id_change_set - WHERE NOT OLD.id_unit_quantity <=> NEW.id_unit_quantity UNION # Changed quantity_produced SELECT NEW.id_link, 'quantity_produced', OLD.quantity_produced, NEW.quantity_produced, NEW.id_change_set WHERE NOT OLD.quantity_produced <=> NEW.quantity_produced + UNION + # Changed cost_unit_local_VAT_excl + SELECT NEW.id_order, 'cost_unit_local_VAT_excl', OLD.cost_unit_local_VAT_excl, NEW.cost_unit_local_VAT_excl, NEW.id_change_set + WHERE NOT OLD.cost_unit_local_VAT_excl <=> NEW.cost_unit_local_VAT_excl + UNION + # Changed cost_unit_local_VAT_incl + SELECT NEW.id_order, 'cost_unit_local_VAT_incl', OLD.cost_unit_local_VAT_incl, NEW.cost_unit_local_VAT_incl, NEW.id_change_set + WHERE NOT OLD.cost_unit_local_VAT_incl <=> NEW.cost_unit_local_VAT_incl + UNION + # Changed price_unit_local_VAT_excl + SELECT NEW.id_order, 'price_unit_local_VAT_excl', OLD.price_unit_local_VAT_excl, NEW.price_unit_local_VAT_excl, NEW.id_change_set + WHERE NOT OLD.price_unit_local_VAT_excl <=> NEW.price_unit_local_VAT_excl + UNION + # Changed price_unit_local_VAT_incl + SELECT NEW.id_order, 'price_unit_local_VAT_incl', OLD.price_unit_local_VAT_incl, NEW.price_unit_local_VAT_incl, NEW.id_change_set + WHERE NOT OLD.price_unit_local_VAT_incl <=> NEW.price_unit_local_VAT_incl UNION # Changed latency_manufacture_days SELECT NEW.id_link, 'latency_manufacture_days', OLD.latency_manufacture_days, NEW.latency_manufacture_days, NEW.id_change_set @@ -6386,6 +6624,227 @@ END // DELIMITER ; +DROP FUNCTION IF EXISTS fn_shop_get_id_product_permutation_from_variation_csv_list; + +DELIMITER // + +CREATE FUNCTION fn_shop_get_id_product_permutation_from_variation_csv_list ( + a_id_product INT + , a_variation_csv TEXT +) +RETURNS INT +DETERMINISTIC +READS SQL DATA +BEGIN + DECLARE v_id_permutation INT; + DECLARE done INT DEFAULT FALSE; + DECLARE v_id_variation_type INT; + DECLARE v_id_variation INT; + DECLARE v_id_permutation_tmp INT; + DECLARE cur CURSOR FOR + SELECT + CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(t.pair, ':', 1), ',', -1) AS UNSIGNED) AS id_variation_type, + CAST(SUBSTRING_INDEX(t.pair, ':', -1) AS UNSIGNED) AS id_variation + FROM ( + SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(a_variation_csv, ',', n), ',', -1) pair + FROM ( + SELECT a.N + b.N * 10 + 1 n + FROM (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a + CROSS JOIN (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b + ORDER BY n + ) numbers + WHERE n <= 1 + (LENGTH(a_variation_csv) - LENGTH(REPLACE(a_variation_csv, ',', ''))) + ) t; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + SET v_id_permutation = NULL; + + OPEN cur; + + read_loop: LOOP + FETCH cur INTO v_id_variation_type, v_id_variation; + IF done THEN + LEAVE read_loop; + END IF; + + IF v_id_permutation IS NULL THEN + -- First iteration: find initial v_id_permutations + SELECT PPVL.id_permutation INTO v_id_permutation + FROM partsltd_prod.Shop_Product_Permutation_Variation_Link PPVL + INNER JOIN partsltd_prod.Shop_Product_Permutation PP ON PPVL.id_permutation = PP.id_permutation + INNER JOIN partsltd_prod.Shop_Variation PV ON PPVL.id_variation = PV.id_variation + WHERE 1=1 + AND PP.id_product = a_id_product + AND PPVL.id_variation = v_id_variation + AND PV.id_type = v_id_variation_type + ; + ELSE + -- Subsequent iterations: narrow down the v_id_permutation + SELECT PPVL.id_permutation INTO v_id_permutation_tmp + FROM partsltd_prod.Shop_Product_Permutation_Variation_Link PPVL + INNER JOIN partsltd_prod.Shop_Product_Permutation PP ON PPVL.id_permutation = PP.id_permutation + INNER JOIN partsltd_prod.Shop_Variation PV ON PPVL.id_variation = PV.id_variation + WHERE 1=1 + AND PP.id_product = a_id_product + AND PPVL.v_id_permutation = v_id_permutation + AND PPVL.id_variation = v_id_variation + AND PV.id_type = v_id_variation_type + ; + + IF v_id_permutation_tmp IS NULL THEN + -- If no match found, exit the loop + SET v_id_permutation := NULL; + LEAVE read_loop; + ELSE + SET v_id_permutation := v_id_permutation_tmp; + END IF; + END IF; + END LOOP; + + CLOSE cur; + + RETURN v_id_permutation; +END // + +DELIMITER ; + +/* +SELECT fn_shop_get_id_product_permutation_from_variation_csv_list ( 1, '1:1' ) AS id_permutation; +SELECT fn_shop_get_id_product_permutation_from_variation_csv_list ( 3, '' ) AS id_permutation; +*/ + + +/* +-- Update the table using the function +UPDATE product_permutation_input +SET v_id_permutation = find_v_id_permutation(variation_csv) +WHERE v_id_permutation IS NULL; +*/ + +/* +select * from partsltd_prod.Shop_Variation + +DROP PROCEDURE IF EXISTS p_shop_get_id_product_permutation_from_variation_csv_list; + +DELIMITER // +CREATE PROCEDURE p_shop_get_id_product_permutation_from_variation_csv_list ( + IN a_guid BINARY(36) + , IN a_debug BIT +) +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE v_id INT; + DECLARE v_row_id INT; + DECLARE v_variation_csv TEXT; + DECLARE v_id_permutation INT; + DECLARE v_time_start TIMESTAMP(6); + + -- Cursor to iterate through unprocessed rows + DECLARE cur CURSOR FOR + SELECT id, session_guid, row_id, variation_csv + FROM product_permutation_input + WHERE v_id_permutation IS NULL; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + SET v_time_start := CURRENT_TIMESTAMP(6); + SET a_debug := IFNULL(a_debug, 0); + + IF a_debug = 1 THEN + SELECT + a_guid + , a_debug + ; + END IF; + + CALL p_validate_guid ( a_guid ); + + OPEN cur; + + read_loop: LOOP + FETCH cur INTO v_id, v_session_guid, v_row_id, v_variation_csv; + IF done THEN + LEAVE read_loop; + END IF; + + -- Find matching v_id_permutation + SET v_id_permutation = NULL; + + SELECT ppvl.v_id_permutation INTO v_id_permutation + FROM ( + SELECT + SUBSTRING_INDEX(SUBSTRING_INDEX(t.pair, ':', 1), ',', -1) AS id_variation_type, + SUBSTRING_INDEX(t.pair, ':', -1) AS id_variation + FROM ( + SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(v_variation_csv, ',', numbers.n), ',', -1) pair + FROM ( + SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 -- add more if needed + ) numbers + WHERE CHAR_LENGTH(v_variation_csv) - CHAR_LENGTH(REPLACE(v_variation_csv, ',', '')) >= numbers.n - 1 + ) t + ) parsed + INNER JOIN product_permutation_variation_link ppvl + ON parsed.id_variation_type = ppvl.id_variation_type + AND parsed.id_variation = ppvl.id_variation + GROUP BY ppvl.v_id_permutation + HAVING COUNT(*) = (LENGTH(v_variation_csv) - LENGTH(REPLACE(v_variation_csv, ',', '')) + 1) + LIMIT 1; + + -- Update the v_id_permutation in the input table + UPDATE product_permutation_input + SET v_id_permutation = v_id_permutation + WHERE id = v_id; + + END LOOP; + + CLOSE cur; + + + IF EXISTS ( SELECT * FROM Shop_Get_Id_Product_Permutation_From_Variation_Csv_List_Temp WHERE GUID = a_guid LIMIT 1 ) THEN + IF EXISTS (SELECT * FROM tmp_Split_Split LIMIT 1) THEN + START TRANSACTION; + INSERT INTO Split_Key_Value_Pair_Csv_Temp ( + guid + , id + , key_column + , value_column + ) + SELECT + a_guid + , id + , key_column + , value_column + FROM tmp_Split_Split + ; + COMMIT; + END IF; + END IF; + + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Input; + DROP TEMPORARY TABLE IF EXISTS tmp_Split_Split; + + IF a_debug = 1 THEN + CALL p_debug_timing_reporting ( v_time_start ); + END IF; +END // +DELIMITER ;; +*/ + +/* +CALL p_shop_get_id_product_permutation_from_variation_csv_list ( + 'nipsnipsnipsnipsnipsnipsnipsnipsnips' + , '1:100,2:200,3:300,4:400' # a_string + , 1 +); + +SELECT * +FROM Split_key_value_pair_csv_Temp +WHERE GUID = 'nipsnipsnipsnipsnipsnipsnipsnipsnips'; + +CALL p_clear_split_key_value_pair_csv_temp( 'nipsnipsnipsnipsnipsnipsnipsnipsnips' ); +*/ + -- Clear previous proc DROP PROCEDURE IF EXISTS p_shop_user_eval; DROP PROCEDURE IF EXISTS p_shop_calc_user; @@ -8388,6 +8847,10 @@ BEGIN WHERE ISNULL(t_S.as_int) OR ISNULL(PC.id_category) + OR ( + PC.active = 0 + AND a_get_inactive_product_category = 0 + ) ) THEN INSERT INTO tmp_Msg_Error ( -- guid, @@ -8405,7 +8868,10 @@ BEGIN WHERE ISNULL(t_S.as_int) OR ISNULL(PC.id_category) - -- OR PC.active = 0 + OR ( + PC.active = 0 + AND a_get_inactive_product_category = 0 + ) ; ELSE INSERT INTO tmp_Category_calc ( @@ -8419,7 +8885,7 @@ BEGIN a_get_all_product_category = 1 OR ( v_has_filter_product_category = 1 - AND FIND_IN_SET(PC.id_category, a_ids_product_category) > 0 + AND NOT ISNULL(t_S.as_int) ) ) AND ( @@ -8461,6 +8927,10 @@ BEGIN WHERE ISNULL(t_S.as_int) OR ISNULL(P.id_product) + OR ( + P.active = 0 + AND a_get_inactive_product = 0 + ) ) THEN INSERT INTO tmp_Msg_Error ( -- guid, @@ -8478,7 +8948,10 @@ BEGIN WHERE ISNULL(t_S.as_int) OR ISNULL(P.id_product) - -- OR PC.active = 0 + OR ( + P.active = 0 + AND a_get_inactive_product = 0 + ) ; ELSE INSERT INTO tmp_Product_calc ( @@ -8495,7 +8968,7 @@ BEGIN a_get_all_product = 1 OR ( v_has_filter_product = 1 - AND FIND_IN_SET(P.id_product, a_ids_product) > 0 + AND NOT ISNULL(t_S.as_int) ) ) AND ( @@ -8554,7 +9027,10 @@ BEGIN WHERE ISNULL(t_S.as_int) OR ISNULL(PP.id_permutation) - -- OR PC.active = 0 + OR ( + PP.active = 0 + AND a_get_inactive_product_permutation = 0 + ) ; ELSE INSERT INTO tmp_Permutation_calc ( @@ -8569,17 +9045,18 @@ BEGIN FROM tmp_Split t_S RIGHT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_S.as_int = PP.id_permutation INNER JOIN tmp_Product_calc t_P ON PP.id_product = t_P.id_product - WHERE ( + WHERE 1=1 + AND ( a_get_all_product_permutation = 1 OR ( v_has_filter_permutation = 1 - AND FIND_IN_SET(PP.id_permutation, a_ids_permutation) > 0 - ) - OR ( - a_get_products_quantity_stock_below_min = 1 - AND PP.quantity_stock < PP.quantity_min + AND NOT ISNULL(t_S.as_int) ) ) + AND ( + a_get_products_quantity_stock_below_min = 1 + AND PP.quantity_stock < PP.quantity_min + ) AND ( a_get_inactive_permutation = 1 OR PP.active = 1 @@ -10296,227 +10773,6 @@ WHERE id_permutation = 1; */ -DROP FUNCTION IF EXISTS fn_shop_get_id_product_permutation_from_variation_csv_list; - -DELIMITER // - -CREATE FUNCTION fn_shop_get_id_product_permutation_from_variation_csv_list ( - a_id_product INT - , a_variation_csv TEXT -) -RETURNS INT -DETERMINISTIC -READS SQL DATA -BEGIN - DECLARE v_id_permutation INT; - DECLARE done INT DEFAULT FALSE; - DECLARE v_id_variation_type INT; - DECLARE v_id_variation INT; - DECLARE v_id_permutation_tmp INT; - DECLARE cur CURSOR FOR - SELECT - CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(t.pair, ':', 1), ',', -1) AS UNSIGNED) AS id_variation_type, - CAST(SUBSTRING_INDEX(t.pair, ':', -1) AS UNSIGNED) AS id_variation - FROM ( - SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(a_variation_csv, ',', n), ',', -1) pair - FROM ( - SELECT a.N + b.N * 10 + 1 n - FROM (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a - CROSS JOIN (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b - ORDER BY n - ) numbers - WHERE n <= 1 + (LENGTH(a_variation_csv) - LENGTH(REPLACE(a_variation_csv, ',', ''))) - ) t; - - DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; - - SET v_id_permutation = NULL; - - OPEN cur; - - read_loop: LOOP - FETCH cur INTO v_id_variation_type, v_id_variation; - IF done THEN - LEAVE read_loop; - END IF; - - IF v_id_permutation IS NULL THEN - -- First iteration: find initial v_id_permutations - SELECT PPVL.id_permutation INTO v_id_permutation - FROM partsltd_prod.Shop_Product_Permutation_Variation_Link PPVL - INNER JOIN partsltd_prod.Shop_Product_Permutation PP ON PPVL.id_permutation = PP.id_permutation - INNER JOIN partsltd_prod.Shop_Variation PV ON PPVL.id_variation = PV.id_variation - WHERE 1=1 - AND PP.id_product = a_id_product - AND PPVL.id_variation = v_id_variation - AND PV.id_type = v_id_variation_type - ; - ELSE - -- Subsequent iterations: narrow down the v_id_permutation - SELECT PPVL.id_permutation INTO v_id_permutation_tmp - FROM partsltd_prod.Shop_Product_Permutation_Variation_Link PPVL - INNER JOIN partsltd_prod.Shop_Product_Permutation PP ON PPVL.id_permutation = PP.id_permutation - INNER JOIN partsltd_prod.Shop_Variation PV ON PPVL.id_variation = PV.id_variation - WHERE 1=1 - AND PP.id_product = a_id_product - AND PPVL.v_id_permutation = v_id_permutation - AND PPVL.id_variation = v_id_variation - AND PV.id_type = v_id_variation_type - ; - - IF v_id_permutation_tmp IS NULL THEN - -- If no match found, exit the loop - SET v_id_permutation := NULL; - LEAVE read_loop; - ELSE - SET v_id_permutation := v_id_permutation_tmp; - END IF; - END IF; - END LOOP; - - CLOSE cur; - - RETURN v_id_permutation; -END // - -DELIMITER ; - -/* -SELECT fn_shop_get_id_product_permutation_from_variation_csv_list ( 1, '1:1' ) AS id_permutation; -SELECT fn_shop_get_id_product_permutation_from_variation_csv_list ( 3, '' ) AS id_permutation; -*/ - - -/* --- Update the table using the function -UPDATE product_permutation_input -SET v_id_permutation = find_v_id_permutation(variation_csv) -WHERE v_id_permutation IS NULL; -*/ - -/* -select * from partsltd_prod.Shop_Variation - -DROP PROCEDURE IF EXISTS p_shop_get_id_product_permutation_from_variation_csv_list; - -DELIMITER // -CREATE PROCEDURE p_shop_get_id_product_permutation_from_variation_csv_list ( - IN a_guid BINARY(36) - , IN a_debug BIT -) -BEGIN - DECLARE done INT DEFAULT FALSE; - DECLARE v_id INT; - DECLARE v_row_id INT; - DECLARE v_variation_csv TEXT; - DECLARE v_id_permutation INT; - DECLARE v_time_start TIMESTAMP(6); - - -- Cursor to iterate through unprocessed rows - DECLARE cur CURSOR FOR - SELECT id, session_guid, row_id, variation_csv - FROM product_permutation_input - WHERE v_id_permutation IS NULL; - - DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; - - SET v_time_start := CURRENT_TIMESTAMP(6); - SET a_debug := IFNULL(a_debug, 0); - - IF a_debug = 1 THEN - SELECT - a_guid - , a_debug - ; - END IF; - - CALL p_validate_guid ( a_guid ); - - OPEN cur; - - read_loop: LOOP - FETCH cur INTO v_id, v_session_guid, v_row_id, v_variation_csv; - IF done THEN - LEAVE read_loop; - END IF; - - -- Find matching v_id_permutation - SET v_id_permutation = NULL; - - SELECT ppvl.v_id_permutation INTO v_id_permutation - FROM ( - SELECT - SUBSTRING_INDEX(SUBSTRING_INDEX(t.pair, ':', 1), ',', -1) AS id_variation_type, - SUBSTRING_INDEX(t.pair, ':', -1) AS id_variation - FROM ( - SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(v_variation_csv, ',', numbers.n), ',', -1) pair - FROM ( - SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 -- add more if needed - ) numbers - WHERE CHAR_LENGTH(v_variation_csv) - CHAR_LENGTH(REPLACE(v_variation_csv, ',', '')) >= numbers.n - 1 - ) t - ) parsed - INNER JOIN product_permutation_variation_link ppvl - ON parsed.id_variation_type = ppvl.id_variation_type - AND parsed.id_variation = ppvl.id_variation - GROUP BY ppvl.v_id_permutation - HAVING COUNT(*) = (LENGTH(v_variation_csv) - LENGTH(REPLACE(v_variation_csv, ',', '')) + 1) - LIMIT 1; - - -- Update the v_id_permutation in the input table - UPDATE product_permutation_input - SET v_id_permutation = v_id_permutation - WHERE id = v_id; - - END LOOP; - - CLOSE cur; - - - IF EXISTS ( SELECT * FROM Shop_Get_Id_Product_Permutation_From_Variation_Csv_List_Temp WHERE GUID = a_guid LIMIT 1 ) THEN - IF EXISTS (SELECT * FROM tmp_Split_Split LIMIT 1) THEN - START TRANSACTION; - INSERT INTO Split_Key_Value_Pair_Csv_Temp ( - guid - , id - , key_column - , value_column - ) - SELECT - a_guid - , id - , key_column - , value_column - FROM tmp_Split_Split - ; - COMMIT; - END IF; - END IF; - - DROP TEMPORARY TABLE IF EXISTS tmp_Split_Input; - DROP TEMPORARY TABLE IF EXISTS tmp_Split_Split; - - IF a_debug = 1 THEN - CALL p_debug_timing_reporting ( v_time_start ); - END IF; -END // -DELIMITER ;; -*/ - -/* -CALL p_shop_get_id_product_permutation_from_variation_csv_list ( - 'nipsnipsnipsnipsnipsnipsnipsnipsnips' - , '1:100,2:200,3:300,4:400' # a_string - , 1 -); - -SELECT * -FROM Split_key_value_pair_csv_Temp -WHERE GUID = 'nipsnipsnipsnipsnipsnipsnipsnipsnips'; - -CALL p_clear_split_key_value_pair_csv_temp( 'nipsnipsnipsnipsnipsnipsnipsnipsnips' ); -*/ - DROP PROCEDURE IF EXISTS p_shop_get_many_product_variation; DELIMITER // @@ -11722,11 +11978,11 @@ CREATE PROCEDURE p_shop_save_stock_item ( BEGIN DECLARE v_code_type_error_bad_data VARCHAR(100); - DECLARE v_id_type_error_bad_data INT; - DECLARE v_id_permission_product INT; - DECLARE v_ids_product_permission LONGTEXT; - DECLARE v_id_change_set INT; DECLARE v_id_access_level_edit INT; + DECLARE v_id_change_set INT; + DECLARE v_id_permission_product INT; + DECLARE v_id_type_error_bad_data INT; + DECLARE v_ids_product_permission LONGTEXT; DECLARE v_time_start TIMESTAMP(6); DECLARE v_time_expire DATETIME; @@ -11747,20 +12003,17 @@ BEGIN CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT - , guid BINARY(36) NOT NULL , id_type INT NULL , code VARCHAR(50) NOT NULL , msg VARCHAR(4000) NOT NULL ); INSERT INTO tmp_Msg_Error ( - guid - , id_type + id_type , code , msg ) SELECT - a_guid - , NULL + NULL , @errno , @text ; @@ -11775,9 +12028,10 @@ BEGIN 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()); + CALL partsltd_prod.p_validate_guid ( a_guid ); - DROP TABLE IF EXISTS tmp_Stock_Item; + DROP TEMPORARY TABLE IF EXISTS tmp_Stock_Item; + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; CREATE TEMPORARY TABLE tmp_Stock_Item ( id_stock INT NOT NULL @@ -11801,7 +12055,7 @@ BEGIN , can_view BIT NULL , can_edit BIT NULL , can_admin BIT NULL - , name_error VARCHAR(255) NOT NULL + , name_error VARCHAR(1000) NULL , is_new BIT NOT NULL ); @@ -11840,25 +12094,26 @@ BEGIN SI_T.id_stock -- , IFNULL(SI_T.id_category, P.id_category) AS id_category , IFNULL(IFNULL(SI_T.id_product, PP.id_product), 0) AS id_product - , IFNULL(IFNULL(SI_T.id_permutation, PP.id_permutation), 0) AS id_permutation + , IFNULL(IFNULL(SI_T.id_permutation, SI.id_permutation), 0) AS id_permutation , TRIM(IFNULL(SI_T.id_pairs_variations, '')) , CASE WHEN TRIM(IFNULL(SI_T.id_pairs_variations, '')) = '' THEN 0 ELSE 1 END AS has_variations - , IFNULL(IFNULL(SI_T.date_purchased, PP.date_purchased), v_time_start) AS date_purchased - , IFNULL(SI_T.date_received, PP.date_received) AS date_received - , IFNULL(IFNULL(SI_T.id_location_storage, PP.id_location_storage), 0) AS id_location_storage - , IFNULL(IFNULL(SI_T.id_currency_cost, PP.id_currency_cost), 0) AS id_currency_cost - , IFNULL(SI_T.cost_local_VAT_incl, PP.cost_local_VAT_incl) AS cost_local_VAT_incl - , IFNULL(SI_T.cost_local_VAT_excl, PP.cost_local_VAT_excl) AS cost_local_VAT_excl - , IFNULL(IFNULL(SI_T.is_sealed, PP.is_sealed), 1) AS is_sealed - , IFNULL(SI_T.date_unsealed, PP.date_unsealed) AS date_unsealed - , IFNULL(IFNULL(SI_T.date_expiration, PP.date_expiration), v_time_expire) AS date_expiration - , IFNULL(IFNULL(SI_T.is_consumed, PP.is_consumed), 0) AS is_consumed - , IFNULL(SI_T.date_consumed, PP.date_consumed) AS date_consumed - , IFNULL(IFNULL(SI_T.active, PP.active), 1) AS active + , IFNULL(IFNULL(SI_T.date_purchased, SI.date_purchased), v_time_start) AS date_purchased + , IFNULL(SI_T.date_received, SI.date_received) AS date_received + , IFNULL(IFNULL(SI_T.id_location_storage, SI.id_location_storage), 0) AS id_location_storage + , IFNULL(IFNULL(SI_T.id_currency_cost, SI.id_currency_cost), 0) AS id_currency_cost + , IFNULL(SI_T.cost_local_VAT_incl, SI.cost_local_VAT_incl) AS cost_local_VAT_incl + , IFNULL(SI_T.cost_local_VAT_excl, SI.cost_local_VAT_excl) AS cost_local_VAT_excl + , IFNULL(IFNULL(SI_T.is_sealed, SI.is_sealed), 1) AS is_sealed + , IFNULL(SI_T.date_unsealed, SI.date_unsealed) AS date_unsealed + , IFNULL(IFNULL(SI_T.date_expiration, SI.date_expiration), v_time_expire) AS date_expiration + , IFNULL(IFNULL(SI_T.is_consumed, SI.is_consumed), 0) AS is_consumed + , IFNULL(SI_T.date_consumed, SI.date_consumed) AS date_consumed + , IFNULL(IFNULL(SI_T.active, SI.active), 1) AS active # , fn_shop_get_product_permutation_name(SI_T.id_permutation) , CASE WHEN IFNULL(SI_T.id_stock, 0) < 1 THEN 1 ELSE 0 END AS is_new - FROM Shop_Stock_Item_Temp SI_T - LEFT JOIN Shop_Product_Permutation PP ON SI_T.id_permutation = PP.id_permutation + FROM partsltd_prod.Shop_Stock_Item_Temp SI_T + LEFT JOIN partsltd_prod.Shop_Stock_Item SI ON SI_T.id_stock = SI.id_stock + LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON SI_T.id_permutation = PP.id_permutation -- LEFT JOIN Shop_Product P ON PP.id_product = P.id_product WHERE SI_T.guid = a_guid ; @@ -11885,10 +12140,10 @@ BEGIN -- Add stock item error names UPDATE tmp_Stock_Item t_SI INNER JOIN partsltd_prod.Shop_Product P ON t_SI.id_product = P.id_product - INNER JOIN partsltd_prod.Shop_Category PC ON P.id_category = PC.id_category + INNER JOIN partsltd_prod.Shop_Product_Category PC ON P.id_category = PC.id_category -- INNER JOIN Shop_Product_Permutation PP ON t_SI.id_product = PP.id_product SET t_SI.name_error = CONCAT( - C.name, + PC.name, ' - ', P.name, ' - ', @@ -11896,20 +12151,55 @@ BEGIN ) ; + IF a_debug = 1 THEN + sElect * from tmp_Stock_Item; + END IF; -- Validation - -- Missing mandatory fields - -- id_product - IF EXISTS (SELECT * FROM tmp_Stock_Item t_SI WHERE t_SI.id_product = 0 LIMIT 1) THEN + -- id_stock + IF EXISTS ( + SELECT * + FROM tmp_Stock_Item t_SI + LEFT JOIN partsltd_prod.Shop_Stock_Item SI ON t_SI.id_stock = SI.id_stock + WHERE 1=1 + AND t_SI.id_stock > 0 + AND ISNULL(SI.id_stock) + LIMIT 1 + ) THEN INSERT INTO tmp_Msg_Error ( - guid - , id_type + id_type , code , msg ) SELECT - a_guid AS GUID - , v_id_type_error_bad_data + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT( + 'Invalid stock item(s): ' + , GROUP_CONCAT( + CONCAT( + IFNULL(t_SI.id_stock, '(No Stock Item)') + , ' - ' + , IFNULL(t_SI.name_error, '(No Product)') + ) SEPARATOR ', ' + ) + ) AS msg + FROM tmp_Stock_Item t_SI + LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_SI.id_permutation = PP.id_permutation + WHERE 1=1 + AND t_SI.id_stock > 0 + AND ISNULL(SI.id_stock) + ; + END IF; + -- id_product + IF EXISTS (SELECT * FROM tmp_Stock_Item t_SI WHERE t_SI.id_product = 0 LIMIT 1) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data , v_code_type_error_bad_data , CONCAT('The following stock item(s) do not have a product: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg FROM tmp_Stock_Item t_SI @@ -11929,14 +12219,12 @@ BEGIN LIMIT 1 ) THEN INSERT INTO tmp_Msg_Error ( - guid - , id_type + id_type , code , msg ) SELECT - a_guid AS GUID - , v_id_type_error_bad_data + v_id_type_error_bad_data , v_code_type_error_bad_data , CONCAT('A valid permutation could not be found for the variations selected for the following stock item(s): ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg FROM tmp_Stock_Item t_SI @@ -11951,14 +12239,12 @@ BEGIN -- date_purchased IF EXISTS (SELECT * FROM tmp_Stock_Item t_SI WHERE ISNULL(t_SI.date_purchased) LIMIT 1) THEN INSERT INTO tmp_Msg_Error ( - guid - , id_type + id_type , code , msg ) SELECT - a_guid AS GUID - , v_id_type_error_bad_data + v_id_type_error_bad_data , v_code_type_error_bad_data , CONCAT('The following stock item(s) do not have an purchase date: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg FROM tmp_Stock_Item t_SI @@ -11976,14 +12262,12 @@ BEGIN LIMIT 1 ) THEN INSERT INTO tmp_Msg_Error ( - guid - , id_type + id_type , code , msg ) SELECT - a_guid AS GUID - , v_id_type_error_bad_data + v_id_type_error_bad_data , v_code_type_error_bad_data , CONCAT('The following stock item(s) do not have a valid storage location: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg FROM tmp_Stock_Item t_SI @@ -11998,25 +12282,23 @@ BEGIN SELECT * FROM tmp_Stock_Item t_SI INNER JOIN partsltd_prod.Shop_Currency C - ON t_SI.id_curency_cost = C.id_currency + ON t_SI.id_currency_cost = C.id_currency AND C.active = 1 WHERE ISNULL(C.id_currency) LIMIT 1 ) THEN INSERT INTO tmp_Msg_Error ( - guid - , id_type + id_type , code , msg ) SELECT - a_guid AS GUID - , v_id_type_error_bad_data + v_id_type_error_bad_data , v_code_type_error_bad_data , CONCAT('The following stock item(s) do not have a valid cost currency: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg FROM tmp_Stock_Item t_SI INNER JOIN partsltd_prod.Shop_Currency C - ON t_SI.id_curency_cost = C.id_currency + ON t_SI.id_currency_cost = C.id_currency AND C.active = 1 WHERE ISNULL(C.id_currency) ; @@ -12033,14 +12315,12 @@ BEGIN LIMIT 1 ) THEN INSERT INTO tmp_Msg_Error ( - guid - , id_type + id_type , code , msg ) SELECT - a_guid AS GUID - , v_id_type_error_bad_data + v_id_type_error_bad_data , v_code_type_error_bad_data , CONCAT('The following stock item(s) do not have a valid cost excluding VAT: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg FROM tmp_Stock_Item t_SI @@ -12063,14 +12343,12 @@ BEGIN LIMIT 1 ) THEN INSERT INTO tmp_Msg_Error ( - guid - , id_type + id_type , code , msg ) SELECT - a_guid AS GUID - , v_id_type_error_bad_data + v_id_type_error_bad_data , v_code_type_error_bad_data , CONCAT('The following stock item(s) do not have a valid cost including VAT: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg FROM tmp_Stock_Item t_SI @@ -12082,87 +12360,71 @@ BEGIN ; END IF; -- date_received - IF EXISTS (SELECT * FROM tmp_Stock_Item t_SI WHERE ISNULL(t_SI.date_received) OR t_SI.date_received < t_SI.date_purchased LIMIT 1) THEN + IF EXISTS (SELECT * FROM tmp_Stock_Item t_SI WHERE NOT ISNULL(t_SI.date_received) AND t_SI.date_received < t_SI.date_purchased LIMIT 1) THEN INSERT INTO tmp_Msg_Error ( - guid - , id_type + id_type , code , msg ) SELECT - a_guid AS GUID - , v_id_type_error_bad_data + v_id_type_error_bad_data , v_code_type_error_bad_data , CONCAT('The following stock item(s) do not have a valid received date: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg FROM tmp_Stock_Item t_SI WHERE 1=1 - AND ( - ISNULL(t_SI.date_received) - OR t_SI.date_received < t_SI.date_purchased - ) + AND NOT ISNULL(t_SI.date_received) + AND t_SI.date_received < t_SI.date_purchased ; END IF; -- date_unsealed - IF EXISTS (SELECT * FROM tmp_Stock_Item t_SI WHERE ISNULL(t_SI.date_unsealed) OR t_SI.date_unsealed < t_SI.date_purchased LIMIT 1) THEN + IF EXISTS (SELECT * FROM tmp_Stock_Item t_SI WHERE NOT ISNULL(t_SI.date_unsealed) AND t_SI.date_unsealed < t_SI.date_purchased LIMIT 1) THEN INSERT INTO tmp_Msg_Error ( - guid - , id_type + id_type , code , msg ) SELECT - a_guid AS GUID - , v_id_type_error_bad_data + v_id_type_error_bad_data , v_code_type_error_bad_data , CONCAT('The following stock item(s) do not have a valid unsealed date: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg FROM tmp_Stock_Item t_SI WHERE 1=1 - AND ( - ISNULL(t_SI.date_unsealed) - OR t_SI.date_unsealed < t_SI.date_purchased - ) + AND NOT ISNULL(t_SI.date_received) + AND t_SI.date_received < t_SI.date_purchased ; END IF; -- date_expiration - IF EXISTS (SELECT * FROM tmp_Stock_Item t_SI WHERE ISNULL(t_SI.date_expiration) OR t_SI.date_expiration < t_SI.date_purchased LIMIT 1) THEN + IF EXISTS (SELECT * FROM tmp_Stock_Item t_SI WHERE NOT ISNULL(t_SI.date_expiration) AND t_SI.date_expiration < t_SI.date_purchased LIMIT 1) THEN INSERT INTO tmp_Msg_Error ( - guid - , id_type + id_type , code , msg ) SELECT - a_guid AS GUID - , v_id_type_error_bad_data + v_id_type_error_bad_data , v_code_type_error_bad_data , CONCAT('The following stock item(s) do not have a valid expiration date: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg FROM tmp_Stock_Item t_SI WHERE 1=1 - AND ( - ISNULL(t_SI.date_expiration) - OR t_SI.date_expiration < t_SI.date_purchased - ) + AND NOT ISNULL(t_SI.date_expiration) + AND t_SI.date_expiration < t_SI.date_purchased ; END IF; -- date_consumed - IF EXISTS (SELECT * FROM tmp_Stock_Item t_SI WHERE ISNULL(t_SI.date_consumed) OR t_SI.date_consumed < t_SI.date_purchased LIMIT 1) THEN + IF EXISTS (SELECT * FROM tmp_Stock_Item t_SI WHERE NOT ISNULL(t_SI.date_consumed) AND t_SI.date_consumed < t_SI.date_purchased LIMIT 1) THEN INSERT INTO tmp_Msg_Error ( - guid - , id_type + id_type , code , msg ) SELECT - a_guid AS GUID - , v_id_type_error_bad_data + v_id_type_error_bad_data , v_code_type_error_bad_data , CONCAT('The following stock item(s) do not have a valid consumed date: ', GROUP_CONCAT(IFNULL(t_SI.name_error, 'NULL') SEPARATOR ', ')) AS msg FROM tmp_Stock_Item t_SI WHERE 1=1 - AND ( - ISNULL(t_SI.date_consumed) - OR t_SI.date_consumed < t_SI.date_purchased - ) + AND NOT ISNULL(t_SI.date_consumed) + AND t_SI.date_consumed < t_SI.date_purchased ; END IF; @@ -12172,7 +12434,15 @@ BEGIN IF NOT ISNULL(v_ids_product_permission) THEN SET v_id_permission_product = (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_PRODUCT' LIMIT 1); - CALL p_shop_calc_user(a_guid, a_id_user, FALSE, v_id_permission_product, v_id_access_level_edit, v_ids_product_permission); + CALL p_shop_calc_user( + a_guid + , a_id_user + , FALSE -- a_get_inactive_users + , v_id_permission_product + , v_id_access_level_edit + , v_ids_product_permission + , 0 -- a_debug + ); UPDATE tmp_Stock_Item t_SI INNER JOIN Shop_Product P ON t_SI.id_product = P.id_product @@ -12185,7 +12455,10 @@ BEGIN , t_SI.can_admin = UE_T.can_admin ; - CALL p_shop_clear_calc_user(a_guid); + CALL p_shop_clear_calc_user( + a_guid + , 0 -- a_debug + ); IF EXISTS (SELECT * FROM tmp_Stock_Item t_SI WHERE IFNULL(t_SI.can_edit, 0) = 0 LIMIT 1) THEN INSERT INTO tmp_Msg_Error ( @@ -12209,14 +12482,22 @@ BEGIN START TRANSACTION; IF NOT ISNULL(v_ids_product_permission) THEN - INSERT INTO Shop_Product_Change_Set ( comment ) - VALUES ( a_comment ) + INSERT INTO Shop_Product_Change_Set ( + comment + , updated_last_by + ) + VALUES ( + a_comment, + a_id_user + ) ; SET v_id_change_set := LAST_INSERT_ID(); + -- select * from partsltd_prod.Shop_Stock_Item - UPDATE partsltd_prod.Shop_Stock_Item - INNER JOIN tmp_Stock_Item t_SI ON SI.id_stock = t_SI.id_stock + UPDATE partsltd_prod.Shop_Stock_Item SI + INNER JOIN tmp_Stock_Item t_SI + ON SI.id_stock = t_SI.id_stock SET SI.id_permutation = t_SI.id_permutation , SI.date_purchased = t_SI.date_purchased @@ -12280,10 +12561,22 @@ BEGIN COMMIT; END IF; - SELECT * FROM tmp_Msg_Error; + # Errors + SELECT * + FROM tmp_Msg_Error t_ME + INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type + ; + + IF a_debug = 1 THEN + SELECT * from tmp_Stock_Item; + END IF; DROP TEMPORARY TABLE IF EXISTS tmp_Stock_Item; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + + IF a_debug = 1 THEN + CALL partsltd_prod.p_debug_timing_reporting ( v_time_start ); + END IF; END // DELIMITER ;; @@ -12404,8 +12697,8 @@ BEGIN , date_received , id_location_storage , id_currency_cost - , cost_local_VAT_incl , cost_local_VAT_excl + , cost_local_VAT_incl , is_sealed , date_unsealed , date_expiration @@ -12421,12 +12714,12 @@ BEGIN , NULL -- id_permutation , NULL -- id_pairs_variations -- , FALSE -- 0 -- has_variations - , '05-09-2025' -- date_purchased + , '2025-09-05 00:00' -- date_purchased , NULL -- date_received , 1 -- id_location_storage , 1 -- id_currency_cost - , 10 -- cost_local_VAT_incl - , 12 -- cost_local_VAT_excl + , 10 -- cost_local_VAT_excl + , 12 -- cost_local_VAT_incl , 1 -- is_sealed , NULL -- date_unsealed , NULL -- date_expiration @@ -12447,7 +12740,7 @@ BEGIN 'Test save Stock_Item' -- comment , v_guid -- guid , 1 -- id_user - , 1 -- debug + , 0 -- debug ); SELECT * @@ -12461,11 +12754,11 @@ BEGIN END // DELIMITER ;; -/* CALL partsltd_prod.p_shop_save_stock_item_test (); DELETE FROM partsltd_prod.Shop_Stock_Item_Temp; +/* update shop_product p set p.has_variations = 0 where id_product = 4 DROP TABLE IF EXISTS tmp_Msg_Error; */-- USE partsltd_prod; @@ -15248,273 +15541,367 @@ DROP PROCEDURE IF EXISTS p_shop_save_supplier; DELIMITER // CREATE PROCEDURE p_shop_save_supplier ( - IN a_guid VARCHAR(500), - IN a_id_user INT, - IN a_comment VARCHAR(500), - IN a_id_supplier INT, - IN a_name_company VARCHAR(256), - IN a_name_contact VARCHAR(256), - IN a_department_contact VARCHAR(256), - IN a_id_address INT, - IN a_phone_number VARCHAR(20), - IN a_fax VARCHAR(20), - IN a_email VARCHAR(515), - IN a_website VARCHAR(300), - IN a_id_currency INT, - IN a_active BIT + IN a_comment VARCHAR(500) + , IN a_guid BINARY(36) + , IN a_id_user INT + , IN a_debug BIT ) BEGIN - DECLARE v_id_error_type_bad_data INT; - DECLARE v_id_error_type_no_permission INT; - DECLARE v_guid_permission BINARY(36); - DECLARE v_id_user VARCHAR(100); - DECLARE v_id_permission_supplier INT; - -- DECLARE v_id_access_level_EDIT INT; - DECLARE v_has_permission BIT; + DECLARE v_code_type_error_bad_data VARCHAR(50); + DECLARE v_code_type_error_no_permission VARCHAR(50); + DECLARE v_id_access_level_edit INT; DECLARE v_id_change_set INT; - DECLARE v_is_new_supplier BIT; + DECLARE v_id_permission_supplier INT; + DECLARE v_id_type_error_bad_data INT; + DECLARE v_id_type_error_no_permission INT; + DECLARE v_time_start TIMESTAMP(6); + + DECLARE exit handler for SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @sqlstate = RETURNED_SQLSTATE + , @errno = MYSQL_ERRNO + , @text = MESSAGE_TEXT + ; + + ROLLBACK; + + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( + display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT + , id_type INT NULL + , code VARCHAR(50) NOT NULL + , msg VARCHAR(4000) NOT NULL + ); + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + NULL + , @errno + , @text + ; + SELECT * + FROM tmp_Msg_Error; + DROP TABLE IF EXISTS tmp_Msg_Error; + END; + + SET v_time_start := CURRENT_TIMESTAMP(6); + SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1); + SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1); + SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION' LIMIT 1); + SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission LIMIT 1); + SET v_id_permission_supplier := (SELECT id_permission FROM partsltd_prod.Shop_Permission WHERE code = 'STORE_SUPPLIER' LIMIT 1); + SET v_id_access_level_EDIT := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'EDIT' LIMIT 1); - SET v_id_error_type_bad_data := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = 'BAD_DATA'); - SET v_guid_permission = UUID(); - SET v_id_user = CURRENT_USER(); - SET v_id_permission_supplier = (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_SUPPLIER' LIMIT 1); - -- SET v_id_access_level_EDIT = (SELECT id_access_level FROM Shop_Access_Level WHERE code = 'EDIT'); + CALL p_validate_guid ( a_guid ); + SET a_comment := TRIM(IFNULL(a_comment, '')); - -- Argument default values - IF a_guid IS NULL THEN - SET a_guid = UUID(); - END IF; - - - -- Temporary tables - /* - CREATE TABLE tmp_Shop_Supplier ( - id_supplier INT NOT NULL, - name_company VARCHAR(255) NOT NULL, - name_contact VARCHAR(255) NULL, - department_contact VARCHAR(255) NULL, - id_address INT NOT NULL, - CONSTRAINT FK_tmp_Shop_Supplier_id_address - FOREIGN KEY (id_address) - REFERENCES Shop_Address(id_address), - phone_number VARCHAR(50) NULL, - fax VARCHAR(50) NULL, - email VARCHAR(255) NOT NULL, - website VARCHAR(255) NULL, - id_currency INT NOT NULL, - CONSTRAINT FK_tmp_Shop_Supplier_id_currency - FOREIGN KEY (id_currency) - REFERENCES Shop_Currency(id_currency), - active BIT NOT NULL, - can_view BIT NOT NULL, - can_edit BIT NOT NULL, - can_admin BIT NOT NULL + DROP TEMPORARY TABLE IF EXISTS tmp_Supplier; + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + + CREATE TEMPORARY TABLE tmp_Supplier ( + id_supplier INT NOT NULL + , id_address INT NOT NULL + , id_currency INT NOT NULL + , name_company VARCHAR(255) NOT NULL + , name_contact VARCHAR(255) NULL + , department_contact VARCHAR(255) NULL + , phone_number VARCHAR(50) NULL + , fax VARCHAR(50) NULL + , email VARCHAR(255) NOT NULL + , website VARCHAR(255) NULL + , active BIT NOT NULL + , name_error VARCHAR(1000) NOT NULL + , is_new BIT NOT NULL ); - */ - CREATE 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 + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( + display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT + , id_type INT NOT NULL + , code VARCHAR(50) NOT NULL + , msg VARCHAR(4000) NOT NULL ); - -- Argument validation - IF a_id_supplier IS NULL THEN - INSERT INTO tmp_Msg_Error ( - guid, id_type, msg - ) - VALUES - (a_guid, v_id_error_type_bad_data, 'Supplier ID must not be null') - ; - END IF; - IF a_name_company IS NULL THEN - INSERT INTO tmp_Msg_Error ( - guid, id_type, msg - ) - VALUES - (a_guid, v_id_error_type_bad_data, 'Supplier company name must not be null') - ; - END IF; - IF a_id_address IS NULL THEN - INSERT INTO tmp_Msg_Error ( - guid, id_type, msg - ) - VALUES - (a_guid, v_id_error_type_bad_data, 'Address ID must not be null') - ; - END IF; - IF a_email IS NULL THEN - INSERT INTO tmp_Msg_Error ( - guid, id_type, msg - ) - VALUES - (a_guid, v_id_error_type_bad_data, 'Email must not be null') - ; - END IF; - IF a_active IS NULL THEN - INSERT INTO tmp_Msg_Error ( - guid, id_type, msg - ) - VALUES - (a_guid, v_id_error_type_bad_data, 'Active must not be null') - ; - END IF; + INSERT INTO tmp_Supplier ( + id_supplier + , id_address + , id_currency + , name_company + , name_contact + , department_contact + , phone_number + , fax + , email + , website + , active + , name_error + , is_new + ) + SELECT + S_T.id_supplier + , S_T.id_address + , S_T.id_currency + , S_T.name_company + , S_T.name_contact + , S_T.department_contact + , S_T.phone_number + , S_T.fax + , S_T.email + , S_T.website + , S_T.active + , IFNULL(S_T.name_company, IFNULL(S_T.email, IFNULL(S_T.website, IFNULL(S_T.name_contact, '(No Supplier)')))) + , IFNULL(S_T.id_supplier, 0) < 1 + FROM partsltd_prod.Shop_Supplier_Temp S_T + WHERE GUID = a_guid + ; - - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN - SET v_is_new_supplier := CASE WHEN a_id_supplier <= 0 THEN 1 ELSE 0 END; - - IF (v_is_new_supplier = 0 AND NOT EXISTS (SELECT * FROM Shop_Supplier S WHERE S.id_supplier = a_id_supplier)) THEN - INSERT INTO tmp_Msg_Error ( - guid, id_type, msg + -- Validation + # id_address + IF EXISTS ( + SELECT * + FROM tmp_Supplier t_S + LEFT JOIN partsltd_prod.Shop_Address A ON t_S.id_address = A.id_address + WHERE 1=1 + AND ( + t_S.id_address = 0 + OR A.active = 0 ) - VALUES - (a_guid, v_id_error_type_bad_data, CONCAT('Invalid supplier ID: ', a_id_supplier)) - ; - END IF; - END IF; - - /* - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN - INSERT INTO tmp_Shop_Supplier ( - id_supplier, name_company, name_contact, department_contact, id_address, phone_number, fax, email, website, id_currency, active + LIMIT 1 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg ) - 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) - /* - FROM Shop_Supplier S - WHERE (NOT v_has_filter_category OR C.id_category LIKE '%' || a_ids_category || '%') - AND (a_get_inactive_categories OR C.active) - * - ; + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT( + 'The following supplier(s) have an invalid or inactive Address: ' + , GROUP_CONCAT(t_S.name_error SEPARATOR ', ') + ) AS msg + FROM tmp_Supplier t_S + LEFT JOIN partsltd_prod.Shop_Address A ON t_S.id_address = A.id_address + WHERE 1=1 + AND ( + t_S.id_address = 0 + OR A.active = 0 + ) + ; END IF; - */ - + # id_currency + IF EXISTS ( + SELECT * + FROM tmp_Supplier t_S + LEFT JOIN partsltd_prod.Shop_Currency C ON t_S.id_currency = C.id_currency + WHERE 1=1 + AND ( + t_S.id_currency = 0 + OR C.active = 0 + ) + LIMIT 1 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT( + 'The following supplier(s) have an invalid or inactive Currency: ' + , GROUP_CONCAT(t_S.name_error SEPARATOR ', ') + ) AS msg + FROM tmp_Supplier t_S + LEFT JOIN partsltd_prod.Shop_Currency C ON t_S.id_currency = C.id_currency + WHERE 1=1 + AND ( + t_S.id_currency = 0 + OR C.active = 0 + ) + ; + END IF; + # name_company + IF EXISTS (SELECT * FROM tmp_Supplier t_S WHERE ISNULL(t_S.name_company) LIMIT 1) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT('The following supplier(s) do not have a name: ', GROUP_CONCAT(IFNULL(t_S.name_error, 'NULL') SEPARATOR ', ')) AS msg + FROM tmp_Supplier t_S + WHERE ISNULL(t_S.name_company) + ; + END IF; + # email + IF EXISTS (SELECT * FROM tmp_Supplier t_S WHERE ISNULL(t_S.email) LIMIT 1) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT('The following supplier(s) do not have an email: ', GROUP_CONCAT(IFNULL(t_S.name_error, 'NULL') SEPARATOR ', ')) AS msg + FROM tmp_Supplier t_S + WHERE ISNULL(t_S.email) + ; + END IF; + -- Permissions - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN - CALL p_shop_calc_user(v_guid_permission, v_id_user, v_id_permission_supplier, ''); - - /* - 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); - - 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_supplier - ; - END IF; - - -- CALL p_shop_clear_calc_user(v_guid_permission); - - DELETE FROM Shop_Calc_User_Temp - WHERE GUID = a_guid; - END IF; + IF a_debug = 1 THEN + SELECT + v_guid + , a_id_user + , FALSE -- get inactive users + , v_id_permission_supplier + , v_id_access_level_edit + , '' -- ids_product + , 0 -- a_debug + ; + SELECT * from partsltd_prod.Shop_Calc_User_Temp; + END IF; + + CALL p_shop_calc_user( + v_guid + , a_id_user + , FALSE -- get inactive users + , v_id_permission_supplier + , v_id_access_level_edit + , '' -- ids_product + , 0 -- a_debug + ); + + IF a_debug = 1 THEN + SELECT * from partsltd_prod.Shop_Calc_User_Temp WHERE GUID = a_guid; + END IF; + + IF NOT EXISTS (SELECT can_view FROM partsltd_prod.Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = v_guid) THEN + DELETE FROM tmp_Msg_Error; + + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + VALUES ( + v_id_type_error_no_permission + , v_code_type_error_no_permission + , CONCAT('You do not have view permissions for ', (SELECT name FROM partsltd_prod.Shop_Permission WHERE id_permission = v_id_permission_supplier LIMIT 1)) + ) + ; + END IF; + + CALL partsltd_prod.p_shop_clear_calc_user( a_guid ); + + IF EXISTS ( SELECT * FROM tmp_Msg_Error LIMIT 1 ) THEN + DELETE FROM tmp_Supplier; + END IF; -- Transaction - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN - INSERT INTO Shop_Sales_And_Purchasing_Change_Set ( - comment, - updated_last_by, - updated_last_on - ) - VALUES ( - CONCAT( - 'Save ', - CASE WHEN v_is_new_supplier = 1 THEN 'new ' ELSE '' END, - 'Supplier - ', - 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 NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN START TRANSACTION; - IF (v_is_new_supplier = 1) THEN - INSERT INTO Shop_Supplier ( - -- id_supplier, - name_company, name_contact, department_contact, id_address, phone_number, fax, email, website, id_currency, active, id_change_set - ) - 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, v_id_change_set - ) + INSERT INTO partsltd_prod.Shop_Sales_And_Purchasing_Change_Set ( + comment + , updated_last_by + , updated_last_on + ) + VALUES ( + a_comment + , a_id_user + , v_time_start + ); + + SET v_id_change_set := LAST_INSERT_ID(); + + INSERT INTO partsltd_prod.Shop_Supplier ( + -- id_supplier, + id_address + , id_currency + , name_company + , name_contact + , department_contact + , phone_number + , fax + , email + , website + , active + , id_change_set + ) + SELECT + t_S.id_address + , t_S.id_currency + , t_S.name_company + , t_S.name_contact + , t_S.department_contact + , t_S.phone_number + , t_S.fax + , t_S.email + , t_S.website + , t_S.active + v_id_change_set + FROM tmp_Supplier t_S + WHERE t_S.is_new = 1 + ; + + UPDATE partsltd_prod.Shop_Supplier S + INNER JOIN tmp_Supplier t_S + ON S.id_supplier = t_S.id_supplier + AND t_S.is_new = 0 + SET + S.id_address = t_S.id_address + , S.id_currency = t_S.id_currency + , S.name_company = t_S.name_company + , S.name_contact = t_S.name_contact + , S.department_contact = t_S.department_contact + , S.phone_number = t_S.phone_number + , S.fax = t_S.fax + , S.email = t_S.email + , S.website = t_S.website + , S.active = t_S.active + , S.id_change_set = v_id_change_set /* - FROM Shop_Supplier S - WHERE (NOT v_has_filter_category OR C.id_category LIKE '%' || a_ids_category || '%') - AND (a_get_inactive_categories OR C.active) + S.name_company = a_name_company, + S.name_contact = a_name_contact, + S.department_contact = a_department_contact, + S.id_address = a_id_address, + S.phone_number = a_phone_number, + S.fax = a_fax, + S.email = a_email, + S.website = a_website, + S.id_currency = a_id_currency, + S.active = a_active, + S.id_change_set = v_id_change_set */ - ; - ELSE - UPDATE Shop_Supplier S - -- INNER JOIN tmp_Shop_Supplier t_S ON S.id_supplier = t_S.id_supplier - SET - /* - S.name_company = t_S.name_company, - S.name_contact = t_S.name_contact, - S.department_contact = t_S.department_contact, - S.id_address = t_S.id_address, - S.phone_number = t_S.phone_number, - S.fax = t_S.fax, - S.email = t_S.email, - S.website = t_S.website, - S.id_currency = t_S.id_currency, - S.active = t_S.active - */ - S.name_company = a_name_company, - S.name_contact = a_name_contact, - S.department_contact = a_department_contact, - S.id_address = a_id_address, - S.phone_number = a_phone_number, - S.fax = a_fax, - S.email = a_email, - S.website = a_website, - S.id_currency = a_id_currency, - S.active = a_active, - S.id_change_set = v_id_change_set - ; - END IF; - - IF EXISTS (SELECT * FROM tmp_Msg_Error) THEN - ROLLBACK; - ELSE - COMMIT; - END IF; + ; + COMMIT; END IF; - -- Returns - -- SET v_now = NOW(); - # Errors SELECT * - FROM tmp_Msg_Error + FROM tmp_Msg_Error t_ME + INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type ; - DROP TABLE tmp_Shop_Supplier; - DROP TABLE tmp_Msg_Error; + IF a_debug = 1 THEN + SELECT * from tmp_Supplier; + END IF; + + DROP TEMPORARY TABLE tmp_Supplier; + DROP TEMPORARY TABLE tmp_Msg_Error; + + IF a_debug = 1 THEN + CALL partsltd_prod.p_debug_timing_reporting ( v_time_start ); + END IF; END // DELIMITER ;; @@ -15523,244 +15910,254 @@ DELIMITER ;; - -/* - -CALL p_shop_get_many_supplier ( - '', # a_id_user - 1, # a_get_all_supplier - 0, # a_get_inactive_supplier - 0, # a_get_first_supplier_only - '', # a_ids_supplier -); - -*/ - - --- Clear previous proc DROP PROCEDURE IF EXISTS p_shop_get_many_supplier; - DELIMITER // CREATE PROCEDURE p_shop_get_many_supplier ( - IN a_id_user INT, - IN a_get_all_supplier BIT, - IN a_get_inactive_supplier BIT, - IN a_get_first_supplier_only BIT, - IN a_ids_supplier VARCHAR(4000) + IN a_id_user INT + , IN a_get_all_supplier BIT + , IN a_get_inactive_supplier BIT + , IN a_ids_supplier TEXT + , IN a_debug BIT ) BEGIN - -- Argument redeclaration - -- Variable declaration - DECLARE v_has_filter_supplier BIT; + DECLARE v_code_type_error_bad_data VARCHAR(50); + DECLARE v_code_type_error_no_permission VARCHAR(50); DECLARE v_guid BINARY(36); - # DECLARE v_id_user VARCHAR(100); - # DECLARE v_ids_permutation_unavailable VARCHAR(4000); - DECLARE v_id_permission_supplier INT; - # DECLARE v_ids_product_permission VARCHAR(4000); - # DECLARE v_ids_permutation_permission VARCHAR(4000); + DECLARE v_has_filter_supplier BIT; DECLARE v_id_access_level_view INT; - DECLARE v_now DATETIME; - DECLARE v_id_minimum INT; - DECLARE v_code_error_data VARCHAR(50); - + DECLARE v_id_permission_supplier INT; + DECLARE v_id_type_error_bad_data INT; + DECLARE v_id_type_error_no_permission INT; + DECLARE v_time_start TIMESTAMP(6); + SET v_time_start := CURRENT_TIMESTAMP(6); SET v_guid := UUID(); - SET v_id_access_level_view := (SELECT id_access_level FROM 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_access_level_view := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'VIEW' LIMIT 1); + SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1); + SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1); + SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION'); + SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission); + SET v_id_permission_supplier := (SELECT id_permission FROM partsltd_prod.Shop_Permission WHERE code = 'STORE_SUPPLIER' LIMIT 1); - -- Argument validation + default values - IF a_id_user IS NULL THEN - SET a_id_user = ''; - ELSE - SET a_id_user = TRIM(a_id_user); - END IF; - IF a_get_all_supplier IS NULL THEN - SET a_get_all_supplier = 1; - END IF; - IF a_get_inactive_supplier IS NULL THEN - SET a_get_inactive_supplier = 0; - END IF; - IF a_get_first_supplier_only IS NULL THEN - SET a_get_first_supplier_only = 0; - END IF; - IF a_ids_supplier IS NULL THEN - SET a_ids_supplier = ''; - ELSE - SET a_ids_supplier = TRIM(REPLACE(a_ids_supplier, '|', ',')); - END IF; + SET a_get_all_supplier := IFNULL(a_get_all_supplier, 0); + SET a_get_inactive_supplier := IFNULL(a_get_inactive_supplier, 0); + SET a_ids_supplier := TRIM(IFNULL(a_ids_supplier, '')); - -- Temporary tables - DROP TABLE IF EXISTS tmp_Shop_Supplier; + DROP TEMPORARY TABLE IF EXISTS tmp_Supplier; + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + DROP TEMPORARY TABLE IF EXISTS tmp_Split; - CREATE TABLE tmp_Shop_Supplier ( - id_supplier INT NOT NULL, - CONSTRAINT FK_tmp_Shop_Supplier_id_supplier - FOREIGN KEY (id_supplier) - REFERENCES Shop_Supplier(id_supplier), - active BIT NOT NULL, - rank_supplier INT NULL + CREATE TEMPORARY TABLE tmp_Supplier ( + id_supplier INT NOT NULL ); - CREATE TABLE IF NOT EXISTS tmp_Msg_Error ( + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT, - 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 ); + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split ( + substring VARCHAR(4000) NOT NULL + , as_int INT NULL + ); + DELETE FROM tmp_Split; + -- Parse filters SET v_has_filter_supplier = CASE WHEN a_ids_supplier = '' THEN 0 ELSE 1 END; - -- select v_has_filter_product, v_has_filter_permutation; - - IF v_has_filter_supplier = 1 OR a_get_all_supplier = 1 THEN - CALL p_split(a_guid, a_ids_supplier, ','); - - IF EXISTS (SELECT * FROM Split_Temp S_T LEFT JOIN Shop_Supplier S ON S_T.substring = S.id_supplier WHERE ISNULL(S.id_supplier)) THEN - INSERT INTO tmp_Msg_Error ( - guid, - code, - msg - ) - VALUES ( - v_guid, - v_code_error_data, - CONCAT('Invalid supplier IDs: ', (SELECT GROUP_CONCAT(S.id_supplier) FROM Temp_Split TS LEFT JOIN Shop_Supplier S ON TS.substring = S.id_supplier WHERE ISNULL(S.id_supplier))) - ) - ; - ELSE - INSERT INTO tmp_Shop_Supplier ( - id_supplier, - active, - rank_supplier - ) - SELECT - S.id_supplier, - S.active, - RANK() OVER (ORDER BY id_supplier ASC) AS rank_supplier - FROM Shop_Supplier S - LEFT JOIN Split_Temp S_T ON S.id_supplier = S_T.substring - WHERE - ( - a_get_all_supplier = 1 - OR NOT ISNULL(S_T.substring) - ) - AND ( - a_get_inactive_supplier - OR S.active = 1 - ) - ; - END IF; - - DROP TABLE Split_Temp; - - IF a_get_first_supplier_only THEN - DELETE t_S - FROM tmp_Shop_Supplier t_S - WHERE t_S.rank_supplier > 1 /*( - SELECT MIN(t_S.rank_supplier) - FROM tmp_Shop_Supplier t_S - ) */ - ; - END IF; + IF a_debug = 1 THEN + SELECT + v_has_filter_supplier + ; END IF; - - -- Permissions - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN - # SET v_id_user := (SELECT id_user FROM Shop_User WHERE name = CURRENT_USER()); - SET v_id_permission_supplier := (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_SUPPLIER' LIMIT 1); - - -- SELECT v_guid, a_id_user, false, v_id_permission_product, v_id_access_level_view, v_ids_permutation_permission; - -- select * from Shop_Calc_User_Temp; - - CALL p_shop_calc_user(v_guid, a_id_user, FALSE, v_id_permission_supplier, v_id_access_level_view, ''); - - -- select * from Shop_Calc_User_Temp; - - IF NOT EXISTS (SELECT can_view FROM Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = v_guid) THEN - INSERT INTO tmp_Msg_Error ( - guid, - code, - msg - ) - VALUES ( - v_guid, - v_code_error_data, - CONCAT('You do not have view permissions for ', (SELECT name FROM Shop_Permission WHERE id_permission = v_id_permission_supplier LIMIT 1)) - ) - ; - END IF; + + -- Suppliers + IF v_has_filter_supplier = 1 THEN + CALL partsltd_prod.p_split(a_guid, a_ids_supplier, ',', a_debug); + + INSERT INTO tmp_Split ( + substring + , as_int + ) + SELECT + substring + , CONVERT(substring, DECIMAL(10,0)) AS as_int + FROM partsltd_prod.Split_Temp + WHERE 1=1 + AND GUID = a_guid + AND NOT ISNULL(substring) + AND substring != '' + ; + + CALL partsltd_prod.p_clear_split_temp( a_guid ); END IF; + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN + IF EXISTS ( + SELECT * + FROM tmp_Split t_S + LEFT JOIN partsltd_prod.Shop_Supplier S ON t_S.as_int = S.id_supplier + WHERE + ISNULL(t_S.as_int) + OR ISNULL(S.id_supplier) + OR ( + S.active = 0 + AND a_get_inactive_supplier = 0 + ) + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type, + code, + msg + ) + SELECT + v_id_type_error_bad_data, + v_code_type_error_bad_data, + CONCAT('Invalid or inactive Supplier IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL')) + FROM tmp_Split t_S + LEFT JOIN partsltd_prod.Shop_Supplier S ON t_S.as_int = S.id_supplier + WHERE + ISNULL(t_S.as_int) + OR ISNULL(S.id_supplier) + OR ( + S.active = 0 + AND a_get_inactive_supplier = 0 + ) + ; + ELSE + INSERT INTO tmp_Supplier ( + id_supplier + ) + SELECT + S.id_supplier + FROM tmp_Split t_S + RIGHT JOIN partsltd_prod.Shop_Supplier S ON t_S.as_int = S.id_supplier + WHERE ( + a_get_all_supplier = 1 + OR ( + v_has_filter_supplier = 1 + AND NOT ISNULL(t_S.as_int) + ) + ) + AND ( + a_get_inactive_supplier = 1 + OR S.active = 1 + ) + ; + END IF; + END IF; - -- select * from tmp_Shop_Product; + DELETE FROM tmp_Split; + + -- Permissions + IF a_debug = 1 THEN + SELECT + v_guid + , a_id_user + , FALSE -- get inactive users + , v_id_permission_supplier + , v_id_access_level_view + , '' -- ids_product + , 0 -- a_debug + ; + SELECT * from Shop_Calc_User_Temp; + END IF; + + CALL p_shop_calc_user( + v_guid + , a_id_user + , FALSE -- get inactive users + , v_id_permission_supplier + , v_id_access_level_view + , '' -- ids_product + , 0 -- a_debug + ); + + IF a_debug = 1 THEN + SELECT * from Shop_Calc_User_Temp; + END IF; + + IF NOT EXISTS (SELECT can_view FROM Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = v_guid) THEN + DELETE FROM tmp_Msg_Error; + + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + VALUES ( + v_id_type_error_no_permission + , v_code_type_error_no_permission + , CONCAT('You do not have view permissions for ', (SELECT name FROM Shop_Permission WHERE id_permission = v_id_permission_supplier LIMIT 1)) + ) + ; + END IF; - -- Returns - SET v_now := NOW(); + IF EXISTS ( SELECT * FROM tmp_Msg_Error LIMIT 1 ) THEN + DELETE FROM tmp_Supplier; + END IF; + -- Returns # Suppliers SELECT t_S.id_supplier, + S.id_address, + -- SA.postcode, + S.id_currency, + C.symbol AS symbol_currency, + C.code AS code_currency, S.name_company, - name_contact, - department_contact, - id_address, - phone_number, - fax, - email, - website, - id_currency, - t_S.active - FROM tmp_Shop_Supplier t_S - INNER JOIN Shop_Supplier S - ON t_S.id_supplier = S.id_supplier + S.name_contact, + S.department_contact, + S.phone_number, + S.fax, + S.email, + S.website, + S.active + FROM tmp_Supplier t_S + INNER JOIN partsltd_prod.Shop_Supplier S ON t_S.id_supplier = S.id_supplier + LEFT JOIN partsltd_prod.Shop_Supplier_Address SA ON S.id_address = SA.id_address + LEFT JOIN partsltd_prod.Shop_Currency C ON S.id_currency = C.id_currency + ; + + # Supplier Addresses + SELECT + t_S.id_supplier + , S.id_address + , SA.id_region + , R.name AS name_region + , SA.address_line_1 + , SA.address_line_2 + , SA.city + , SA.county + , SA.postcode + FROM tmp_Supplier t_S + INNER JOIN partsltd_prod.Shop_Supplier S ON t_S.id_supplier = S.id_supplier + LEFT JOIN partsltd_prod.Shop_Supplier_Address SA ON S.id_address = SA.id_address + LEFT JOIN partsltd_prod.Shop_Region R ON SA.id_region = R.id_region ; # Errors - SELECT - /* - t_ME.display_order, - t_ME.guid, - t_ME.id_type, - t_ME.msg, - MET.code, - MET.name, - MET.description - */ - * + SELECT * FROM tmp_Msg_Error t_ME - INNER JOIN Shop_Msg_Error_Type MET - ON t_ME.id_type = MET.id_type - WHERE guid = v_guid + INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type ; - /* - # Return arguments for test - SELECT - a_ids_category, - a_get_inactive_category, - a_ids_product, - a_get_inactive_product, - a_get_first_product_only, - a_get_all_product, - a_ids_image, - a_get_inactive_image, - a_get_first_image_only, - a_get_all_image - ; - */ - - # select 'other outputs'; - # select * from tmp_Shop_Product; - - -- Clean up - DROP TABLE IF EXISTS tmp_Supplier; + IF a_debug = 1 THEN + SELECT * from tmp_Supplier; + END IF; + + DROP TEMPORARY TABLE IF EXISTS tmp_Supplier; + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + DROP TEMPORARY TABLE IF EXISTS tmp_Split; + + IF a_debug = 1 THEN + CALL p_debug_timing_reporting( v_time_start ); + END IF; END // DELIMITER ;; @@ -15768,24 +16165,13 @@ DELIMITER ;; /* CALL p_shop_get_many_supplier ( - 'auth0|6582b95c895d09a70ba10fef', # a_id_user - 1, # a_get_all_supplier - 0, # a_get_inactive_supplier - 0, # a_get_first_supplier_only - '' # a_ids_supplier + 1 -- 'auth0|6582b95c895d09a70ba10fef' # a_id_user + , 1 # a_get_all_supplier + , 0 # a_get_inactive_supplier + , '' # a_ids_supplier + , 0 # a_debug ); -select * from shop_supplier; -select * from shop_product; -select * from TMP_MSG_ERROR; -DROP TABLE TMP_MSG_ERROR; - -insert into shop_product_change_set (comment) - values ('set product not subscription - test bool output to python'); - update shop_product - set is_subscription = 0, - id_change_set = (select id_change_set from shop_product_change_set order by id_change_set desc limit 1) - where id_product = 1 */ @@ -15793,491 +16179,675 @@ insert into shop_product_change_set (comment) -- Clear previous proc DROP PROCEDURE IF EXISTS p_shop_save_supplier_purchase_order; -DROP TABLE IF EXISTS tmp_Shop_Supplier_Purchase_Order_Product_Link; +DROP TABLE IF EXISTS tmp_Supplier_Purchase_Order_Product_Link; DROP TABLE IF EXISTS tmp_Msg_Error; DELIMITER // CREATE PROCEDURE p_shop_save_supplier_purchase_order ( - IN a_guid VARCHAR(500), - IN a_id_user INT, - IN a_comment VARCHAR(500), - 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) + , IN a_guid BINARY(36) + , IN a_id_user INT + , IN a_debug BIT ) 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_supplier_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_code_type_error_bad_data VARCHAR(50); + DECLARE v_code_type_error_no_permission VARCHAR(50); + DECLARE v_code_type_error_warning VARCHAR(50); + DECLARE v_id_access_level_edit INT; DECLARE v_id_change_set INT; - DECLARE v_is_new_supplier_purchase_order BIT; + DECLARE v_id_permission_supplier_purchase_order VARCHAR(100); + DECLARE v_id_type_error_bad_data INT; + DECLARE v_id_type_error_no_permission INT; + DECLARE v_id_type_error_warning INT; + DECLARE v_ids_product_permission TEXT; + DECLARE v_time_start TIMESTAMP(6); + + DECLARE exit handler for SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @sqlstate = RETURNED_SQLSTATE + , @errno = MYSQL_ERRNO + , @text = MESSAGE_TEXT + ; + + ROLLBACK; + + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( + display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT + , id_type INT NULL + , code VARCHAR(50) NOT NULL + , msg VARCHAR(4000) NOT NULL + ); + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + NULL + , @errno + , @text + ; + SELECT * + FROM tmp_Msg_Error; + DROP TABLE IF EXISTS tmp_Msg_Error; + END; - -- SET SESSION sql_mode = sys.list_drop(@@session.sql_mode, 'ONLY_FULL_GROUP_BY'); + SET v_time_start := CURRENT_TIMESTAMP(6); + SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA'); + SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data); + SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION'); + SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission); + SET v_code_type_error_warning := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'WARNING'); + SET v_id_type_error_warning := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_warning); + SET v_id_permission_supplier_purchase_order := (SELECT GROUP_CONCAT(id_permission SEPARATOR ',') FROM partsltd_prod.Shop_Permission WHERE code IN ('STORE_SUPPLIER', 'STORE_SUPPLIER_PURCHASE_ORDER', 'STORE_PRODUCT') LIMIT 1); + SET v_id_access_level_edit := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'EDIT' LIMIT 1); - 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_supplier_purchase_order := (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_SUPPLIER_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; - */ + CALL p_validate_guid ( a_guid ); + SET a_comment := TRIM(IFNULL(a_comment, '')); + DROP TEMPORARY TABLE IF EXISTS tmp_Supplier; + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + -- 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_Supplier_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_Supplier_Purchase_Order(id_order), - */ - id_permutation INT NOT NULL, - CONSTRAINT FK_tmp_Supplier_Purchase_Order_Product_Link_id_permutation - FOREIGN KEY (id_permutation) - REFERENCES Shop_Product_Permutation(id_permutation), - cost_total_local FLOAT NOT NULL, - id_currency_cost INT NOT NULL, - quantity_ordered FLOAT NOT NULL, - id_unit_quantity INT NOT NULL, - CONSTRAINT FK_tmp_Supplier_Purchase_Order_Product_Link_id_unit_quantity - FOREIGN KEY (id_unit_quantity) - REFERENCES Shop_Unit_Measurement(id_unit_measurement), - quantity_received FLOAT NULL, - latency_delivery_days INT NOT NULL, - display_order INT NOT NULL, - active BIT NOT NULL, - name_error VARCHAR(200) NOT NULL + CREATE TEMPORARY TABLE tmp_Supplier_Purchase_Order ( + id_order INT NOT NULL PRIMARY KEY + , id_supplier_ordered INT NOT NULL + , id_currency_cost INT NOT NULL + -- , cost_total_local FLOAT NOT NULL + , active BIT NOT NULL ); - CREATE TABLE IF NOT EXISTS tmp_Msg_Error ( - display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT, - guid BINARY(36) NOT NULL, - id_type INT NOT NULL, - CONSTRAINT FK_tmp_Msg_Error_id_type - FOREIGN KEY (id_type) - REFERENCES Shop_Msg_Error_Type (id_type), - code VARCHAR(50) NOT NULL, - msg VARCHAR(4000) NOT NULL + CREATE TEMPORARY TABLE tmp_Supplier_Purchase_Order_Product_Link ( + id_link INT NOT NULL PRIMARY KEY + , id_order INT NOT NULL + , id_permutation INT NOT NULL + -- , id_currency_cost INT NOT NULL + , quantity_ordered FLOAT NOT NULL + , id_unit_quantity INT NOT NULL + , quantity_received FLOAT NULL + , latency_delivery_days INT NOT NULL + , display_order INT NOT NULL + , active BIT NOT NULL + , name_error VARCHAR(200) NOT NULL + , cost_total_local_VAT_excl FLOAT NOT NULL + , cost_total_local_VAT_incl FLOAT NOT NULL + , cost_unit_local_VAT_excl FLOAT NOT NULL + , cost_unit_local_VAT_incl FLOAT NOT NULL + , has_order BIT NULL + ); + + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( + display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT + , id_type INT NOT NULL + , code VARCHAR(50) NOT NULL + , msg VARCHAR(4000) NOT NULL ); - - -- 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_Supplier_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 Supplier 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; - + INSERT INTO tmp_Supplier_Purchase_Order ( + id_order + , id_supplier_ordered + , id_currency_cost + ) + SELECT + SPO_T.id_order + , IFNULL(IFNULL(SPO_T.id_supplier_ordered, SPO.id_supplier_ordered), 0) AS id_supplier_ordered + , IFNULL(IFNULL(SPO_T.id_currency_cost, SPO.id_currency_cost), 0) AS id_currency_cost + FROM partsltd_prod.Shop_Supplier_Purchase_Order_Temp SPO_T + LEFT JOIN partsltd_prod.Shop_Supplier_Purchase_Order SPO ON SPO_T.id_order = SPO.id_order + WHERE SPO_T.GUID = a_guid + ; - -- Get data from Temp table - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN - SET v_is_new_supplier_purchase_order := CASE WHEN a_id_order <= 0 THEN 1 ELSE 0 END; - - INSERT INTO tmp_Shop_Supplier_Purchase_Order_Product_Link ( - id_link, - id_order, - id_permutation, - cost_total_local, - id_currency_cost, - quantity_ordered, - id_unit_quantity, - quantity_received, - latency_delivery_days, - display_order, - active, - name_error + INSERT INTO tmp_Supplier_Purchase_Order_Product_Link ( + id_link + , id_order + , id_permutation + -- , id_currency_cost + , id_unit_quantity + , quantity_ordered + , quantity_received + , latency_delivery_days + , display_order + , active + , name_error + , is_new + , cost_total_local_VAT_excl + , cost_total_local_VAT_incl + , cost_unit_local_VAT_excl + , cost_unit_local_VAT_incl + , has_order + ) + SELECT + IFNULL(SPOPL_T.id_link, 0) AS id_link + , IFNULL(IFNULL(SPOPL_T.id_order, SPOPL.id_order), 0) AS id_order + , IFNULL(IFNULL(SPOPL_T.id_permutation, SPOPL.id_permutation), 0) AS id_permutation + -- , IFNULL(IFNULL(SPOPL_T.id_currency_cost, SPOPL.id_currency_cost), 0) AS id_currency_cost + , IFNULL(IFNULL(SPOPL_T.id_unit_quantity, SPOPL.id_unit_quantity), 0) AS id_unit_quantity + , IFNULL(IFNULL(SPOPL_T.quantity_ordered, SPOPL.quantity_ordered), 0) AS quantity_ordered + , IFNULL(SPOPL_T.quantity_received, SPOPL.quantity_received) AS quantity_received + , IFNULL(SPOPL_T.latency_delivery_days, SPOPL.latency_delivery_days) AS latency_delivery_days + , RANK() OVER (PARTITION BY IFNULL(IFNULL(SPOPL_T.id_order, SPOPL.id_order), 0) ORDER BY IFNULL(IFNULL(SPOPL_T.display_order, SPOPL.display_order), 0)) AS display_order + , IFNULL(IFNULL(SPOPL_T.active, SPOPL.active), 1) AS active + , CONCAT( + fn_shop_get_product_permutation_name(SPOPL_T.id_permutation) + , ' - x' + , IFNULL(SPOPL_T.quantity_ordered, '(No Quantity)') + ) AS name_error + , IFNULL(SPOPL_T.id_link, 0) < 1 AS is_new + , IFNULL(IFNULL(SPOPL_T.cost_total_local_VAT_excl, SPOPL.cost_total_local_VAT_excl), 0) AS cost_total_local_VAT_excl + , IFNULL(IFNULL(SPOPL_T.cost_total_local_VAT_incl, SPOPL.cost_total_local_VAT_incl), 0) AS cost_total_local_VAT_incl + , IFNULL(SPOPL_T.cost_total_local_VAT_excl / SPOPL_T.quantity_ordered, SPOPL.cost_unit_local_VAT_excl) AS cost_unit_local_VAT_excl + , IFNULL(SPOPL_T.cost_total_local_VAT_incl / SPOPL_T.quantity_ordered, SPOPL.cost_unit_local_VAT_incl) AS cost_unit_local_VAT_incl + , NOT ISNULL(t_SPO.id_order) AS has_order + FROM partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link_Temp SPOPL_T + LEFT JOIN partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link SPOPL ON SPOPL_T.id_link = SPOPL.id_link + LEFT JOIN tmp_Supplier_Purchase_Order t_SPO ON SPOPL_T.id_order = t_SPO.id_order + WHERE SPOPL_T.GUID = a_guid + ; + + INSERT INTO tmp_Supplier_Purchase_Order ( + id_order + , id_supplier_ordered + , id_currency_cost + ) + SELECT + SPO_T.id_order + , IFNULL(IFNULL(SPO_T.id_supplier_ordered, SPO.id_supplier_ordered), 0) AS id_supplier_ordered + , IFNULL(IFNULL(SPO_T.id_currency_cost, SPO.id_currency_cost), 0) AS id_currency_cost + FROM partsltd_prod.Shop_Supplier_Purchase_Order SPO + INNER JOIN tmp_Supplier_Purchase_Order_Product_Link t_SPOPL + ON SPO.id_order = t_SPOPL.id_order + AND t_SPOPL.has_order = 0 + ; + + -- Validation + -- Supplier Purchase Order + # id_order + IF EXISTS ( + SELECT * + FROM tmp_Supplier_Purchase_Order t_SPO + LEFT JOIN partsltd_prod.Shop_Supplier_Purchase_Order SPO ON t_SPO.id_order = SPO.id_order + WHERE 1=1 + AND t_SPO.id_order > 0 + AND ISNULL(SPO.id_order) + LIMIT 1 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg ) - /* - 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 - SPOPL_T.id_link, - SPOPL_T.id_order, - SPOPL_T.id_permutation, - PP.cost_local * quantity_ordered AS cost_total_local, - SPOPL_T.id_currency_cost, - SPOPL_T.quantity_ordered, - SPOPL_T.id_unit_quantity, - SPOPL_T.quantity_received, - SPOPL_T.latency_delivery_days, - SPOPL_T.display_order, - SPOPL_T.active, - CONCAT(PP.id_permutation, ' - ', IFNULL(PP.name ,'')) AS name_error - FROM Shop_Supplier_Purchase_Order_Product_Link_Temp SPOPL_T - INNER JOIN Shop_Product_Permutation PP ON SPOPL_T.id_permutation = PP.id_permutation - WHERE SPOPL_T.GUID = a_guid - ; - DELETE SPOPL_T - FROM Shop_Supplier_Purchase_Order_Product_Link_Temp SPOPL_T - WHERE SPOPL_T.GUID = a_guid - ; - - /* - UPDATE tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL - SET - cost_total_local - */ + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT( + 'A valid ID is required for the following Supplier Purchase Order(s): ' + , GROUP_CONCAT(CONCAT(IFNULL(t_SPO.id_stock, '(No Supplier Purchase Order)')) SEPARATOR ', ') + ) AS msg + FROM tmp_Stock_Item t_SPO + LEFT JOIN partsltd_prod.Shop_Supplier_Purchase_Order SPO ON t_SPO.id_order = SPO.id_order + WHERE 1=1 + AND t_SPO.id_stock > 0 + AND ISNULL(SPO.id_stock) + ; END IF; - - -- Invalid quantity ordered - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN - IF EXISTS ( - SELECT * - FROM tmp_Shop_Supplier_Purchase_Order_Product_Link - WHERE - NOT ISNULL(quantity_ordered) - AND quantity_ordered < 0 - ) THEN - INSERT INTO tmp_Msg_Error ( - guid, id_type, code, msg + # id_supplier_ordered + IF EXISTS ( + SELECT * + FROM tmp_Supplier_Purchase_Order t_SPO + LEFT JOIN partsltd_prod.Shop_Supplier S ON t_SPO.id_supplier_ordered = S.id_supplier + WHERE 1=1 + AND ( + ISNULL(S.id_supplier) + OR S.active = 0 ) - SELECT - a_guid, - v_id_error_type_bad_data, - v_code_error_type_bad_data, - CONCAT('Invalid quantity ordered property for the following permutations: ', GROUP_CONCAT(t_SPOPL.name_error SEPARATOR ', ')) - FROM tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL - -- INNER JOIN Shop_Product_Permutation PP ON t_SPOPL.id_permutation = PP.id_permutation - WHERE t_SPOPL.quantity_ordered < 0 - ; - END IF; + LIMIT 1 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT( + 'A valid supplier is required for the following Supplier Purchase Order(s): ' + , GROUP_CONCAT(CONCAT(IFNULL(t_SPO.id_stock, '(No Supplier Purchase Order)'), ' - ', t_SPO.id_supplier_ordered) SEPARATOR ', ') + ) AS msg + FROM tmp_Stock_Item t_SPO + LEFT JOIN partsltd_prod.Shop_Supplier S ON t_SPO.id_supplier_ordered = S.id_supplier + WHERE 1=1 + AND ( + ISNULL(S.id_supplier) + OR S.active = 0 + ) + ; END IF; - - -- Duplicates - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN - IF EXISTS (SELECT id_permutation, name_error, COUNT(*) FROM tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL GROUP BY id_permutation HAVING COUNT(*) > 1) THEN - INSERT INTO tmp_Msg_Error ( - guid, id_type, code, msg + # id_currency_cost + IF EXISTS ( + SELECT * + FROM tmp_Supplier_Purchase_Order t_SPO + LEFT JOIN partsltd_prod.Shop_Currency C ON t_SPO.id_currency_cost = C.id_currency + WHERE 1=1 + AND ( + ISNULL(C.id_currency) + OR C.active = 0 ) - SELECT - a_guid, - v_id_error_type_bad_data, - v_code_error_type_bad_data, - CONCAT('Duplicate records: ', GROUP_CONCAT(t_SPOPLC.name_error SEPARATOR ', ')) - FROM (SELECT id_permutation, name_error, COUNT(*) FROM tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL GROUP BY id_permutation HAVING COUNT(*) > 1) t_SPOPLC - ; - END IF; + LIMIT 1 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT( + 'A valid currency is required for the following Supplier Purchase Order(s): ' + , GROUP_CONCAT(CONCAT(IFNULL(t_SPO.id_stock, '(No Supplier Purchase Order)'), ' - ', t_SPO.id_currency_cost) SEPARATOR ', ') + ) AS msg + FROM tmp_Stock_Item t_SPO + LEFT JOIN partsltd_prod.Shop_Currency C ON t_SPO.id_currency_cost = C.id_currency + WHERE 1=1 + AND ( + ISNULL(C.id_currency) + OR C.active = 0 + ) + ; + END IF; + # id_unit_quantity + IF EXISTS ( + SELECT * + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL + LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM ON t_SPOPL.id_unit_quantity = UM.id_unit_measurement + WHERE 1=1 + AND ( + ISNULL(UM.id_unit_measurement) + OR UM.active = 0 + ) + LIMIT 1 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT( + 'A valid unit measurement of quantity is required for the following Supplier Purchase Order(s): ' + , GROUP_CONCAT(CONCAT(IFNULL(t_SPO.id_stock, '(No Supplier Purchase Order)'), ' - ', t_SPO.id_currency_cost) SEPARATOR ', ') + ) AS msg + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL + LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM ON t_SPOPL.id_unit_quantity = UM.id_unit_measurement + WHERE 1=1 + AND ( + ISNULL(UM.id_unit_measurement) + OR UM.active = 0 + ) + ; + END IF; + # Invalid quantity ordered + IF EXISTS ( + SELECT * + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL + WHERE + ISNULL(t_SPOPL.quantity_ordered) + OR t_SPOPL.quantity_ordered <= 0 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type, code, msg + ) + SELECT + v_id_error_type_bad_data, + v_code_error_type_bad_data, + CONCAT( + 'A valid quantity ordered is required for the following Supplier Purchase Order Item(s): ' + , GROUP_CONCAT(t_SPOPL.name_error SEPARATOR ', ') + ) + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL + WHERE + ISNULL(t_SPOPL.quantity_ordered) + OR t_SPOPL.quantity_ordered <= 0 + ; + END IF; + # Invalid quantity received + IF EXISTS ( + SELECT * + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL + WHERE t_SPOPL.quantity_received < 0 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type, code, msg + ) + SELECT + v_id_error_type_bad_data, + v_code_error_type_bad_data, + CONCAT( + 'A valid quantity received is required for the following Supplier Purchase Order Item(s): ' + , GROUP_CONCAT(t_SPOPL.name_error, ' - ', t_SPOPL.quantity_received SEPARATOR ', ') + ) + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL + WHERE t_SPOPL.quantity_received < 0 + ; + END IF; + # Invalid delivery latency + IF EXISTS ( + SELECT * + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL + WHERE t_SPOPL.latency_delivery_days < 0 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type, code, msg + ) + SELECT + v_id_error_type_bad_data, + v_code_error_type_bad_data, + CONCAT( + 'A valid delivery latency is required for the following Supplier Purchase Order Item(s): ' + , GROUP_CONCAT(t_SPOPL.name_error, ' - ', t_SPOPL.latency_delivery_days SEPARATOR ', ') + ) + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL + WHERE t_SPOPL.latency_delivery_days < 0 + ; END IF; - + -- Duplicates + IF EXISTS ( + SELECT + id_permutation + , name_error + , COUNT(*) + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL + GROUP BY id_permutation + HAVING COUNT(*) > 1 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type, code, msg + ) + SELECT + v_id_error_type_bad_data, + v_code_error_type_bad_data, + CONCAT('Duplicate records: ', GROUP_CONCAT(t_SPOPLC.name_error SEPARATOR ', ')) + FROM ( + SELECT + id_permutation + , name_error + , COUNT(*) + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL + GROUP BY id_permutation + HAVING COUNT(*) > 1 + ) t_SPOPLC + ; + END IF; + -- Empty Supplier Purchase Order + IF EXISTS ( SELECT * FROM tmp_Supplier_Purchase_Order t_SPO LEFT JOIN tmp_Supplier_Purchase_Order_Product_Link t_SPOPL ON t_SPO.id_order = t_SPOPL.id_order WHERE ISNULL(t_SPOPL.id_order) ) THEN + INSERT INTO tmp_Msg_Error ( + id_type, code, msg + ) + SELECT + v_id_error_type_bad_data, + v_code_error_type_bad_data, + CONCAT( + 'There are no items in the following Supplier Purchase Order(s): ' + , GROUP_CONCAT(t_SPO.name_error SEPARATOR ', ') + ) AS msg + FROM tmp_Supplier_Purchase_Order t_SPO + LEFT JOIN tmp_Supplier_Purchase_Order_Product_Link t_SPOPL ON t_SPO.id_order = t_SPOPL.id_order + WHERE ISNULL(t_SPOPL.id_order) + ; + END IF; + + -- Supplier Purchase Order Items without Order + IF EXISTS ( + SELECT * + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL + LEFT JOIN tmp_Supplier_Purchase_Order t_SPO ON t_SPOPL.id_order = t_SPO.id_order + WHERE ISNULL(t_SPO.id_order) + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type, code, msg + ) + SELECT + v_id_error_type_bad_data, + v_code_error_type_bad_data, + CONCAT( + 'There is no order for the following Supplier Purchase Order Item(s): ' + , GROUP_CONCAT(t_SPOPL.name_error SEPARATOR ', ') + ) AS msg + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL + LEFT JOIN tmp_Supplier_Purchase_Order t_SPO ON t_SPOPL.id_order = t_SPO.id_order + WHERE ISNULL(t_SPO.id_order) + ; + END IF; -- Permissions - 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_Supplier_Purchase_Order_Product_Link t_SPO - INNER JOIN Shop_Product_Permutation PP ON t_SPO.id_permutation = PP.id_permutation - ) G - ); - - CALL p_shop_calc_user(v_guid_permission, a_id_user, 0, v_id_permission_supplier_purchase_order, v_id_access_level_edit, v_ids_product); - - /* - UPDATE tmp_Shop_Supplier t_S - INNER JOIN Shop_Calc_User_Temp TP - ON TP.GUID = v_guid_permission - SET tP.can_view = TP.can_view, - tP.can_edit = TP.can_edit, - tP.can_admin = TP.can_admin; - */ - /* - 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_supplier_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; - - DELETE FROM Shop_Calc_User_Temp - WHERE GUID = a_guid; - END IF; + SET v_ids_product_permission := ( + SELECT + GROUP_CONCAT(DISTINCT PP.id_product SEPARATOR ',') + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL + INNER JOIN partsltd_prod.Shop_Product_Permutation PP ON t_SPOPL.id_permutation = PP.id_permutation + ); + IF a_debug = 1 THEN + SELECT + v_guid + , a_id_user + , FALSE -- get inactive users + , v_id_permission_supplier_purchase_order + , v_id_access_level_edit + , v_ids_product_permission -- ids_product + , 0 -- a_debug + ; + SELECT * from partsltd_prod.Shop_Calc_User_Temp; + END IF; + + CALL p_shop_calc_user( + v_guid + , a_id_user + , FALSE -- get inactive users + , v_id_permission_supplier_purchase_order + , v_id_access_level_edit + , v_ids_product_permission -- ids_product + , 0 -- a_debug + ); + + IF a_debug = 1 THEN + SELECT * from partsltd_prod.Shop_Calc_User_Temp WHERE GUID = a_guid; + END IF; + + IF NOT EXISTS (SELECT can_view FROM partsltd_prod.Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = v_guid) THEN + DELETE FROM tmp_Msg_Error; + + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + VALUES ( + v_id_type_error_no_permission + , v_code_type_error_no_permission + , CONCAT('You do not have view permissions for ', (SELECT name FROM partsltd_prod.Shop_Permission WHERE id_permission = v_id_permission_supplier LIMIT 1)) + ) + ; + END IF; + + CALL partsltd_prod.p_shop_clear_calc_user( a_guid ); + IF EXISTS ( SELECT * FROM tmp_Msg_Error LIMIT 1 ) THEN + DELETE FROM tmp_Supplier_Purchase_Order; + DELETE FROM tmp_Supplier_Purchase_Order_Product_Link; + END IF; + + IF EXISTS ( + SELECT * + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL + INNER JOIN partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link SPOPL ON t_SPOPL.id_link = SPOPL.id_link + INNER JOIN partsltd_prod.Shop_Stock_Item SI ON SPOPL.id_permutation = SI.id_permutation + WHERE + t_SPOPL.is_new = 0 + AND t_SPOPL.quantity_received <> SPOPL.quantity_received + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_warning + , v_code_type_error_warning + , CONCAT( + 'The quantity received has changed on the following orders. Please update the stock items appropriately.' + , GROUP_CONCAT( + CONCAT( + t_SPOPL.name_error + , ' - from ' + , SPOPL.quantity_received + , ' to ' + , t_SPOPL.quantity_received + ) SEPARATOR ', ' + ) + ) AS msg + ; + END IF; + -- 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 + comment + , updated_last_by + , updated_last_on ) VALUES ( - CONCAT( - 'Save ', - CASE WHEN v_is_new_supplier_purchase_order = 1 THEN 'new ' ELSE '' END, - 'Supplier Purchase Order - ', - a_comment - ), - a_id_user, - CURRENT_TIME() + a_comment + , a_id_user + , v_time_start ); - 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_supplier_purchase_order = 1) THEN - INSERT INTO Shop_Supplier_Purchase_Order ( - id_supplier_ordered, - cost_total_local, - id_currency_cost, - created_by, - id_change_set, - active - ) - SELECT - a_id_supplier_ordered, - SUM(t_SPOPL.cost_total_local), - a_id_currency_cost, - a_id_user, - v_id_change_set, - a_active - FROM tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL - ; - -- SET v_id_order_new - SET a_id_order := (SELECT id_order FROM Shop_Supplier_Purchase_Order ORDER BY id_order DESC LIMIT 1); - INSERT INTO Shop_Supplier_Purchase_Order_Product_Link ( - id_order, - id_permutation, - cost_total_local, - id_currency_cost, - quantity_ordered, - id_unit_quantity, - quantity_received, - latency_delivery_days, - display_order, - active, - created_by, - id_change_set - ) - SELECT - a_id_order, -- v_id_order_new, - id_permutation, - cost_total_local, - id_currency_cost, - quantity_ordered, - id_unit_quantity, - quantity_received, - latency_delivery_days, - display_order, - active, - a_id_user, - v_id_change_set - FROM tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL - ; - ELSE - UPDATE Shop_Supplier_Purchase_Order SPO - INNER JOIN tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL ON SPO.id_order = t_SPOPL.id_order - SET - SPO.id_supplier_ordered = a_id_supplier_ordered, - SPO.cost_total_local = SUM(t_SPOPL.cost_total_local), - SPO.id_currency = a_id_currency_cost, - SPO.id_change_set = v_id_change_set, - SPO.active = a_active - WHERE SPO.id_order = a_id_order - ; - IF EXISTS (SELECT * FROM tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL INNER JOIN Shop_Supplier_Purchase_Order_Product_Link SPOPL ON t_SPOPL.id_link = SPOPL.id_link) THEN - UPDATE Shop_Supplier_Purchase_Order_Product_Link SPOPL - INNER JOIN tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL - ON SPOPL.id_link = t_SPOPL.id_link - SET - SPOPL.id_order = t_SPOPL.id_order, - SPOPL.id_permutation = t_SPOPL.id_permutation, - SPOPL.cost_total_local = t_SPOPL.cost_total_local, - SPOPL.id_currency_cost = t_SPOPL.id_currency_cost, - SPOPL.quantity_ordered = t_SPOPL.quantity_ordered, - SPOPL.id_unit_quantity = t_SPOPL.id_unit_quantity, - SPOPL.quantity_received = t_SPOPL.quantity_received, - SPOPL.latency_delivery_days = t_SPOPL.latency_delivery_days, - SPOPL.display_order = t_SPOPL.display_order, - SPOPL.active = t_SPOPL.active, - SPOPL.id_change_set = v_id_change_set - ; - ELSE - INSERT INTO Shop_Supplier_Purchase_Order_Product_Link ( - id_order, - id_permutation, - cost_total_local, - id_currency_cost, - quantity_ordered, - id_unit_quantity, - quantity_received, - latency_delivery_days, - display_order, - active, - created_by, - id_change_set - ) - SELECT - id_order, - id_permutation, - cost_total_local, - id_currency_cost, - quantity_ordered, - id_unit_quantity, - quantity_received, - latency_delivery_days, - display_order, - active, - a_id_user, - v_id_change_set - FROM tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL - WHERE t_SPOPL.id_link < 0 - ; - END IF; - END IF; + SET v_id_change_set := LAST_INSERT_ID(); - IF EXISTS (SELECT * FROM tmp_Msg_Error) THEN - ROLLBACK; - ELSE - COMMIT; - END IF; + INSERT INTO partsltd_prod.Shop_Supplier_Purchase_Order ( + id_supplier_ordered + , id_currency_cost + , cost_total_local_VAT_excl + , cost_total_local_VAT_incl + , created_by + , created_on + , id_change_set + , active + ) + SELECT + t_SPO.id_supplier_ordered + , t_SPO.id_currency_cost + , SUM(t_SPOPL.cost_total_local_VAT_excl) + , SUM(t_SPOPL.cost_total_local_VAT_incl) + , t_SPO.active + , a_id_user + , v_time_start + , v_id_change_set + FROM tmp_Supplier_Purchase_Order t_SPO + INNER JOIN tmp_Supplier_Purchase_Order_Product_Link t_SPOPL ON t_SPO.id_order = t_SPOPL.id_order + WHERE t_SPOPL.is_new = 1 + ; + + INSERT INTO Shop_Supplier_Purchase_Order_Product_Link ( + id_order + , id_permutation + -- , id_currency_cost + , id_unit_quantity + , quantity_ordered + , quantity_received + , latency_delivery_days + , display_order + , active + , cost_total_local_VAT_excl + , cost_total_local_VAT_incl + , created_by + , id_change_set + ) + SELECT + t_SPOPL.id_order + , t_SPOPL.id_permutation + -- , t_SPOPL.id_currency_cost + , t_SPOPL.id_unit_quantity + , t_SPOPL.quantity_ordered + , t_SPOPL.quantity_received + , t_SPOPL.latency_delivery_days + , t_SPOPL.display_order + , t_SPOPL.active + , t_SPOPL.cost_total_local_VAT_excl + , t_SPOPL.cost_total_local_VAT_incl + , a_id_user + , v_id_change_set + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL + WHERE t_SPOPL.is_new = 1 + ; + + UPDATE partsltd_prod.Shop_Supplier_Purchase_Order SPO + INNER JOIN tmp_Supplier_Purchase_Order t_SPO + ON SPO.id_order = t_SPO.id_order + AND t_SPO.is_new = 0 + INNER JOIN tmp_Supplier_Purchase_Order_Product_Link t_SPOPL ON t_SPO.id_order = t_SPOPL.id_order + SET + SPO.id_supplier_ordered = t_SPO.id_supplier_ordered + , SPO.id_currency_cost = id_currency_cost + , SPO.cost_total_local_VAT_excl = SUM(t_SPOPL.cost_total_local_VAT_excl) + , SPO.cost_total_local_VAT_incl = SUM(t_SPOPL.cost_total_local_VAT_incl) + , SPO.active = a_active + , SPO.id_change_set = v_id_change_set + ; + + UPDATE partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link SPOPL + INNER JOIN tmp_Supplier_Purchase_Order_Product_Link t_SPOPL + ON SPOPL.id_link = t_SPOPL.id_link + AND t_SPOPL.is_new = 0 + SET + SPOPL.id_order = t_SPOPL.id_order, + SPOPL.id_permutation = t_SPOPL.id_permutation, + -- SPOPL.id_currency_cost = t_SPOPL.id_currency_cost, + SPOPL.id_unit_quantity = t_SPOPL.id_unit_quantity, + SPOPL.quantity_ordered = t_SPOPL.quantity_ordered, + SPOPL.quantity_received = t_SPOPL.quantity_received, + SPOPL.latency_delivery_days = t_SPOPL.latency_delivery_days, + SPOPL.display_order = t_SPOPL.display_order, + SPOPL.active = t_SPOPL.active, + SPOPL.cost_total_local_VAT_excl = t_SPOPL.cost_total_local_VAT_excl, + SPOPL.cost_total_local_VAT_incl = t_SPOPL.cost_total_local_VAT_incl, + SPOPL.id_change_set = v_id_change_set + ; + + DELETE SPO_T + FROM Shop_Supplier_Purchase_Order_Temp SPO_T + WHERE SPO_T.GUID = a_guid + ; + DELETE SPOPL_T + FROM Shop_Supplier_Purchase_Order_Product_Link_Temp SPOPL_T + WHERE SPOPL_T.GUID = a_guid + ; + + COMMIT; END IF; - -- Returns - # SET v_now = NOW(); - - # Supplier Purchase Orders - SELECT * - FROM Shop_Supplier_Purchase_Order - WHERE id_order = a_id_order - ; - - # Supplier Purchase Order Product Links - SELECT * - FROM Shop_Supplier_Purchase_Order_Product_Link - WHERE id_order = a_id_order - ; - # Errors SELECT * - FROM tmp_Msg_Error + FROM tmp_Msg_Error t_ME + INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type ; - # DROP TABLE tmp_Shop_Supplier_Purchase_Order; - DROP TABLE tmp_Shop_Supplier_Purchase_Order_Product_Link; - DROP TABLE tmp_Msg_Error; + IF a_debug = 1 THEN + SELECT * from tmp_Supplier; + END IF; + + DROP TEMPORARY TABLE tmp_Supplier_Purchase_Order; + DROP TEMPORARY TABLE tmp_Supplier_Purchase_Order_Product_Link; + DROP TEMPORARY TABLE tmp_Msg_Error; + + IF a_debug = 1 THEN + CALL partsltd_prod.p_debug_timing_reporting ( v_time_start ); + END IF; END // DELIMITER ;; @@ -16344,634 +16914,397 @@ DELETE FROM Shop_Supplier_Purchase_Order; - - --- Clear previous proc DROP PROCEDURE IF EXISTS p_shop_get_many_supplier_purchase_order; - DELIMITER // CREATE PROCEDURE p_shop_get_many_supplier_purchase_order ( IN a_id_user INT, IN a_get_all_supplier BIT, IN a_get_inactive_supplier BIT, - IN a_get_first_supplier_only BIT, - IN a_ids_supplier VARCHAR(4000), + IN a_ids_supplier TEXT, IN a_get_all_order BIT, - -- IN a_get_inactive_order BIT, - IN a_get_first_order_only BIT, - IN a_ids_order VARCHAR(4000), - IN a_get_inactive_category BIT, - IN a_ids_category VARCHAR(4000), - IN a_get_inactive_product BIT, - IN a_ids_product VARCHAR(4000), - IN a_get_inactive_permutation BIT, - IN a_ids_permutation VARCHAR(4000), + IN a_get_inactive_order BIT, + IN a_ids_order TEXT, + IN a_ids_permutation TEXT, IN a_date_from DATETIME, - IN a_date_to DATETIME + IN a_date_to DATETIME, + IN a_debug BIT ) BEGIN - -- Argument redeclaration - -- Variable declaration + DECLARE v_code_type_error_bad_data VARCHAR(50); + DECLARE v_code_type_error_no_permission VARCHAR(50); + DECLARE v_guid BINARY(36); DECLARE v_has_filter_supplier BIT; DECLARE v_has_filter_order BIT; - DECLARE v_has_filter_category BIT; - DECLARE v_has_filter_product BIT; DECLARE v_has_filter_permutation BIT; DECLARE v_has_filter_date_from BIT; DECLARE v_has_filter_date_to BIT; - DECLARE v_guid BINARY(36); - # DECLARE v_id_user VARCHAR(100); - # DECLARE v_ids_permutation_unavailable VARCHAR(4000); - DECLARE v_ids_permission_supplier_purchase_order VARCHAR(4000); - DECLARE v_ids_product_permission VARCHAR(4000); - # DECLARE v_ids_permutation_permission VARCHAR(4000); DECLARE v_id_access_level_view INT; - -- DECLARE v_now DATETIME; - -- DECLARE v_id_minimum INT; - DECLARE v_code_error_data VARCHAR(50); - DECLARE v_id_type_error_data INT; + DECLARE v_ids_permission_supplier_purchase_order VARCHAR(100); + DECLARE v_id_type_error_bad_data INT; + DECLARE v_id_type_error_no_permission INT; + DECLARE v_time_start TIMESTAMP(6); + SET v_time_start := CURRENT_TIMESTAMP(6); SET v_guid := UUID(); - SET v_id_access_level_view := (SELECT id_access_level FROM Shop_Access_Level WHERE code = 'VIEW' LIMIT 1); - -- SET v_ids_permission_supplier_purchase_order := (SELECT id_permission FROM Shop_Permission WHERE code = 'SHOP_SUPPLIER_PURCHASE_ORDER' LIMIT 1); - SET v_code_error_data = 'BAD_DATA'; - SET v_id_type_error_data := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_error_data); + SET v_id_access_level_view := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'VIEW' LIMIT 1); + SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1); + SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1); + SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION' LIMIT 1); + SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission LIMIT 1); + SET v_ids_permission_supplier_purchase_order := (SELECT GROUP_CONCAT(id_permission SEPARATOR ',') FROM partsltd_prod.Shop_Permission WHERE code IN ('STORE_SUPPLIER', 'STORE_SUPPLIER_PURCHASE_ORDER', 'STORE_PRODUCT')); + + SET a_get_all_supplier := IFNULL(a_get_all_supplier, 1); + SET a_get_inactive_supplier := IFNULL(a_get_inactive_supplier, 0); + SET a_ids_supplier := TRIM(IFNULL(a_ids_supplier, '')); + SET a_get_all_order := IFNULL(a_get_all_order, 1); + SET a_get_inactive_order := IFNULL(a_get_inactive_order, 0); + SET a_ids_order := TRIM(IFNULL(a_ids_order, '')); + SET a_ids_permutation := TRIM(IFNULL(a_ids_permutation, '')); + SET a_date_from := IFNULL(a_date_from, NULL); + SET a_date_to := IFNULL(a_date_to, NULL); + SET a_debug := IFNULL(a_debug, 0); - -- Argument validation + default values - IF a_id_user IS NULL THEN - SET a_id_user = ''; - ELSE - SET a_id_user = TRIM(a_id_user); - END IF; - IF a_get_all_supplier IS NULL THEN - SET a_get_all_supplier = 1; - END IF; - IF a_get_inactive_supplier IS NULL THEN - SET a_get_inactive_supplier = 0; - END IF; - IF a_get_first_supplier_only IS NULL THEN - SET a_get_first_supplier_only = 0; - END IF; - IF a_ids_supplier IS NULL THEN - SET a_ids_supplier = ''; - ELSE - SET a_ids_supplier = TRIM(REPLACE(a_ids_supplier, '|', ',')); - END IF; - IF a_get_all_order IS NULL THEN - SET a_get_all_order = 1; - END IF; - /* - IF a_get_inactive_order IS NULL THEN - SET a_get_inactive_order = 0; - END IF; - */ - IF a_get_first_order_only IS NULL THEN - SET a_get_first_order_only = 0; - END IF; - IF a_ids_order IS NULL THEN - SET a_ids_order = ''; - ELSE - SET a_ids_order = TRIM(REPLACE(a_ids_order, '|', ',')); - END IF; - IF a_get_inactive_category IS NULL THEN - SET a_get_inactive_category = 0; - END IF; - IF a_ids_category IS NULL THEN - SET a_ids_category = ''; - ELSE - SET a_ids_category = TRIM(REPLACE(a_ids_category, '|', ',')); - END IF; - IF a_get_inactive_product IS NULL THEN - SET a_get_inactive_product = 0; - END IF; - IF a_ids_product IS NULL THEN - SET a_ids_product = ''; - ELSE - SET a_ids_product = TRIM(REPLACE(a_ids_product, '|', ',')); - END IF; - IF a_get_inactive_permutation IS NULL THEN - SET a_get_inactive_permutation = 0; - END IF; - IF a_ids_permutation IS NULL THEN - SET a_ids_permutation = ''; - ELSE - SET a_ids_permutation = TRIM(REPLACE(a_ids_permutation, '|', ',')); - END IF; + DROP TEMPORARY TABLE IF EXISTS tmp_Supplier_Purchase_Order_Product_Link; + DROP TEMPORARY TABLE IF EXISTS tmp_Supplier_Purchase_Order; + DROP TEMPORARY TABLE IF EXISTS tmp_Supplier; + DROP TEMPORARY TABLE IF EXISTS tmp_Permutation; + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + DROP TEMPORARY TABLE IF EXISTS tmp_Split; - -- Temporary tables - DROP TABLE IF EXISTS tmp_Shop_Supplier_Purchase_Order_Product_Link; - DROP TABLE IF EXISTS tmp_Shop_Supplier_Purchase_Order; - DROP TABLE IF EXISTS tmp_Shop_Supplier; - DROP TABLE IF EXISTS tmp_Shop_Product; - - CREATE TABLE tmp_Shop_Supplier ( - id_supplier INT NOT NULL, - CONSTRAINT FK_tmp_Shop_Supplier_id_supplier - FOREIGN KEY (id_supplier) - REFERENCES Shop_Supplier(id_supplier), - active BIT NOT NULL, - rank_supplier INT NULL, - can_view BIT, - can_edit BIT, - can_admin BIT + CREATE TEMPORARY TABLE tmp_Supplier ( + id_supplier INT NOT NULL PRIMARY KEY ); - 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, - active BIT NOT NULL, - rank_order INT NOT NULL + CREATE TEMPORARY TABLE tmp_Supplier_Purchase_Order ( + id_order INT NOT NULL PRIMARY KEY ); - /* - CREATE TABLE tmp_Shop_Supplier_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_Supplier_Purchase_Order(id_order), - id_permutation INT NOT NULL, - CONSTRAINT FK_tmp_Supplier_Purchase_Order_Product_Link_id_permutation - FOREIGN KEY (id_permutation) - REFERENCES Shop_Product_Permutation(id_permutation), - cost_total_local FLOAT NOT NULL, - id_currency_cost INT NOT NULL, - quantity_ordered FLOAT NOT NULL, - id_unit_quantity INT NOT NULL, - CONSTRAINT FK_tmp_Supplier_Purchase_Order_Product_Link_id_unit_quantity - FOREIGN KEY (id_unit_quantity) - REFERENCES Shop_Unit_Measurement(id_unit_measurement), - quantity_received FLOAT NULL, - latency_delivery_days INT NOT NULL, - display_order INT NOT NULL - ); - */ - - CREATE TABLE tmp_Shop_Product ( - id_category INT NOT NULL, - CONSTRAINT FK_tmp_Shop_Product_id_category - FOREIGN KEY (id_category) - REFERENCES Shop_Product_Category(id_category), - id_product INT NOT NULL, - CONSTRAINT FK_tmp_Shop_Product_id_product - FOREIGN KEY (id_product) - REFERENCES Shop_Product(id_product), - -- product_has_variations BIT NOT NULL, - id_permutation INT NULL, - CONSTRAINT FK_tmp_Shop_Product_id_permutation - FOREIGN KEY (id_permutation) - REFERENCES Shop_Product_Permutation(id_permutation), - active_category BIT NOT NULL, - active_product BIT NOT NULL, - active_permutation BIT NULL, - display_order_category INT NOT NULL, - display_order_product INT NOT NULL, - display_order_permutation INT NULL, - rank_permutation INT NOT NULL, # _in_category - name VARCHAR(255) NOT NULL, - description VARCHAR(4000) NOT NULL, - /* - price_GBP_full FLOAT NOT NULL, - price_GBP_min FLOAT NOT NULL, - */ - latency_manufacture_days INT NOT NULL, - quantity_min FLOAT NOT NULL, - quantity_max FLOAT NOT NULL, - quantity_step FLOAT NOT NULL, - quantity_stock FLOAT NOT NULL, - is_subscription BIT NOT NULL, - id_unit_measurement_interval_recurrence INT, - CONSTRAINT FK_tmp_Shop_Product_id_unit_measurement_interval_recurrence - FOREIGN KEY (id_unit_measurement_interval_recurrence) - REFERENCES Shop_Interval_Recurrence(id_interval), - count_interval_recurrence INT, - id_stripe_product VARCHAR(100), - product_has_variations INT NOT NULL, - can_view BIT, - can_edit BIT, - can_admin BIT + CREATE TEMPORARY TABLE tmp_Permutation ( + id_permutation INT NOT NULL PRIMARY KEY ); - CREATE TABLE IF NOT EXISTS tmp_Msg_Error ( + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT, - 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 ); + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split ( + substring VARCHAR(4000) NOT NULL + , as_int INT NULL + ); + DELETE FROM tmp_Split; - -- Parse filters SET v_has_filter_supplier = CASE WHEN a_ids_supplier = '' THEN 0 ELSE 1 END; SET v_has_filter_order = CASE WHEN a_ids_order = '' THEN 0 ELSE 1 END; - SET v_has_filter_category = CASE WHEN a_ids_category = '' THEN 0 ELSE 1 END; - SET v_has_filter_product = CASE WHEN a_ids_product = '' THEN 0 ELSE 1 END; SET v_has_filter_permutation = CASE WHEN a_ids_permutation = '' THEN 0 ELSE 1 END; SET v_has_filter_date_from = CASE WHEN ISNULL(a_date_from) THEN 0 ELSE 1 END; SET v_has_filter_date_to = CASE WHEN ISNULL(a_date_to) THEN 0 ELSE 1 END; - -- select v_has_filter_product, v_has_filter_permutation; + IF a_debug = 1 THEN + SELECT + v_has_filter_supplier, + v_has_filter_order, + v_has_filter_permutation, + v_has_filter_date_from, + v_has_filter_date_to + ; + END IF; - IF v_has_filter_supplier THEN - CALL p_split(a_guid, a_ids_supplier, ','); - - IF EXISTS (SELECT * FROM Split_Temp TS LEFT JOIN Shop_Supplier S ON TS.substring = S.id_supplier WHERE ISNULL(S.id_supplier)) THEN + -- Permutations + IF v_has_filter_permutation = 1 THEN + CALL partsltd_prod.p_split(a_guid, a_ids_permutation, ',', a_debug); + + INSERT INTO tmp_Split ( + substring + , as_int + ) + SELECT + substring + , CONVERT(substring, DECIMAL(10,0)) AS as_int + FROM partsltd_prod.Split_Temp + WHERE 1=1 + AND GUID = a_guid + AND NOT ISNULL(substring) + AND substring != '' + ; + + CALL partsltd_prod.p_clear_split_temp( a_guid ); + END IF; + + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN + IF EXISTS ( + SELECT * + FROM tmp_Split t_S + LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_S.as_int = PP.id_permutation + WHERE + ISNULL(t_S.as_int) + OR ISNULL(PP.id_permutation) + OR PP.active = 0 + ) THEN INSERT INTO tmp_Msg_Error ( - guid, - id_type, + id_type, code, msg ) SELECT - v_guid, - v_id_type_error_data, - v_code_error_data, - CONCAT('Invalid supplier IDs: ', IFNULL(GROUP_CONCAT(TS.substring SEPARATOR ', '), 'NULL')) - FROM Split_Temp TS - LEFT JOIN Shop_Supplier S ON TS.substring = S.id_supplier - WHERE ISNULL(S.id_supplier) + v_id_type_error_bad_data, + v_code_type_error_bad_data, + CONCAT('Invalid or inactive permutation IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL')) + FROM tmp_Split t_S + LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_S.as_int = PP.id_permutation + WHERE + ISNULL(t_S.as_int) + OR ISNULL(PP.id_permutation) + OR PP.active = 0 ; ELSE - INSERT INTO tmp_Shop_Supplier ( - id_supplier, - active, - rank_supplier + INSERT INTO tmp_Permutation ( + id_permutation ) SELECT - S.id_supplier, - S.active, - RANK() OVER (ORDER BY id_supplier ASC) AS rank_supplier - FROM Shop_Supplier S - INNER JOIN Split_Temp TS ON S.id_supplier = TS.substring - WHERE - ( - a_get_inactive_supplier - OR S.active = 1 - ) + PP.id_permutation + FROM tmp_Split t_S + RIGHT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_S.as_int = PP.id_permutation + WHERE ( + v_has_filter_permutation = 0 + OR NOT ISNULL(t_S.as_int) + ) ; - END IF; - - DROP TABLE Split_Temp; + END IF; + END IF; + + DELETE FROM tmp_Split; + + -- Suppliers + IF v_has_filter_supplier = 1 THEN + CALL partsltd_prod.p_split(a_guid, a_ids_supplier, ',', a_debug); - IF a_get_first_supplier_only THEN - DELETE t_S - FROM tmp_Shop_Supplier t_S - WHERE t_S.rank_supplier > ( - SELECT MIN(t_S.rank_supplier) - FROM tmp_Shop_Supplier t_S - ) - ; - END IF; - END IF; - - IF v_has_filter_category = 1 THEN - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN - CALL p_split(a_guid, a_ids_category, ','); - - IF EXISTS (SELECT * FROM Split_Temp TS LEFT JOIN Shop_Product_Category C ON TS.substring = C.id_category WHERE ISNULL(C.id_category)) THEN - INSERT INTO tmp_Msg_Error ( - guid, - id_type, - code, - msg - ) - SELECT - v_guid, - v_id_type_error_data, - v_code_error_data, - CONCAT('Invalid category IDs: ', IFNULL(GROUP_CONCAT(TS.substring SEPARATOR ', ') ,'NULL')) - FROM Split_Temp TS - LEFT JOIN Shop_Product_Category C ON TS.substring = C.id_category - WHERE ISNULL(C.id_category) - ; - END IF; - - DROP TABLE Split_Temp; - END IF; + INSERT INTO tmp_Split ( + substring + , as_int + ) + SELECT + substring + , CONVERT(substring, DECIMAL(10,0)) AS as_int + FROM partsltd_prod.Split_Temp + WHERE 1=1 + AND GUID = a_guid + AND NOT ISNULL(substring) + AND substring != '' + ; + + CALL partsltd_prod.p_clear_split_temp( a_guid ); END IF; - IF v_has_filter_product = 1 THEN - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN - CALL p_split(a_guid, a_ids_product, ','); - - IF EXISTS (SELECT * FROM Split_Temp TS LEFT JOIN Shop_Product ON TS.substring = P.id_product WHERE ISNULL(P.id_product)) THEN - INSERT INTO tmp_Msg_Error ( - guid, - id_type, - code, - msg + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN + IF EXISTS ( + SELECT * + FROM tmp_Split t_S + LEFT JOIN partsltd_prod.Shop_Supplier S ON t_S.as_int = S.id_supplier + WHERE + ISNULL(t_S.as_int) + OR ISNULL(S.id_supplier) + OR ( + S.active = 0 + AND a_get_inactive_supplier = 0 ) - SELECT - v_guid, - v_id_type_error_data, - v_code_error_data, - CONCAT('Invalid product IDs: ', IFNULL(GROUP_CONCAT(TS.substring SEPARATOR ', ') ,'NULL')) - FROM Split_Temp TS - LEFT JOIN Shop_Product ON TS.substring = P.id_product - WHERE ISNULL(P.id_product) - ; - END IF; - - DROP TABLE Split_Temp; - END IF; - END IF; - - IF v_has_filter_permutation = 1 THEN - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN - CALL p_split(a_guid, a_ids_permutation, ','); - - IF EXISTS (SELECT * FROM Split_Temp TS LEFT JOIN Shop_Product_Permutation PP ON TS.substring = PP.id_permutation WHERE ISNULL(PP.id_permutation)) THEN - INSERT INTO tmp_Msg_Error ( - guid, - id_type, - code, - msg - ) - SELECT - v_guid, - v_id_type_error_data, - v_code_error_data, - CONCAT('Invalid permutation IDs: ', IFNULL(GROUP_CONCAT(TS.substring SEPARATOR ', ') ,'NULL')) - FROM Split_Temp TS - LEFT JOIN Shop_Product_Permutation PP ON TS.substring = PP.id_permutation - WHERE ISNULL(PP.id_permutation) - ; - END IF; - - DROP TABLE Split_Temp; - END IF; - END IF; - - IF v_has_filter_category = 1 OR v_has_filter_product = 1 OR v_has_filter_permutation = 1 THEN - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN - INSERT INTO tmp_Shop_Product ( - id_category, - id_product, - id_permutation, - active_category, - active_product, - active_permutation, - display_order_category, - display_order_product, - display_order_permutation - -- rank_permutation, - /* - name, - description, - /* - price_GBP_VAT_incl, - price_GBP_VAT_excl, - price_GBP_min, - * - latency_manufacture_days, - quantity_min, - quantity_max, - quantity_step, - quantity_stock, - is_subscription, - id_unit_measurement_interval_recurrence, - count_interval_recurrence, - id_stripe_product, - product_has_variations - */ - ) - SELECT - P.id_category, - P.id_product, - -- P.has_variations AS product_has_variations, - PP.id_permutation, - C.active AS active_category, - P.active AS active_product, - PP.active AS active_permutation, - C.display_order AS display_order_category, - P.display_order AS display_order_product, - PP.display_order AS display_order_permutation - -- RANK() OVER (ORDER BY C.display_order, P.display_order, PP.display_order) AS rank_permutation, #PARTITION BY P.id_category # _in_category - /* - P.name, - PP.description, - /* - PP.price_GBP_VAT_incl, - PP.price_GBP_VAT_excl, - PP.price_GBP_min, - * - PP.latency_manufacture_days, - PP.quantity_min, - PP.quantity_max, - PP.quantity_step, - PP.quantity_stock, - PP.is_subscription, - PP.id_unit_measurement_interval_recurrence, - PP.count_interval_recurrence, - PP.id_stripe_product, - P.has_variations - */ - FROM Shop_Product P - INNER JOIN Shop_Product_Permutation PP - ON P.id_product = PP.id_product - INNER JOIN Shop_Product_Category C - ON P.id_category = C.id_category - WHERE - # permutations - ( - ( - NOT v_has_filter_permutation - OR FIND_IN_SET(PP.id_permutation, a_ids_permutation) > 0 - ) - AND ( - a_get_inactive_permutation - OR PP.active = 1 - ) - ) - # categories - AND ( - ( - NOT v_has_filter_category - OR FIND_IN_SET(P.id_category, a_ids_category) > 0 - ) - AND ( - a_get_inactive_category - OR C.active = 1 - ) - ) - # products - AND ( - ( - NOT v_has_filter_product - OR FIND_IN_SET(P.id_product, a_ids_product) > 0 - ) - AND ( - a_get_inactive_product - OR P.active = 1 - ) - ) - ; - END IF; - END IF; - - -- Get orders - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN - CALL p_split(a_guid, a_ids_order, ','); - - IF v_has_filter_order AND EXISTS (SELECT * FROM Split_Temp TS LEFT JOIN Shop_Supplier_Purchase_Order SPO ON TS.substring = SPO.id_order WHERE ISNULL(SPO.id_order)) THEN + ) THEN INSERT INTO tmp_Msg_Error ( - guid, - id_type, + id_type, code, msg ) SELECT - v_guid, - v_id_type_error_data, - v_code_error_data, - CONCAT('Invalid order IDs: ', IFNULL(GROUP_CONCAT(TS.substring SEPARATOR ', '), 'NULL')) - FROM Split_Temp TS - LEFT JOIN Shop_Supplier_Purchase_Order SPO ON TS.substring = SPO.id_order - WHERE ISNULL(SPO.id_order) + v_id_type_error_bad_data, + v_code_type_error_bad_data, + CONCAT('Invalid or inactive Supplier IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL')) + FROM tmp_Split t_S + LEFT JOIN partsltd_prod.Shop_Supplier S ON t_S.as_int = S.id_supplier + WHERE + ISNULL(t_S.as_int) + OR ISNULL(S.id_supplier) + OR ( + S.active = 0 + AND a_get_inactive_supplier = 0 + ) ; - END IF; - - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN - INSERT INTO tmp_Shop_Supplier_Purchase_Order ( -- _Product_Link - id_order, - -- active, - rank_order + ELSE + INSERT INTO tmp_Supplier ( + id_supplier ) SELECT - SPO.id_order, - -- SPO.active, - RANK() OVER (ORDER BY SPO.id_order ASC) AS rank_order - FROM Shop_Supplier_Purchase_Order SPO - INNER JOIN Split_Temp TS ON SPO.id_order = TS.substring - INNER JOIN Shop_Supplier_Purchase_Order_Product_Link SPOPL ON SPO.id_order = SPOPL.id_order - INNER JOIN Shop_Supplier S ON SPO.id_supplier_ordered = S.id_supplier - INNER JOIN Shop_Product_Permutation PP ON SPOPL.id_permutation = PP.id_permutation - INNER JOIN Shop_Product P ON PP.id_product = P.id_product - INNER JOIN Shop_Product_Category C ON P.id_category = C.id_category - LEFT JOIN tmp_Shop_Product t_P ON SPOPL.id_permutation = t_P.id_permutation - LEFT JOIN tmp_Shop_Supplier t_S ON SPO.id_supplier_ordered = t_S.id_supplier - WHERE - # supplier - ( - v_has_filter_supplier = 0 - OR NOT ISNULL(t_S.id_supplier) -- SPO.id_supplier_ordered IN (SELECT DISTINCT id_supplier FROM tmp_Shop_Supplier) + S.id_supplier + FROM tmp_Split t_S + RIGHT JOIN partsltd_prod.Shop_Supplier S ON t_S.as_int = S.id_supplier + WHERE ( + a_get_all_supplier = 1 + OR ( + v_has_filter_supplier = 1 + AND NOT ISNULL(t_S.as_int) + ) ) - # order AND ( - ( - v_has_filter_order = 0 - OR ( - # ID - FIND_IN_SET(SPO.id_order, a_ids_order) > 0 - # date - AND ( - ( - v_has_filter_date_from = 0 - OR SPO.created_on > a_date_from - ) - AND ( - v_has_filter_date_to = 0 - OR SPO.created_on < a_date_to - ) - ) - ) - ) - # active - /* - AND ( - a_get_inactive_order - OR SPO.active = 1 - ) - */ - ) - # permutations - AND ( - ( - v_has_filter_category = 0 - AND v_has_filter_product = 0 - AND v_has_filter_permutation = 0 - ) - OR NOT ISNULL(t_P.id_permutation) -- SPO.id_permutation IN (SELECT DISTINCT id_permutation FROM tmp_Shop_Product) + a_get_inactive_supplier = 1 + OR S.active = 1 ) ; END IF; - - DROP TABLE Split_Temp; + END IF; + + DELETE FROM tmp_Split; + + -- Supplier Purchase Orders + IF v_has_filter_order = 1 THEN + CALL partsltd_prod.p_split(a_guid, a_ids_order, ',', a_debug); - IF a_get_first_order_only THEN - DELETE t_SPO - FROM tmp_Shop_Supplier_Purchase_Order t_SPO - WHERE t_SPO.rank_order > ( - SELECT MIN(t_SPO.rank_order) - FROM tmp_Shop_Supplier_Purchase_Order t_SPO + INSERT INTO tmp_Split ( + substring + , as_int + ) + SELECT + substring + , CONVERT(substring, DECIMAL(10,0)) AS as_int + FROM partsltd_prod.Split_Temp + WHERE 1=1 + AND GUID = a_guid + AND NOT ISNULL(substring) + AND substring != '' + ; + + CALL partsltd_prod.p_clear_split_temp( a_guid ); + END IF; + + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN + IF EXISTS ( + SELECT * + FROM tmp_Split t_S + LEFT JOIN partsltd_prod.Shop_Supplier_Purchase_Order SPO ON t_S.as_int = SPO.id_order + WHERE + ISNULL(t_S.as_int) + OR ISNULL(SPO.id_order) + OR ( + SPO.active = 0 + AND a_get_inactive_order = 0 + ) + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type, + code, + msg ) + SELECT + v_id_type_error_bad_data, + v_code_type_error_bad_data, + CONCAT('Invalid or inactive Supplier Purchase Order IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL')) + FROM tmp_Split t_S + LEFT JOIN partsltd_prod.Shop_Supplier_Purchase_Order SPO ON t_S.as_int = SPO.id_order + WHERE + ISNULL(t_S.as_int) + OR ISNULL(SPO.id_order) + OR ( + SPO.active = 0 + AND a_get_inactive_order = 0 + ) + ; + ELSE + INSERT INTO tmp_Supplier_Purchase_Order ( + id_order + ) + SELECT + SPO.id_order + FROM tmp_Split t_S + RIGHT JOIN partsltd_prod.Shop_Supplier_Purchase_Order SPO ON t_S.as_int = SPO.id_order + INNER JOIN tmp_Supplier t_SUPP ON SPO.id_supplier_ordered = t_SUPP.id_supplier + INNER JOIN partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link SPOPL ON SPO.id_order = SPOPL.id_order + INNER JOIN tmp_Permutation t_PP ON SPOPL.id_permutation = t_PP.id_permutation + WHERE ( + a_get_all_order = 1 + OR ( + v_has_filter_order = 1 + AND NOT ISNULL(t_S.as_int) + ) + OR ( + v_has_filter_supplier = 1 + AND NOT ISNULL(t_SUPP.id_supplier) + ) + OR ( + v_has_filter_permutation = 1 + AND NOT ISNULL(t_PP.id_permutation) + ) + ) + AND ( + a_get_inactive_order = 1 + OR SPO.active = 1 + ) + AND ( + v_has_filter_date_from = 0 + OR SPO.created_on > a_date_from + ) + AND ( + v_has_filter_date_to = 0 + OR SPO.created_on < a_date_to + ) + ; END IF; - END IF; + END IF; + + DELETE FROM tmp_Split; -- Permissions - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN - # SET v_id_user := (SELECT id_user FROM Shop_User WHERE name = CURRENT_USER()); - SET v_ids_permission_supplier_purchase_order := (SELECT GROUP_CONCAT(id_permission SEPARATOR ',') FROM Shop_Permission WHERE code IN ('STORE_SUPPLIER', 'STORE_SUPPLIER_PURCHASE_ORDER')); - -- SET v_ids_permutation_permission := (SELECT GROUP_CONCAT(id_permutation SEPARATOR ',') FROM tmp_Shop_Product WHERE NOT ISNULL(id_permutation)); - SET v_ids_product_permission := (SELECT GROUP_CONCAT(P.id_product SEPARATOR ',') FROM (SELECT DISTINCT id_product FROM tmp_Shop_Product WHERE NOT ISNULL(id_product)) P); - - -- SELECT v_guid, a_id_user, false, v_id_permission_product, v_id_access_level_view, v_ids_permutation_permission; - -- select * from Shop_Calc_User_Temp; - - CALL p_shop_calc_user(v_guid, a_id_user, FALSE, v_ids_permission_supplier_purchase_order, v_id_access_level_view, v_ids_product_permission); - - -- select * from Shop_Calc_User_Temp; - - IF NOT EXISTS (SELECT can_view FROM Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = v_guid) THEN - INSERT INTO tmp_Msg_Error ( - guid, - id_type, - code, - msg - ) - SELECT - v_guid, - v_id_type_error_data, - v_code_error_data, - CONCAT('You do not have view permissions for ', GROUP_CONCAT(name SEPARATOR ', ')) - FROM Shop_Permission - WHERE id_permission = v_ids_permission_supplier_purchase_order - ; - END IF; - - - UPDATE tmp_Shop_Product t_P - INNER JOIN Shop_Calc_User_Temp UE_T - ON t_P.id_product = UE_T.id_product -- t_P.id_permutation = UE_T.id_permutation - AND UE_T.GUID = v_guid - SET t_P.can_view = UE_T.can_view, - t_P.can_edit = UE_T.can_edit, - t_P.can_admin = UE_T.can_admin + IF a_debug = 1 THEN + SELECT + v_guid + , a_id_user + , FALSE -- get inactive users + , v_ids_permission_supplier_purchase_order + , v_id_access_level_view + , '' -- ids_product + , 0 -- a_debug + ; + SELECT * from partsltd_prod.Shop_Calc_User_Temp; + END IF; + + CALL p_shop_calc_user( + v_guid + , a_id_user + , FALSE -- get inactive users + , v_ids_permission_supplier_purchase_order + , v_id_access_level_view + , '' -- ids_product + , 0 -- a_debug + ); + + IF a_debug = 1 THEN + SELECT * from partsltd_prod.Shop_Calc_User_Temp; + END IF; + + IF NOT EXISTS (SELECT can_view FROM partsltd_prod.Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = v_guid) THEN + DELETE FROM tmp_Msg_Error; + + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + VALUES ( + v_id_type_error_no_permission + , v_code_type_error_no_permission + , CONCAT('You do not have view permissions for ', (SELECT name FROM partsltd_prod.Shop_Permission WHERE id_permission = v_id_permission_supplier LIMIT 1)) + ) ; - - # 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 - ; END IF; - - -- select * from tmp_Shop_Product; - + IF EXISTS ( SELECT * FROM tmp_Msg_Error LIMIT 1 ) THEN + DELETE FROM tmp_Supplier_Purchase_Order_Product_Link; + DELETE FROM tmp_Supplier_Purchase_Order; + END IF; + -- Returns - -- SET v_now := NOW(); - + /* # Suppliers SELECT t_S.id_supplier, @@ -16985,127 +17318,93 @@ BEGIN S.website, S.id_currency, t_S.active - FROM tmp_Shop_Supplier t_S - INNER JOIN Shop_Supplier S + FROM tmp_Supplier t_S + INNER JOIN partsltd_prod.Shop_Supplier S ON t_S.id_supplier = S.id_supplier ; - + */ + # Supplier Purchase Order - SELECT # * - t_SPO.id_order, - SPO.id_supplier_ordered, - SPO.cost_total_local, - SPO.id_currency_cost, - t_SPO.active - FROM Shop_Supplier_Purchase_Order SPO - INNER JOIN tmp_Shop_Supplier_Purchase_Order t_SPO ON SPO.id_order = t_SPO.id_order + SELECT + t_SPO.id_order + , SPO.id_supplier_ordered + , SPO.id_currency_cost + , SPO.cost_total_local_VAT_excl + , SPO.cost_total_local_VAT_incl + , SPO.active + , SPO.created_on + , CONCAT( + SPO.cost_total_local_VAT_excl + , ' on ' + , SPO.created_on + ) AS name + FROM tmp_Supplier_Purchase_Order t_SPO + INNER JOIN partsltd_prod.Shop_Supplier_Purchase_Order SPO ON SPO.id_order = t_SPO.id_order ; # Supplier Purchase Order Product Link SELECT - SPOPL.id_link, - SPOPL.id_order, - SPOPL.id_permutation, - P.name as name_product, - SPOPL.cost_total_local, - SPOPL.id_currency_cost, - SPOPL.quantity_ordered, - SPOPL.id_unit_quantity, - SPOPL.quantity_received, - SPOPL.latency_delivery_days, - SPOPL.display_order - FROM Shop_Supplier_Purchase_Order_Product_Link SPOPL - -- INNER JOIN tmp_Shop_Supplier_Purchase_Order_Product_Link t_SPOPL ON SPOPL.id_link = t_SPOPL.id_link - INNER JOIN tmp_Shop_Supplier_Purchase_Order t_SPO ON SPOPL.id_order = t_SPO.id_order - INNER JOIN Shop_Product_Permutation PP ON SPOPL.id_permutation = PP.id_permutation - INNER JOIN Shop_Product P ON PP.id_product = P.id_product - INNER JOIN Shop_Product_Category C ON P.id_category = C.id_category - ORDER BY SPOPL.id_order, C.display_order, P.display_order, PP.display_order + SPOPL.id_link + , SPOPL.id_order + , SPOPL.id_permutation + , fn_shop_get_product_permutation_name(SPOPL.id_permutation) AS name_permutation + -- , SPOPL.id_currency_cost + , SPOPL.id_unit_quantity + , SPOPL.quantity_ordered + , SPOPL.quantity_received + , SPOPL.latency_delivery_days + , SPOPL.display_order + , SPOPL.cost_total_local_VAT_excl + , SPOPL.cost_total_local_VAT_incl + , SPOPL.cost_unit_local_VAT_excl + , SPOPL.cost_unit_local_VAT_incl + , SPOPL.active + FROM tmp_Supplier_Purchase_Order t_SPO + INNER JOIN partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link SPOPL ON t_SPO.id_order = SPOPL.id_order ; # Errors - SELECT - /* - t_ME.display_order, - t_ME.guid, - t_ME.id_type, - t_ME.msg, - MET.code, - MET.name, - MET.description - */ - * + SELECT * FROM tmp_Msg_Error t_ME - INNER JOIN Shop_Msg_Error_Type MET - ON t_ME.id_type = MET.id_type - WHERE guid = v_guid + INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type ; - /* - # Return arguments for test - SELECT - a_ids_category, - a_get_inactive_category, - a_ids_product, - a_get_inactive_product, - a_get_first_product_only, - a_get_all_product, - a_ids_image, - a_get_inactive_image, - a_get_first_image_only, - a_get_all_image - ; - */ - - # select 'other outputs'; - # select * from tmp_Shop_Product; - - -- Clean up - DROP TABLE IF EXISTS tmp_Shop_Supplier_Purchase_Order_Product_Link; - DROP TABLE IF EXISTS tmp_Shop_Supplier_Purchase_Order; - DROP TABLE IF EXISTS tmp_Shop_Supplier; - DROP TABLE IF EXISTS tmp_Shop_Product; - - DELETE FROM Shop_Calc_User_Temp - WHERE GUID = v_guid - ; + IF a_debug = 1 THEN + SELECT * from tmp_Supplier_Purchase_Order_Product_Link; + SELECT * from tmp_Supplier_Purchase_Order; + SELECT * from tmp_Supplier; + END IF; + + DROP TEMPORARY TABLE IF EXISTS tmp_Supplier_Purchase_Order_Product_Link; + DROP TEMPORARY TABLE IF EXISTS tmp_Supplier_Purchase_Order; + DROP TEMPORARY TABLE IF EXISTS tmp_Supplier; + DROP TEMPORARY TABLE IF EXISTS tmp_Permutation; + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + DROP TEMPORARY TABLE IF EXISTS tmp_Split; + + IF a_debug = 1 THEN + CALL p_debug_timing_reporting( v_time_start ); + END IF; END // DELIMITER ;; -/* CALL p_shop_get_many_supplier_purchase_order ( - '', # a_id_user + 1, # a_id_user 1, # a_get_all_supplier 0, # a_get_inactive_supplier - 0, # a_get_first_supplier_only '', # a_ids_supplier 1, # a_get_all_order - -- 0, # a_get_inactive_order - 0, # a_get_first_order_only + 0, # a_get_inactive_order '', # a_ids_order - 0, # a_get_inactive_category - '', # a_ids_category - 0, # a_get_inactive_product - '', # a_ids_product - 0, # a_get_inactive_permutation '', # a_ids_permutation NULL, # a_date_from NULL # a_date_to + , 0 # a_debug ); -select * from shop_image; -select * from shop_product; -select * from TMP_MSG_ERROR; -DROP TABLE TMP_MSG_ERROR; - -insert into shop_product_change_set (comment) - values ('set product not subscription - test bool output to python'); - update shop_product - set is_subscription = 0, - id_change_set = (select id_change_set from shop_product_change_set order by id_change_set desc limit 1) - where id_product = 1 +/* */ @@ -17114,539 +17413,595 @@ insert into shop_product_change_set (comment) -- Clear previous proc DROP PROCEDURE IF EXISTS p_shop_save_manufacturing_purchase_order; -DROP TABLE IF EXISTS tmp_Shop_Manufacturing_Purchase_Order_Product_Link; +DROP TABLE IF EXISTS tmp_Manufacturing_Purchase_Order_Product_Link; DROP TABLE IF EXISTS tmp_Msg_Error; DELIMITER // CREATE PROCEDURE p_shop_save_manufacturing_purchase_order ( - 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) + IN a_comment VARCHAR(500) + , IN a_guid BINARY(36) + , IN a_id_user INT + , IN a_debug BIT ) 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_code_type_error_bad_data VARCHAR(50); + DECLARE v_code_type_error_no_permission VARCHAR(50); + DECLARE v_id_access_level_edit INT; DECLARE v_id_change_set INT; - DECLARE v_is_new_manufacturing_purchase_order BIT; + DECLARE v_ids_permission_manufacturing_purchase_order VARCHAR(100); + DECLARE v_id_type_error_bad_data INT; + DECLARE v_id_type_error_no_permission INT; + DECLARE v_ids_product_permission TEXT; + DECLARE v_time_start TIMESTAMP(6); + + DECLARE exit handler for SQLEXCEPTION + BEGIN + GET DIAGNOSTICS CONDITION 1 + @sqlstate = RETURNED_SQLSTATE + , @errno = MYSQL_ERRNO + , @text = MESSAGE_TEXT + ; + + ROLLBACK; + + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( + display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT + , id_type INT NULL + , code VARCHAR(50) NOT NULL + , msg VARCHAR(4000) NOT NULL + ); + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + NULL + , @errno + , @text + ; + SELECT * + FROM tmp_Msg_Error; + DROP TABLE IF EXISTS tmp_Msg_Error; + END; - SET SESSION sql_mode = sys.list_drop(@@session.sql_mode, 'ONLY_FULL_GROUP_BY'); + SET v_time_start := CURRENT_TIMESTAMP(6); + SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1); + SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1); + SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION' LIMIT 1); + SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission LIMIT 1); + SET v_ids_permission_manufacturing_purchase_order := (SELECT GROUP_CONCAT(id_permission SEPARATOR ',') FROM partsltd_prod.Shop_Permission WHERE code IN ('STORE_MANUFACTURING_PURCHASE_ORDER', 'STORE_PRODUCT')); + SET v_id_access_level_edit := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'EDIT' LIMIT 1); - 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; + CALL p_validate_guid ( a_guid ); + SET a_comment := TRIM(IFNULL(a_comment, '')); + DROP TEMPORARY TABLE IF EXISTS tmp_Manufacturing; + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + -- 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 TEMPORARY TABLE tmp_Manufacturing_Purchase_Order ( + id_order INT NOT NULL PRIMARY KEY + , id_currency_cost INT NOT NULL ); - CREATE TABLE IF NOT EXISTS tmp_Msg_Error ( - display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT, - guid BINARY(36) NOT NULL, - id_type INT NOT NULL, - 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 + CREATE TEMPORARY TABLE tmp_Manufacturing_Purchase_Order_Product_Link ( + id_link INT NOT NULL PRIMARY KEY + , id_order INT NOT NULL + , id_permutation INT NOT NULL + , id_currency_cost INT NOT NULL + , quantity_ordered FLOAT NOT NULL + , id_unit_quantity INT NOT NULL + , quantity_received FLOAT NULL + , latency_delivery_days INT NOT NULL + , display_order INT NOT NULL + , active BIT NOT NULL + , name_error VARCHAR(200) NOT NULL + , cost_total_local_VAT_excl FLOAT NOT NULL + , cost_total_local_VAT_incl FLOAT NOT NULL + , cost_unit_local_VAT_excl FLOAT NOT NULL + , cost_unit_local_VAT_incl FLOAT NOT NULL + , has_order BIT NULL + ); + + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( + display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT + , id_type INT NOT NULL + , code VARCHAR(50) NOT NULL + , msg VARCHAR(4000) NOT NULL ); - - -- 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; - + INSERT INTO tmp_Manufacturing_Purchase_Order ( + id_order + , id_currency_cost + ) + SELECT + SPO_T.id_order + , IFNULL(IFNULL(SPO_T.id_currency_cost, MPO.id_currency_cost), 0) AS id_currency_cost + FROM partsltd_prod.Shop_Manufacturing_Purchase_Order_Temp SPO_T + LEFT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order MPO ON SPO_T.id_order = MPO.id_order + WHERE SPO_T.GUID = a_guid + ; - -- 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 + INSERT INTO tmp_Manufacturing_Purchase_Order_Product_Link ( + id_link + , id_order + , id_permutation + , id_currency_cost + , quantity_ordered + , id_unit_quantity + , quantity_received + , latency_delivery_days + , display_order + , active + , name_error + , is_new + , cost_total_local_VAT_excl + , cost_total_local_VAT_incl + , cost_unit_local_VAT_excl + , cost_unit_local_VAT_incl + , has_order + ) + SELECT + IFNULL(SPOPL_T.id_link, 0) AS id_link + , IFNULL(IFNULL(SPOPL_T.id_order, MPOPL.id_order), 0) AS id_order + , IFNULL(IFNULL(SPOPL_T.id_permutation, MPOPL.id_permutation), 0) AS id_permutation + , IFNULL(IFNULL(SPOPL_T.id_currency_cost, MPOPL.id_currency_cost), 0) AS id_currency_cost + , IFNULL(IFNULL(SPOPL_T.quantity_ordered, MPOPL.quantity_ordered), 0) AS quantity_ordered + , IFNULL(IFNULL(SPOPL_T.id_unit_quantity, MPOPL.id_unit_quantity), 0) AS id_unit_quantity + , IFNULL(SPOPL_T.quantity_received, MPOPL.quantity_received) AS quantity_received + , IFNULL(SPOPL_T.latency_delivery_days, MPOPL.latency_delivery_days) AS latency_delivery_days + , RANK() OVER (PARTITION BY IFNULL(IFNULL(SPOPL_T.id_order, MPOPL.id_order), 0) ORDER BY IFNULL(IFNULL(SPOPL_T.display_order, MPOPL.display_order), 0)) AS display_order + , IFNULL(IFNULL(SPOPL_T.active, MPOPL.active), 1) AS active + , CONCAT( + fn_shop_get_product_permutation_name(SPOPL_T.id_permutation) + , ' - x' + , IFNULL(SPOPL_T.quantity_ordered, '(No Quantity)') + ) AS name_error + , IFNULL(SPOPL_T.id_link, 0) < 1 AS is_new + , IFNULL(IFNULL(SPOPL_T.cost_total_local_VAT_excl, MPOPL.cost_total_local_VAT_excl), 0) AS cost_total_local_VAT_excl + , IFNULL(IFNULL(SPOPL_T.cost_total_local_VAT_incl, MPOPL.cost_total_local_VAT_incl), 0) AS cost_total_local_VAT_incl + , IFNULL(SPOPL_T.cost_total_local_VAT_excl / SPOPL_T.quantity_ordered, MPOPL.cost_unit_local_VAT_excl) AS cost_unit_local_VAT_excl + , IFNULL(SPOPL_T.cost_total_local_VAT_incl / SPOPL_T.quantity_ordered, MPOPL.cost_unit_local_VAT_incl) AS cost_unit_local_VAT_incl + , NOT ISNULL(t_MPO.id_order) AS has_order + FROM partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link_Temp SPOPL_T + LEFT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link MPOPL ON SPOPL_T.id_link = MPOPL.id_link + LEFT JOIN tmp_Manufacturing_Purchase_Order t_MPO ON SPOPL_T.id_order = t_MPO.id_order + WHERE SPOPL_T.GUID = a_guid + ; + + INSERT INTO tmp_Manufacturing_Purchase_Order ( + id_order + , id_currency_cost + ) + SELECT + SPO_T.id_order + , IFNULL(IFNULL(SPO_T.id_currency_cost, MPO.id_currency_cost), 0) AS id_currency_cost + FROM partsltd_prod.Shop_Manufacturing_Purchase_Order MPO + INNER JOIN tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL + ON MPO.id_order = t_MPOPL.id_order + AND t_MPOPL.has_order = 0 + ; + + -- Validation + -- Manufacturing Purchase Order + # id_order + IF EXISTS ( + SELECT * + FROM tmp_Manufacturing_Purchase_Order t_MPO + LEFT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order MPO ON t_MPO.id_order = MPO.id_order + WHERE 1=1 + AND t_MPO.id_order > 0 + AND ISNULL(MPO.id_order) + LIMIT 1 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg ) - /* - 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 - ; + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT( + 'A valid ID is required for the following Manufacturing Purchase Order(s): ' + , GROUP_CONCAT(CONCAT(IFNULL(t_MPO.id_stock, '(No Manufacturing Purchase Order)')) SEPARATOR ', ') + ) AS msg + FROM tmp_Stock_Item t_SPO + LEFT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order MPO ON t_MPO.id_order = MPO.id_order + WHERE 1=1 + AND t_MPO.id_stock > 0 + AND ISNULL(MPO.id_stock) + ; 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 + # id_currency_cost + IF EXISTS ( + SELECT * + FROM tmp_Manufacturing_Purchase_Order t_MPO + LEFT JOIN partsltd_prod.Shop_Currency C ON t_MPO.id_currency_cost = C.id_currency + WHERE 1=1 + AND ( + ISNULL(C.id_currency) + OR C.active = 0 ) - 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; + LIMIT 1 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT( + 'A valid currency is required for the following Manufacturing Purchase Order(s): ' + , GROUP_CONCAT(CONCAT(IFNULL(t_MPO.id_stock, '(No Manufacturing Purchase Order)'), ' - ', t_MPO.id_currency_cost) SEPARATOR ', ') + ) AS msg + FROM tmp_Stock_Item t_SPO + LEFT JOIN partsltd_prod.Shop_Currency C ON t_MPO.id_currency_cost = C.id_currency + WHERE 1=1 + AND ( + ISNULL(C.id_currency) + OR C.active = 0 + ) + ; 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 + # id_unit_quantity + IF EXISTS ( + SELECT * + FROM tmp_Manufacturing_Purchase_Order t_MPO + LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM ON t_MPO.id_unit_quantity = UM.id_unit_measurement + WHERE 1=1 + AND ( + ISNULL(UM.id_unit_measurement) + OR UM.active = 0 ) - 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; + LIMIT 1 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT( + 'A valid unit measurement of quantity is required for the following Manufacturing Purchase Order(s): ' + , GROUP_CONCAT(CONCAT(IFNULL(t_MPO.id_stock, '(No Manufacturing Purchase Order)'), ' - ', t_MPO.id_currency_cost) SEPARATOR ', ') + ) AS msg + FROM tmp_Stock_Item t_SPO + LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM ON t_MPO.id_unit_quantity = UM.id_unit_measurement + WHERE 1=1 + AND ( + ISNULL(UM.id_unit_measurement) + OR UM.active = 0 + ) + ; 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 + # Invalid quantity ordered + IF EXISTS ( + SELECT * + FROM tmp_Manufacturing_Purchase_Order_Product_Link + WHERE + ISNULL(t_MPOPL.quantity_ordered) + OR t_MPOPL.quantity_ordered <= 0 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type, code, msg + ) + SELECT + v_id_error_type_bad_data, + v_code_error_type_bad_data, + CONCAT( + 'A valid quantity ordered is required for the following Manufacturing Purchase Order Item(s): ' + , GROUP_CONCAT(t_MPOPL.name_error SEPARATOR ', ') ) - 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; + FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL + WHERE + ISNULL(t_MPOPL.quantity_ordered) + OR t_MPOPL.quantity_ordered <= 0 + ; + END IF; + # Invalid quantity received + IF EXISTS ( + SELECT * + FROM tmp_Manufacturing_Purchase_Order_Product_Link + WHERE t_MPOPL.quantity_received < 0 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type, code, msg + ) + SELECT + v_id_error_type_bad_data, + v_code_error_type_bad_data, + CONCAT( + 'A valid quantity received is required for the following Manufacturing Purchase Order Item(s): ' + , GROUP_CONCAT(t_MPOPL.name_error, ' - ', t_MPOPL.quantity_received SEPARATOR ', ') + ) + FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL + WHERE t_MPOPL.quantity_received < 0 + ; + END IF; + # Invalid delivery latency + IF EXISTS ( + SELECT * + FROM tmp_Manufacturing_Purchase_Order_Product_Link + WHERE t_MPOPL.latency_delivery_days < 0 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type, code, msg + ) + SELECT + v_id_error_type_bad_data, + v_code_error_type_bad_data, + CONCAT( + 'A valid delivery latency is required for the following Manufacturing Purchase Order Item(s): ' + , GROUP_CONCAT(t_MPOPL.name_error, ' - ', t_MPOPL.latency_delivery_days SEPARATOR ', ') + ) + FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL + WHERE t_MPOPL.latency_delivery_days < 0 + ; END IF; + -- Duplicates + IF EXISTS ( + SELECT + id_permutation + , name_error + , COUNT(*) + FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL + GROUP BY id_permutation + HAVING COUNT(*) > 1 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type, code, msg + ) + SELECT + v_id_error_type_bad_data, + v_code_error_type_bad_data, + CONCAT('Duplicate records: ', GROUP_CONCAT(t_SPOPLC.name_error SEPARATOR ', ')) + FROM ( + SELECT + id_permutation + , name_error + , COUNT(*) + FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL + GROUP BY id_permutation + HAVING COUNT(*) > 1 + ) t_SPOPLC + ; + END IF; + -- Empty Manufacturing Purchase Order + IF EXISTS ( SELECT * FROM tmp_Manufacturing_Purchase_Order t_MPO LEFT JOIN tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL ON t_MPO.id_order = t_MPOPL.id_order WHERE ISNULL(t_MPOPL.id_order) ) THEN + INSERT INTO tmp_Msg_Error ( + id_type, code, msg + ) + SELECT + v_id_error_type_bad_data, + v_code_error_type_bad_data, + CONCAT( + 'There are no items in the following Manufacturing Purchase Order(s): ' + , GROUP_CONCAT(t_MPO.name_error SEPARATOR ', ') + ) AS msg + FROM tmp_Manufacturing_Purchase_Order t_MPO + LEFT JOIN tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL ON t_MPO.id_order = t_MPOPL.id_order + WHERE ISNULL(t_MPOPL.id_order) + ; + END IF; + + -- Manufacturing Purchase Order Items without Order + IF EXISTS ( + SELECT * + FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL + LEFT JOIN tmp_Manufacturing_Purchase_Order t_MPO ON t_MPOPL.id_order = t_MPO.id_order + WHERE ISNULL(t_MPO.id_order) + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type, code, msg + ) + SELECT + v_id_error_type_bad_data, + v_code_error_type_bad_data, + CONCAT( + 'There is no order for the following Manufacturing Purchase Order Item(s): ' + , GROUP_CONCAT(t_MPOPL.name_error SEPARATOR ', ') + ) AS msg + FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL + LEFT JOIN tmp_Manufacturing_Purchase_Order t_MPO ON t_MPOPL.id_order = t_MPO.id_order + WHERE ISNULL(t_MPO.id_order) + ; + END IF; -- Permissions - 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; + SET v_ids_product_permission := ( + SELECT + GROUP_CONCAT(DISTINCT PP.id_product SEPARATOR ',') + FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL + INNER JOIN partsltd_prod.Shop_Product_Permutation PP ON t_MPOPL.id_permutation = PP.id_permutation + ); + IF a_debug = 1 THEN + SELECT + v_guid + , a_id_user + , FALSE -- get inactive users + , v_ids_permission_manufacturing_purchase_order + , v_id_access_level_edit + , v_ids_product_permission -- ids_product + , 0 -- a_debug + ; + SELECT * from partsltd_prod.Shop_Calc_User_Temp; + END IF; + + CALL p_shop_calc_user( + v_guid + , a_id_user + , FALSE -- get inactive users + , v_ids_permission_manufacturing_purchase_order + , v_id_access_level_edit + , v_ids_product_permission -- ids_product + , 0 -- a_debug + ); + + IF a_debug = 1 THEN + SELECT * from partsltd_prod.Shop_Calc_User_Temp WHERE GUID = a_guid; + END IF; + + IF NOT EXISTS (SELECT can_view FROM partsltd_prod.Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = v_guid) THEN + DELETE FROM tmp_Msg_Error; + + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + VALUES ( + v_id_type_error_no_permission + , v_code_type_error_no_permission + , CONCAT('You do not have view permissions for ', (SELECT name FROM partsltd_prod.Shop_Permission WHERE id_permission = v_id_permission_manufacturing LIMIT 1)) + ) + ; + END IF; + + CALL partsltd_prod.p_shop_clear_calc_user( a_guid ); + IF EXISTS ( SELECT * FROM tmp_Msg_Error LIMIT 1 ) THEN + DELETE FROM tmp_Manufacturing; + 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 + 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() + a_comment + , a_id_user + , v_time_start ); - 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; + SET v_id_change_set := LAST_INSERT_ID(); - IF EXISTS (SELECT * FROM tmp_Msg_Error) THEN - ROLLBACK; - ELSE - COMMIT; - END IF; + INSERT INTO partsltd_prod.Shop_Manufacturing_Purchase_Order ( + id_currency_cost + , cost_total_local_VAT_excl + , cost_total_local_VAT_incl + , created_by + , created_on + , id_change_set + , active + ) + SELECT + t_MPO.id_currency_cost + , SUM(t_MPOPL.cost_total_local_VAT_excl) + , SUM(t_MPOPL.cost_total_local_VAT_incl) + , t_MPO.active + , a_id_user + , v_time_start + , v_id_change_set + FROM tmp_Manufacturing_Purchase_Order t_MPO + INNER JOIN tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL ON t_MPO.id_order = t_MPOPL.id_order + WHERE t_MPOPL.is_new = 1 + ; + + INSERT INTO Shop_Manufacturing_Purchase_Order_Product_Link ( + id_order + , id_permutation + , id_currency_cost + , id_unit_quantity + , quantity_ordered + , quantity_received + , latency_delivery_days + , display_order + , active + , cost_total_local_VAT_excl + , cost_total_local_VAT_incl + , created_by + , id_change_set + ) + SELECT + t_MPOPL.id_order + , t_MPOPL.id_permutation + , t_MPOPL.id_currency_cost + , t_MPOPL.id_unit_quantity + , t_MPOPL.quantity_ordered + , t_MPOPL.quantity_received + , t_MPOPL.latency_delivery_days + , t_MPOPL.display_order + , t_MPOPL.active + , t_MPOPL.cost_total_local_VAT_excl + , t_MPOPL.cost_total_local_VAT_incl + , a_id_user + , v_id_change_set + FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL + WHERE t_MPOPL.is_new = 1 + ; + + UPDATE partsltd_prod.Shop_Manufacturing_Purchase_Order MPO + INNER JOIN tmp_Manufacturing_Purchase_Order t_MPO + ON MPO.id_order = t_MPO.id_order + AND t_MPO.is_new = 0 + INNER JOIN tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL ON t_MPO.id_order = t_MPOPL.id_order + SET + MPO.id_currency_cost = id_currency_cost + , MPO.cost_total_local_VAT_excl = SUM(t_MPOPL.cost_total_local_VAT_excl) + , MPO.cost_total_local_VAT_incl = SUM(t_MPOPL.cost_total_local_VAT_incl) + , MPO.active = a_active + , MPO.id_change_set = v_id_change_set + ; + + UPDATE partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link MPOPL + INNER JOIN tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL + ON MPOPL.id_link = t_MPOPL.id_link + AND t_MPOPL.is_new = 0 + SET + MPOPL.id_order = t_MPOPL.id_order, + MPOPL.id_permutation = t_MPOPL.id_permutation, + MPOPL.id_currency_cost = t_MPOPL.id_currency_cost, + MPOPL.id_unit_quantity = t_MPOPL.id_unit_quantity, + MPOPL.quantity_ordered = t_MPOPL.quantity_ordered, + MPOPL.quantity_received = t_MPOPL.quantity_received, + MPOPL.latency_delivery_days = t_MPOPL.latency_delivery_days, + MPOPL.display_order = t_MPOPL.display_order, + MPOPL.active = t_MPOPL.active, + MPOPL.cost_total_local_VAT_excl = t_MPOPL.cost_total_local_VAT_excl, + MPOPL.cost_total_local_VAT_incl = t_MPOPL.cost_total_local_VAT_incl, + MPOPL.id_change_set = v_id_change_set + ; + + DELETE SPO_T + FROM Shop_Manufacturing_Purchase_Order_Temp SPO_T + WHERE SPO_T.GUID = a_guid + ; + DELETE SPOPL_T + FROM Shop_Manufacturing_Purchase_Order_Product_Link_Temp SPOPL_T + WHERE SPOPL_T.GUID = a_guid + ; + + COMMIT; 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 + FROM tmp_Msg_Error t_ME + INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type ; - # DROP TABLE tmp_Shop_Manufacturing_Purchase_Order; - DROP TABLE tmp_Shop_Manufacturing_Purchase_Order_Product_Link; - DROP TABLE tmp_Msg_Error; + IF a_debug = 1 THEN + SELECT * from tmp_Manufacturing; + END IF; + + DROP TEMPORARY TABLE tmp_Manufacturing_Purchase_Order; + DROP TEMPORARY TABLE tmp_Manufacturing_Purchase_Order_Product_Link; + DROP TEMPORARY TABLE tmp_Msg_Error; + + IF a_debug = 1 THEN + CALL partsltd_prod.p_debug_timing_reporting ( v_time_start ); + END IF; END // DELIMITER ;; @@ -17666,10 +18021,10 @@ INSERT INTO Shop_Manufacturing_Purchase_Order_Product_Link_Temp ( id_permutation, cost_total_local, id_currency_cost, - quantity_used, + quantity_ordered, id_unit_quantity, - quantity_produced, - latency_manufacture_days, + quantity_received, + latency_delivery_days, display_order, active ) @@ -17681,10 +18036,10 @@ VALUES 1, # id_permutation, 100, # cost_total_local, 1, # id_currency_cost, - 1, # quantity_used, + 1, # quantity_ordered, 1, # id_unit_quantity, - 1, # quantity_produced, - 14, # latency_manufacture_days , + 1, # quantity_received, + 14, # latency_delivery_days , 1, # display_order 1 # active ) @@ -17693,12 +18048,10 @@ VALUES 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 + 'TEST SAVE' + , 'NIPS' # a_guid + , 1 -- 'auth0|6582b95c895d09a70ba10fef', # a_id_user + , 1 -- a_debug ); SELECT * FROM Shop_Manufacturing_Purchase_Order_Product_Link_Temp; @@ -17714,661 +18067,395 @@ DELETE FROM Shop_Manufacturing_Purchase_Order; - - --- Clear previous proc DROP PROCEDURE IF EXISTS p_shop_get_many_manufacturing_purchase_order; - DELIMITER // CREATE PROCEDURE p_shop_get_many_manufacturing_purchase_order ( IN a_id_user INT, IN a_get_all_order BIT, - -- IN a_get_inactive_order BIT, - IN a_get_first_order_only BIT, - IN a_ids_order VARCHAR(4000), - IN a_get_inactive_category BIT, - IN a_ids_category VARCHAR(4000), - IN a_get_inactive_product BIT, - IN a_ids_product VARCHAR(4000), - IN a_get_inactive_permutation BIT, - IN a_ids_permutation VARCHAR(4000), + IN a_get_inactive_order BIT, + IN a_ids_order TEXT, + IN a_ids_permutation TEXT, IN a_date_from DATETIME, - IN a_date_to DATETIME + IN a_date_to DATETIME, + IN a_debug BIT ) BEGIN - -- Argument redeclaration - -- Variable declaration + DECLARE v_code_type_error_bad_data VARCHAR(50); + DECLARE v_code_type_error_no_permission VARCHAR(50); + DECLARE v_guid BINARY(36); DECLARE v_has_filter_order BIT; - DECLARE v_has_filter_category BIT; - DECLARE v_has_filter_product BIT; DECLARE v_has_filter_permutation BIT; DECLARE v_has_filter_date_from BIT; DECLARE v_has_filter_date_to BIT; - DECLARE v_guid BINARY(36); - # DECLARE v_id_user VARCHAR(100); - # DECLARE v_ids_permutation_unavailable VARCHAR(4000); - DECLARE v_ids_permission_manufacturing_purchase_order VARCHAR(4000); - DECLARE v_ids_product_permission VARCHAR(4000); - # DECLARE v_ids_permutation_permission VARCHAR(4000); DECLARE v_id_access_level_view INT; - -- DECLARE v_now DATETIME; - -- DECLARE v_id_minimum INT; - DECLARE v_code_error_data VARCHAR(50); - DECLARE v_id_type_error_data INT; + DECLARE v_ids_permission_manufacturing_purchase_order VARCHAR(100); + DECLARE v_id_type_error_bad_data INT; + DECLARE v_id_type_error_no_permission INT; + DECLARE v_time_start TIMESTAMP(6); + SET v_time_start := CURRENT_TIMESTAMP(6); SET v_guid := UUID(); - SET v_id_access_level_view := (SELECT id_access_level FROM Shop_Access_Level WHERE code = 'VIEW' LIMIT 1); - -- SET v_ids_permission_manufacturing_purchase_order := (SELECT id_permission FROM Shop_Permission WHERE code = 'SHOP_manufacturing_PURCHASE_ORDER' LIMIT 1); - SET v_code_error_data = 'BAD_DATA'; - SET v_id_type_error_data := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_error_data); + SET v_id_access_level_view := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'VIEW' LIMIT 1); + SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1); + SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1); + SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION'); + SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission); + SET v_ids_permission_manufacturing_purchase_order := (SELECT GROUP_CONCAT(id_permission SEPARATOR ',') FROM partsltd_prod.Shop_Permission WHERE code IN ('STORE_MANUFACTURING_PURCHASE_ORDER', 'STORE_PRODUCT')); + + SET a_get_all_order := IFNULL(a_get_all_order, 1); + SET a_get_inactive_order := IFNULL(a_get_inactive_order, 0); + SET a_ids_order := TRIM(IFNULL(a_ids_order, '')); + SET a_ids_permutation := TRIM(IFNULL(a_ids_permutation, '')); + SET a_date_from := IFNULL(a_date_from, NULL); + SET a_date_to := IFNULL(a_date_to, NULL); + SET a_debug := IFNULL(a_debug, 0); - -- Argument validation + default values - IF a_id_user IS NULL THEN - SET a_id_user = ''; - ELSE - SET a_id_user = TRIM(a_id_user); - END IF; - IF a_get_all_order IS NULL THEN - SET a_get_all_order = 1; - END IF; - /* - IF a_get_inactive_order IS NULL THEN - SET a_get_inactive_order = 0; - END IF; - */ - IF a_get_first_order_only IS NULL THEN - SET a_get_first_order_only = 0; - END IF; - IF a_ids_order IS NULL THEN - SET a_ids_order = ''; - ELSE - SET a_ids_order = TRIM(REPLACE(a_ids_order, '|', ',')); - END IF; - IF a_get_inactive_category IS NULL THEN - SET a_get_inactive_category = 0; - END IF; - IF a_ids_category IS NULL THEN - SET a_ids_category = ''; - ELSE - SET a_ids_category = TRIM(REPLACE(a_ids_category, '|', ',')); - END IF; - IF a_get_inactive_product IS NULL THEN - SET a_get_inactive_product = 0; - END IF; - IF a_ids_product IS NULL THEN - SET a_ids_product = ''; - ELSE - SET a_ids_product = TRIM(REPLACE(a_ids_product, '|', ',')); - END IF; - IF a_get_inactive_permutation IS NULL THEN - SET a_get_inactive_permutation = 0; - END IF; - IF a_ids_permutation IS NULL THEN - SET a_ids_permutation = ''; - ELSE - SET a_ids_permutation = TRIM(REPLACE(a_ids_permutation, '|', ',')); - END IF; + DROP TEMPORARY TABLE IF EXISTS tmp_Manufacturing_Purchase_Order_Product_Link; + DROP TEMPORARY TABLE IF EXISTS tmp_Manufacturing_Purchase_Order; + DROP TEMPORARY TABLE IF EXISTS tmp_Permutation; + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + DROP TEMPORARY TABLE IF EXISTS tmp_Split; - -- Temporary tables - DROP TABLE IF EXISTS tmp_Shop_Manufacturing_Purchase_Order_Product_Link; - DROP TABLE IF EXISTS tmp_Shop_Manufacturing_Purchase_Order; - DROP TABLE IF EXISTS tmp_Shop_Product; - - CREATE TABLE tmp_Shop_Manufacturing_Purchase_Order ( - id_order INT NOT NULL PRIMARY KEY, - /* - id_supplier_ordered INT NOT NULL, - CONSTRAINT FK_tmp_Shop_Manufacturing_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, - value_produced_total_local FLOAT NOT NULL, - active BIT NOT NULL, - rank_order INT NOT NULL + CREATE TEMPORARY TABLE tmp_Manufacturing_Purchase_Order ( + id_order INT NOT NULL PRIMARY KEY ); - /* - CREATE TABLE tmp_Shop_Manufacturing_Purchase_Order_Product_Link ( - id_link INT NOT NULL PRIMARY KEY, - id_order INT NOT NULL, - CONSTRAINT FK_tmp_manufacturing_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_manufacturing_Purchase_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, - quantity_used FLOAT NOT NULL, - id_unit_quantity INT NOT NULL, - CONSTRAINT FK_tmp_manufacturing_Purchase_Order_Product_Link_id_unit_quantity - FOREIGN KEY (id_unit_quantity) - REFERENCES Shop_Unit_Measurement(id_unit_measurement), - quantity_produced FLOAT NULL, - latency_delivery_days INT NOT NULL, - display_order INT NOT NULL - ); - */ - - CREATE TABLE tmp_Shop_Product ( - id_category INT NOT NULL, - CONSTRAINT FK_tmp_Shop_Product_id_category - FOREIGN KEY (id_category) - REFERENCES Shop_Product_Category(id_category), - id_product INT NOT NULL, - CONSTRAINT FK_tmp_Shop_Product_id_product - FOREIGN KEY (id_product) - REFERENCES Shop_Product(id_product), - -- product_has_variations BIT NOT NULL, - id_permutation INT NULL, - CONSTRAINT FK_tmp_Shop_Product_id_permutation - FOREIGN KEY (id_permutation) - REFERENCES Shop_Product_Permutation(id_permutation), - active_category BIT NOT NULL, - active_product BIT NOT NULL, - active_permutation BIT NULL, - display_order_category INT NOT NULL, - display_order_product INT NOT NULL, - display_order_permutation INT NULL, - rank_permutation INT NOT NULL, # _in_category - # name VARCHAR(255) NOT NULL, - # description VARCHAR(4000) NOT NULL, - /* - price_GBP_full FLOAT NOT NULL, - price_GBP_min FLOAT NOT NULL, - */ - /* - latency_manufacture_days INT NOT NULL, - quantity_min FLOAT NOT NULL, - quantity_max FLOAT NOT NULL, - quantity_step FLOAT NOT NULL, - quantity_stock FLOAT NOT NULL, - is_subscription BIT NOT NULL, - id_unit_measurement_interval_recurrence INT, - CONSTRAINT FK_tmp_Shop_Product_id_unit_measurement_interval_recurrence - FOREIGN KEY (id_unit_measurement_interval_recurrence) - REFERENCES Shop_Interval_Recurrence(id_interval), - count_interval_recurrence INT, - id_stripe_product VARCHAR(100), - product_has_variations INT NOT NULL, - */ - can_view BIT, - can_edit BIT, - can_admin BIT + CREATE TEMPORARY TABLE tmp_Permutation ( + id_permutation INT NOT NULL PRIMARY KEY ); - CREATE TABLE IF NOT EXISTS tmp_Msg_Error ( + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT, - 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 ); + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split ( + substring VARCHAR(4000) NOT NULL + , as_int INT NULL + ); + DELETE FROM tmp_Split; - -- Parse filters SET v_has_filter_order = CASE WHEN a_ids_order = '' THEN 0 ELSE 1 END; - SET v_has_filter_category = CASE WHEN a_ids_category = '' THEN 0 ELSE 1 END; - SET v_has_filter_product = CASE WHEN a_ids_product = '' THEN 0 ELSE 1 END; SET v_has_filter_permutation = CASE WHEN a_ids_permutation = '' THEN 0 ELSE 1 END; SET v_has_filter_date_from = CASE WHEN ISNULL(a_date_from) THEN 0 ELSE 1 END; SET v_has_filter_date_to = CASE WHEN ISNULL(a_date_to) THEN 0 ELSE 1 END; - -- select v_has_filter_product, v_has_filter_permutation; - - IF v_has_filter_category = 1 THEN - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN - CALL p_split(a_guid, a_ids_category, ','); - - IF EXISTS (SELECT * FROM Split_Temp TS LEFT JOIN Shop_Product_Category C ON TS.substring = C.id_category WHERE ISNULL(C.id_category)) THEN - INSERT INTO tmp_Msg_Error ( - guid, - id_type, - code, - msg - ) - SELECT - v_guid, - v_id_type_error_data, - v_code_error_data, - CONCAT('Invalid category IDs: ', IFNULL(GROUP_CONCAT(TS.substring SEPARATOR ', ') ,'NULL')) - FROM Split_Temp TS - LEFT JOIN Shop_Product_Category C ON TS.substring = C.id_category - WHERE ISNULL(C.id_category) - ; - END IF; - - DROP TABLE Temp_Split; - END IF; - END IF; - - IF v_has_filter_product = 1 THEN - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN - CALL p_split(a_guid, a_ids_product, ','); - - IF EXISTS (SELECT * FROM Split_Temp TS LEFT JOIN Shop_Product ON TS.substring = P.id_product WHERE ISNULL(P.id_product)) THEN - INSERT INTO tmp_Msg_Error ( - guid, - id_type, - code, - msg - ) - SELECT - v_guid, - v_id_type_error_data, - v_code_error_data, - CONCAT('Invalid product IDs: ', IFNULL(GROUP_CONCAT(TS.substring SEPARATOR ', ') ,'NULL')) - FROM Split_Temp TS - LEFT JOIN Shop_Product ON TS.substring = P.id_product - WHERE ISNULL(P.id_product) - ; - END IF; - - DROP TABLE Temp_Split; - END IF; + IF a_debug = 1 THEN + SELECT + v_has_filter_order + , v_has_filter_permutation + , v_has_filter_date_from + , v_has_filter_date_to + ; END IF; + -- Permutations IF v_has_filter_permutation = 1 THEN - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN - CALL p_split(a_guid, a_ids_permutation, ','); - - IF EXISTS (SELECT * FROM Split_Temp TS LEFT JOIN Shop_Product_Permutation PP ON TS.substring = PP.id_permutation WHERE ISNULL(PP.id_permutation)) THEN - INSERT INTO tmp_Msg_Error ( - guid, - id_type, - code, - msg - ) - SELECT - v_guid, - v_id_type_error_data, - v_code_error_data, - CONCAT('Invalid permutation IDs: ', IFNULL(GROUP_CONCAT(TS.substring SEPARATOR ', ') ,'NULL')) - FROM Split_Temp TS - LEFT JOIN Shop_Product_Permutation PP ON TS.substring = PP.id_permutation - WHERE ISNULL(PP.id_permutation) - ; - END IF; - - DROP TABLE Temp_Split; - END IF; + CALL partsltd_prod.p_split(a_guid, a_ids_permutation, ',', a_debug); + + INSERT INTO tmp_Split ( + substring + , as_int + ) + SELECT + substring + , CONVERT(substring, DECIMAL(10,0)) AS as_int + FROM partsltd_prod.Split_Temp + WHERE 1=1 + AND GUID = a_guid + AND NOT ISNULL(substring) + AND substring != '' + ; + + CALL partsltd_prod.p_clear_split_temp( a_guid ); END IF; - IF v_has_filter_category = 1 OR v_has_filter_product = 1 OR v_has_filter_permutation = 1 THEN - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN - INSERT INTO tmp_Shop_Product ( - id_category, - id_product, - id_permutation, - active_category, - active_product, - active_permutation, - display_order_category, - display_order_product, - display_order_permutation - -- rank_permutation, - /* - name, - description, - /* - price_GBP_VAT_incl, - price_GBP_VAT_excl, - price_GBP_min, - * - latency_manufacture_days, - quantity_min, - quantity_max, - quantity_step, - quantity_stock, - is_subscription, - id_unit_measurement_interval_recurrence, - count_interval_recurrence, - id_stripe_product, - product_has_variations - */ - ) - SELECT - P.id_category, - P.id_product, - -- P.has_variations AS product_has_variations, - PP.id_permutation, - C.active AS active_category, - P.active AS active_product, - PP.active AS active_permutation, - C.display_order AS display_order_category, - P.display_order AS display_order_product, - PP.display_order AS display_order_permutation - -- RANK() OVER (ORDER BY C.display_order, P.display_order, PP.display_order) AS rank_permutation, #PARTITION BY P.id_category # _in_category - /* - P.name, - PP.description, - /* - PP.price_GBP_VAT_incl, - PP.price_GBP_VAT_excl, - PP.price_GBP_min, - * - PP.latency_manufacture_days, - PP.quantity_min, - PP.quantity_max, - PP.quantity_step, - PP.quantity_stock, - PP.is_subscription, - PP.id_unit_measurement_interval_recurrence, - PP.count_interval_recurrence, - PP.id_stripe_product, - P.has_variations - */ - FROM Shop_Product P - INNER JOIN Shop_Product_Permutation PP - ON P.id_product = PP.id_product - INNER JOIN Shop_Product_Category C - ON P.id_category = C.id_category - WHERE - # permutations - ( - ( - NOT v_has_filter_permutation - OR FIND_IN_SET(PP.id_permutation, a_ids_permutation) > 0 - ) - AND ( - a_get_inactive_permutation - OR PP.active = 1 - ) - ) - # categories - AND ( - ( - NOT v_has_filter_category - OR FIND_IN_SET(P.id_category, a_ids_category) > 0 - ) - AND ( - a_get_inactive_category - OR C.active = 1 - ) - ) - # products - AND ( - ( - NOT v_has_filter_product - OR FIND_IN_SET(P.id_product, a_ids_product) > 0 - ) - AND ( - a_get_inactive_product - OR P.active = 1 - ) - ) - ; - END IF; - END IF; - - -- Get orders - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN - CALL p_split(a_guid, a_ids_order, ','); - - IF v_has_filter_order AND EXISTS (SELECT * FROM Split_Temp TS LEFT JOIN Shop_Manufacturing_Purchase_Order MPO ON TS.substring = MPO.id_order WHERE ISNULL(MPO.id_order)) THEN + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN + IF EXISTS ( + SELECT * + FROM tmp_Split t_S + LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_S.as_int = PP.id_permutation + WHERE + ISNULL(t_S.as_int) + OR ISNULL(PP.id_permutation) + OR PP.active = 0 + ) THEN INSERT INTO tmp_Msg_Error ( - guid, - id_type, + id_type, code, msg ) SELECT - v_guid, - v_id_type_error_data, - v_code_error_data, - CONCAT('Invalid order IDs: ', IFNULL(GROUP_CONCAT(TS.substring SEPARATOR ', '), 'NULL')) - FROM Split_Temp TS - LEFT JOIN Shop_Manufacturing_Purchase_Order MPO ON TS.substring = MPO.id_order - WHERE ISNULL(MPO.id_order) + v_id_type_error_bad_data, + v_code_type_error_bad_data, + CONCAT('Invalid or inactive permutation IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL')) + FROM tmp_Split t_S + LEFT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_S.as_int = PP.id_permutation + WHERE + ISNULL(t_S.as_int) + OR ISNULL(PP.id_permutation) + OR PP.active = 0 ; - END IF; - - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN - INSERT INTO tmp_Shop_Manufacturing_Purchase_Order ( -- _Product_Link - id_order, - -- active, - rank_order + ELSE + INSERT INTO tmp_Permutation ( + id_permutation ) SELECT - MPO.id_order, - -- MPO.active, - RANK() OVER (ORDER BY MPO.id_order ASC) AS rank_order - FROM Shop_Manufacturing_Purchase_Order MPO - INNER JOIN Split_Temp TS ON MPO.id_order = TS.substring - INNER JOIN Shop_manufacturing_Purchase_Order_Product_Link MPOPL ON MPO.id_order = MPOPL.id_order - INNER JOIN Shop_Product_Permutation PP ON MPOPL.id_permutation = PP.id_permutation - INNER JOIN Shop_Product P ON PP.id_product = P.id_product - INNER JOIN Shop_Product_Category C ON P.id_category = C.id_category - LEFT JOIN tmp_Shop_Product t_P ON MPOPL.id_permutation = t_P.id_permutation - WHERE - # order - ( - ( - v_has_filter_order = 0 - OR ( - # ID - FIND_IN_SET(MPO.id_order, a_ids_order) > 0 - # date - AND ( - ( - v_has_filter_date_from = 0 - OR MPO.created_on > a_date_from - ) - AND ( - v_has_filter_date_to = 0 - OR MPO.created_on < a_date_to - ) - ) - ) - ) - # active - /* - AND ( - a_get_inactive_order - OR MPO.active = 1 - ) - */ - ) - # permutations - AND ( - ( - v_has_filter_category = 0 - AND v_has_filter_product = 0 - AND v_has_filter_permutation = 0 - ) - OR NOT ISNULL(t_P.id_permutation) -- MPO.id_permutation IN (SELECT DISTINCT id_permutation FROM tmp_Shop_Product) + PP.id_permutation + FROM tmp_Split t_S + RIGHT JOIN partsltd_prod.Shop_Product_Permutation PP ON t_S.as_int = PP.id_permutation + WHERE ( + v_has_filter_permutation = 0 + OR NOT ISNULL(t_S.as_int) ) ; END IF; - - DROP TABLE Split_Temp; + END IF; + + DELETE FROM tmp_Split; + + -- Manufacturing Purchase Orders + IF v_has_filter_order = 1 THEN + CALL partsltd_prod.p_split(a_guid, a_ids_order, ',', a_debug); - IF a_get_first_order_only THEN - DELETE t_MPO - FROM tmp_Shop_Manufacturing_Purchase_Order t_MPO - WHERE t_MPO.rank_order > ( - SELECT MIN(t_MPO.rank_order) - FROM tmp_Shop_Manufacturing_Purchase_Order t_MPO + INSERT INTO tmp_Split ( + substring + , as_int + ) + SELECT + substring + , CONVERT(substring, DECIMAL(10,0)) AS as_int + FROM partsltd_prod.Split_Temp + WHERE 1=1 + AND GUID = a_guid + AND NOT ISNULL(substring) + AND substring != '' + ; + + CALL partsltd_prod.p_clear_split_temp( a_guid ); + END IF; + + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error LIMIT 1) THEN + IF EXISTS ( + SELECT * + FROM tmp_Split t_S + LEFT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order MPO ON t_S.as_int = MPO.id_order + WHERE + ISNULL(t_S.as_int) + OR ISNULL(MPO.id_order) + OR ( + MPO.active = 0 + AND a_get_inactive_order = 0 + ) + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type, + code, + msg ) + SELECT + v_id_type_error_bad_data, + v_code_type_error_bad_data, + CONCAT('Invalid or inactive Manufacturing Purchase Order IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL')) + FROM tmp_Split t_S + LEFT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order MPO ON t_S.as_int = MPO.id_order + WHERE + ISNULL(t_S.as_int) + OR ISNULL(MPO.id_order) + OR ( + MPO.active = 0 + AND a_get_inactive_order = 0 + ) + ; + ELSE + INSERT INTO tmp_Manufacturing_Purchase_Order ( + id_order + ) + SELECT + MPO.id_order + FROM tmp_Split t_S + RIGHT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order MPO ON t_S.as_int = MPO.id_order + INNER JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link MPOPL ON MPO.id_order = MPOPL.id_order + INNER JOIN tmp_Permutation t_PP ON MPOPL.id_permutation = t_PP.id_permutation + WHERE ( + a_get_all_order = 1 + OR ( + v_has_filter_order = 1 + AND NOT ISNULL(t_S.as_int) + ) + OR ( + v_has_filter_permutation = 1 + AND NOT ISNULL(t_PP.id_permutation) + ) + ) + AND ( + a_get_inactive_order = 1 + OR MPO.active = 1 + ) + AND ( + v_has_filter_date_from = 0 + OR MPO.created_on > a_date_from + ) + AND ( + v_has_filter_date_to = 0 + OR MPO.created_on < a_date_to + ) + ; END IF; - END IF; + END IF; + + DELETE FROM tmp_Split; -- Permissions - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid LIMIT 1) THEN - # SET v_id_user := (SELECT id_user FROM Shop_User WHERE name = CURRENT_USER()); - SET v_ids_permission_manufacturing_purchase_order := (SELECT GROUP_CONCAT(id_permission SEPARATOR ',') FROM Shop_Permission WHERE code IN ('STORE_manufacturing', 'STORE_manufacturing_PURCHASE_ORDER')); - -- SET v_ids_permutation_permission := (SELECT GROUP_CONCAT(id_permutation SEPARATOR ',') FROM tmp_Shop_Product WHERE NOT ISNULL(id_permutation)); - SET v_ids_product_permission := (SELECT GROUP_CONCAT(P.id_product SEPARATOR ',') FROM (SELECT DISTINCT id_product FROM tmp_Shop_Product WHERE NOT ISNULL(id_product)) P); - - -- SELECT v_guid, a_id_user, false, v_id_permission_product, v_id_access_level_view, v_ids_permutation_permission; - -- select * from Shop_Calc_User_Temp; - - CALL p_shop_calc_user(v_guid, a_id_user, FALSE, v_ids_permission_manufacturing_purchase_order, v_id_access_level_view, v_ids_product_permission); - - -- select * from Shop_Calc_User_Temp; - - IF NOT EXISTS (SELECT can_view FROM Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = v_guid) THEN - INSERT INTO tmp_Msg_Error ( - guid, - id_type, - code, - msg - ) - SELECT - v_guid, - v_id_type_error_data, - v_code_error_data, - CONCAT('You do not have view permissions for ', GROUP_CONCAT(name SEPARATOR ', ')) - FROM Shop_Permission - WHERE id_permission = v_ids_permission_manufacturing_purchase_order - ; - END IF; - - - UPDATE tmp_Shop_Product t_P - INNER JOIN Shop_Calc_User_Temp UE_T - ON t_P.id_product = UE_T.id_product -- t_P.id_permutation = UE_T.id_permutation - AND UE_T.GUID = v_guid - SET t_P.can_view = UE_T.can_view, - t_P.can_edit = UE_T.can_edit, - t_P.can_admin = UE_T.can_admin + IF a_debug = 1 THEN + SELECT + v_guid + , a_id_user + , FALSE -- get inactive users + , v_ids_permission_manufacturing_purchase_order + , v_id_access_level_view + , '' -- ids_product + , 0 -- a_debug + ; + SELECT * FROM partsltd_prod.Shop_Calc_User_Temp; + END IF; + + CALL p_shop_calc_user( + v_guid + , a_id_user + , FALSE -- get inactive users + , v_ids_permission_manufacturing_purchase_order + , v_id_access_level_view + , '' -- ids_product + , 0 -- a_debug + ); + + IF a_debug = 1 THEN + SELECT * FROM partsltd_prod.Shop_Calc_User_Temp; + END IF; + + IF NOT EXISTS (SELECT can_view FROM partsltd_prod.Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = v_guid) THEN + DELETE FROM tmp_Msg_Error; + + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + VALUES ( + v_id_type_error_no_permission + , v_code_type_error_no_permission + , CONCAT('You do not have view permissions for ', (SELECT name FROM partsltd_prod.Shop_Permission WHERE id_permission = v_id_permission_manufacturing LIMIT 1)) + ) ; - - # 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 - ; END IF; - - -- select * from tmp_Shop_Product; - + IF EXISTS ( SELECT * FROM tmp_Msg_Error LIMIT 1 ) THEN + DELETE FROM tmp_Manufacturing_Purchase_Order_Product_Link; + DELETE FROM tmp_Manufacturing_Purchase_Order; + END IF; + -- Returns - -- SET v_now := NOW(); - - # manufacturing Purchase Order - SELECT # * - t_MPO.id_order, - MPO.cost_total_local, - MPO.id_currency_cost, - MPO.value_produced_total_local, - t_MPO.active - FROM Shop_Manufacturing_Purchase_Order MPO - INNER JOIN tmp_Shop_Manufacturing_Purchase_Order t_MPO ON MPO.id_order = t_MPO.id_order + /* + # Manufacturings + SELECT + t_S.id_manufacturing, + S.name_company, + S.name_contact, + S.department_contact, + S.id_address, + S.phone_number, + S.fax, + S.email, + S.website, + S.id_currency, + t_S.active + FROM tmp_Manufacturing t_S + INNER JOIN partsltd_prod.Shop_Manufacturing S + ON t_S.id_manufacturing = S.id_manufacturing + ; + */ + + # Manufacturing Purchase Order + SELECT + t_MPO.id_order + , MPO.id_currency + , MPO.cost_total_local_VAT_excl + , MPO.cost_total_local_VAT_incl + , MPO.price_total_local_VAT_excl + , MPO.price_total_local_VAT_incl + , MPO.active + , MPO.created_on + , CONCAT( + MPO.cost_total_local_VAT_excl + , ' on ' + , MPO.created_on + ) AS name + FROM tmp_Manufacturing_Purchase_Order t_MPO + INNER JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order MPO ON MPO.id_order = t_MPO.id_order ; - # manufacturing Purchase Order Product Link + # Manufacturing Purchase Order Product Link SELECT - MPOPL.id_link, - MPOPL.id_order, - MPOPL.id_permutation, - P.name as name_product, - MPOPL.cost_total_local, - MPOPL.id_currency_cost, - MPOPL.value_produced_total_local, - MPOPL.quantity_used, - MPOPL.id_unit_quantity, - MPOPL.quantity_produced, - MPOPL.latency_manufacture_days, - MPOPL.display_order - FROM 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 - INNER JOIN tmp_Shop_Manufacturing_Purchase_Order t_MPO ON MPOPL.id_order = t_MPO.id_order - INNER JOIN Shop_Product_Permutation PP ON MPOPL.id_permutation = PP.id_permutation - INNER JOIN Shop_Product P ON PP.id_product = P.id_product - INNER JOIN Shop_Product_Category C ON P.id_category = C.id_category - ORDER BY MPOPL.id_order, C.display_order, P.display_order, PP.display_order + MPOPL.id_link + , MPOPL.id_order + , MPOPL.id_permutation + , fn_shop_get_product_permutation_name(MPOPL.id_permutation) AS name_permutation + , MPOPL.id_unit_quantity + , MPOPL.quantity_used + , MPOPL.quantity_produced + , MPOPL.latency_manufacture_days + , MPOPL.display_order + , MPOPL.cost_unit_local_VAT_excl + , MPOPL.cost_unit_local_VAT_incl + , MPOPL.price_unit_local_VAT_excl + , MPOPL.price_unit_local_VAT_incl + , MPOPL.active + FROM tmp_Manufacturing_Purchase_Order t_MPO + INNER JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link MPOPL ON t_MPO.id_order = MPOPL.id_order ; # Errors - SELECT - /* - t_ME.display_order, - t_ME.guid, - t_ME.id_type, - t_ME.msg, - MET.code, - MET.name, - MET.description - */ - * + SELECT * FROM tmp_Msg_Error t_ME - INNER JOIN Shop_Msg_Error_Type MET - ON t_ME.id_type = MET.id_type - WHERE guid = v_guid + INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type ; - /* - # Return arguments for test - SELECT - a_ids_category, - a_get_inactive_category, - a_ids_product, - a_get_inactive_product, - a_get_first_product_only, - a_get_all_product, - a_ids_image, - a_get_inactive_image, - a_get_first_image_only, - a_get_all_image - ; - */ - - # select 'other outputs'; - # select * from tmp_Shop_Product; - - -- Clean up - DROP TABLE IF EXISTS tmp_Shop_Manufacturing_Purchase_Order_Product_Link; - DROP TABLE IF EXISTS tmp_Shop_Manufacturing_Purchase_Order; - DROP TABLE IF EXISTS tmp_Shop_Product; - - DELETE FROM Shop_Calc_User_Temp - WHERE GUID = v_guid - ; + IF a_debug = 1 THEN + SELECT * from tmp_Manufacturing_Purchase_Order; + SELECT * from tmp_Permutation; + END IF; + + DROP TEMPORARY TABLE IF EXISTS tmp_Manufacturing_Purchase_Order_Product_Link; + DROP TEMPORARY TABLE IF EXISTS tmp_Manufacturing_Purchase_Order; + DROP TEMPORARY TABLE IF EXISTS tmp_Permutation; + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + DROP TEMPORARY TABLE IF EXISTS tmp_Split; + + IF a_debug = 1 THEN + CALL p_debug_timing_reporting( v_time_start ); + END IF; END // DELIMITER ;; -/* CALL p_shop_get_many_manufacturing_purchase_order ( - '', # a_id_user - 1, # a_get_all_order - -- 0, # a_get_inactive_order - 0, # a_get_first_order_only - '', # a_ids_order - 0, # a_get_inactive_category - '', # a_ids_category - 0, # a_get_inactive_product - '', # a_ids_product - 0, # a_get_inactive_permutation - '', # a_ids_permutation - NULL, # a_date_from - NULL # a_date_to + 1 # a_id_user + , 1 # a_get_all_order + , 0 # a_get_inactive_order + , '' # a_ids_order + , '' # a_ids_permutation + , NULL # a_date_from + , NULL # a_date_to + , 0 # a_debug ); -select * from shop_image; -select * from shop_product; -select * from TMP_MSG_ERROR; -DROP TABLE TMP_MSG_ERROR; - -insert into shop_product_change_set (comment) - values ('set product not subscription - test bool output to python'); - update shop_product - set is_subscription = 0, - id_change_set = (select id_change_set from shop_product_change_set order by id_change_set desc limit 1) - where id_product = 1 - - +/* */ @@ -20313,6 +20400,7 @@ VALUES , ('NO_PERMISSION', 'No permission', 'Not authorised') , ('PRODUCT_AVAILABILITY', 'Product not available', 'Product not available') , ('MYSQL_ERROR', 'MySQL error', 'MySQL execution error.') + , ('WARNING', 'Warning', 'Non-breaking error.') ; # File Types @@ -20965,10 +21053,28 @@ VALUES # Supplier INSERT INTO Shop_Supplier ( - name_company, name_contact, department_contact, id_address, phone_number, fax, email, website, id_currency + name_company + , name_contact + , department_contact + -- , id_address + , phone_number + , fax + , email + , website + , id_currency ) VALUES - ('Precision And Research Technology Systems Limited', 'Teddy Middleton-Smith', 'Executive Management', 1, '07375571430', '', 'teddy@partsltd.co.uk', 'www.partsltd.co.uk', 1) + ( + 'Precision And Research Technology Systems Limited' + , 'Teddy Middleton-Smith' + , 'Executive Management' + -- , 1 + , '07375571430' + , '' + , 'teddy@partsltd.co.uk' + , 'www.partsltd.co.uk' + , 1 + ) ; # Suppliers @@ -20976,7 +21082,7 @@ INSERT INTO Shop_Supplier ( name_company , name_contact , department_contact - , id_address + -- , id_address , phone_number , fax , email @@ -20984,7 +21090,52 @@ INSERT INTO Shop_Supplier ( , id_currency ) VALUES - ('Malt Kiln Farm Shop', NULL, NULL, 1, '01788 832640', NULL, 'farmshop@maltkilnfarmshop.co.uk', 'https://www.maltkilnfarmshop.co.uk/', 1) + ( + 'Malt Kiln Farm Shop' + , NULL + , NULL + -- , 1 + , '01788 832640' + , NULL + , 'farmshop@maltkilnfarmshop.co.uk' + , 'https://www.maltkilnfarmshop.co.uk/' + , 1 + ) +; + + +# Supplier Addresses +INSERT INTO Shop_Supplier_Address ( + id_supplier + , id_region + , postcode + , address_line_1 + , address_line_2 + , city + , county + , active +) +VALUES + ( + 1 + , 1 + , 'CV22 6DN' + , '53 Alfred Green Close' + , '' + , 'Rugby' + , 'Warwickshire' + , 1 + ), + ( + 1 + , 1 + , 'CV22 6DN' + , '53 Alfred Green Close' + , '' + , 'Rugby' + , 'Warwickshire' + , 1 + ) ; /* diff --git a/static/MySQL/0001_destroy.sql b/static/MySQL/0001_destroy.sql index 561523ff..38c42774 100644 --- a/static/MySQL/0001_destroy.sql +++ b/static/MySQL/0001_destroy.sql @@ -16,29 +16,42 @@ DROP TABLE IF EXISTS tmp_Price; DROP TABLE IF EXISTS tmp_Shop_User; DROP TABLE IF EXISTS tmp_Shop_Order; DROP TABLE IF EXISTS tmp_Shop_Product; +DROP TABLE IF EXISTS tmp_Product; +DROP TABLE IF EXISTS tmp_Product_Permutation; +DROP TABLE IF EXISTS tmp_Permutation; DROP TABLE IF EXISTS tmp_Shop_Product_p_shop_calc_user; DROP TABLE IF EXISTS tmp_Shop_Product_p_Shop_Calc_User; DROP TABLE IF EXISTS tmp_Shop_Image; +DROP TABLE IF EXISTS tmp_Image; +DROP TABLE IF EXISTS tmp_Product_Image; DROP TABLE IF EXISTS tmp_Shop_Variation; +DROP TABLE IF EXISTS tmp_Variation; +DROP TABLE IF EXISTS tmp_Variation_Type; DROP TABLE IF EXISTS tmp_Shop_Discount; DROP TABLE IF EXISTS tmp_Discount; DROP TABLE IF EXISTS tmp_Shop_Category; +DROP TABLE IF EXISTS tmp_Category; DROP TABLE IF EXISTS tmp_Shop_Product_Category; +DROP TABLE IF EXISTS tmp_Product_Category; DROP TABLE IF EXISTS tmp_Shop_Product_Currency_Region_Link; DROP TABLE IF EXISTS tmp_Shop_Product_Currency_Link; DROP TABLE IF EXISTS tmp_User_Role_Link; DROP TABLE IF EXISTS tmp_Shop_Basket; DROP TABLE IF EXISTS tmp_Shop_Supplier_Purchase_Order_Product_Link; +DROP TABLE IF EXISTS tmp_Supplier_Purchase_Order_Product_Link; DROP TABLE IF EXISTS tmp_Shop_Supplier_Purchase_Order; +DROP TABLE IF EXISTS tmp_Supplier_Purchase_Order; DROP TABLE IF EXISTS tmp_Shop_Supplier; +DROP TABLE IF EXISTS tmp_Supplier; DROP TABLE IF EXISTS tmp_Shop_Manufacturing_Purchase_Order_Product_Link; +DROP TABLE IF EXISTS tmp_Manufacturing_Purchase_Order_Product_Link; DROP TABLE IF EXISTS tmp_Shop_Manufacturing_Purchase_Order; +DROP TABLE IF EXISTS tmp_Manufacturing_Purchase_Order; DROP TABLE IF EXISTS tmp_Shop_Customer; DROP TABLE IF EXISTS tmp_Shop_Customer_Sale_Order_Product_Link; DROP TABLE IF EXISTS tmp_Shop_Customer_Sale_Order; - # Delete old tables DROP TABLE IF EXISTS Split_Temp; DROP TABLE IF EXISTS Split_Key_Value_Pair_Csv_Temp; @@ -62,6 +75,7 @@ DROP TABLE IF EXISTS Shop_Manufacturing_Purchase_Order_Product_Link_Temp; DROP TABLE IF EXISTS Shop_Manufacturing_Purchase_Order_Product_Link_Audit; DROP TABLE IF EXISTS Shop_Manufacturing_Purchase_Order_Product_Link; +DROP TABLE IF EXISTS Shop_Manufacturing_Purchase_Order_Temp; DROP TABLE IF EXISTS Shop_Manufacturing_Purchase_Order_Audit; DROP TABLE IF EXISTS Shop_Manufacturing_Purchase_Order; @@ -69,9 +83,14 @@ DROP TABLE IF EXISTS Shop_Supplier_Purchase_Order_Product_Link_Temp; DROP TABLE IF EXISTS Shop_Supplier_Purchase_Order_Product_Link_Audit; DROP TABLE IF EXISTS Shop_Supplier_Purchase_Order_Product_Link; +DROP TABLE IF EXISTS Shop_Supplier_Purchase_Order_Temp; DROP TABLE IF EXISTS Shop_Supplier_Purchase_Order_Audit; DROP TABLE IF EXISTS Shop_Supplier_Purchase_Order; +DROP TABLE IF EXISTS Shop_Supplier_Address_Temp; +DROP TABLE IF EXISTS Shop_Supplier_Address_Audit; +DROP TABLE IF EXISTS Shop_Supplier_Address; + DROP TABLE IF EXISTS Shop_Supplier_Temp; DROP TABLE IF EXISTS Shop_Supplier_Audit; DROP TABLE IF EXISTS Shop_Supplier; diff --git a/static/MySQL/1106_tbl_Shop_Address.sql b/static/MySQL/1106_tbl_Shop_Address.sql index 37f3dfe7..3f58e177 100644 --- a/static/MySQL/1106_tbl_Shop_Address.sql +++ b/static/MySQL/1106_tbl_Shop_Address.sql @@ -5,18 +5,27 @@ SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Address'; CREATE TABLE Shop_Address ( - id_address INT NOT NULL AUTO_INCREMENT PRIMARY KEY, - id_region INT NOT NULL, - postcode VARCHAR(20) NOT NULL, - address_line_1 VARCHAR(256) NOT NULL, - address_line_2 VARCHAR(256) NOT NULL, - city VARCHAR(256) NOT NULL, - county VARCHAR(256) NOT NULL, - active BIT NOT NULL DEFAULT 1, - created_on DATETIME, - created_by INT, - id_change_set INT, - CONSTRAINT FK_Shop_Address_id_change_set + id_address INT NOT NULL AUTO_INCREMENT PRIMARY KEY + , id_region INT NOT NULL + , CONSTRAINT FK_Shop_Address_id_region + FOREIGN KEY (id_region) + REFERENCES partsltd_prod.Shop_Region(id_region) + /* + , id_supplier INT NULL + , CONSTRAINT FK_Shop_Address_id_supplier + FOREIGN KEY (id_supplier) + REFERENCES partsltd_prod.Shop_Supplier(id_supplier) + */ + , postcode VARCHAR(20) NOT NULL + , address_line_1 VARCHAR(256) NOT NULL + , address_line_2 VARCHAR(256) NOT NULL + , city VARCHAR(256) NOT NULL + , county VARCHAR(256) NOT NULL + , active BIT NOT NULL DEFAULT 1 + , created_on DATETIME + , created_by INT + , id_change_set INT + , CONSTRAINT FK_Shop_Address_id_change_set FOREIGN KEY (id_change_set) - REFERENCES Shop_User_Change_Set(id_change_set) + REFERENCES partsltd_prod.Shop_User_Change_Set(id_change_set) ); \ No newline at end of file diff --git a/static/MySQL/1107_tbl_Shop_Address_Audit.sql b/static/MySQL/1107_tbl_Shop_Address_Audit.sql index 9ef937c2..4364f913 100644 --- a/static/MySQL/1107_tbl_Shop_Address_Audit.sql +++ b/static/MySQL/1107_tbl_Shop_Address_Audit.sql @@ -1,8 +1,6 @@ # Address Audits - - SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Address_Audit'; CREATE TABLE IF NOT EXISTS Shop_Address_Audit ( diff --git a/static/MySQL/1400_tbl_Shop_Supplier.sql b/static/MySQL/1400_tbl_Shop_Supplier.sql index 99f6e81a..201de6db 100644 --- a/static/MySQL/1400_tbl_Shop_Supplier.sql +++ b/static/MySQL/1400_tbl_Shop_Supplier.sql @@ -8,10 +8,12 @@ CREATE TABLE IF NOT EXISTS Shop_Supplier ( name_company VARCHAR(255) NOT NULL, name_contact VARCHAR(255) NULL, department_contact VARCHAR(255) NULL, + /* id_address INT NOT NULL, CONSTRAINT FK_Shop_Supplier_id_address FOREIGN KEY (id_address) REFERENCES Shop_Address(id_address), + */ phone_number VARCHAR(50) NULL, fax VARCHAR(50) NULL, email VARCHAR(255) NOT NULL, diff --git a/static/MySQL/1402_tbl_Shop_Supplier_Temp.sql b/static/MySQL/1402_tbl_Shop_Supplier_Temp.sql index 7e474daf..dda7056d 100644 --- a/static/MySQL/1402_tbl_Shop_Supplier_Temp.sql +++ b/static/MySQL/1402_tbl_Shop_Supplier_Temp.sql @@ -8,11 +8,12 @@ CREATE TABLE IF NOT EXISTS Shop_Supplier_Temp ( name_company VARCHAR(255) NOT NULL, name_contact VARCHAR(255) NULL, department_contact VARCHAR(255) NULL, - id_address INT NOT NULL, + -- id_address INT NOT NULL, phone_number VARCHAR(50) NULL, fax VARCHAR(50) NULL, email VARCHAR(255) NOT NULL, website VARCHAR(255) NULL, id_currency INT NOT NULL, - active BIT NULL + active BIT NULL, + GUID BINARY(36) NOT NULL ); diff --git a/static/MySQL/1403_tbl_Shop_Supplier_Address.sql b/static/MySQL/1403_tbl_Shop_Supplier_Address.sql new file mode 100644 index 00000000..14d1284c --- /dev/null +++ b/static/MySQL/1403_tbl_Shop_Supplier_Address.sql @@ -0,0 +1,29 @@ + +# Supplier Addresses + +SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Address'; + +CREATE TABLE Shop_Supplier_Address ( + id_address INT NOT NULL AUTO_INCREMENT PRIMARY KEY + , id_supplier INT NOT NULL + , CONSTRAINT FK_Shop_Supplier_Address_id_supplier + FOREIGN KEY (id_supplier) + REFERENCES partsltd_prod.Shop_Supplier(id_supplier) + ON UPDATE RESTRICT + , id_region INT NOT NULL + , CONSTRAINT FK_Shop_Supplier_Address_id_region + FOREIGN KEY (id_region) + REFERENCES partsltd_prod.Shop_Region(id_region) + , postcode VARCHAR(20) NOT NULL + , address_line_1 VARCHAR(256) NOT NULL + , address_line_2 VARCHAR(256) NOT NULL + , city VARCHAR(256) NOT NULL + , county VARCHAR(256) NOT NULL + , active BIT NOT NULL DEFAULT 1 + , created_on DATETIME + , created_by INT + , id_change_set INT + , CONSTRAINT FK_Shop_Supplier_Address_id_change_set + FOREIGN KEY (id_change_set) + REFERENCES partsltd_prod.Shop_User_Change_Set(id_change_set) +); \ No newline at end of file diff --git a/static/MySQL/1404_tbl_Shop_Supplier_Address_Audit.sql b/static/MySQL/1404_tbl_Shop_Supplier_Address_Audit.sql new file mode 100644 index 00000000..c3af2add --- /dev/null +++ b/static/MySQL/1404_tbl_Shop_Supplier_Address_Audit.sql @@ -0,0 +1,21 @@ + +# Supplier Address Audits + +SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Address_Audit'; + +CREATE TABLE IF NOT EXISTS Shop_Supplier_Address_Audit ( + id_audit INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + id_address INT NOT NULL, + CONSTRAINT FK_Shop_Supplier_Address_Audit_id_address + FOREIGN KEY (id_address) + REFERENCES Shop_Supplier_Address(id_address) + ON UPDATE RESTRICT, + name_field VARCHAR(50), + value_prev VARCHAR(500), + value_new VARCHAR(500), + id_change_set INT NOT NULL, + CONSTRAINT FK_Shop_Supplier_Address_Audit_id_change_set + FOREIGN KEY (id_change_set) + REFERENCES Shop_User_Change_Set(id_change_set) + ON UPDATE RESTRICT +); \ No newline at end of file diff --git a/static/MySQL/1405_tbl_Shop_Supplier_Address_Temp.sql b/static/MySQL/1405_tbl_Shop_Supplier_Address_Temp.sql new file mode 100644 index 00000000..0f5019e5 --- /dev/null +++ b/static/MySQL/1405_tbl_Shop_Supplier_Address_Temp.sql @@ -0,0 +1,17 @@ + +# Supplier Addresses Staging + +SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Supplier_Address_Temp'; + +CREATE TABLE Shop_Supplier_Address_Temp ( + id_address INT NOT NULL AUTO_INCREMENT PRIMARY KEY + , id_supplier INT NOT NULL + , id_region INT NOT NULL + , postcode VARCHAR(20) NOT NULL + , address_line_1 VARCHAR(256) NOT NULL + , address_line_2 VARCHAR(256) NOT NULL + , city VARCHAR(256) NOT NULL + , county VARCHAR(256) NOT NULL + , active BIT NOT NULL DEFAULT 1 + , GUID BINARY(36) NOT NULL +); \ No newline at end of file diff --git a/static/MySQL/1412_tbl_Shop_Supplier_Purchase_Order_Product_Link.sql b/static/MySQL/1412_tbl_Shop_Supplier_Purchase_Order_Product_Link.sql index 73d5890e..9d16cf04 100644 --- a/static/MySQL/1412_tbl_Shop_Supplier_Purchase_Order_Product_Link.sql +++ b/static/MySQL/1412_tbl_Shop_Supplier_Purchase_Order_Product_Link.sql @@ -15,7 +15,7 @@ CREATE TABLE IF NOT EXISTS Shop_Supplier_Purchase_Order_Product_Link ( CONSTRAINT FK_Shop_Supplier_Purchase_Order_Product_Link_id_permutation FOREIGN KEY (id_permutation) REFERENCES Shop_Product_Permutation(id_permutation), - id_currency_cost INT NOT NULL, + -- id_currency_cost INT NOT NULL, id_unit_quantity INT NOT NULL, CONSTRAINT FK_Shop_Supplier_Purchase_Order_Product_Link_id_unit_quantity FOREIGN KEY (id_unit_quantity) diff --git a/static/MySQL/1415_tbl_Shop_Manufacturing_Purchase_Order.sql b/static/MySQL/1415_tbl_Shop_Manufacturing_Purchase_Order.sql index b66e4d25..7d347b42 100644 --- a/static/MySQL/1415_tbl_Shop_Manufacturing_Purchase_Order.sql +++ b/static/MySQL/1415_tbl_Shop_Manufacturing_Purchase_Order.sql @@ -1,16 +1,22 @@ - # Manufacturing Purchase Order - - SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Manufacturing_Purchase_Order'; CREATE TABLE IF NOT EXISTS Shop_Manufacturing_Purchase_Order ( id_order INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + /* cost_total_local FLOAT NOT NULL, id_currency_cost INT NOT NULL, - value_produced_total_local FLOAT NOT NULL, + */ + id_currency INT NOT NULL, + CONSTRAINT FK_Manufacturing_Purchase_Order_id_currency + FOREIGN KEY (id_currency) + REFERENCES Shop_Currency(id_currency), + cost_total_local_VAT_excl FLOAT NOT NULL, + cost_total_local_VAT_incl FLOAT NOT NULL, + price_total_local_VAT_excl FLOAT NOT NULL, + price_total_local_VAT_incl FLOAT NOT NULL, /* latency_delivery INT NOT NULL, quantity_ordered FLOAT NOT NULL, diff --git a/static/MySQL/1417_tbl_Shop_Manufacturing_Purchase_Order_Temp.sql b/static/MySQL/1417_tbl_Shop_Manufacturing_Purchase_Order_Temp.sql new file mode 100644 index 00000000..82040c97 --- /dev/null +++ b/static/MySQL/1417_tbl_Shop_Manufacturing_Purchase_Order_Temp.sql @@ -0,0 +1,28 @@ + +# Manufacturing Purchase Order Temp + +SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Shop_Manufacturing_Purchase_Order_Temp'; + +CREATE TABLE IF NOT EXISTS Shop_Manufacturing_Purchase_Order_Temp ( + id_order INT NOT NULL AUTO_INCREMENT PRIMARY KEY, + /* + cost_total_local FLOAT NOT NULL, + */ + id_currency_cost INT NOT NULL, + cost_total_local_VAT_excl FLOAT NOT NULL, + cost_total_local_VAT_incl FLOAT NOT NULL, + price_total_local_VAT_excl FLOAT NOT NULL, + price_total_local_VAT_incl FLOAT NOT NULL, + /* + latency_delivery INT NOT NULL, + quantity_ordered FLOAT NOT NULL, + id_unit_quantity INT NOT NULL, + CONSTRAINT FK_Shop_Manufacturing_Purchase_Order_id_unit_quantity + FOREIGN KEY (id_unit_quantity) + REFERENCES Shop_Unit_Measurement(id_unit), + quantity_received INT NULL, + display_order INT NOT NULL, + */ + active BIT NOT NULL DEFAULT 1, + GUID BINARY(36) NOT NULL +); diff --git a/static/MySQL/1418_tbl_Shop_Manufacturing_Purchase_Order_Product_Link.sql b/static/MySQL/1418_tbl_Shop_Manufacturing_Purchase_Order_Product_Link.sql index 3f92002b..7bcb3ebd 100644 --- a/static/MySQL/1418_tbl_Shop_Manufacturing_Purchase_Order_Product_Link.sql +++ b/static/MySQL/1418_tbl_Shop_Manufacturing_Purchase_Order_Product_Link.sql @@ -15,16 +15,17 @@ CREATE TABLE IF NOT EXISTS Shop_Manufacturing_Purchase_Order_Product_Link ( CONSTRAINT FK_Manufacturing_Purchase_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, + cost_unit_local_VAT_excl FLOAT NOT NULL, + cost_unit_local_VAT_incl FLOAT NOT NULL, + price_unit_local_VAT_excl FLOAT NOT NULL, + price_unit_local_VAT_incl FLOAT NOT NULL, id_unit_quantity INT NOT NULL, CONSTRAINT FK_Manufacturing_Purchase_Order_id_unit_quantity FOREIGN KEY (id_unit_quantity) REFERENCES Shop_Unit_Measurement(id_unit_measurement), - latency_manufacture_days INT NOT NULL, + quantity_used FLOAT NOT NULL, quantity_produced FLOAT NOT NULL, + latency_manufacture_days INT NOT NULL, display_order INT NOT NULL, active BIT NOT NULL, created_on DATETIME, diff --git a/static/MySQL/1420_tbl_Shop_Manufacturing_Purchase_Order_Product_Link_Temp.sql b/static/MySQL/1420_tbl_Shop_Manufacturing_Purchase_Order_Product_Link_Temp.sql index a6684530..22a99720 100644 --- a/static/MySQL/1420_tbl_Shop_Manufacturing_Purchase_Order_Product_Link_Temp.sql +++ b/static/MySQL/1420_tbl_Shop_Manufacturing_Purchase_Order_Product_Link_Temp.sql @@ -1,8 +1,6 @@ # Manufacturing Purchase Order Product Link Temp - - -- DROP TABLE Shop_Manufacturing_Purchase_Order_Product_Link_Temp; -- SELECT * FROM Shop_Manufacturing_Purchase_Order_Product_Link_Temp; @@ -10,26 +8,17 @@ SELECT CONCAT('WARNING: Table ', TABLE_NAME, ' already exists.') AS msg_warning CREATE TABLE IF NOT EXISTS Shop_Manufacturing_Purchase_Order_Product_Link_Temp ( id_link INT NOT NULL PRIMARY KEY, - GUID BINARY(36) NOT NULL, id_order INT NOT NULL, - /* - CONSTRAINT FK_Manuf_Purch_Order_Product_Link_Temp_id_order - FOREIGN KEY (id_order) - REFERENCES Shop_Manufacturing_Purchase_Order(id_order), - */ id_permutation INT NOT NULL, - CONSTRAINT FK_Manuf_Purch_Order_Product_Link_Temp_id_permutation - FOREIGN KEY (id_permutation) - REFERENCES Shop_Product_Permutation(id_permutation), - cost_total_local FLOAT NOT NULL, - id_currency_cost INT NOT NULL, - quantity_used FLOAT NOT NULL, id_unit_quantity INT NOT NULL, - CONSTRAINT FK_Manuf_Purch_Order_Product_Link_Temp_id_unit_quantity - FOREIGN KEY (id_unit_quantity) - REFERENCES Shop_Unit_Measurement(id_unit_measurement), - quantity_produced FLOAT NULL, + quantity_used FLOAT NOT NULL, latency_manufacture_days INT NOT NULL, + quantity_produced FLOAT NOT NULL, display_order INT NOT NULL, - active BIT NOT NULL + active BIT NOT NULL, + cost_unit_local_VAT_excl FLOAT NULL, + cost_unit_local_VAT_incl FLOAT NULL, + price_unit_local_VAT_excl FLOAT NULL, + price_unit_local_VAT_incl FLOAT NULL, + GUID BINARY(36) NOT NULL ); diff --git a/static/MySQL/3400_tri_Shop_Supplier.sql b/static/MySQL/3400_tri_Shop_Supplier.sql index a43b1ec4..97469e06 100644 --- a/static/MySQL/3400_tri_Shop_Supplier.sql +++ b/static/MySQL/3400_tri_Shop_Supplier.sql @@ -47,10 +47,12 @@ BEGIN SELECT NEW.id_supplier, 'department_contact', OLD.department_contact, NEW.department_contact, NEW.id_change_set WHERE NOT OLD.department_contact <=> NEW.department_contact UNION + /* # Changed id_address SELECT NEW.id_supplier, 'id_address', OLD.id_address, NEW.id_address, NEW.id_change_set WHERE NOT OLD.id_address <=> NEW.id_address UNION + */ # Changed phone_number SELECT NEW.id_supplier, 'phone_number', OLD.phone_number, NEW.phone_number, NEW.id_change_set WHERE NOT OLD.phone_number <=> NEW.phone_number diff --git a/static/MySQL/3403_tri_Shop_Supplier_Address.sql b/static/MySQL/3403_tri_Shop_Supplier_Address.sql new file mode 100644 index 00000000..93315302 --- /dev/null +++ b/static/MySQL/3403_tri_Shop_Supplier_Address.sql @@ -0,0 +1,65 @@ + +# Shop Supplier Address + +DROP TRIGGER IF EXISTS before_insert_Shop_Supplier_Address; +DROP TRIGGER IF EXISTS before_update_Shop_Supplier_Address; + + +DELIMITER // +CREATE TRIGGER before_insert_Shop_Supplier_Address +BEFORE INSERT ON Shop_Supplier_Address +FOR EACH ROW +BEGIN + SET NEW.created_on := IFNULL(NEW.created_on, NOW()); + SET NEW.created_by := IFNULL(NEW.created_by, IFNULL((SELECT id_user FROM Shop_User WHERE firstname = CURRENT_USER()), -1)); +END // +DELIMITER ;; + + +DELIMITER // +CREATE TRIGGER before_update_Shop_Supplier_Address +BEFORE UPDATE ON Shop_Supplier_Address +FOR EACH ROW +BEGIN + IF OLD.id_change_set <=> NEW.id_change_set THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'New change Set ID must be provided.'; + END IF; + + INSERT INTO Shop_Supplier_Address_Audit ( + id_address, + name_field, + value_prev, + value_new, + id_change_set + ) + # Changed region + SELECT NEW.id_address, 'id_region', OLD.id_region, NEW.id_region, NEW.id_change_set + WHERE NOT OLD.id_region <=> NEW.id_region + UNION + # Changed postcode + SELECT NEW.id_address, 'postcode', OLD.postcode, NEW.postcode, NEW.id_change_set + WHERE NOT OLD.postcode <=> NEW.postcode + UNION + # Changed address_line_1 + SELECT NEW.id_address, 'address_line_1', OLD.address_line_1, NEW.address_line_1, NEW.id_change_set + WHERE NOT OLD.address_line_1 <=> NEW.address_line_1 + UNION + # Changed address_line_2 + SELECT NEW.id_address, 'address_line_2', OLD.address_line_2, NEW.address_line_2, NEW.id_change_set + WHERE NOT OLD.address_line_2 <=> NEW.address_line_2 + UNION + # Changed city + SELECT NEW.id_address, 'city', OLD.city, NEW.city, NEW.id_change_set + WHERE NOT OLD.city <=> NEW.city + UNION + # Changed county + SELECT NEW.id_address, 'county', OLD.county, NEW.county, NEW.id_change_set + WHERE NOT OLD.county <=> NEW.county + UNION + # Changed active + SELECT NEW.id_address, 'active', CONVERT(CONVERT(OLD.active, SIGNED), CHAR), CONVERT(CONVERT(NEW.active, SIGNED), CHAR), NEW.id_change_set + WHERE NOT (OLD.active <=> NEW.active) + ; +END // +DELIMITER ;; \ No newline at end of file diff --git a/static/MySQL/3409_tri_Shop_Supplier_Purchase_Order.sql b/static/MySQL/3409_tri_Shop_Supplier_Purchase_Order.sql index 15bb25e9..bb8c8cf6 100644 --- a/static/MySQL/3409_tri_Shop_Supplier_Purchase_Order.sql +++ b/static/MySQL/3409_tri_Shop_Supplier_Purchase_Order.sql @@ -38,14 +38,18 @@ BEGIN # Changed id_supplier_ordered SELECT NEW.id_order, 'id_supplier_ordered', OLD.id_supplier_ordered, NEW.id_supplier_ordered, NEW.id_change_set WHERE NOT OLD.id_supplier_ordered <=> NEW.id_supplier_ordered - UNION - # Changed cost_total_local - SELECT NEW.id_order, 'cost_total_local', OLD.cost_total_local, NEW.cost_total_local, NEW.id_change_set - WHERE NOT OLD.cost_total_local <=> NEW.cost_total_local UNION # Changed id_currency_cost SELECT NEW.id_order, 'id_currency_cost', OLD.id_currency_cost, NEW.id_currency_cost, NEW.id_change_set WHERE NOT OLD.id_currency_cost <=> NEW.id_currency_cost + UNION + # Changed cost_total_local_VAT_excl + SELECT NEW.id_order, 'cost_total_local_VAT_excl', OLD.cost_total_local_VAT_excl, NEW.cost_total_local_VAT_excl, NEW.id_change_set + WHERE NOT OLD.cost_total_local_VAT_excl <=> NEW.cost_total_local_VAT_excl + UNION + # Changed cost_total_local_VAT_incl + SELECT NEW.id_order, 'cost_total_local_VAT_incl', OLD.cost_total_local_VAT_incl, NEW.cost_total_local_VAT_incl, NEW.id_change_set + WHERE NOT OLD.cost_total_local_VAT_incl <=> NEW.cost_total_local_VAT_incl /* UNION # Changed latency_delivery diff --git a/static/MySQL/3412_tri_Shop_Supplier_Purchase_Order_Product_Link.sql b/static/MySQL/3412_tri_Shop_Supplier_Purchase_Order_Product_Link.sql index 5a3fa14e..61749642 100644 --- a/static/MySQL/3412_tri_Shop_Supplier_Purchase_Order_Product_Link.sql +++ b/static/MySQL/3412_tri_Shop_Supplier_Purchase_Order_Product_Link.sql @@ -43,15 +43,13 @@ BEGIN SELECT NEW.id_link, 'id_permutation', OLD.id_permutation, NEW.id_permutation, NEW.id_change_set WHERE NOT OLD.id_permutation <=> NEW.id_permutation UNION - # Changed cost_total_local - SELECT NEW.id_link, 'cost_total_local', OLD.cost_total_local, NEW.cost_total_local, NEW.id_change_set - WHERE NOT OLD.cost_total_local <=> NEW.cost_total_local - UNION + /* # Changed id_currency_cost SELECT NEW.id_link, 'id_currency_cost', OLD.id_currency_cost, NEW.id_currency_cost, NEW.id_change_set WHERE NOT OLD.id_currency_cost <=> NEW.id_currency_cost UNION - # Changed quantity_ordered + */ + # Changed quantity_ordered SELECT NEW.id_link, 'quantity_ordered', OLD.quantity_ordered, NEW.quantity_ordered, NEW.id_change_set WHERE NOT OLD.quantity_ordered <=> NEW.quantity_ordered UNION @@ -74,6 +72,22 @@ BEGIN # Changed active SELECT NEW.id_link, 'active', OLD.active, NEW.active, NEW.id_change_set WHERE NOT OLD.active <=> NEW.active + UNION + # Changed cost_total_local_VAT_excl + SELECT NEW.id_link, 'cost_total_local_VAT_excl', OLD.cost_total_local_VAT_excl, NEW.cost_total_local_VAT_excl, NEW.id_change_set + WHERE NOT OLD.cost_total_local_VAT_excl <=> NEW.cost_total_local_VAT_excl + UNION + # Changed cost_total_local_VAT_incl + SELECT NEW.id_link, 'cost_total_local_VAT_incl', OLD.cost_total_local_VAT_incl, NEW.cost_total_local_VAT_incl, NEW.id_change_set + WHERE NOT OLD.cost_total_local_VAT_incl <=> NEW.cost_total_local_VAT_incl + UNION + # Changed cost_unit_local_VAT_excl + SELECT NEW.id_link, 'cost_unit_local_VAT_excl', OLD.cost_unit_local_VAT_excl, NEW.cost_unit_local_VAT_excl, NEW.id_change_set + WHERE NOT OLD.cost_unit_local_VAT_excl <=> NEW.cost_unit_local_VAT_excl + UNION + # Changed cost_unit_local_VAT_incl + SELECT NEW.id_link, 'cost_unit_local_VAT_incl', OLD.cost_unit_local_VAT_incl, NEW.cost_unit_local_VAT_incl, NEW.id_change_set + WHERE NOT OLD.cost_unit_local_VAT_incl <=> NEW.cost_unit_local_VAT_incl ; END // DELIMITER ;; diff --git a/static/MySQL/3415_tri_Shop_Manufacturing_Purchase_Order.sql b/static/MySQL/3415_tri_Shop_Manufacturing_Purchase_Order.sql index 08623a2f..33292cec 100644 --- a/static/MySQL/3415_tri_Shop_Manufacturing_Purchase_Order.sql +++ b/static/MySQL/3415_tri_Shop_Manufacturing_Purchase_Order.sql @@ -35,17 +35,25 @@ BEGIN value_new, id_change_set ) - # Changed cost_total_local - SELECT NEW.id_order, 'cost_total_local', OLD.cost_total_local, NEW.cost_total_local, NEW.id_change_set - WHERE NOT OLD.cost_total_local <=> NEW.cost_total_local + # Changed id_currency + SELECT NEW.id_order, 'id_currency', OLD.id_currency, NEW.id_currency, NEW.id_change_set + WHERE NOT OLD.id_currency <=> NEW.id_currency UNION - # Changed value_produced_total_local - SELECT NEW.id_order, 'value_produced_total_local', OLD.value_produced_total_local, NEW.value_produced_total_local, NEW.id_change_set - WHERE NOT OLD.value_produced_total_local <=> NEW.value_produced_total_local + # Changed cost_total_local_VAT_excl + SELECT NEW.id_order, 'cost_total_local_VAT_excl', OLD.cost_total_local_VAT_excl, NEW.cost_total_local_VAT_excl, NEW.id_change_set + WHERE NOT OLD.cost_total_local_VAT_excl <=> NEW.cost_total_local_VAT_excl UNION - # Changed id_currency_cost - SELECT NEW.id_order, 'id_currency_cost', OLD.id_currency_cost, NEW.id_currency_cost, NEW.id_change_set - WHERE NOT OLD.id_currency_cost <=> NEW.id_currency_cost + # Changed cost_total_local_VAT_incl + SELECT NEW.id_order, 'cost_total_local_VAT_incl', OLD.cost_total_local_VAT_incl, NEW.cost_total_local_VAT_incl, NEW.id_change_set + WHERE NOT OLD.cost_total_local_VAT_incl <=> NEW.cost_total_local_VAT_incl + UNION + # Changed price_total_local_VAT_excl + SELECT NEW.id_order, 'price_total_local_VAT_excl', OLD.price_total_local_VAT_excl, NEW.price_total_local_VAT_excl, NEW.id_change_set + WHERE NOT OLD.price_total_local_VAT_excl <=> NEW.price_total_local_VAT_excl + UNION + # Changed price_total_local_VAT_incl + SELECT NEW.id_order, 'price_total_local_VAT_incl', OLD.price_total_local_VAT_incl, NEW.price_total_local_VAT_incl, NEW.id_change_set + WHERE NOT OLD.price_total_local_VAT_incl <=> NEW.price_total_local_VAT_incl UNION # Changed active SELECT NEW.id_order, 'active', OLD.active, NEW.active, NEW.id_change_set diff --git a/static/MySQL/3418_tri_Shop_Manufacturing_Purchase_Order_Product_Link.sql b/static/MySQL/3418_tri_Shop_Manufacturing_Purchase_Order_Product_Link.sql index 34acff81..5077fb5b 100644 --- a/static/MySQL/3418_tri_Shop_Manufacturing_Purchase_Order_Product_Link.sql +++ b/static/MySQL/3418_tri_Shop_Manufacturing_Purchase_Order_Product_Link.sql @@ -43,25 +43,33 @@ BEGIN SELECT NEW.id_link, 'id_permutation', OLD.id_permutation, NEW.id_permutation, NEW.id_change_set WHERE NOT OLD.id_permutation <=> NEW.id_permutation UNION - # Changed cost_total_local - SELECT NEW.id_link, 'cost_total_local', OLD.cost_total_local, NEW.cost_total_local, NEW.id_change_set - WHERE NOT OLD.cost_total_local <=> NEW.cost_total_local - UNION - # Changed id_currency_cost - SELECT NEW.id_link, 'id_currency_cost', OLD.id_currency_cost, NEW.id_currency_cost, NEW.id_change_set - WHERE NOT OLD.id_currency_cost <=> NEW.id_currency_cost + # Changed id_unit_quantity + SELECT NEW.id_link, 'id_unit_quantity', OLD.id_unit_quantity, NEW.id_unit_quantity, NEW.id_change_set + WHERE NOT OLD.id_unit_quantity <=> NEW.id_unit_quantity UNION # Changed quantity_used SELECT NEW.id_link, 'quantity_used', OLD.quantity_used, NEW.quantity_used, NEW.id_change_set WHERE NOT OLD.quantity_used <=> NEW.quantity_used - UNION - # Changed id_unit_quantity - SELECT NEW.id_link, 'id_unit_quantity', OLD.id_unit_quantity, NEW.id_unit_quantity, NEW.id_change_set - WHERE NOT OLD.id_unit_quantity <=> NEW.id_unit_quantity UNION # Changed quantity_produced SELECT NEW.id_link, 'quantity_produced', OLD.quantity_produced, NEW.quantity_produced, NEW.id_change_set WHERE NOT OLD.quantity_produced <=> NEW.quantity_produced + UNION + # Changed cost_unit_local_VAT_excl + SELECT NEW.id_order, 'cost_unit_local_VAT_excl', OLD.cost_unit_local_VAT_excl, NEW.cost_unit_local_VAT_excl, NEW.id_change_set + WHERE NOT OLD.cost_unit_local_VAT_excl <=> NEW.cost_unit_local_VAT_excl + UNION + # Changed cost_unit_local_VAT_incl + SELECT NEW.id_order, 'cost_unit_local_VAT_incl', OLD.cost_unit_local_VAT_incl, NEW.cost_unit_local_VAT_incl, NEW.id_change_set + WHERE NOT OLD.cost_unit_local_VAT_incl <=> NEW.cost_unit_local_VAT_incl + UNION + # Changed price_unit_local_VAT_excl + SELECT NEW.id_order, 'price_unit_local_VAT_excl', OLD.price_unit_local_VAT_excl, NEW.price_unit_local_VAT_excl, NEW.id_change_set + WHERE NOT OLD.price_unit_local_VAT_excl <=> NEW.price_unit_local_VAT_excl + UNION + # Changed price_unit_local_VAT_incl + SELECT NEW.id_order, 'price_unit_local_VAT_incl', OLD.price_unit_local_VAT_incl, NEW.price_unit_local_VAT_incl, NEW.id_change_set + WHERE NOT OLD.price_unit_local_VAT_incl <=> NEW.price_unit_local_VAT_incl UNION # Changed latency_manufacture_days SELECT NEW.id_link, 'latency_manufacture_days', OLD.latency_manufacture_days, NEW.latency_manufacture_days, NEW.id_change_set diff --git a/static/MySQL/6000_p_debug_timing_reporting.sql b/static/MySQL/6000_p_debug_timing_reporting.sql index 45eaf32b..2e1b4dba 100644 --- a/static/MySQL/6000_p_debug_timing_reporting.sql +++ b/static/MySQL/6000_p_debug_timing_reporting.sql @@ -17,27 +17,25 @@ BEGIN SET v_time_end := CURRENT_TIMESTAMP(6); SELECT a_time_start - , UNIX_DATETIME(a_time_start) + , UNIX_TIMESTAMP(a_time_start) , MICROSECOND(a_time_start) / 1000 , v_time_end - , UNIX_DATETIME(v_time_end) + , UNIX_TIMESTAMP(v_time_end) , MICROSECOND(v_time_end) / 1000 , v_time_end - a_time_start AS timestamp_delta - , UNIX_DATETIME(v_time_end - a_time_start) AS UNIX_DATETIME_timestamp_delta + , UNIX_TIMESTAMP(v_time_end - a_time_start) AS UNIX_TIMESTAMP_timestamp_delta , MICROSECOND(v_time_end - a_time_start) AS MICROSECOND_timestamp_delta -- , TIME_FORMAT(TIMEDIFF(v_time_end, a_time_start), '%H:%i:%s') AS time_difference , CONCAT( TIME_FORMAT(TIMEDIFF(v_time_end, a_time_start), '%H hours, %i minutes, %s seconds'), ', ', - DATETIMEDIFF(MICROSECOND, a_time_start, v_time_end) % 1000000 / 1000, ' milliseconds' + TIMESTAMPDIFF(MICROSECOND, a_time_start, v_time_end) % 1000000 / 1000, ' milliseconds' ) AS time_difference ; END // DELIMITER ;; - - /* CALL partsltd_prod.p_debug_timing_reporting ( CURRENT_TIMESTAMP(6) diff --git a/static/MySQL/7204_p_shop_calc_product_permutation.sql b/static/MySQL/7204_p_shop_calc_product_permutation.sql index 9ee160db..f2e29caf 100644 --- a/static/MySQL/7204_p_shop_calc_product_permutation.sql +++ b/static/MySQL/7204_p_shop_calc_product_permutation.sql @@ -373,8 +373,8 @@ BEGIN ) ) AND ( - a_get_products_quantity_stock_below_min = 1 - AND PP.quantity_stock < PP.quantity_min + a_get_products_quantity_stock_below_min = 0 + OR PP.quantity_stock < PP.quantity_min ) AND ( a_get_inactive_permutation = 1 diff --git a/static/MySQL/7204_p_shop_get_many_product.sql b/static/MySQL/7204_p_shop_get_many_product.sql index b2d803d3..90e7388a 100644 --- a/static/MySQL/7204_p_shop_get_many_product.sql +++ b/static/MySQL/7204_p_shop_get_many_product.sql @@ -447,8 +447,13 @@ BEGIN -- WHERE guid = v_guid ; + IF a_debug = 1 THEN + SELECT * FROM tmp_Category; + SELECT * FROM tmp_Product; + SELECT * FROM tmp_Permutation; + SELECT * FROM tmp_Image; + END IF; - -- Clean up DROP TEMPORARY TABLE IF EXISTS tmp_Split; DROP TEMPORARY TABLE IF EXISTS tmp_Image; DROP TEMPORARY TABLE IF EXISTS tmp_Category; @@ -481,7 +486,7 @@ CALL partsltd_prod.p_shop_get_many_product ( , 0 # a_get_inactive_image , '' # a_ids_image , 0 # a_get_products_quantity_stock_below_minimum - , 0 # a_debug + , 1 # a_debug ); select * FROM partsltd_prod.Shop_Calc_User_Temp; diff --git a/static/MySQL/7400_p_shop_save_supplier.sql b/static/MySQL/7400_p_shop_save_supplier.sql index 98cfcea6..6c9fcc89 100644 --- a/static/MySQL/7400_p_shop_save_supplier.sql +++ b/static/MySQL/7400_p_shop_save_supplier.sql @@ -45,9 +45,11 @@ BEGIN , msg ) SELECT - NULL + id_type , @errno , @text + FROM partsltd_prod.Shop_Msg_Error_Type MET + WHERE code = 'MYSQL_ERROR' ; SELECT * FROM tmp_Msg_Error; @@ -55,12 +57,12 @@ BEGIN END; SET v_time_start := CURRENT_TIMESTAMP(6); - SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA'); - SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data); - SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION'); - SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission); - SET v_id_permission_supplier = (SELECT id_permission FROM partsltd_prod.Shop_Permission WHERE code = 'STORE_SUPPLIER' LIMIT 1); - SET v_id_access_level_EDIT = (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'EDIT'); + SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1); + SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1); + SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION' LIMIT 1); + SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission LIMIT 1); + SET v_id_permission_supplier := (SELECT id_permission FROM partsltd_prod.Shop_Permission WHERE code = 'STORE_SUPPLIER' LIMIT 1); + SET v_id_access_level_EDIT := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'EDIT' LIMIT 1); CALL p_validate_guid ( a_guid ); SET a_comment := TRIM(IFNULL(a_comment, '')); @@ -84,6 +86,18 @@ BEGIN , is_new BIT NOT NULL ); + CREATE TEMPORARY TABLE tmp_Supplier_Address ( + id_address INT NOT NULL + , id_supplier INT NOT NULL + , id_region INT NOT NULL + , postcode VARCHAR(20) NOT NULL + , address_line_1 VARCHAR(256) NOT NULL + , address_line_2 VARCHAR(256) NOT NULL + , city VARCHAR(256) NOT NULL + , county VARCHAR(256) NOT NULL + , active BIT NOT NULL + ); + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT , id_type INT NOT NULL @@ -125,7 +139,38 @@ BEGIN WHERE GUID = a_guid ; + INSERT INTO tmp_Supplier_Address ( + id_address + , id_supplier + , id_region + , postcode + , address_line_1 + , address_line_2 + , city + , county + , active + , name_error + , is_new + ) + SELECT + SA_T.id_address + , SA_T.id_supplier + , SA_T.id_region + , SA_T.postcode + , SA_T.address_line_1 + , SA_T.address_line_2 + , SA_T.city + , SA_T.county + , SA_T.active + , IFNULL(SA_T.postcode, IFNULL(SA_T.city, IFNULL(SA_T.county, IFNULL(SA_T.address_line_1, IFNULL(SA_T.address_line_2, '(No Supplier)'))))) AS name_error + , IFNULL(SA_T.id_address, 0) < 1 AS is_new + FROM partsltd_prod.Shop_Supplier_Address_Temp SA_T + WHERE GUID = a_guid + ; + -- Validation + -- Suppliers + /* # id_address IF EXISTS ( SELECT * @@ -159,6 +204,7 @@ BEGIN ) ; END IF; + */ # id_currency IF EXISTS ( SELECT * @@ -222,6 +268,106 @@ BEGIN WHERE ISNULL(t_S.email) ; END IF; + # duplicate + IF EXISTS (SELECT COUNT(*) FROM tmp_Supplier t_S WHERE COUNT(*) > 1 GROUP BY t_S.id_supplier) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT('The following supplier(s) are duplicates: ', GROUP_CONCAT(IFNULL(t_S.name_error, 'NULL') SEPARATOR ', ')) AS msg + FROM tmp_Supplier t_S + WHERE COUNT(*) > 1 + GROUP BY t_S.id_supplier + ; + END IF; + + -- Addresses + # id_supplier + IF EXISTS ( + SELECT * + FROM tmp_Supplier_Address t_SA + LEFT JOIN partsltd_prod.Shop_Supplier S ON t_SA.id_supplier = S.id_supplier + WHERE 1=1 + AND ( + t_SA.id_supplier = 0 + OR S.active = 0 + ) + LIMIT 1 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT( + 'The following supplier address(es) have an invalid or inactive Supplier: ' + , GROUP_CONCAT(t_S.name_error SEPARATOR ', ') + ) AS msg + FROM tmp_Supplier t_S + LEFT JOIN partsltd_prod.Shop_Supplier S ON t_SA.id_supplier = S.id_supplier + WHERE 1=1 + AND ( + t_SA.id_supplier = 0 + OR S.active = 0 + ) + ; + END IF; + # id_region + IF EXISTS ( + SELECT * + FROM tmp_Supplier_Address t_SA + LEFT JOIN partsltd_prod.Shop_Region R ON t_SA.id_region = R.id_region + WHERE 1=1 + AND ( + t_SA.id_region = 0 + OR R.active = 0 + ) + LIMIT 1 + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT( + 'The following supplier address(es) have an invalid or inactive Supplier: ' + , GROUP_CONCAT(t_S.name_error SEPARATOR ', ') + ) AS msg + FROM tmp_Supplier t_S + LEFT JOIN partsltd_prod.Shop_Region R ON t_SA.id_region = R.id_region + WHERE 1=1 + AND ( + t_SA.id_region = 0 + OR R.active = 0 + ) + ; + END IF; + # duplicate + IF EXISTS (SELECT COUNT(*) FROM tmp_Supplier_Address t_SA WHERE COUNT(*) > 1 GROUP BY t_SA.id_address) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_bad_data + , v_code_type_error_bad_data + , CONCAT('The following supplier address(es) are duplicates: ', GROUP_CONCAT(IFNULL(t_S.name_error, 'NULL') SEPARATOR ', ')) AS msg + FROM tmp_Supplier_Address t_SA + WHERE COUNT(*) > 1 + GROUP BY t_SA.id_address + ; + END IF; -- Permissions IF a_debug = 1 THEN @@ -262,7 +408,7 @@ BEGIN VALUES ( v_id_type_error_no_permission , v_code_type_error_no_permission - CONCAT('You do not have view permissions for ', (SELECT name FROM partsltd_prod.Shop_Permission WHERE id_permission = v_id_permission_supplier LIMIT 1)) + , CONCAT('You do not have view permissions for ', (SELECT name FROM partsltd_prod.Shop_Permission WHERE id_permission = v_id_permission_supplier LIMIT 1)) ) ; END IF; @@ -291,7 +437,6 @@ BEGIN SET v_id_change_set := LAST_INSERT_ID(); INSERT INTO partsltd_prod.Shop_Supplier ( - -- id_supplier, id_address , id_currency , name_company @@ -350,6 +495,47 @@ BEGIN S.id_change_set = v_id_change_set */ ; + + INSERT INTO partsltd_prod.Shop_Supplier_Address ( + id_address + , id_supplier + , id_region + , postcode + , address_line_1 + , address_line_2 + , city + , county + , active + ) + SELECT + t_SA.id_address + , t_SA.id_supplier + , t_SA.id_region + , t_SA.postcode + , t_SA.address_line_1 + , t_SA.address_line_2 + , t_SA.city + , t_SA.county + , t_SA.active + FROM tmp_Supplier_Address t_SA + WHERE t_SA.is_new = 1 + ; + + UPDATE partsltd_prod.Shop_Supplier_Address SA + INNER JOIN tmp_Supplier_Address t_SA + ON SA.id_address = t_SA.id_address + AND t_SA.is_new = 0 + SET + SA.id_address = t_SA.id_address + , SA.id_supplier = t_SA.id_supplier + , SA.id_region = t_SA.id_region + , SA.postcode = t_SA.postcode + , SA.address_line_1 = t_SA.address_line_1 + , SA.address_line_2 = t_SA.address_line_2 + , SA.city = t_SA.city + , SA.county = t_SA.county + , SA.active = t_SA.active + ; COMMIT; END IF; diff --git a/static/MySQL/7401_p_shop_get_many_supplier.sql b/static/MySQL/7401_p_shop_get_many_supplier.sql index b854cf55..99e921e2 100644 --- a/static/MySQL/7401_p_shop_get_many_supplier.sql +++ b/static/MySQL/7401_p_shop_get_many_supplier.sql @@ -23,24 +23,26 @@ BEGIN 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_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_code_type_error_no_permission := (SELECT code FROM Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION'); - SET v_id_type_error_no_permission := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission); - SET v_id_permission_supplier := (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_SUPPLIER' LIMIT 1); + SET v_id_access_level_view := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'VIEW' LIMIT 1); + SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1); + SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1); + SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION'); + SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission); + SET v_id_permission_supplier := (SELECT id_permission FROM partsltd_prod.Shop_Permission WHERE code = 'STORE_SUPPLIER' LIMIT 1); SET a_get_all_supplier := IFNULL(a_get_all_supplier, 0); SET a_get_inactive_supplier := IFNULL(a_get_inactive_supplier, 0); SET a_ids_supplier := TRIM(IFNULL(a_ids_supplier, '')); DROP TEMPORARY TABLE IF EXISTS tmp_Supplier; + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + DROP TEMPORARY TABLE IF EXISTS tmp_Split; CREATE TEMPORARY TABLE tmp_Supplier ( id_supplier INT NOT NULL ); - CREATE TABLE IF NOT EXISTS tmp_Msg_Error ( + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT, id_type INT NOT NULL, code VARCHAR(50) NOT NULL, @@ -94,7 +96,7 @@ BEGIN OR ISNULL(S.id_supplier) OR ( S.active = 0 - AND v_get_inactive_supplier = 0 + AND a_get_inactive_supplier = 0 ) ) THEN INSERT INTO tmp_Msg_Error ( @@ -113,7 +115,7 @@ BEGIN OR ISNULL(S.id_supplier) OR ( S.active = 0 - AND v_get_inactive_supplier = 0 + AND a_get_inactive_supplier = 0 ) ; ELSE @@ -173,14 +175,14 @@ BEGIN DELETE FROM tmp_Msg_Error; INSERT INTO tmp_Msg_Error ( - , id_type + id_type , code , msg ) VALUES ( v_id_type_error_no_permission , v_code_type_error_no_permission - CONCAT('You do not have view permissions for ', (SELECT name FROM Shop_Permission WHERE id_permission = v_id_permission_supplier LIMIT 1)) + , CONCAT('You do not have view permissions for ', (SELECT name FROM Shop_Permission WHERE id_permission = v_id_permission_supplier LIMIT 1)) ) ; END IF; @@ -193,8 +195,9 @@ BEGIN # Suppliers SELECT t_S.id_supplier, - S.id_address, S.id_currency, + C.symbol AS symbol_currency, + C.code AS code_currency, S.name_company, S.name_contact, S.department_contact, @@ -204,14 +207,32 @@ BEGIN S.website, S.active FROM tmp_Supplier t_S - INNER JOIN Shop_Supplier S - ON t_S.id_supplier = S.id_supplier + INNER JOIN partsltd_prod.Shop_Supplier S ON t_S.id_supplier = S.id_supplier + LEFT JOIN partsltd_prod.Shop_Currency C ON S.id_currency = C.id_currency + ; + + # Supplier Addresses + SELECT + t_S.id_supplier + , SA.id_address + , SA.id_region + , R.name AS name_region + , SA.postcode + , SA.address_line_1 + , SA.address_line_2 + , SA.city + , SA.county + , SA.active + FROM tmp_Supplier t_S + INNER JOIN partsltd_prod.Shop_Supplier S ON t_S.id_supplier = S.id_supplier + INNER JOIN partsltd_prod.Shop_Supplier_Address SA ON S.id_supplier = SA.id_supplier + LEFT JOIN partsltd_prod.Shop_Region R ON SA.id_region = R.id_region ; # Errors SELECT * FROM tmp_Msg_Error t_ME - INNER JOIN Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type + INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type ; IF a_debug = 1 THEN @@ -220,6 +241,7 @@ BEGIN DROP TEMPORARY TABLE IF EXISTS tmp_Supplier; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + DROP TEMPORARY TABLE IF EXISTS tmp_Split; IF a_debug = 1 THEN CALL p_debug_timing_reporting( v_time_start ); @@ -228,6 +250,7 @@ END // DELIMITER ;; +/* CALL p_shop_get_many_supplier ( 1 -- 'auth0|6582b95c895d09a70ba10fef' # a_id_user @@ -237,5 +260,4 @@ CALL p_shop_get_many_supplier ( , 0 # a_debug ); -/* */ \ No newline at end of file diff --git a/static/MySQL/7403_p_save_supplier_purchase_order.sql b/static/MySQL/7403_p_save_supplier_purchase_order.sql index b8d660cc..965e4205 100644 --- a/static/MySQL/7403_p_save_supplier_purchase_order.sql +++ b/static/MySQL/7403_p_save_supplier_purchase_order.sql @@ -21,7 +21,7 @@ BEGIN DECLARE v_code_type_error_warning VARCHAR(50); DECLARE v_id_access_level_edit INT; DECLARE v_id_change_set INT; - DECLARE v_id_permission_supplier_purchase_order INT; + DECLARE v_id_permission_supplier_purchase_order VARCHAR(100); DECLARE v_id_type_error_bad_data INT; DECLARE v_id_type_error_no_permission INT; DECLARE v_id_type_error_warning INT; @@ -66,8 +66,8 @@ BEGIN SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission); SET v_code_type_error_warning := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'WARNING'); SET v_id_type_error_warning := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_warning); - SET v_id_permission_supplier_purchase_order = (SELECT id_permission FROM partsltd_prod.Shop_Permission WHERE code = 'STORE_SUPPLIER_PURCHASE_ORDER' LIMIT 1); - SET v_id_access_level_edit = (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'EDIT'); + SET v_id_permission_supplier_purchase_order := (SELECT GROUP_CONCAT(id_permission SEPARATOR ',') FROM partsltd_prod.Shop_Permission WHERE code IN ('STORE_SUPPLIER', 'STORE_SUPPLIER_PURCHASE_ORDER', 'STORE_PRODUCT') LIMIT 1); + SET v_id_access_level_edit := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'EDIT' LIMIT 1); CALL p_validate_guid ( a_guid ); SET a_comment := TRIM(IFNULL(a_comment, '')); @@ -81,13 +81,14 @@ BEGIN , id_supplier_ordered INT NOT NULL , id_currency_cost INT NOT NULL -- , cost_total_local FLOAT NOT NULL + , active BIT NOT NULL ); CREATE TEMPORARY TABLE tmp_Supplier_Purchase_Order_Product_Link ( id_link INT NOT NULL PRIMARY KEY , id_order INT NOT NULL , id_permutation INT NOT NULL - , id_currency_cost INT NOT NULL + -- , id_currency_cost INT NOT NULL , quantity_ordered FLOAT NOT NULL , id_unit_quantity INT NOT NULL , quantity_received FLOAT NULL @@ -127,9 +128,9 @@ BEGIN id_link , id_order , id_permutation - , id_currency_cost - , quantity_ordered + -- , id_currency_cost , id_unit_quantity + , quantity_ordered , quantity_received , latency_delivery_days , display_order @@ -144,14 +145,14 @@ BEGIN ) SELECT IFNULL(SPOPL_T.id_link, 0) AS id_link - , IFNULL(IFNULL(SPOPL_T.id_order, SPOPL.id_order) 0) AS id_order + , IFNULL(IFNULL(SPOPL_T.id_order, SPOPL.id_order), 0) AS id_order , IFNULL(IFNULL(SPOPL_T.id_permutation, SPOPL.id_permutation), 0) AS id_permutation - , IFNULL(IFNULL(SPOPL_T.id_currency_cost, SPOPL.id_currency_cost) 0) AS id_currency_cost - , IFNULL(IFNULL(SPOPL_T.quantity_ordered, SPOPL.quantity_ordered), 0) AS quantity_ordered + -- , IFNULL(IFNULL(SPOPL_T.id_currency_cost, SPOPL.id_currency_cost), 0) AS id_currency_cost , IFNULL(IFNULL(SPOPL_T.id_unit_quantity, SPOPL.id_unit_quantity), 0) AS id_unit_quantity + , IFNULL(IFNULL(SPOPL_T.quantity_ordered, SPOPL.quantity_ordered), 0) AS quantity_ordered , IFNULL(SPOPL_T.quantity_received, SPOPL.quantity_received) AS quantity_received , IFNULL(SPOPL_T.latency_delivery_days, SPOPL.latency_delivery_days) AS latency_delivery_days - , RANK() OVER (PARTITION BY IFNULL(IFNULL(SPOPL_T.id_order, SPOPL.id_order) 0) ORDER BY IFNULL(IFNULL(SPOPL_T.display_order, SPOPL.display_order), 0)) AS display_order + , RANK() OVER (PARTITION BY IFNULL(IFNULL(SPOPL_T.id_order, SPOPL.id_order), 0) ORDER BY IFNULL(IFNULL(SPOPL_T.display_order, SPOPL.display_order), 0)) AS display_order , IFNULL(IFNULL(SPOPL_T.active, SPOPL.active), 1) AS active , CONCAT( fn_shop_get_product_permutation_name(SPOPL_T.id_permutation) @@ -285,8 +286,8 @@ BEGIN # id_unit_quantity IF EXISTS ( SELECT * - FROM tmp_Supplier_Purchase_Order t_SPO - LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM ON t_SPO.id_unit_quantity = UM.id_unit_measurement + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL + LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM ON t_SPOPL.id_unit_quantity = UM.id_unit_measurement WHERE 1=1 AND ( ISNULL(UM.id_unit_measurement) @@ -306,8 +307,8 @@ BEGIN 'A valid unit measurement of quantity is required for the following Supplier Purchase Order(s): ' , GROUP_CONCAT(CONCAT(IFNULL(t_SPO.id_stock, '(No Supplier Purchase Order)'), ' - ', t_SPO.id_currency_cost) SEPARATOR ', ') ) AS msg - FROM tmp_Stock_Item t_SPO - LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM ON t_SPO.id_unit_quantity = UM.id_unit_measurement + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL + LEFT JOIN partsltd_prod.Shop_Unit_Measurement UM ON t_SPOPL.id_unit_quantity = UM.id_unit_measurement WHERE 1=1 AND ( ISNULL(UM.id_unit_measurement) @@ -318,7 +319,7 @@ BEGIN # Invalid quantity ordered IF EXISTS ( SELECT * - FROM tmp_Supplier_Purchase_Order_Product_Link + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL WHERE ISNULL(t_SPOPL.quantity_ordered) OR t_SPOPL.quantity_ordered <= 0 @@ -342,7 +343,7 @@ BEGIN # Invalid quantity received IF EXISTS ( SELECT * - FROM tmp_Supplier_Purchase_Order_Product_Link + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL WHERE t_SPOPL.quantity_received < 0 ) THEN INSERT INTO tmp_Msg_Error ( @@ -362,7 +363,7 @@ BEGIN # Invalid delivery latency IF EXISTS ( SELECT * - FROM tmp_Supplier_Purchase_Order_Product_Link + FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL WHERE t_SPOPL.latency_delivery_days < 0 ) THEN INSERT INTO tmp_Msg_Error ( @@ -494,7 +495,7 @@ BEGIN VALUES ( v_id_type_error_no_permission , v_code_type_error_no_permission - CONCAT('You do not have view permissions for ', (SELECT name FROM partsltd_prod.Shop_Permission WHERE id_permission = v_id_permission_supplier LIMIT 1)) + , CONCAT('You do not have view permissions for ', (SELECT name FROM partsltd_prod.Shop_Permission WHERE id_permission = v_id_permission_supplier LIMIT 1)) ) ; END IF; @@ -513,8 +514,30 @@ BEGIN INNER JOIN partsltd_prod.Shop_Stock_Item SI ON SPOPL.id_permutation = SI.id_permutation WHERE t_SPOPL.is_new = 0 - AND t_SPOPL.quantity_received < SPOPL.quantity_received - ) + AND t_SPOPL.quantity_received <> SPOPL.quantity_received + ) THEN + INSERT INTO tmp_Msg_Error ( + id_type + , code + , msg + ) + SELECT + v_id_type_error_warning + , v_code_type_error_warning + , CONCAT( + 'The quantity received has changed on the following orders. Please update the stock items appropriately.' + , GROUP_CONCAT( + CONCAT( + t_SPOPL.name_error + , ' - from ' + , SPOPL.quantity_received + , ' to ' + , t_SPOPL.quantity_received + ) SEPARATOR ', ' + ) + ) AS msg + ; + END IF; -- Transaction IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN @@ -559,7 +582,7 @@ BEGIN INSERT INTO Shop_Supplier_Purchase_Order_Product_Link ( id_order , id_permutation - , id_currency_cost + -- , id_currency_cost , id_unit_quantity , quantity_ordered , quantity_received @@ -574,7 +597,7 @@ BEGIN SELECT t_SPOPL.id_order , t_SPOPL.id_permutation - , t_SPOPL.id_currency_cost + -- , t_SPOPL.id_currency_cost , t_SPOPL.id_unit_quantity , t_SPOPL.quantity_ordered , t_SPOPL.quantity_received @@ -583,8 +606,8 @@ BEGIN , t_SPOPL.active , t_SPOPL.cost_total_local_VAT_excl , t_SPOPL.cost_total_local_VAT_incl - a_id_user - v_id_change_set + , a_id_user + , v_id_change_set FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL WHERE t_SPOPL.is_new = 1 ; @@ -610,7 +633,7 @@ BEGIN SET SPOPL.id_order = t_SPOPL.id_order, SPOPL.id_permutation = t_SPOPL.id_permutation, - SPOPL.id_currency_cost = t_SPOPL.id_currency_cost, + -- SPOPL.id_currency_cost = t_SPOPL.id_currency_cost, SPOPL.id_unit_quantity = t_SPOPL.id_unit_quantity, SPOPL.quantity_ordered = t_SPOPL.quantity_ordered, SPOPL.quantity_received = t_SPOPL.quantity_received, @@ -632,6 +655,7 @@ BEGIN ; COMMIT; + END IF; # Errors SELECT * 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 2d235460..3c3bf201 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 @@ -26,19 +26,19 @@ BEGIN DECLARE v_has_filter_date_from BIT; DECLARE v_has_filter_date_to BIT; DECLARE v_id_access_level_view INT; - DECLARE v_ids_permission_supplier_purchase_order INT; + DECLARE v_ids_permission_supplier_purchase_order VARCHAR(100); DECLARE v_id_type_error_bad_data INT; DECLARE v_id_type_error_no_permission INT; DECLARE v_time_start TIMESTAMP(6); SET v_time_start := CURRENT_TIMESTAMP(6); SET v_guid := UUID(); - SET v_id_access_level_view := (SELECT id_access_level FROM Shop_Access_Level WHERE code = 'VIEW' LIMIT 1); - 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_code_type_error_no_permission := (SELECT code FROM Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION'); - SET v_id_type_error_no_permission := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission); - SET v_ids_permission_supplier_purchase_order := (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_SUPPLIER_PURCHASE_ORDER' LIMIT 1); + SET v_id_access_level_view := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'VIEW' LIMIT 1); + SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1); + SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1); + SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION' LIMIT 1); + SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission LIMIT 1); + SET v_ids_permission_supplier_purchase_order := (SELECT GROUP_CONCAT(id_permission SEPARATOR ',') FROM partsltd_prod.Shop_Permission WHERE code IN ('STORE_SUPPLIER', 'STORE_SUPPLIER_PURCHASE_ORDER', 'STORE_PRODUCT')); SET a_get_all_supplier := IFNULL(a_get_all_supplier, 1); SET a_get_inactive_supplier := IFNULL(a_get_inactive_supplier, 0); @@ -51,32 +51,38 @@ BEGIN SET a_date_to := IFNULL(a_date_to, NULL); SET a_debug := IFNULL(a_debug, 0); - DROP TABLE IF EXISTS tmp_Supplier_Purchase_Order_Product_Link; - DROP TABLE IF EXISTS tmp_Supplier_Purchase_Order; - DROP TABLE IF EXISTS tmp_Supplier; - DROP TABLE IF EXISTS tmp_Product; + DROP TEMPORARY TABLE IF EXISTS tmp_Supplier_Purchase_Order_Product_Link; + DROP TEMPORARY TABLE IF EXISTS tmp_Supplier_Purchase_Order; + DROP TEMPORARY TABLE IF EXISTS tmp_Supplier; + DROP TEMPORARY TABLE IF EXISTS tmp_Permutation; + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + DROP TEMPORARY TABLE IF EXISTS tmp_Split; - CREATE TABLE tmp_Supplier ( + CREATE TEMPORARY TABLE tmp_Supplier ( id_supplier INT NOT NULL PRIMARY KEY ); - CREATE TABLE tmp_Supplier_Purchase_Order ( + CREATE TEMPORARY TABLE tmp_Supplier_Purchase_Order ( id_order INT NOT NULL PRIMARY KEY ); - CREATE TABLE tmp_Supplier_Purchase_Order_Product_Link ( - id_link INT NOT NULL PRIMARY KEY, - id_order INT NOT NULL, - id_permutation INT NOT NULL + CREATE TEMPORARY TABLE tmp_Permutation ( + id_permutation INT NOT NULL PRIMARY KEY ); - CREATE TABLE IF NOT EXISTS tmp_Msg_Error ( + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT, id_type INT NOT NULL, code VARCHAR(50) NOT NULL, msg VARCHAR(4000) NOT NULL ); + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split ( + substring VARCHAR(4000) NOT NULL + , as_int INT NULL + ); + DELETE FROM tmp_Split; + SET v_has_filter_supplier = CASE WHEN a_ids_supplier = '' THEN 0 ELSE 1 END; SET v_has_filter_order = CASE WHEN a_ids_order = '' THEN 0 ELSE 1 END; SET v_has_filter_permutation = CASE WHEN a_ids_permutation = '' THEN 0 ELSE 1 END; @@ -189,7 +195,7 @@ BEGIN OR ISNULL(S.id_supplier) OR ( S.active = 0 - AND v_get_inactive_supplier = 0 + AND a_get_inactive_supplier = 0 ) ) THEN INSERT INTO tmp_Msg_Error ( @@ -208,7 +214,7 @@ BEGIN OR ISNULL(S.id_supplier) OR ( S.active = 0 - AND v_get_inactive_supplier = 0 + AND a_get_inactive_supplier = 0 ) ; ELSE @@ -267,7 +273,7 @@ BEGIN OR ISNULL(SPO.id_order) OR ( SPO.active = 0 - AND v_get_inactive_order = 0 + AND a_get_inactive_order = 0 ) ) THEN INSERT INTO tmp_Msg_Error ( @@ -286,7 +292,7 @@ BEGIN OR ISNULL(SPO.id_order) OR ( SPO.active = 0 - AND v_get_inactive_order = 0 + AND a_get_inactive_order = 0 ) ; ELSE @@ -340,40 +346,40 @@ BEGIN v_guid , a_id_user , FALSE -- get inactive users - , v_id_permission_supplier_purchase_order + , v_ids_permission_supplier_purchase_order , v_id_access_level_view , '' -- ids_product , 0 -- a_debug ; - SELECT * from Shop_Calc_User_Temp; + SELECT * from partsltd_prod.Shop_Calc_User_Temp; END IF; CALL p_shop_calc_user( v_guid , a_id_user , FALSE -- get inactive users - , v_id_permission_supplier_purchase_order + , v_ids_permission_supplier_purchase_order , v_id_access_level_view , '' -- ids_product , 0 -- a_debug ); IF a_debug = 1 THEN - SELECT * from Shop_Calc_User_Temp; + SELECT * from partsltd_prod.Shop_Calc_User_Temp; END IF; - IF NOT EXISTS (SELECT can_view FROM Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = v_guid) THEN + IF NOT EXISTS (SELECT can_view FROM partsltd_prod.Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = v_guid) THEN DELETE FROM tmp_Msg_Error; INSERT INTO tmp_Msg_Error ( - , id_type + id_type , code , msg ) VALUES ( v_id_type_error_no_permission , v_code_type_error_no_permission - CONCAT('You do not have view permissions for ', (SELECT name FROM Shop_Permission WHERE id_permission = v_id_permission_supplier LIMIT 1)) + , CONCAT('You do not have view permissions for ', (SELECT name FROM partsltd_prod.Shop_Permission WHERE id_permission = v_id_permission_supplier LIMIT 1)) ) ; END IF; @@ -399,7 +405,7 @@ BEGIN S.id_currency, t_S.active FROM tmp_Supplier t_S - INNER JOIN Shop_Supplier S + INNER JOIN partsltd_prod.Shop_Supplier S ON t_S.id_supplier = S.id_supplier ; */ @@ -412,6 +418,12 @@ BEGIN , SPO.cost_total_local_VAT_excl , SPO.cost_total_local_VAT_incl , SPO.active + , SPO.created_on + , CONCAT( + SPO.cost_total_local_VAT_excl + , ' on ' + , SPO.created_on + ) AS name FROM tmp_Supplier_Purchase_Order t_SPO INNER JOIN partsltd_prod.Shop_Supplier_Purchase_Order SPO ON SPO.id_order = t_SPO.id_order ; @@ -422,23 +434,25 @@ BEGIN , SPOPL.id_order , SPOPL.id_permutation , fn_shop_get_product_permutation_name(SPOPL.id_permutation) AS name_permutation - , SPOPL.id_currency_cost + -- , SPOPL.id_currency_cost , SPOPL.id_unit_quantity , SPOPL.quantity_ordered , SPOPL.quantity_received , SPOPL.latency_delivery_days , SPOPL.display_order - , SPO.cost_total_local_VAT_excl - , SPO.cost_total_local_VAT_incl - FROM tmp_Supplier_Purchase_Order_Product_Link t_SPOPL - INNER JOIN partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link SPOPL ON t_SPOPL.id_link = SPOPL.id_link - INNER JOIN tmp_Supplier_Purchase_Order t_SPO ON SPOPL.id_order = t_SPO.id_order + , SPOPL.cost_total_local_VAT_excl + , SPOPL.cost_total_local_VAT_incl + , SPOPL.cost_unit_local_VAT_excl + , SPOPL.cost_unit_local_VAT_incl + , SPOPL.active + FROM tmp_Supplier_Purchase_Order t_SPO + INNER JOIN partsltd_prod.Shop_Supplier_Purchase_Order_Product_Link SPOPL ON t_SPO.id_order = SPOPL.id_order ; # Errors SELECT * FROM tmp_Msg_Error t_ME - INNER JOIN Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type + INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type ; IF a_debug = 1 THEN @@ -450,7 +464,9 @@ BEGIN DROP TEMPORARY TABLE IF EXISTS tmp_Supplier_Purchase_Order_Product_Link; DROP TEMPORARY TABLE IF EXISTS tmp_Supplier_Purchase_Order; DROP TEMPORARY TABLE IF EXISTS tmp_Supplier; + DROP TEMPORARY TABLE IF EXISTS tmp_Permutation; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + DROP TEMPORARY TABLE IF EXISTS tmp_Split; IF a_debug = 1 THEN CALL p_debug_timing_reporting( v_time_start ); @@ -459,15 +475,14 @@ END // DELIMITER ;; -/* CALL p_shop_get_many_supplier_purchase_order ( - '', # a_id_user + 1, # a_id_user 1, # a_get_all_supplier 0, # a_get_inactive_supplier '', # a_ids_supplier 1, # a_get_all_order - -- 0, # a_get_inactive_order + 0, # a_get_inactive_order '', # a_ids_order '', # a_ids_permutation NULL, # a_date_from @@ -475,4 +490,5 @@ CALL p_shop_get_many_supplier_purchase_order ( , 0 # a_debug ); +/* */ diff --git a/static/MySQL/7415_p_shop_save_manufacturing_purchase_order.sql b/static/MySQL/7415_p_shop_save_manufacturing_purchase_order.sql index c29eee63..0028d757 100644 --- a/static/MySQL/7415_p_shop_save_manufacturing_purchase_order.sql +++ b/static/MySQL/7415_p_shop_save_manufacturing_purchase_order.sql @@ -20,7 +20,7 @@ BEGIN DECLARE v_code_type_error_no_permission VARCHAR(50); DECLARE v_id_access_level_edit INT; DECLARE v_id_change_set INT; - DECLARE v_id_permission_manufacturing_purchase_order INT; + DECLARE v_ids_permission_manufacturing_purchase_order VARCHAR(100); DECLARE v_id_type_error_bad_data INT; DECLARE v_id_type_error_no_permission INT; DECLARE v_ids_product_permission TEXT; @@ -58,12 +58,12 @@ BEGIN END; SET v_time_start := CURRENT_TIMESTAMP(6); - SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA'); - SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data); - SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION'); - SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission); - SET v_id_permission_manufacturing_purchase_order = (SELECT id_permission FROM partsltd_prod.Shop_Permission WHERE code = 'STORE_SUPPLIER_PURCHASE_ORDER' LIMIT 1); - SET v_id_access_level_edit = (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'EDIT'); + SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1); + SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1); + SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION' LIMIT 1); + SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission LIMIT 1); + SET v_ids_permission_manufacturing_purchase_order := (SELECT GROUP_CONCAT(id_permission SEPARATOR ',') FROM partsltd_prod.Shop_Permission WHERE code IN ('STORE_MANUFACTURING_PURCHASE_ORDER', 'STORE_PRODUCT')); + SET v_id_access_level_edit := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'EDIT' LIMIT 1); CALL p_validate_guid ( a_guid ); SET a_comment := TRIM(IFNULL(a_comment, '')); @@ -136,14 +136,14 @@ BEGIN ) SELECT IFNULL(SPOPL_T.id_link, 0) AS id_link - , IFNULL(IFNULL(SPOPL_T.id_order, MPOPL.id_order) 0) AS id_order + , IFNULL(IFNULL(SPOPL_T.id_order, MPOPL.id_order), 0) AS id_order , IFNULL(IFNULL(SPOPL_T.id_permutation, MPOPL.id_permutation), 0) AS id_permutation - , IFNULL(IFNULL(SPOPL_T.id_currency_cost, MPOPL.id_currency_cost) 0) AS id_currency_cost + , IFNULL(IFNULL(SPOPL_T.id_currency_cost, MPOPL.id_currency_cost), 0) AS id_currency_cost , IFNULL(IFNULL(SPOPL_T.quantity_ordered, MPOPL.quantity_ordered), 0) AS quantity_ordered , IFNULL(IFNULL(SPOPL_T.id_unit_quantity, MPOPL.id_unit_quantity), 0) AS id_unit_quantity , IFNULL(SPOPL_T.quantity_received, MPOPL.quantity_received) AS quantity_received , IFNULL(SPOPL_T.latency_delivery_days, MPOPL.latency_delivery_days) AS latency_delivery_days - , RANK() OVER (PARTITION BY IFNULL(IFNULL(SPOPL_T.id_order, MPOPL.id_order) 0) ORDER BY IFNULL(IFNULL(SPOPL_T.display_order, MPOPL.display_order), 0)) AS display_order + , RANK() OVER (PARTITION BY IFNULL(IFNULL(SPOPL_T.id_order, MPOPL.id_order), 0) ORDER BY IFNULL(IFNULL(SPOPL_T.display_order, MPOPL.display_order), 0)) AS display_order , IFNULL(IFNULL(SPOPL_T.active, MPOPL.active), 1) AS active , CONCAT( fn_shop_get_product_permutation_name(SPOPL_T.id_permutation) @@ -418,7 +418,7 @@ BEGIN v_guid , a_id_user , FALSE -- get inactive users - , v_id_permission_manufacturing_purchase_order + , v_ids_permission_manufacturing_purchase_order , v_id_access_level_edit , v_ids_product_permission -- ids_product , 0 -- a_debug @@ -430,7 +430,7 @@ BEGIN v_guid , a_id_user , FALSE -- get inactive users - , v_id_permission_manufacturing_purchase_order + , v_ids_permission_manufacturing_purchase_order , v_id_access_level_edit , v_ids_product_permission -- ids_product , 0 -- a_debug @@ -451,7 +451,7 @@ BEGIN VALUES ( v_id_type_error_no_permission , v_code_type_error_no_permission - CONCAT('You do not have view permissions for ', (SELECT name FROM partsltd_prod.Shop_Permission WHERE id_permission = v_id_permission_manufacturing LIMIT 1)) + , CONCAT('You do not have view permissions for ', (SELECT name FROM partsltd_prod.Shop_Permission WHERE id_permission = v_id_permission_manufacturing LIMIT 1)) ) ; END IF; @@ -527,8 +527,8 @@ BEGIN , t_MPOPL.active , t_MPOPL.cost_total_local_VAT_excl , t_MPOPL.cost_total_local_VAT_incl - a_id_user - v_id_change_set + , a_id_user + , v_id_change_set FROM tmp_Manufacturing_Purchase_Order_Product_Link t_MPOPL WHERE t_MPOPL.is_new = 1 ; @@ -575,6 +575,7 @@ BEGIN ; COMMIT; + END IF; # Errors SELECT * 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 3c77cb5a..17a8b3fa 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 @@ -5,9 +5,6 @@ DROP PROCEDURE IF EXISTS p_shop_get_many_manufacturing_purchase_order; DELIMITER // CREATE PROCEDURE p_shop_get_many_manufacturing_purchase_order ( IN a_id_user INT, - IN a_get_all_manufacturing BIT, - IN a_get_inactive_manufacturing BIT, - IN a_ids_manufacturing TEXT, IN a_get_all_order BIT, IN a_get_inactive_order BIT, IN a_ids_order TEXT, @@ -25,19 +22,19 @@ BEGIN DECLARE v_has_filter_date_from BIT; DECLARE v_has_filter_date_to BIT; DECLARE v_id_access_level_view INT; - DECLARE v_ids_permission_manufacturing_purchase_order INT; + DECLARE v_ids_permission_manufacturing_purchase_order VARCHAR(100); DECLARE v_id_type_error_bad_data INT; DECLARE v_id_type_error_no_permission INT; DECLARE v_time_start TIMESTAMP(6); SET v_time_start := CURRENT_TIMESTAMP(6); SET v_guid := UUID(); - SET v_id_access_level_view := (SELECT id_access_level FROM Shop_Access_Level WHERE code = 'VIEW' LIMIT 1); - 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_code_type_error_no_permission := (SELECT code FROM Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION'); - SET v_id_type_error_no_permission := (SELECT id_type FROM Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission); - SET v_ids_permission_manufacturing_purchase_order := (SELECT id_permission FROM Shop_Permission WHERE code = 'STORE_SUPPLIER_PURCHASE_ORDER' LIMIT 1); + SET v_id_access_level_view := (SELECT id_access_level FROM partsltd_prod.Shop_Access_Level WHERE code = 'VIEW' LIMIT 1); + SET v_code_type_error_bad_data := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'BAD_DATA' LIMIT 1); + SET v_id_type_error_bad_data := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_bad_data LIMIT 1); + SET v_code_type_error_no_permission := (SELECT code FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = 'NO_PERMISSION'); + SET v_id_type_error_no_permission := (SELECT id_type FROM partsltd_prod.Shop_Msg_Error_Type WHERE code = v_code_type_error_no_permission); + SET v_ids_permission_manufacturing_purchase_order := (SELECT GROUP_CONCAT(id_permission SEPARATOR ',') FROM partsltd_prod.Shop_Permission WHERE code IN ('STORE_MANUFACTURING_PURCHASE_ORDER', 'STORE_PRODUCT')); SET a_get_all_order := IFNULL(a_get_all_order, 1); SET a_get_inactive_order := IFNULL(a_get_inactive_order, 0); @@ -47,27 +44,33 @@ BEGIN SET a_date_to := IFNULL(a_date_to, NULL); SET a_debug := IFNULL(a_debug, 0); - DROP TABLE IF EXISTS tmp_Manufacturing_Purchase_Order_Product_Link; - DROP TABLE IF EXISTS tmp_Manufacturing_Purchase_Order; - DROP TABLE IF EXISTS tmp_Product; + DROP TEMPORARY TABLE IF EXISTS tmp_Manufacturing_Purchase_Order_Product_Link; + DROP TEMPORARY TABLE IF EXISTS tmp_Manufacturing_Purchase_Order; + DROP TEMPORARY TABLE IF EXISTS tmp_Permutation; + DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + DROP TEMPORARY TABLE IF EXISTS tmp_Split; - CREATE TABLE tmp_Manufacturing_Purchase_Order ( + CREATE TEMPORARY TABLE tmp_Manufacturing_Purchase_Order ( id_order INT NOT NULL PRIMARY KEY ); - CREATE TABLE tmp_Manufacturing_Purchase_Order_Product_Link ( - id_link INT NOT NULL PRIMARY KEY, - id_order INT NOT NULL, - id_permutation INT NOT NULL + CREATE TEMPORARY TABLE tmp_Permutation ( + id_permutation INT NOT NULL PRIMARY KEY ); - CREATE TABLE IF NOT EXISTS tmp_Msg_Error ( + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Msg_Error ( display_order INT NOT NULL PRIMARY KEY AUTO_INCREMENT, id_type INT NOT NULL, code VARCHAR(50) NOT NULL, msg VARCHAR(4000) NOT NULL ); + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_Split ( + substring VARCHAR(4000) NOT NULL + , as_int INT NULL + ); + DELETE FROM tmp_Split; + SET v_has_filter_order = CASE WHEN a_ids_order = '' THEN 0 ELSE 1 END; SET v_has_filter_permutation = CASE WHEN a_ids_permutation = '' THEN 0 ELSE 1 END; SET v_has_filter_date_from = CASE WHEN ISNULL(a_date_from) THEN 0 ELSE 1 END; @@ -172,13 +175,13 @@ BEGIN IF EXISTS ( SELECT * FROM tmp_Split t_S - LEFT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order SPO ON t_S.as_int = SPO.id_order + LEFT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order MPO ON t_S.as_int = MPO.id_order WHERE ISNULL(t_S.as_int) - OR ISNULL(SPO.id_order) + OR ISNULL(MPO.id_order) OR ( - SPO.active = 0 - AND v_get_inactive_order = 0 + MPO.active = 0 + AND a_get_inactive_order = 0 ) ) THEN INSERT INTO tmp_Msg_Error ( @@ -191,13 +194,13 @@ BEGIN v_code_type_error_bad_data, CONCAT('Invalid or inactive Manufacturing Purchase Order IDs: ', IFNULL(GROUP_CONCAT(t_S.substring SEPARATOR ', '), 'NULL')) FROM tmp_Split t_S - LEFT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order SPO ON t_S.as_int = SPO.id_order + LEFT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order MPO ON t_S.as_int = MPO.id_order WHERE ISNULL(t_S.as_int) - OR ISNULL(SPO.id_order) + OR ISNULL(MPO.id_order) OR ( - SPO.active = 0 - AND v_get_inactive_order = 0 + MPO.active = 0 + AND a_get_inactive_order = 0 ) ; ELSE @@ -205,11 +208,11 @@ BEGIN id_order ) SELECT - SPO.id_order + MPO.id_order FROM tmp_Split t_S - RIGHT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order SPO ON t_S.as_int = SPO.id_order - INNER JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link SPOPL ON SPO.id_order = SPOPL.id_order - INNER JOIN tmp_Permutation t_PP ON SPOPL.id_permutation = t_PP.id_permutation + RIGHT JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order MPO ON t_S.as_int = MPO.id_order + INNER JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link MPOPL ON MPO.id_order = MPOPL.id_order + INNER JOIN tmp_Permutation t_PP ON MPOPL.id_permutation = t_PP.id_permutation WHERE ( a_get_all_order = 1 OR ( @@ -223,15 +226,15 @@ BEGIN ) AND ( a_get_inactive_order = 1 - OR SPO.active = 1 + OR MPO.active = 1 ) AND ( v_has_filter_date_from = 0 - OR SPO.created_on > a_date_from + OR MPO.created_on > a_date_from ) AND ( v_has_filter_date_to = 0 - OR SPO.created_on < a_date_to + OR MPO.created_on < a_date_to ) ; @@ -246,40 +249,40 @@ BEGIN v_guid , a_id_user , FALSE -- get inactive users - , v_id_permission_manufacturing_purchase_order + , v_ids_permission_manufacturing_purchase_order , v_id_access_level_view , '' -- ids_product , 0 -- a_debug ; - SELECT * from Shop_Calc_User_Temp; + SELECT * FROM partsltd_prod.Shop_Calc_User_Temp; END IF; CALL p_shop_calc_user( v_guid , a_id_user , FALSE -- get inactive users - , v_id_permission_manufacturing_purchase_order + , v_ids_permission_manufacturing_purchase_order , v_id_access_level_view , '' -- ids_product , 0 -- a_debug ); IF a_debug = 1 THEN - SELECT * from Shop_Calc_User_Temp; + SELECT * FROM partsltd_prod.Shop_Calc_User_Temp; END IF; - IF NOT EXISTS (SELECT can_view FROM Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = v_guid) THEN + IF NOT EXISTS (SELECT can_view FROM partsltd_prod.Shop_Calc_User_Temp UE_T WHERE UE_T.GUID = v_guid) THEN DELETE FROM tmp_Msg_Error; INSERT INTO tmp_Msg_Error ( - , id_type + id_type , code , msg ) VALUES ( v_id_type_error_no_permission , v_code_type_error_no_permission - CONCAT('You do not have view permissions for ', (SELECT name FROM Shop_Permission WHERE id_permission = v_id_permission_manufacturing LIMIT 1)) + , CONCAT('You do not have view permissions for ', (SELECT name FROM partsltd_prod.Shop_Permission WHERE id_permission = v_id_permission_manufacturing LIMIT 1)) ) ; END IF; @@ -305,60 +308,66 @@ BEGIN S.id_currency, t_S.active FROM tmp_Manufacturing t_S - INNER JOIN Shop_Manufacturing S + INNER JOIN partsltd_prod.Shop_Manufacturing S ON t_S.id_manufacturing = S.id_manufacturing ; */ # Manufacturing Purchase Order SELECT - t_SPO.id_order - , SPO.id_manufacturing_ordered - , SPO.id_currency_cost - , SPO.cost_total_local_VAT_excl - , SPO.cost_total_local_VAT_incl - , SPO.active - FROM tmp_Manufacturing_Purchase_Order t_SPO - INNER JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order SPO ON SPO.id_order = t_SPO.id_order + t_MPO.id_order + , MPO.id_currency + , MPO.cost_total_local_VAT_excl + , MPO.cost_total_local_VAT_incl + , MPO.price_total_local_VAT_excl + , MPO.price_total_local_VAT_incl + , MPO.active + , MPO.created_on + , CONCAT( + MPO.cost_total_local_VAT_excl + , ' on ' + , MPO.created_on + ) AS name + FROM tmp_Manufacturing_Purchase_Order t_MPO + INNER JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order MPO ON MPO.id_order = t_MPO.id_order ; # Manufacturing Purchase Order Product Link SELECT - SPOPL.id_link - , SPOPL.id_order - , SPOPL.id_permutation - , fn_shop_get_product_permutation_name(SPOPL.id_permutation) AS name_permutation - , SPOPL.id_currency_cost - , SPOPL.id_unit_quantity - , SPOPL.quantity_ordered - , SPOPL.quantity_received - , SPOPL.latency_delivery_days - , SPOPL.display_order - , SPO.cost_total_local_VAT_excl - , SPO.cost_total_local_VAT_incl - , SPO.cost_unit_local_VAT_excl - , SPO.cost_unit_local_VAT_incl - FROM tmp_Manufacturing_Purchase_Order_Product_Link t_SPOPL - INNER JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link SPOPL ON t_SPOPL.id_link = SPOPL.id_link - INNER JOIN tmp_Manufacturing_Purchase_Order t_SPO ON SPOPL.id_order = t_SPO.id_order + MPOPL.id_link + , MPOPL.id_order + , MPOPL.id_permutation + , fn_shop_get_product_permutation_name(MPOPL.id_permutation) AS name_permutation + , MPOPL.id_unit_quantity + , MPOPL.quantity_used + , MPOPL.quantity_produced + , MPOPL.latency_manufacture_days + , MPOPL.display_order + , MPOPL.cost_unit_local_VAT_excl + , MPOPL.cost_unit_local_VAT_incl + , MPOPL.price_unit_local_VAT_excl + , MPOPL.price_unit_local_VAT_incl + , MPOPL.active + FROM tmp_Manufacturing_Purchase_Order t_MPO + INNER JOIN partsltd_prod.Shop_Manufacturing_Purchase_Order_Product_Link MPOPL ON t_MPO.id_order = MPOPL.id_order ; # Errors SELECT * FROM tmp_Msg_Error t_ME - INNER JOIN Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type + INNER JOIN partsltd_prod.Shop_Msg_Error_Type MET ON t_ME.id_type = MET.id_type ; IF a_debug = 1 THEN - SELECT * from tmp_Manufacturing_Purchase_Order_Product_Link; SELECT * from tmp_Manufacturing_Purchase_Order; - SELECT * from tmp_Manufacturing; + SELECT * from tmp_Permutation; END IF; DROP TEMPORARY TABLE IF EXISTS tmp_Manufacturing_Purchase_Order_Product_Link; DROP TEMPORARY TABLE IF EXISTS tmp_Manufacturing_Purchase_Order; - DROP TEMPORARY TABLE IF EXISTS tmp_Manufacturing; + DROP TEMPORARY TABLE IF EXISTS tmp_Permutation; DROP TEMPORARY TABLE IF EXISTS tmp_Msg_Error; + DROP TEMPORARY TABLE IF EXISTS tmp_Split; IF a_debug = 1 THEN CALL p_debug_timing_reporting( v_time_start ); @@ -367,20 +376,17 @@ END // DELIMITER ;; -/* CALL p_shop_get_many_manufacturing_purchase_order ( - '', # a_id_user - 1, # a_get_all_manufacturing - 0, # a_get_inactive_manufacturing - '', # a_ids_manufacturing - 1, # a_get_all_order - -- 0, # a_get_inactive_order - '', # a_ids_order - '', # a_ids_permutation - NULL, # a_date_from - NULL # a_date_to + 1 # a_id_user + , 1 # a_get_all_order + , 0 # a_get_inactive_order + , '' # a_ids_order + , '' # a_ids_permutation + , NULL # a_date_from + , NULL # a_date_to , 0 # a_debug ); +/* */ diff --git a/static/MySQL/9000_populate.sql b/static/MySQL/9000_populate.sql index 3a3a5a19..bf140f04 100644 --- a/static/MySQL/9000_populate.sql +++ b/static/MySQL/9000_populate.sql @@ -690,10 +690,28 @@ VALUES # Supplier INSERT INTO Shop_Supplier ( - name_company, name_contact, department_contact, id_address, phone_number, fax, email, website, id_currency + name_company + , name_contact + , department_contact + -- , id_address + , phone_number + , fax + , email + , website + , id_currency ) VALUES - ('Precision And Research Technology Systems Limited', 'Teddy Middleton-Smith', 'Executive Management', 1, '07375571430', '', 'teddy@partsltd.co.uk', 'www.partsltd.co.uk', 1) + ( + 'Precision And Research Technology Systems Limited' + , 'Teddy Middleton-Smith' + , 'Executive Management' + -- , 1 + , '07375571430' + , '' + , 'teddy@partsltd.co.uk' + , 'www.partsltd.co.uk' + , 1 + ) ; # Suppliers @@ -701,7 +719,7 @@ INSERT INTO Shop_Supplier ( name_company , name_contact , department_contact - , id_address + -- , id_address , phone_number , fax , email @@ -709,7 +727,51 @@ INSERT INTO Shop_Supplier ( , id_currency ) VALUES - ('Malt Kiln Farm Shop', NULL, NULL, 1, '01788 832640', NULL, 'farmshop@maltkilnfarmshop.co.uk', 'https://www.maltkilnfarmshop.co.uk/', 1) + ( + 'Malt Kiln Farm Shop' + , NULL + , NULL + -- , 1 + , '01788 832640' + , NULL + , 'farmshop@maltkilnfarmshop.co.uk' + , 'https://www.maltkilnfarmshop.co.uk/' + , 1 + ) +; + +# Supplier Addresses +INSERT INTO Shop_Supplier_Address ( + id_supplier + , id_region + , postcode + , address_line_1 + , address_line_2 + , city + , county + , active +) +VALUES + ( + 1 + , 1 + , 'CV22 6DN' + , '53 Alfred Green Close' + , '' + , 'Rugby' + , 'Warwickshire' + , 1 + ), + ( + 2 + , 1 + , 'CV22 6DN' + , '53 Alfred Green Close' + , '' + , 'Rugby' + , 'Warwickshire' + , 1 + ) ; /* diff --git a/static/MySQL/temp.txt b/static/MySQL/temp.txt index d9b0aa72..a78abf18 100644 --- a/static/MySQL/temp.txt +++ b/static/MySQL/temp.txt @@ -91,13 +91,19 @@ 1398_tbl_Shop_Order_Status_Audit.sql 1400_tbl_Shop_Supplier.sql 1401_tbl_Shop_Supplier_Audit.sql +1402_tbl_Shop_Supplier_Temp.sql +1403_tbl_Shop_Supplier_Address.sql +1403_tbl_Shop_Supplier_Address_Temp.sql +1404_tbl_Shop_Supplier_Address.sql 1409_tbl_Shop_Supplier_Purchase_Order.sql 1410_tbl_Shop_Supplier_Purchase_Order_Audit.sql +1411_tbl_Shop_Supplier_Purchase_Order_Temp.sql 1412_tbl_Shop_Supplier_Purchase_Order_Product_Link.sql 1413_tbl_Shop_Supplier_Purchase_Order_Product_Link_Audit.sql 1414_tbl_Shop_Supplier_Purchase_Order_Product_Link_Temp.sql 1415_tbl_Shop_Manufacturing_Purchase_Order.sql 1416_tbl_Shop_Manufacturing_Purchase_Order_Audit.sql +1417_tbl_Shop_Manufacturing_Purchase_Order_Temp.sql 1418_tbl_Shop_Manufacturing_Purchase_Order_Product_Link.sql 1419_tbl_Shop_Manufacturing_Purchase_Order_Product_Link_Audit.sql 1420_tbl_Shop_Manufacturing_Purchase_Order_Product_Link_Temp.sql @@ -146,6 +152,7 @@ 3321_tri_Shop_User_Basket.sql 3324_tri_Shop_User_Order_Status.sql 3400_tri_Shop_Supplier.sql +3403_tri_Shop_Supplier_Address.sql 3403_tri_Shop_Unit_Measurement.sql 3406_tri_Shop_Unit_Of_Measurement_Conversion.sql 3409_tri_Shop_Supplier_Purchase_Order.sql @@ -162,6 +169,7 @@ 6003_p_split_key_value_pair_csv.sql 6004_p_clear_split_key_value_pair_csv_temp.sql 6206_fn_shop_get_product_permutation_name.sql +6210_fn_shop_get_id_product_permutation_from_variation_csv_list.sql 6500_p_shop_calc_user.sql 6501_p_shop_clear_calc_user.sql 7003_p_shop_get_many_access_level.sql @@ -179,7 +187,6 @@ 7204_p_shop_get_many_product.sql 7205_p_shop_get_many_stripe_product_new.sql 7206_p_shop_save_product_permutation.sql -7210_fn_shop_get_id_product_permutation_from_variation_csv_list.sql 7210_p_shop_get_many_product_variation.sql 7219_p_shop_get_many_stock_item.sql 7220_p_shop_save_stock_item.sql diff --git a/static/css/components/table.css b/static/css/components/table.css index 73544f5d..04de4bd1 100644 --- a/static/css/components/table.css +++ b/static/css/components/table.css @@ -1,4 +1,8 @@ +#formFilters .container { + max-width: fit-content; +} + thead, tbody { padding-top: 0px !important; padding-bottom: 0px !important; @@ -44,4 +48,13 @@ table select { table input { width: 90% !important; +} + +table button { + margin: 0.25vh; + padding: 0.5vh 1vh; +} + +tr.delete { + background-color: red; } \ No newline at end of file diff --git a/static/css/main.css b/static/css/main.css index 83a8064e..0b00d5d8 100644 --- a/static/css/main.css +++ b/static/css/main.css @@ -500,10 +500,6 @@ button:hover, input[type="submit"]:hover, #overlayHamburger .row *:hover { text-decoration: none; } -.delete { - text-decoration: underline; -} - /* Overlay modal */ .overlay { diff --git a/static/css/pages/store/manufacturing_purchase_order.css b/static/css/pages/store/manufacturing_purchase_order.css new file mode 100644 index 00000000..0582381c --- /dev/null +++ b/static/css/pages/store/manufacturing_purchase_order.css @@ -0,0 +1,38 @@ + +#formFilters { + width: 50vh; +} + +#formFilters .container-input.filter.active { + width: 8vh; +} +#formFilters .container-input.filter.date_from, +#formFilters .container-input.filter.date_to { + width: 8vh; +} + +#tableMain thead tr th.currency.collapsed, #tableMain tbody tr td.currency.collapsed { + width: 9vh; + min-width: 9vh; +} +#tableMain thead tr th.currency, #tableMain tbody tr td.currency { + width: 11vh; + min-width: 11vh; +} + +#tableMain tbody tr td.cost_total_local_vat_excl, #tableMain thead tr th.cost_total_local_vat_excl, +#tableMain tbody tr td.cost_total_local_vat_incl, #tableMain thead tr th.cost_total_local_vat_incl, +#tableMain tbody tr td.price_total_local_vat_excl, #tableMain thead tr th.price_total_local_vat_excl, +#tableMain tbody tr td.price_total_local_vat_incl, #tableMain thead tr th.price_total_local_vat_incl { + width: 5vh; + min-width: 5vh; +} +#tableMain tbody tr td.items, #tableMain thead tr th.items { + width: 40vh; + min-width: 40vh; +} + +#tableMain tbody tr td.active, #tableMain thead tr th.active { + width: 5vh; + min-width: 5vh; +} diff --git a/static/css/pages/store/product_permutations.css b/static/css/pages/store/product_permutations.css index 7c345c82..5534efb3 100644 --- a/static/css/pages/store/product_permutations.css +++ b/static/css/pages/store/product_permutations.css @@ -25,14 +25,15 @@ display: table-cell !important; } #tableMain thead tr th.product_variations, #tableMain tbody tr td.product_variations { - width: 20vh; - min-width: 20vh; + width: 24vh; + min-width: 24vh; } -#tableMain tbody tr td.product_variations table thead tr th, #tableMain tbody tr td.product_variations table tbody tr td { +#tableMain tbody tr td.product_variations table thead tr th.product_variation_type, #tableMain tbody tr td.product_variations table tbody tr td.product_variation_type, +#tableMain tbody tr td.product_variations table thead tr th.product_variation, #tableMain tbody tr td.product_variations table tbody tr td.product_variation { width: 8vh; min-width: 8vh; } -#tableMain tbody tr td.product_variations table thead tr th:last-of-type, #tableMain tbody tr td.product_variations table tbody tr td:last-of-type { +#tableMain tbody tr td.product_variations table thead tr th.add, #tableMain tbody tr td.product_variations table tbody tr td.delete { width: 4vh; min-width: 4vh; } diff --git a/static/css/pages/store/supplier.css b/static/css/pages/store/supplier.css new file mode 100644 index 00000000..25b14d44 --- /dev/null +++ b/static/css/pages/store/supplier.css @@ -0,0 +1,59 @@ + +#formFilters { + width: 50vh; +} + +#formFilters .container-input.filter.active { + width: 8vh; +} + +#tableMain tbody tr td.name_company, #tableMain thead tr th.name_company, +#tableMain tbody tr td.name_contact, #tableMain thead tr th.name_contact, +#tableMain tbody tr td.department_contact, #tableMain thead tr th.department_contact, +#tableMain tbody tr td.phone_number, #tableMain thead tr th.phone_number { + width: 10vh; + min-width: 10vh; +} +#tableMain tbody tr td.email, #tableMain thead tr th.email, +#tableMain tbody tr td.website, #tableMain thead tr th.website { + width: 15vh; + min-width: 15vh; +} + +#tableMain thead tr th.address.collapsed, #tableMain tbody tr td.address.collapsed { + width: 9vh; + min-width: 9vh; + display: table-cell !important; +} +#tableMain thead tr th.address, #tableMain tbody tr td.address { + width: 108vh; + min-width: 108vh; +} +#tableMain tbody tr td.address table thead tr th.postcode, #tableMain tbody tr td.address table tbody tr td.postcode, +#tableMain tbody tr td.address table thead tr th.address_line_1, #tableMain tbody tr td.address table tbody tr td.address_line_1, +#tableMain tbody tr td.address table thead tr th.address_line_2, #tableMain tbody tr td.address table tbody tr td.address_line_2, +#tableMain tbody tr td.address table thead tr th.city, #tableMain tbody tr td.address table tbody tr td.city, +#tableMain tbody tr td.address table thead tr th.county, #tableMain tbody tr td.address table tbody tr td.county, +#tableMain tbody tr td.address table thead tr th.region, #tableMain tbody tr td.address table tbody tr td.region { + width: 15vh; + min-width: 15vh; +} +#tableMain tbody tr td.address table thead tr th.active, #tableMain tbody tr td.address table tbody tr td.active, +#tableMain tbody tr td.address table thead tr th.add, #tableMain tbody tr td.address table tbody tr td.delete { + width: 5vh; + min-width: 5vh; +} + +#tableMain thead tr th.currency.collapsed, #tableMain tbody tr td.currency.collapsed { + width: 9vh; + min-width: 9vh; +} +#tableMain thead tr th.currency, #tableMain tbody tr td.currency { + width: 11vh; + min-width: 11vh; +} + +#tableMain tbody tr td.active, #tableMain thead tr th.active { + width: 5vh; + min-width: 5vh; +} diff --git a/static/css/pages/store/supplier_purchase_order.css b/static/css/pages/store/supplier_purchase_order.css new file mode 100644 index 00000000..82d92096 --- /dev/null +++ b/static/css/pages/store/supplier_purchase_order.css @@ -0,0 +1,40 @@ + +#formFilters { + width: 100vh; +} + +#formFilters .container-input.filter.active { + width: 8vh; +} +#formFilters .container-input.filter.date_from, +#formFilters .container-input.filter.date_to { + width: 8vh; +} + +#tableMain tbody tr td.supplier, #tableMain thead tr th.supplier { + width: 15vh; + min-width: 15vh; +} + +#tableMain thead tr th.currency.collapsed, #tableMain tbody tr td.currency.collapsed { + width: 9vh; + min-width: 9vh; +} +#tableMain thead tr th.currency, #tableMain tbody tr td.currency { + width: 11vh; + min-width: 11vh; +} + +#tableMain tbody tr td.cost_total_local_vat_excl, #tableMain thead tr th.cost_total_local_vat_excl, +#tableMain tbody tr td.cost_total_local_vat_incl, #tableMain thead tr th.cost_total_local_vat_incl { + width: 10vh; + min-width: 10vh; +} +#tableMain tbody tr td.items, #tableMain thead tr th.items { + width: 40vh; + min-width: 40vh; +} +#tableMain tbody tr td.active, #tableMain thead tr th.active { + width: 5vh; + min-width: 5vh; +} diff --git a/static/dist/css/main.bundle.css b/static/dist/css/main.bundle.css index 05b86a66..decdc7bd 100644 --- a/static/dist/css/main.bundle.css +++ b/static/dist/css/main.bundle.css @@ -500,10 +500,6 @@ button:hover, input[type="submit"]:hover, #overlayHamburger .row *:hover { text-decoration: none; } -.delete { - text-decoration: underline; -} - /* Overlay modal */ .overlay { @@ -609,6 +605,10 @@ td.dirty { height: 50vh; } +#formFilters .container { + max-width: fit-content; +} + thead, tbody { padding-top: 0px !important; padding-bottom: 0px !important; @@ -656,6 +656,15 @@ table input { width: 90% !important; } +table button { + margin: 0.25vh; + padding: 0.5vh 1vh; +} + +tr.delete { + background-color: red; +} + button.collapsed { display: block; diff --git a/static/dist/css/store_product_permutations.bundle.css b/static/dist/css/store_product_permutations.bundle.css index ff0283be..dbd8d84b 100644 --- a/static/dist/css/store_product_permutations.bundle.css +++ b/static/dist/css/store_product_permutations.bundle.css @@ -78,14 +78,15 @@ display: table-cell !important; } #tableMain thead tr th.product_variations, #tableMain tbody tr td.product_variations { - width: 20vh; - min-width: 20vh; + width: 24vh; + min-width: 24vh; } -#tableMain tbody tr td.product_variations table thead tr th, #tableMain tbody tr td.product_variations table tbody tr td { +#tableMain tbody tr td.product_variations table thead tr th.product_variation_type, #tableMain tbody tr td.product_variations table tbody tr td.product_variation_type, +#tableMain tbody tr td.product_variations table thead tr th.product_variation, #tableMain tbody tr td.product_variations table tbody tr td.product_variation { width: 8vh; min-width: 8vh; } -#tableMain tbody tr td.product_variations table thead tr th:last-of-type, #tableMain tbody tr td.product_variations table tbody tr td:last-of-type { +#tableMain tbody tr td.product_variations table thead tr th.add, #tableMain tbody tr td.product_variations table tbody tr td.delete { width: 4vh; min-width: 4vh; } diff --git a/static/dist/js/main.bundle.js b/static/dist/js/main.bundle.js index 4ccc5bf5..838cf708 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),v}},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:L(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),v}},t}function m(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){m(i,n,o,a,u,"next",e)}function u(e){m(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 g.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:(v=k(b().mark((function t(){var r;return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return(r={})[flagCallback]=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 v.apply(this,arguments)})},{key:"getCategories",value:(h=k(b().mark((function t(){return b().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 h.apply(this,arguments)})},{key:"getCategoriesByFilters",value:(y=k(b().mark((function t(r){return b().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 y.apply(this,arguments)})},{key:"saveCategories",value:(d=k(b().mark((function t(r,n,o){var i;return b().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 d.apply(this,arguments)})},{key:"getProducts",value:(p=k(b().mark((function t(){return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,e.request(hashGetStoreProduct);case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}}),t)}))),function(){return p.apply(this,arguments)})},{key:"getProductsByFilters",value:(f=k(b().mark((function t(r){return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e.goToHash(hashPageStoreProducts,r);case 1:case"end":return t.stop()}}),t)}))),function(e){return f.apply(this,arguments)})},{key:"saveProducts",value:(s=k(b().mark((function t(r,n,o){var i;return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return(i={})[flagFormFilters]=l.convertForm2JSON(n),i[flagProduct]=r,i[flagComment]=o,t.next=6,e.request(hashSaveStoreProduct,"POST",i);case 6:return t.abrupt("return",t.sent);case 7:case"end":return t.stop()}}),t)}))),function(e,t,r){return s.apply(this,arguments)})},{key:"getProductPermutations",value:(c=k(b().mark((function t(){return b().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 c.apply(this,arguments)})},{key:"getProductPermutationsByFilters",value:(u=k(b().mark((function t(r){return b().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 u.apply(this,arguments)})},{key:"saveProductPermutations",value:(a=k(b().mark((function t(r,n,o){var i;return b().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 a.apply(this,arguments)})},{key:"getStockItems",value:(i=k(b().mark((function t(){return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,e.request(hashGetStoreStockItem);case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}}),t)}))),function(){return i.apply(this,arguments)})},{key:"getStockItemsByFilters",value:(o=k(b().mark((function t(r){return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e.goToHash(hashPageStoreStockItems,r);case 1:case"end":return t.stop()}}),t)}))),function(e){return o.apply(this,arguments)})},{key:"saveStockItems",value:(n=k(b().mark((function t(r,n,o){var i;return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return(i={})[flagFormFilters]=l.convertForm2JSON(n),i[flagStockItem]=r,i[flagComment]=o,t.next=6,e.request(hashSaveStoreStockItem,"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,p,d,y,h,v,g}();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 O(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[flagForm]=convertForm2JSON(r);var n=[keyNameFull,keyPhoneNumber,keyPostcode,keyAddress1,keyAddress2,keyCity,keyCounty];for(var o in console.log("ajaxData:"),console.log(e),e[flagForm][keyInfoIdentical]=getElementValueCurrent(r.querySelector("#"+keyInfoIdentical)),n)t==idOverlayInfoBilling&&e[flagForm][keyInfoIdentical]?e[flagForm][n[o]]=getElementValueCurrent((void 0).querySelector("#"+n[o])):e[flagForm][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),p.initialiseEventHandler(idButtonCheckout,flagInitialised,(function(){e.removeEventListener("click"),e.addEventListener("click",(function(e){var t=v.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(){p.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=Ge(Ke(e.prototype),"leave",r);return"function"==typeof n?function(e){return n.apply(r,e)}:n}(t,0,this)([])}}])}(F);function $e(e){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(e)}function Ze(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 ft(e){return ft="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},ft(e)}function pt(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 Ot(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:"hookupFilterIsNotEmpty",value:function(){this.hookupFilter(flagIsNotEmpty)}},{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(){p.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){if(this.constructor===t)throw new Error("Subclass of TableBasePage must implement method initialiseRowNew().");e.classList.remove(flagRowNew)}},{key:"hookupTableMain",value:function(){var e=this;if(this.constructor===t)throw new Error("Must implement hookupTableMain() method.");p.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)};p.initialiseEventHandler(e,flagInitialised,(function(e){e.addEventListener("change",(function(t){r(t,e)})),t.handleChangeElementCellTable(null,e)}))}},{key:"handleChangeElementCellTable",value:function(e,t){var r=l.getRowFromElement(t),n=l.getCellFromElement(t),o=l.hasDirtyChildrenContainer(r),i=t.classList.contains(flagDirty),a=l.updateAndCheckIsElementDirty(t);if(a!=i){l.handleDirtyElement(n,a);var u=l.hasDirtyChildrenContainer(r);if(u!=o){l.handleDirtyElement(r,u);var c=this.getTableRecords(!0).length>0;this.toggleShowButtonsSaveCancel(c)}}}},{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,yt.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=st.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:"hookupProductPermutationVariationFields",value:function(){var e=this;this.hookupEventHandler("click",idTableMain+" td."+flagProductVariations,(function(t,r){return e.handleClickProductPermutationVariationsPreview(t,r)}))}},{key:"handleClickProductPermutationVariationsPreview",value:function(e,t){var r=this;console.log("click product permutation variations preview"),this.toggleColumnCollapsed(flagProductVariations,!1);var o=this.getElementProductVariations(t),i=document.createElement("table");i.classList.add(flagProductVariations);var a=document.createElement("thead"),u=document.createElement("tr"),l=document.createElement("th");l.textContent="Type";var c=document.createElement("th");c.textContent="Name";var s=document.createElement("button");s.classList.add(flagAdd),s.textContent="+";var f=document.createElement("th");f.appendChild(s),u.appendChild(l),u.appendChild(c),u.appendChild(f),a.appendChild(u),i.appendChild(a);var p=document.createElement("tbody");console.log("variations:",o),n.isEmpty(o)?o=[PageStoreProductPermutations.createOptionUnselectedProductVariation()]:o.forEach((function(e,t){r.addProductPermutationVariationRow(p,e)})),i.appendChild(p);var d=t.parentElement;d.innerHTML="",d.appendChild(i),console.log("tblVariations: ",i);var y=idTableMain+" td."+flagProductVariations+" button."+flagAdd;this.hookupEventHandler("click",y,this.handleClickButtonProductPermutationVariationsAdd);var h=idTableMain+" td."+flagProductVariations+" button."+flagDelete;this.hookupEventHandler("click",h,this.handleClickButtonProductPermutationVariationsDelete)}},{key:"toggleColumnCollapsed",value:function(e,t){this.toggleColumnHasClassnameFlag(e,t,flagCollapsed)}},{key:"getElementProductVariations",value:function(e){var t,r,o,i=e.getAttribute(attrValueCurrent),a=[];return n.isEmpty(i)||(i=i.split(",")).forEach((function(e){2==(t=e.split(":")).length?(console.log("parts: ",t),o=productVariationTypes[t[0].trim()],r=productVariations[t[1].trim()],a.push(kt(kt({},flagProductVariationType,o),flagProductVariation,r))):console.log("error: invalid variation: ",e)})),a}},{key:"addProductPermutationVariationRow",value:function(e,t){var r,n,o,i,a,u,c=Object.keys(productVariations),s=Object.keys(productVariationTypes);console.log("permutationVariation: ",t);var f=t[flagProductVariation],p=t[flagProductVariationType],d=document.createElement("td");d.classList.add(flagProductVariationType),l.setElementAttributesValuesCurrentAndPrevious(d,p[attrIdProductVariationType]);var y=document.createElement("select");y.classList.add(flagProductVariationType),l.setElementAttributesValuesCurrentAndPrevious(y,p[attrIdProductVariationType]),o=l.createOption(null),console.log("optionProductVariationType: ",o),y.appendChild(o),s.forEach((function(e){r=productVariationTypes[e],n=st.getOptionJsonFromObjectJson(r,p[attrIdProductVariationType]),o=l.createOption(n),console.log("optionProductVariationType: ",o),y.appendChild(o)}));var h=document.createElement("td");h.classList.add(flagProductVariation),l.setElementAttributesValuesCurrentAndPrevious(h,f[attrIdProductVariation]);var v=document.createElement("select");v.classList.add(flagProductVariation),l.setElementAttributesValuesCurrentAndPrevious(v,f[attrIdProductVariation]),u=l.createOption(null),console.log("optionProductVariation: ",u),v.appendChild(u),c.forEach((function(e){i=productVariations[e],a=st.getOptionJsonFromObjectJson(i,f[attrIdProductVariation]),u=l.createOption(a),console.log("optionProductVariation: ",u),v.appendChild(u)}));var g=document.createElement("td");g.classList.add(flagDelete);var b=document.createElement("button");b.classList.add(flagDelete),b.textContent="x";var m=document.createElement("tr");d.appendChild(y),m.appendChild(d),h.appendChild(v),m.appendChild(h),g.appendChild(b),m.appendChild(g),e.appendChild(m)}},{key:"handleClickButtonProductPermutationVariationsDelete",value:function(e,t){var r=getRowFromElement(t),n=r.closest("td."+flagProductVariations);r.remove(),this.updateProductPermutationVariations(n)}},{key:"updateProductPermutationVariations",value:function(e){var t=this.getProductPermutationVariationsText(e);e.setAttribute(attrValueCurrent,t),l.isElementDirty(e)}},{key:"getProductPermutationVariationsText",value:function(e){var t,r,n,o,i=e.querySelectorAll("tr"),a="";return i.forEach((function(e,i){t=e.querySelector("td select."+flagProductVariationType),r=e.querySelector("td select."+flagProductVariation),n=t.getAttribute(attrValueCurrent),o=r.getAttribute(attrValueCurrent),a+=n+":"+o+","})),a}},{key:"leave",value:function(){if(this.constructor===t)throw new Error("Must implement leave() method.");Ot(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}},{key:"createOptionUnselectedProductVariation",value:function(){return kt(kt({},flagProductVariationType,kt(kt(kt(kt({},flagNameAttrOptionText,[flagName]),flagNameAttrOptionValue,[attrIdProductVariationType]),flagName,"Select Variation Type"),attrIdProductVariationType,0)),flagProductVariation,kt(kt(kt(kt({},flagNameAttrOptionText,[flagName]),flagNameAttrOptionValue,[attrIdProductVariation]),flagName,"Select Variation"),attrIdProductVariation,0))}}])}(F);function At(e){return At="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},At(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 Dt(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)?Dt(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 Dt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageHome,e)},this.routes[hashPageContact]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageContact,e)},this.routes[hashPageServices]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageServices,e)},this.routes[hashPageAdminHome]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageAdminHome,e)},this.routes[hashPageAccessibilityStatement]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageAccessibilityStatement,e)},this.routes[hashPageDataRetentionSchedule]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageDataRetentionSchedule,e)},this.routes[hashPageLicense]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageLicense,e)},this.routes[hashPagePrivacyPolicy]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPagePrivacyPolicy,e)},this.routes[hashPageStoreProductCategories]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageStoreProductCategories,e)},this.routes[hashPageStoreProductPermutations]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageStoreProductPermutations,e)},this.routes[hashPageStoreProducts]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageStoreProducts,e)},this.routes[hashPageStoreStockItems]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageStoreStockItems,e)},this.initialize()}),[{key:"loadPage",value:function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.getClassPageFromHash(e);this.currentPage=new n(this),this.currentPage.initialize(r),window.addEventListener("beforeunload",(function(){return t.currentPage.leave()}))}},{key:"getClassPageFromHash",value:function(e){var t=this.pages[e];try{return t.module}catch(t){throw console.log("this.pages: ",this.pages),console.error("Page not found:",e),t}}},{key:"initialize",value:function(){window.addEventListener("popstate",this.handlePopState.bind(this))}},{key:"handlePopState",value:function(e){this.loadPageCurrent()}},{key:"loadPageCurrent",value:function(){var e=l.getHashPageCurrent();this.loadPage(e)}},{key:"navigateToHash",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=C.getUrlFromHash(e,r);history.pushState({data:t,params:r},"",e),C.goToUrl(n,t)}},{key:"navigateToUrl",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;(!(arguments.length>2&&void 0!==arguments[2])||arguments[2])&&history.pushState(t,"",e),e=C.parameteriseUrl(e,t),C.goToUrl(e)}}],[{key:"loadPageBodyFromResponse",value:function(e){console.log(e.data),l.loadPageBody(e.data)}}])}();function un(e){return un="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},un(e)}function ln(e,t){for(var r=0;r{"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;--a){var i=this.tryEntries[a],u=i.completion;if("root"===i.tryLoc)return o("end");if(i.tryLoc<=this.prev){var l=n.call(i,"catchLoc"),c=n.call(i,"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),v}},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:x(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),v}},t}function m(e,t,r,n,o,a,i){try{var u=e[a](i),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 a=e.apply(t,r);function i(e){m(a,n,o,i,u,"next",e)}function u(e){m(a,n,o,i,u,"throw",e)}i(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,a=c.length>3&&void 0!==c[3]?c[3]:null,i=e.getUrlFromHash(r,a),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,i,o),t.prev=7,t.next=10,fetch(i,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 I.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:(A=k(b().mark((function t(){var r;return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return(r={})[flagCallback]=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 A.apply(this,arguments)})},{key:"getCategories",value:(T=k(b().mark((function t(){return b().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 T.apply(this,arguments)})},{key:"getCategoriesByFilters",value:(E=k(b().mark((function t(r){return b().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 E.apply(this,arguments)})},{key:"saveCategories",value:(O=k(b().mark((function t(r,n,o){var a;return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return(a={})[flagFormFilters]=l.convertForm2JSON(n),a[flagProductCategory]=r,a[flagComment]=o,t.next=6,e.request(hashSaveStoreProductCategory,"POST",a);case 6:return t.abrupt("return",t.sent);case 7:case"end":return t.stop()}}),t)}))),function(e,t,r){return O.apply(this,arguments)})},{key:"getProducts",value:(w=k(b().mark((function t(){return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,e.request(hashGetStoreProduct);case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}}),t)}))),function(){return w.apply(this,arguments)})},{key:"getProductsByFilters",value:(C=k(b().mark((function t(r){return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e.goToHash(hashPageStoreProducts,r);case 1:case"end":return t.stop()}}),t)}))),function(e){return C.apply(this,arguments)})},{key:"saveProducts",value:(S=k(b().mark((function t(r,n,o){var a;return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return(a={})[flagFormFilters]=l.convertForm2JSON(n),a[flagProduct]=r,a[flagComment]=o,t.next=6,e.request(hashSaveStoreProduct,"POST",a);case 6:return t.abrupt("return",t.sent);case 7:case"end":return t.stop()}}),t)}))),function(e,t,r){return S.apply(this,arguments)})},{key:"getProductPermutations",value:(m=k(b().mark((function t(){return b().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 m.apply(this,arguments)})},{key:"getProductPermutationsByFilters",value:(g=k(b().mark((function t(r){return b().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 g.apply(this,arguments)})},{key:"saveProductPermutations",value:(v=k(b().mark((function t(r,n,o){var a;return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return(a={})[flagFormFilters]=l.convertForm2JSON(n),a[flagProductPermutation]=r,a[flagComment]=o,t.next=6,e.request(hashSaveStoreProductPermutation,"POST",a);case 6:return t.abrupt("return",t.sent);case 7:case"end":return t.stop()}}),t)}))),function(e,t,r){return v.apply(this,arguments)})},{key:"getStockItems",value:(h=k(b().mark((function t(){return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,e.request(hashGetStoreStockItem);case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}}),t)}))),function(){return h.apply(this,arguments)})},{key:"getStockItemsByFilters",value:(y=k(b().mark((function t(r){return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e.goToHash(hashPageStoreStockItems,r);case 1:case"end":return t.stop()}}),t)}))),function(e){return y.apply(this,arguments)})},{key:"saveStockItems",value:(p=k(b().mark((function t(r,n,o){var a;return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return(a={})[flagFormFilters]=l.convertForm2JSON(n),a[flagStockItem]=r,a[flagComment]=o,t.next=6,e.request(hashSaveStoreStockItem,"POST",a);case 6:return t.abrupt("return",t.sent);case 7:case"end":return t.stop()}}),t)}))),function(e,t,r){return p.apply(this,arguments)})},{key:"getSuppliers",value:(d=k(b().mark((function t(){return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,e.request(hashGetStoreSupplier);case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}}),t)}))),function(){return d.apply(this,arguments)})},{key:"getSuppliersByFilters",value:(f=k(b().mark((function t(r){return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e.goToHash(hashPageStoreSuppliers,r);case 1:case"end":return t.stop()}}),t)}))),function(e){return f.apply(this,arguments)})},{key:"saveSuppliers",value:(s=k(b().mark((function t(r,n,o){var a;return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return(a={})[flagFormFilters]=l.convertForm2JSON(n),a[flagSupplier]=r,a[flagComment]=o,t.next=6,e.request(hashSaveStoreSupplier,"POST",a);case 6:return t.abrupt("return",t.sent);case 7:case"end":return t.stop()}}),t)}))),function(e,t,r){return s.apply(this,arguments)})},{key:"getSupplierPurchaseOrders",value:(c=k(b().mark((function t(){return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,e.request(hashGetStoreSupplierPurchaseOrder);case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}}),t)}))),function(){return c.apply(this,arguments)})},{key:"getSupplierPurchaseOrdersByFilters",value:(u=k(b().mark((function t(r){return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e.goToHash(hashPageStoreSupplierPurchaseOrders,r);case 1:case"end":return t.stop()}}),t)}))),function(e){return u.apply(this,arguments)})},{key:"saveSupplierPurchaseOrders",value:(i=k(b().mark((function t(r,n,o){var a;return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return(a={})[flagFormFilters]=l.convertForm2JSON(n),a[flagSupplierPurchaseOrder]=r,a[flagComment]=o,t.next=6,e.request(hashSaveStoreSupplierPurchaseOrder,"POST",a);case 6:return t.abrupt("return",t.sent);case 7:case"end":return t.stop()}}),t)}))),function(e,t,r){return i.apply(this,arguments)})},{key:"getManufacturingPurchaseOrders",value:(a=k(b().mark((function t(){return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,e.request(hashGetStoreManufacturingPurchaseOrder);case 2:return t.abrupt("return",t.sent);case 3:case"end":return t.stop()}}),t)}))),function(){return a.apply(this,arguments)})},{key:"getManufacturingPurchaseOrdersByFilters",value:(o=k(b().mark((function t(r){return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e.goToHash(hashPageStoreManufacturingPurchaseOrders,r);case 1:case"end":return t.stop()}}),t)}))),function(e){return o.apply(this,arguments)})},{key:"saveManufacturingPurchaseOrders",value:(n=k(b().mark((function t(r,n,o){var a;return b().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return(a={})[flagFormFilters]=l.convertForm2JSON(n),a[flagManufacturingPurchaseOrder]=r,a[flagComment]=o,t.next=6,e.request(hashSaveStoreManufacturingPurchaseOrder,"POST",a);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,a,i,u,c,s,f,d,p,y,h,v,g,m,S,C,w,O,E,T,A,I}();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 O(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[flagForm]=convertForm2JSON(r);var n=[keyNameFull,keyPhoneNumber,keyPostcode,keyAddress1,keyAddress2,keyCity,keyCounty];for(var o in console.log("ajaxData:"),console.log(e),e[flagForm][keyInfoIdentical]=getElementValueCurrent(r.querySelector("#"+keyInfoIdentical)),n)t==idOverlayInfoBilling&&e[flagForm][keyInfoIdentical]?e[flagForm][n[o]]=getElementValueCurrent((void 0).querySelector("#"+n[o])):e[flagForm][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),d.initialiseEventHandler(idButtonCheckout,flagInitialised,(function(){e.removeEventListener("click"),e.addEventListener("click",(function(e){var t=v.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(){d.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=Ge(We(e.prototype),"leave",r);return"function"==typeof n?function(e){return n.apply(r,e)}:n}(t,0,this)([])}}])}(F);function $e(e){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(e)}function Ze(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 ft(e){return ft="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},ft(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],a=this.getFormFilters(),i=l.convertForm2JSON(a);n.areEqualDicts(o,i)||this.callFilterTableContent(o)}else Ot(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:"hookupFilterIsNotEmpty",value:function(){this.hookupFilter(flagIsNotEmpty)}},{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=[];return document.querySelectorAll(idTableMain+" > tbody > tr").forEach((function(o){r&&!o.classList.contains(flagDirty)||(e=t.getJsonRow(o),n.push(e))})),n}},{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(){d.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)}));var a=document.querySelectorAll(idTableMain+" > tbody > tr").length;o.setAttribute(e.constructor.attrIdRowObject,-1-a),e.initialiseRowNew(o),n.appendChild(o),e.hookupTableMain()}))}},{key:"initialiseRowNew",value:function(e){if(this.constructor===t)throw new Error("Subclass of TableBasePage must implement method initialiseRowNew().");e.classList.remove(flagRowNew)}},{key:"hookupTableMain",value:function(){var e=this;if(this.constructor===t)throw new Error("Must implement hookupTableMain() method.");d.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)};d.initialiseEventHandler(e,flagInitialised,(function(e){e.addEventListener("change",(function(t){r(t,e)})),r(null,e)}))}},{key:"handleChangeElementCellTable",value:function(e,t){var r=l.getRowFromElement(t),n=l.getCellFromElement(t),o=l.hasDirtyChildrenNotDeletedContainer(r),a=t.classList.contains(flagDirty),i=l.updateAndCheckIsElementDirty(t);if(i!=a){l.handleDirtyElement(n,i);var u=l.hasDirtyChildrenNotDeletedContainer(r);if(u!=o){l.handleDirtyElement(r,u);var c=this.getTableRecords(!0).length>0;this.toggleShowButtonsSaveCancel(c)}}}},{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,yt.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,a){r.handleClickTableCellDdlPreview(o,a,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,a=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 i=t.cloneNode(!0);t.parentNode.replaceChild(i,t);var u=i.getAttribute(attrValueCurrent);i.innerHTML="";var c,s,f=document.createElement("select");l.setElementValuesCurrentAndPrevious(f,l.getElementAttributeValueCurrent(i)),console.log({optionObjectList:r,cellSelector:n}),r.forEach((function(e){c=st.getOptionJsonFromObjectJson(e,u),s=l.createOption(c),f.appendChild(s)})),i.appendChild(f),a(n+" select")}}},{key:"handleChangeTableCellDdl",value:function(e,t){var r=l.getRowFromElement(t),n=l.getCellFromElement(t);console.log("td: ",n);var o=l.hasDirtyChildrenNotDeletedContainer(r),a=t.classList.contains(flagDirty),i=l.updateAndCheckIsElementDirty(t);if(console.log("isDirtyElement: ",i),console.log("wasDirtyElement: ",a),i!=a){l.handleDirtyElement(n,i);var u=t.options[t.selectedIndex];l.setElementAttributeValueCurrent(n,u.value);var c=l.hasDirtyChildrenNotDeletedContainer(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,a){var i=a.querySelector("div");i&&!i.classList.contains(flagCollapsed)&&r.handleClickTableCellDdlPreview(o,a,t,e,(function(e,t){n(e,t)}))}))}},{key:"hookupProductPermutationVariationFields",value:function(){var e=this;this.hookupEventHandler("click",idTableMain+" td."+flagProductVariations,(function(t,r){return e.handleClickProductPermutationVariationsPreview(t,r)}))}},{key:"handleClickProductPermutationVariationsPreview",value:function(e,t){var r=this;console.log("click product permutation variations preview"),this.toggleColumnCollapsed(flagProductVariations,!1);var o=this.getElementProductVariations(t),a=document.createElement("table");a.classList.add(flagProductVariations);var i=document.createElement("thead"),u=document.createElement("tr"),l=document.createElement("th");l.classList.add(flagProductVariationType),l.textContent="Type";var c=document.createElement("th");c.classList.add(flagProductVariation),c.textContent="Name";var s=document.createElement("button");s.classList.add(flagAdd),s.textContent="+";var f=document.createElement("th");f.classList.add(flagAdd),f.appendChild(s),u.appendChild(l),u.appendChild(c),u.appendChild(f),i.appendChild(u),a.appendChild(i);var d=document.createElement("tbody");console.log("variations:",o),n.isEmpty(o)?o=[PageStoreProductPermutations.createOptionUnselectedProductVariation()]:o.forEach((function(e,t){r.addProductPermutationVariationRow(d,e)})),a.appendChild(d);var p=t.closest(idTableMain+" tbody tr td."+flagProductVariations);p.innerHTML="",p.appendChild(a),console.log("tblVariations: ",a);var y=idTableMain+" td."+flagProductVariations+" button."+flagAdd;this.hookupEventHandler("click",y,this.handleClickButtonProductPermutationVariationsAdd);var h=idTableMain+" td."+flagProductVariations+" button."+flagDelete;this.hookupEventHandler("click",h,this.handleClickButtonProductPermutationVariationsDelete)}},{key:"toggleColumnCollapsed",value:function(e,t){this.toggleColumnHasClassnameFlag(e,t,flagCollapsed)}},{key:"toggleColumnHeaderCollapsed",value:function(e,t){this.toggleColumnHasClassnameFlag(e,t,flagCollapsed)}},{key:"getElementProductVariations",value:function(e){var t,r,o,a=e.getAttribute(attrValueCurrent),i=[];return n.isEmpty(a)||(a=a.split(",")).forEach((function(e){2==(t=e.split(":")).length?(console.log("parts: ",t),o=productVariationTypes[t[0].trim()],r=productVariations[t[1].trim()],i.push(kt(kt({},flagProductVariationType,o),flagProductVariation,r))):console.log("error: invalid variation: ",e)})),i}},{key:"addProductPermutationVariationRow",value:function(e,t){var r,n,o,a,i,u,c=Object.keys(productVariations),s=Object.keys(productVariationTypes);console.log("permutationVariation: ",t);var f=t[flagProductVariation],d=t[flagProductVariationType],p=document.createElement("td");p.classList.add(flagProductVariationType),l.setElementAttributesValuesCurrentAndPrevious(p,d[attrIdProductVariationType]);var y=document.createElement("select");y.classList.add(flagProductVariationType),l.setElementAttributesValuesCurrentAndPrevious(y,d[attrIdProductVariationType]),o=l.createOption(null),console.log("optionProductVariationType: ",o),y.appendChild(o),s.forEach((function(e){r=productVariationTypes[e],n=st.getOptionJsonFromObjectJson(r,d[attrIdProductVariationType]),o=l.createOption(n),console.log("optionProductVariationType: ",o),y.appendChild(o)}));var h=document.createElement("td");h.classList.add(flagProductVariation),l.setElementAttributesValuesCurrentAndPrevious(h,f[attrIdProductVariation]);var v=document.createElement("select");v.classList.add(flagProductVariation),l.setElementAttributesValuesCurrentAndPrevious(v,f[attrIdProductVariation]),u=l.createOption(null),console.log("optionProductVariation: ",u),v.appendChild(u),c.forEach((function(e){a=productVariations[e],i=st.getOptionJsonFromObjectJson(a,f[attrIdProductVariation]),u=l.createOption(i),console.log("optionProductVariation: ",u),v.appendChild(u)}));var g=document.createElement("td");g.classList.add(flagDelete);var b=document.createElement("button");b.classList.add(flagDelete),b.textContent="x";var m=document.createElement("tr");p.appendChild(y),m.appendChild(p),h.appendChild(v),m.appendChild(h),g.appendChild(b),m.appendChild(g),e.appendChild(m)}},{key:"handleClickButtonProductPermutationVariationsDelete",value:function(e,t){var r=getRowFromElement(t),n=r.closest("td."+flagProductVariations);r.remove(),this.updateProductPermutationVariations(n)}},{key:"updateProductPermutationVariations",value:function(e){var t=this.getProductPermutationVariationsText(e);e.setAttribute(attrValueCurrent,t),l.isElementDirty(e)}},{key:"getProductPermutationVariationsText",value:function(e){var t,r,n,o,a=e.querySelectorAll("tr"),i="";return a.forEach((function(e,a){t=e.querySelector("td select."+flagProductVariationType),r=e.querySelector("td select."+flagProductVariation),n=t.getAttribute(attrValueCurrent),o=r.getAttribute(attrValueCurrent),i+=n+":"+o+","})),i}},{key:"hookupCurrencyFields",value:function(){this.hookupTableCellDdlPreviews(idTableMain+" td."+flagCurrency,yt.getListFromDict(currencies))}},{key:"leave",value:function(){if(this.constructor===t)throw new Error("Must implement leave() method.");Ot(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),a=o.classList.contains(r);t!=a&&(l.toggleElementHasClassnameFlag(o,t,r),n.querySelectorAll("td."+e).forEach((function(e){l.toggleElementHasClassnameFlag(e,t,r)})))}},{key:"toggleColumnHeaderHasClassnameFlag",value:function(e,t,r){var n=this.getTableMain().querySelector("th."+e);l.toggleElementHasClassnameFlag(n,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}},{key:"createOptionUnselectedProductVariation",value:function(){return kt(kt({},flagProductVariationType,kt(kt(kt(kt({},flagNameAttrOptionText,[flagName]),flagNameAttrOptionValue,[attrIdProductVariationType]),flagName,"Select Variation Type"),attrIdProductVariationType,0)),flagProductVariation,kt(kt(kt(kt({},flagNameAttrOptionText,[flagName]),flagNameAttrOptionValue,[attrIdProductVariation]),flagName,"Select Variation"),attrIdProductVariation,0))}}])}(F);function jt(e){return jt="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},jt(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 a,i=!0,u=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return i=e.done,e},e:function(e){u=!0,a=e},f:function(){try{i||null==r.return||r.return()}finally{if(u)throw a}}}}function Lt(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r0?supplierAddresses[o]:[],i=document.createElement("table");i.classList.add(flagAddress);var u=document.createElement("thead"),c=document.createElement("tr"),s=document.createElement("th");s.classList.add(flagPostcode),s.textContent="Postcode";var f=document.createElement("th");f.classList.add(flagAddressLine1),f.textContent="Address Line 1";var d=document.createElement("th");d.classList.add(flagAddressLine2),d.textContent="Address Line 2";var p=document.createElement("th");p.classList.add(flagCity),p.textContent="City";var y=document.createElement("th");y.classList.add(flagCounty),y.textContent="County";var h=document.createElement("th");h.classList.add(flagRegion),h.textContent="Region";var v=document.createElement("th");v.classList.add(flagActive),v.textContent="Active";var g=document.createElement("th");g.classList.add(flagAdd);var b=document.createElement("button");b.classList.add(flagAdd),b.textContent="+",g.appendChild(b),c.appendChild(s),c.appendChild(f),c.appendChild(d),c.appendChild(p),c.appendChild(y),c.appendChild(h),c.appendChild(v),c.appendChild(g),u.appendChild(c),i.appendChild(u);var m=document.createElement("tbody"),k=yt.getListFromDict(regions);a.forEach((function(e,t){r.addRowSupplierAddress(m,e,k)})),i.appendChild(m);var P=l.getCellFromElement(t),S=P.cloneNode(!1);S.appendChild(i),n.replaceChild(S,P),console.log("tblAddresses: ",i),this.hookupAddressFields()}},{key:"addRowSupplierAddress",value:function(e,t,r){console.log("addRowSupplierAddress: ",t);var n=document.createElement("td");n.classList.add(flagPostcode);var o=document.createElement("textarea");o.classList.add(flagPostcode),l.setElementValuesCurrentAndPrevious(o,t[flagPostcode]),n.appendChild(o);var a=document.createElement("td");a.classList.add(flagAddressLine1);var i=document.createElement("textarea");i.classList.add(flagAddressLine1),l.setElementValuesCurrentAndPrevious(i,t[flagAddressLine1]),a.appendChild(i);var u=document.createElement("td");u.classList.add(flagAddressLine2);var c=document.createElement("textarea");c.classList.add(flagAddressLine2),l.setElementValuesCurrentAndPrevious(c,t[flagAddressLine2]),u.appendChild(c);var s=document.createElement("td");s.classList.add(flagCity);var f=document.createElement("textarea");f.classList.add(flagCity),l.setElementValuesCurrentAndPrevious(f,t[flagCity]),s.appendChild(f);var d=document.createElement("td");d.classList.add(flagCounty);var p=document.createElement("textarea");p.classList.add(flagCounty),l.setElementValuesCurrentAndPrevious(p,t[flagCounty]),d.appendChild(p);var y=t[flagRegion];y||(y=nn({},attrIdRegion,""));var h=document.createElement("td");h.classList.add(flagRegion),l.setElementAttributesValuesCurrentAndPrevious(h,y[attrIdRegion]);var v,g,b=document.createElement("select");b.classList.add(flagRegion),r.forEach((function(e){v=st.getOptionJsonFromObjectJson(e),g=l.createOption(v),b.appendChild(g)})),l.setElementValuesCurrentAndPrevious(b,y[attrIdRegion]),h.appendChild(b);var m=document.createElement("td");m.classList.add(flagActive);var k=document.createElement("input");k.classList.add(flagActive),k.type="checkbox",l.setElementValuesCurrentAndPrevious(k,t[flagActive]),m.appendChild(k);var P=document.createElement("td");P.classList.add(flagDelete);var S=document.createElement("button");S.classList.add(flagDelete),S.textContent="x",P.appendChild(S);var C=document.createElement("tr");C.setAttribute(attrIdSupplierAddress,t[attrIdSupplierAddress]),C.appendChild(n),C.appendChild(a),C.appendChild(u),C.appendChild(s),C.appendChild(d),C.appendChild(h),C.appendChild(m),C.appendChild(P),e.appendChild(C)}},{key:"hookupAddressPostcodeInputs",value:function(){this.hookupChangeHandlerTableCells(idTableMain+" td."+flagAddress+" textarea."+flagPostcode)}},{key:"hookupAddressLine1Inputs",value:function(){this.hookupChangeHandlerTableCells(idTableMain+" td."+flagAddress+" textarea."+flagAddressLine1)}},{key:"hookupAddressLine2Inputs",value:function(){this.hookupChangeHandlerTableCells(idTableMain+" td."+flagAddress+" textarea."+flagAddressLine2)}},{key:"hookupAddressCityInputs",value:function(){this.hookupChangeHandlerTableCells(idTableMain+" td."+flagAddress+" textarea."+flagCity)}},{key:"hookupAddressCountyInputs",value:function(){this.hookupChangeHandlerTableCells(idTableMain+" td."+flagAddress+" textarea."+flagCounty)}},{key:"hookupAddressRegionDdls",value:function(){this.hookupChangeHandlerTableCells(idTableMain+" td."+flagAddress+" select."+flagRegion)}},{key:"hookupAddressActiveCheckboxes",value:function(){this.hookupChangeHandlerTableCells(idTableMain+" td."+flagAddress+" input."+flagActive,(function(e,t){var r=t.closest("tr"),n=r.getAttribute(attrIdSupplierAddress);l.setElementAttributeValueCurrent(r,n);var o=r.closest(idTableMain+" > tbody > tr").querySelectorAll("td."+flagAddress+" input."+flagActive);t.checked&&o.forEach((function(e){e!=t&&l.setElementValueCurrent(e,!1)}))}))}},{key:"hookupAddressDeleteButtons",value:function(){var e=this;this.hookupEventHandler("click",idTableMain+" td."+flagAddress+" button."+flagDelete,(function(t,r){l.getRowFromElement(r).classList.add(flagDelete);var n=document.createElement("button");n.classList.add(flagAdd),n.textContent="+",r.replaceWith(n),e.hookupAddressUndeleteButtons()}))}},{key:"hookupAddressUndeleteButtons",value:function(){var e=this;this.hookupEventHandler("click",idTableMain+" td."+flagAddress+" td button."+flagAdd,(function(t,r){l.getRowFromElement(r).classList.remove(flagDelete);var n=document.createElement("button");n.classList.add(flagDelete),n.textContent="x",r.replaceWith(n),e.hookupAddressDeleteButtons()}))}},{key:"hookupAddressAddButtons",value:function(){var e=this;this.hookupEventHandler("click",idTableMain+" td."+flagAddress+" th button."+flagAdd,(function(t,r){var n=r.closest(idTableMain+" > tbody > tr"),o=n.getAttribute(attrIdSupplier),a=n.querySelectorAll("td."+flagAddress+" input."+flagActive+":checked").length>0,i=n.querySelectorAll("td."+flagAddress+" td."+flagAddress).length,u=nn(nn(nn(nn(nn(nn(nn(nn(nn({},attrIdSupplier,o),attrIdSupplierAddress,-1-i),flagPostcode,""),flagAddressLine1,""),flagAddressLine2,""),flagCity,""),flagCounty,""),attrIdRegion,""),flagActive,!a),c=n.querySelector("td."+flagAddress+" table tbody");if(e.addRowSupplierAddress(c,u,yt.getListFromDict(regions)),!a){var s=n.querySelector("td."+flagAddress);l.setElementAttributeValueCurrent(s,u[attrIdSupplierAddress])}e.hookupAddressFields()}))}},{key:"hookupPhoneNumberInputs",value:function(){this.hookupChangeHandlerTableCells(idTableMain+" td."+flagPhoneNumber+" textarea")}},{key:"hookupFaxInputs",value:function(){this.hookupChangeHandlerTableCells(idTableMain+" td."+flagFax+" textarea")}},{key:"hookupEmailInputs",value:function(){this.hookupChangeHandlerTableCells(idTableMain+" td."+flagEmail+" textarea")}},{key:"hookupWebsiteInputs",value:function(){this.hookupChangeHandlerTableCells(idTableMain+" td."+flagWebsite+" textarea")}},{key:"hookupActiveCheckboxes",value:function(){this.hookupChangeHandlerTableCells(idTableMain+" td."+flagActive+" input")}},{key:"leave",value:function(){Zr(t,"leave",this,3)([])}}])}(It);function un(e){return un="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},un(e)}function ln(e,t){for(var r=0;r0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageHome,e)},this.routes[hashPageContact]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageContact,e)},this.routes[hashPageServices]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageServices,e)},this.routes[hashPageAdminHome]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageAdminHome,e)},this.routes[hashPageAccessibilityStatement]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageAccessibilityStatement,e)},this.routes[hashPageDataRetentionSchedule]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageDataRetentionSchedule,e)},this.routes[hashPageLicense]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageLicense,e)},this.routes[hashPagePrivacyPolicy]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPagePrivacyPolicy,e)},this.routes[hashPageStoreManufacturingPurchaseOrders]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageStoreManufacturingPurchaseOrders,e)},this.routes[hashPageStoreProductCategories]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageStoreProductCategories,e)},this.routes[hashPageStoreProductPermutations]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageStoreProductPermutations,e)},this.routes[hashPageStoreProducts]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageStoreProducts,e)},this.routes[hashPageStoreStockItems]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageStoreStockItems,e)},this.routes[hashPageStoreSuppliers]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageStoreSuppliers,e)},this.routes[hashPageStoreSupplierPurchaseOrders]=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return t.navigateToHash(hashPageStoreSupplierPurchaseOrders,e)},this.initialize()}),[{key:"loadPage",value:function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.getClassPageFromHash(e);this.currentPage=new n(this),this.currentPage.initialize(r),window.addEventListener("beforeunload",(function(){return t.currentPage.leave()}))}},{key:"getClassPageFromHash",value:function(e){var t=this.pages[e];try{return t.module}catch(t){throw console.log("this.pages: ",this.pages),console.error("Page not found:",e),t}}},{key:"initialize",value:function(){window.addEventListener("popstate",this.handlePopState.bind(this))}},{key:"handlePopState",value:function(e){this.loadPageCurrent()}},{key:"loadPageCurrent",value:function(){var e=l.getHashPageCurrent();this.loadPage(e)}},{key:"navigateToHash",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=C.getUrlFromHash(e,r);history.pushState({data:t,params:r},"",e),C.goToUrl(n,t)}},{key:"navigateToUrl",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;(!(arguments.length>2&&void 0!==arguments[2])||arguments[2])&&history.pushState(t,"",e),e=C.parameteriseUrl(e,t),C.goToUrl(e)}}],[{key:"loadPageBodyFromResponse",value:function(e){console.log(e.data),l.loadPageBody(e.data)}}])}();function Hn(e){return Hn="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},Hn(e)}function Mn(e,t){for(var r=0;r { - overlay.querySelector('button.' + flagClose).addEventListener("click", (event) => { + overlay.querySelector('button.' + flagCancel).addEventListener("click", (event) => { event.stopPropagation(); overlay.css('display', 'none'); }); diff --git a/static/js/pages/base_table.js b/static/js/pages/base_table.js index ae37514a..acfdfbf0 100644 --- a/static/js/pages/base_table.js +++ b/static/js/pages/base_table.js @@ -168,10 +168,10 @@ export default class TableBasePage extends BasePage { .catch(error => console.error('Error:', error)); } getTableRecords(dirtyOnly = false) { - let table = this.getTableMain(); + // let table = this.getTableMain(); let records = []; let record; - table.querySelectorAll('tbody tr').forEach((row) => { + document.querySelectorAll(idTableMain + ' > tbody > tr').forEach((row) => { if (dirtyOnly && !row.classList.contains(flagDirty)) return; record = this.getJsonRow(row); records.push(record); @@ -221,6 +221,8 @@ export default class TableBasePage extends BasePage { row.querySelectorAll('.' + flagInitialised).forEach(function(element) { element.classList.remove(flagInitialised); }); + let countRows = document.querySelectorAll(idTableMain + ' > tbody > tr').length; + row.setAttribute(this.constructor.attrIdRowObject, -1 - countRows); /* Shared nethods let newDisplayOrder = parseInt(tbody.querySelector('tr:last-child').querySelector('td.' + flagDisplayOrder + ' .' + flagSlider).getAttribute(attrValueCurrent)) + 1; let slider = tbody.querySelector('tr:last-child').querySelector('td.' + flagDisplayOrder + ' .' + flagSlider); @@ -285,19 +287,19 @@ export default class TableBasePage extends BasePage { input.addEventListener("change", (event) => { handler(event, input); }); - this.handleChangeElementCellTable(null, input); + handler(null, input); }); // this.hookupEventHandler("change", inputSelector, handler); } handleChangeElementCellTable(event, element) { let row = DOM.getRowFromElement(element); let td = DOM.getCellFromElement(element); - let wasDirtyRow = DOM.hasDirtyChildrenContainer(row); + let wasDirtyRow = DOM.hasDirtyChildrenNotDeletedContainer(row); let wasDirtyElement = element.classList.contains(flagDirty); let isDirtyElement = DOM.updateAndCheckIsElementDirty(element); if (isDirtyElement != wasDirtyElement) { DOM.handleDirtyElement(td, isDirtyElement); - let isNowDirtyRow = DOM.hasDirtyChildrenContainer(row); + let isNowDirtyRow = DOM.hasDirtyChildrenNotDeletedContainer(row); if (isNowDirtyRow != wasDirtyRow) { DOM.handleDirtyElement(row, isNowDirtyRow); let rows = this.getTableRecords(true); @@ -419,7 +421,7 @@ export default class TableBasePage extends BasePage { let row = DOM.getRowFromElement(ddl); let td = DOM.getCellFromElement(ddl); console.log("td: ", td); - let wasDirtyRow = DOM.hasDirtyChildrenContainer(row); + let wasDirtyRow = DOM.hasDirtyChildrenNotDeletedContainer(row); let wasDirtyElement = ddl.classList.contains(flagDirty); let isDirtyElement = DOM.updateAndCheckIsElementDirty(ddl); console.log("isDirtyElement: ", isDirtyElement); @@ -428,7 +430,7 @@ export default class TableBasePage extends BasePage { DOM.handleDirtyElement(td, isDirtyElement); let optionSelected = ddl.options[ddl.selectedIndex]; DOM.setElementAttributeValueCurrent(td, optionSelected.value); - let isNowDirtyRow = DOM.hasDirtyChildrenContainer(row); + let isNowDirtyRow = DOM.hasDirtyChildrenNotDeletedContainer(row); console.log("isNowDirtyRow: ", isNowDirtyRow); console.log("wasDirtyRow: ", wasDirtyRow); if (isNowDirtyRow != wasDirtyRow) { @@ -460,13 +462,16 @@ export default class TableBasePage extends BasePage { let thead = document.createElement("thead"); let tr = document.createElement("tr"); let thVariationType = document.createElement("th"); + thVariationType.classList.add(flagProductVariationType); thVariationType.textContent = 'Type'; let thNameVariation = document.createElement("th"); + thNameVariation.classList.add(flagProductVariation); thNameVariation.textContent = 'Name'; let buttonAdd = document.createElement("button"); buttonAdd.classList.add(flagAdd); buttonAdd.textContent = '+'; let thAddDelete = document.createElement("th"); + thAddDelete.classList.add(flagAdd); thAddDelete.appendChild(buttonAdd); tr.appendChild(thVariationType); tr.appendChild(thNameVariation); @@ -484,9 +489,10 @@ export default class TableBasePage extends BasePage { }); } tblVariations.appendChild(tbody); - let parent = element.parentElement; - parent.innerHTML = ''; - parent.appendChild(tblVariations); + + let cellParent = element.closest(idTableMain + ' tbody tr td.' + flagProductVariations); + cellParent.innerHTML = ''; + cellParent.appendChild(tblVariations); console.log("tblVariations: ", tblVariations); let selectorButtonAdd = idTableMain + ' td.' + flagProductVariations + ' button.' + flagAdd; this.hookupEventHandler("click", selectorButtonAdd, this.handleClickButtonProductPermutationVariationsAdd); @@ -496,6 +502,9 @@ export default class TableBasePage extends BasePage { toggleColumnCollapsed(flagColumn, isCollapsed) { this.toggleColumnHasClassnameFlag(flagColumn, isCollapsed, flagCollapsed); } + toggleColumnHeaderCollapsed(flagColumn, isCollapsed) { + this.toggleColumnHasClassnameFlag(flagColumn, isCollapsed, flagCollapsed); + } getElementProductVariations(element) { let permutationVariations = element.getAttribute(attrValueCurrent); let objVariations = []; @@ -636,6 +645,10 @@ export default class TableBasePage extends BasePage { return variationPairsString; } + hookupCurrencyFields() { + this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagCurrency, Utils.getListFromDict(currencies)); + } + leave() { if (this.constructor === TableBasePage) { throw new Error("Must implement leave() method."); @@ -653,12 +666,17 @@ export default class TableBasePage extends BasePage { let columnTh = table.querySelector('th.' + columnFlag); let columnThHasFlag = columnTh.classList.contains(classnameFlag); if (isRequiredFlag == columnThHasFlag) return; - let columnTds = table.querySelectorAll('td.' + columnFlag); DOM.toggleElementHasClassnameFlag(columnTh, isRequiredFlag, classnameFlag); + let columnTds = table.querySelectorAll('td.' + columnFlag); columnTds.forEach((columnTd) => { DOM.toggleElementHasClassnameFlag(columnTd, isRequiredFlag, classnameFlag); }); } + toggleColumnHeaderHasClassnameFlag(columnFlag, isRequiredFlag, classnameFlag) { + let table = this.getTableMain(); + let columnTh = table.querySelector('th.' + columnFlag); + DOM.toggleElementHasClassnameFlag(columnTh, isRequiredFlag, classnameFlag); + } } @@ -669,7 +687,9 @@ import DOM from "../dom.js"; export class PageStoreProductCategories extends TableBasePage { static hash = hashPageStoreProductCategories; + static attrIdRowObject = attrIdProductCategory; callFilterTableContent = API.getCategoriesByFilters; + callSaveTableContent = API.saveCategories; constructor() {} initialize() {} diff --git a/static/js/pages/store/manufacturing_purchase_orders.js b/static/js/pages/store/manufacturing_purchase_orders.js new file mode 100644 index 00000000..950253ac --- /dev/null +++ b/static/js/pages/store/manufacturing_purchase_orders.js @@ -0,0 +1,82 @@ + +import API from "../../api.js"; +import BusinessObjects from "../../lib/business_objects.js"; +import DOM from "../../dom.js"; +import Events from "../../lib/events.js"; +import TableBasePage from "../base_table.js"; +import Utils from "../../lib/utils.js"; +import Validation from "../../lib/validation.js"; +import StoreTableMixinPage from "./mixin_table.js"; + +export default class PageStoreSupplierPurchaseOrders extends TableBasePage { + static hash = hashPageStoreSupplierPurchaseOrders; + static attrIdRowObject = attrIdSupplierPurchaseOrder; + callFilterTableContent = API.getSupplierPurchaseOrdersByFilters; + callSaveTableContent = API.saveSupplierPurchaseOrders; + + constructor(router) { + super(router); + this.storeMixin = new StoreTableMixinPage(this); + } + + initialize() { + this.sharedInitialize(); + } + + hookupFilters() { + this.sharedHookupFilters(); + this.hookupFilterActive(); + } + + loadRowTable(rowJson) { + } + getJsonRow(row) { + if (row == null) return; + let tdCurrency = row.querySelector('td.' + flagCurrency); + let inputCostTotalLocalVatExcl = row.querySelector('td.' + flagCostTotalLocalVatExcl + ' input'); + let inputCostTotalLocalVatIncl = row.querySelector('td.' + flagCostTotalLocalVatIncl + ' input'); + let inputPriceTotalLocalVatExcl = row.querySelector('td.' + flagPriceTotalLocalVatExcl + ' input'); + let inputPriceTotalLocalVatIncl = row.querySelector('td.' + flagPriceTotalLocalVatIncl + ' input'); + let tdItems = row.querySelector('td.' + flagItems); + let checkboxActive = row.querySelector('td.' + flagActive + ' textarea'); + + let jsonRow = {}; + jsonRow[attrIdSupplierPurchaseOrder] = row.getAttribute(attrIdSupplierPurchaseOrder); + jsonRow[attrIdCurrency] = DOM.getElementAttributeValueCurrent(tdCurrency); + jsonRow[flagCostTotalLocalVatExcl] = DOM.getElementAttributeValueCurrent(inputCostTotalLocalVatExcl); + jsonRow[flagCostTotalLocalVatIncl] = DOM.getElementAttributeValueCurrent(inputCostTotalLocalVatIncl); + jsonRow[flagPriceTotalLocalVatExcl] = DOM.getElementAttributeValueCurrent(inputPriceTotalLocalVatExcl); + jsonRow[flagPriceTotalLocalVatIncl] = DOM.getElementAttributeValueCurrent(inputPriceTotalLocalVatIncl); + jsonRow[flagItems] = DOM.getElementAttributeValueCurrent(tdItems); + jsonRow[flagActive] = DOM.getElementAttributeValueCurrent(checkboxActive); + return jsonRow; + } + initialiseRowNew(row) { + super.initialiseRowNew(row); + } + + hookupTableMain() { + super.hookupTableMain(); + this.hookupCurrencyFields(); + this.hookupCostInputs(); + this.hookupOrderItemsFields(); + this.hookupActiveCheckboxes(); + } + hookupCostInputs() { + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostTotalLocalVatExcl + ' input'); + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostTotalLocalVatIncl + ' input'); + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagPriceTotalLocalVatExcl + ' input'); + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagPriceTotalLocalVatIncl + ' input'); + } + hookupOrderItemsFields() { + + } + hookupActiveCheckboxes(){ + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagActive + ' input'); + } + + leave() { + super.leave(); + } +} + diff --git a/static/js/pages/store/product_categories.js b/static/js/pages/store/product_categories.js index 9b815828..3261451d 100644 --- a/static/js/pages/store/product_categories.js +++ b/static/js/pages/store/product_categories.js @@ -7,6 +7,7 @@ import StoreTableMixinPage from "./mixin_table.js"; export default class PageStoreProductCategories extends TableBasePage { static hash = hashPageStoreProductCategories; + static attrIdRowObject = attrIdProductCategory; callFilterTableContent = API.getCategoriesByFilters; callSaveTableContent = API.saveCategories; diff --git a/static/js/pages/store/product_permutations.js b/static/js/pages/store/product_permutations.js index aebafd3a..8c6fc0cf 100644 --- a/static/js/pages/store/product_permutations.js +++ b/static/js/pages/store/product_permutations.js @@ -10,6 +10,7 @@ import StoreTableMixinPage from "./mixin_table.js"; export default class PageStoreProductPermutations extends TableBasePage { static hash = hashPageStoreProductPermutations; + static attrIdRowObject = attrIdProductPermutation; callFilterTableContent = API.getProductPermutationsByFilters; callSaveTableContent = API.saveProductPermutations; diff --git a/static/js/pages/store/products.js b/static/js/pages/store/products.js index fb58f739..e5cc5a1d 100644 --- a/static/js/pages/store/products.js +++ b/static/js/pages/store/products.js @@ -8,6 +8,7 @@ import Utils from "../../lib/utils.js"; export default class PageStoreProducts extends TableBasePage { static hash = hashPageStoreProducts; + static attrIdRowObject = attrIdProduct; callFilterTableContent = API.getProductsByFilters; callSaveTableContent = API.saveProducts; diff --git a/static/js/pages/store/stock_items.js b/static/js/pages/store/stock_items.js index 3e2e7468..24c1f09c 100644 --- a/static/js/pages/store/stock_items.js +++ b/static/js/pages/store/stock_items.js @@ -10,6 +10,7 @@ import StoreTableMixinPage from "./mixin_table.js"; export default class PageStoreStockItems extends TableBasePage { static hash = hashPageStoreStockItems; + static attrIdRowObject = attrIdStockItem; callFilterTableContent = API.getStockItemsByFilters; callSaveTableContent = API.saveStockItems; @@ -73,8 +74,8 @@ export default class PageStoreStockItems extends TableBasePage { let tdProduct = row.querySelector('td.' + flagProduct); let tdProductVariations = row.querySelector('td.' + flagProductVariations); let tdCurrencyCost = row.querySelector('td.' + flagCurrencyCost); - let inputCostLocalVatExcl = row.querySelector('td.' + flagCostLocalVatExcl + ' input'); - let inputCostLocalVatIncl = row.querySelector('td.' + flagCostLocalVatIncl + ' input'); + let inputCostLocalVatExcl = row.querySelector('td.' + flagCostUnitLocalVatExcl + ' input'); + let inputCostLocalVatIncl = row.querySelector('td.' + flagCostUnitLocalVatIncl + ' input'); let inputDatePurchased = row.querySelector('td.' + flagDatePurchased + ' input'); let inputDateReceived = row.querySelector('td.' + flagDateReceived + ' input'); let tdStorageLocation = row.querySelector('td.' + flagStorageLocation); @@ -93,8 +94,8 @@ export default class PageStoreStockItems extends TableBasePage { jsonRow[flagProductVariations] = DOM.getElementAttributeValueCurrent(tdProductVariations); jsonRow[flagHasVariations] = jsonRow[flagProductVariations] != ''; jsonRow[flagCurrencyCost] = DOM.getElementAttributeValueCurrent(tdCurrencyCost); - jsonRow[flagCostLocalVatExcl] = DOM.getElementAttributeValueCurrent(inputCostLocalVatExcl); - jsonRow[flagCostLocalVatIncl] = DOM.getElementAttributeValueCurrent(inputCostLocalVatIncl); + jsonRow[flagCostUnitLocalVatExcl] = DOM.getElementAttributeValueCurrent(inputCostLocalVatExcl); + jsonRow[flagCostUnitLocalVatIncl] = DOM.getElementAttributeValueCurrent(inputCostLocalVatIncl); jsonRow[flagDatePurchased] = DOM.getElementAttributeValueCurrent(inputDatePurchased); jsonRow[flagDateReceived] = DOM.getElementAttributeValueCurrent(inputDateReceived); jsonRow[attrIdStorageLocation] = DOM.getElementAttributeValueCurrent(tdStorageLocation); @@ -189,8 +190,8 @@ export default class PageStoreStockItems extends TableBasePage { this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagCurrencyCost, Utils.getListFromDict(currencies)); } hookupCostInputs(){ - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostLocalVatExcl + ' input'); - this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostLocalVatIncl + ' input'); + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostUnitLocalVatExcl + ' input'); + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostUnitLocalVatIncl + ' input'); } hookupOrderDateInputs(){ this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagDatePurchased + ' input'); diff --git a/static/js/pages/store/supplier_purchase_orders.js b/static/js/pages/store/supplier_purchase_orders.js new file mode 100644 index 00000000..fd45b5b2 --- /dev/null +++ b/static/js/pages/store/supplier_purchase_orders.js @@ -0,0 +1,82 @@ + +import API from "../../api.js"; +import BusinessObjects from "../../lib/business_objects.js"; +import DOM from "../../dom.js"; +import Events from "../../lib/events.js"; +import TableBasePage from "../base_table.js"; +import Utils from "../../lib/utils.js"; +import Validation from "../../lib/validation.js"; +import StoreTableMixinPage from "./mixin_table.js"; + +export default class PageStoreSupplierPurchaseOrders extends TableBasePage { + static hash = hashPageStoreSupplierPurchaseOrders; + static attrIdRowObject = attrIdSupplierPurchaseOrder; + callFilterTableContent = API.getSupplierPurchaseOrdersByFilters; + callSaveTableContent = API.saveSupplierPurchaseOrders; + + constructor(router) { + super(router); + this.storeMixin = new StoreTableMixinPage(this); + } + + initialize() { + this.sharedInitialize(); + } + + hookupFilters() { + this.sharedHookupFilters(); + this.hookupFilterActive(); + } + + loadRowTable(rowJson) { + } + getJsonRow(row) { + if (row == null) return; + let tdSupplier = row.querySelector('td.' + flagSupplier); + let tdCurrency = row.querySelector('td.' + flagCurrency); + let inputCostTotalLocalVatExcl = row.querySelector('td.' + flagCostTotalLocalVatExcl + ' input'); + let inputCostTotalLocalVatIncl = row.querySelector('td.' + flagCostTotalLocalVatIncl + ' input'); + let tdItems = row.querySelector('td.' + flagItems); + let checkboxActive = row.querySelector('td.' + flagActive + ' textarea'); + + let jsonRow = {}; + jsonRow[attrIdSupplierPurchaseOrder] = row.getAttribute(attrIdSupplierPurchaseOrder); + jsonRow[attrIdSupplier] = DOM.getElementAttributeValueCurrent(tdSupplier); + jsonRow[attrIdCurrency] = DOM.getElementAttributeValueCurrent(tdCurrency); + jsonRow[flagCostTotalLocalVatExcl] = DOM.getElementAttributeValueCurrent(inputCostTotalLocalVatExcl); + jsonRow[flagCostTotalLocalVatIncl] = DOM.getElementAttributeValueCurrent(inputCostTotalLocalVatIncl); + jsonRow[flagItems] = DOM.getElementAttributeValueCurrent(tdItems); + jsonRow[flagActive] = DOM.getElementAttributeValueCurrent(checkboxActive); + return jsonRow; + } + initialiseRowNew(row) { + super.initialiseRowNew(row); + } + + hookupTableMain() { + super.hookupTableMain(); + this.hookupSupplierFields(); + this.hookupCurrencyFields(); + this.hookupCostInputs(); + this.hookupOrderItemsFields(); + this.hookupActiveCheckboxes(); + } + hookupSupplierFields() { + this.hookupTableCellDdlPreviews(idTableMain + ' td.' + flagSupplier, Utils.getListFromDict(suppliers)); + } + hookupCostInputs() { + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostTotalLocalVatExcl + ' input'); + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagCostTotalLocalVatIncl + ' input'); + } + hookupOrderItemsFields() { + + } + hookupActiveCheckboxes(){ + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagActive + ' input'); + } + + leave() { + super.leave(); + } +} + diff --git a/static/js/pages/store/suppliers.js b/static/js/pages/store/suppliers.js new file mode 100644 index 00000000..80758fce --- /dev/null +++ b/static/js/pages/store/suppliers.js @@ -0,0 +1,388 @@ + +import API from "../../api.js"; +import BusinessObjects from "../../lib/business_objects.js"; +import DOM from "../../dom.js"; +import Events from "../../lib/events.js"; +import TableBasePage from "../base_table.js"; +import Utils from "../../lib/utils.js"; +import Validation from "../../lib/validation.js"; +import StoreTableMixinPage from "./mixin_table.js"; + +export default class PageStoreSuppliers extends TableBasePage { + static hash = hashPageStoreSuppliers; + static attrIdRowObject = attrIdSupplier; + callFilterTableContent = API.getSuppliersByFilters; + callSaveTableContent = API.saveSuppliers; + + constructor(router) { + super(router); + this.storeMixin = new StoreTableMixinPage(this); + } + + initialize() { + this.sharedInitialize(); + } + + hookupFilters() { + this.sharedHookupFilters(); + this.hookupFilterActive(); + } + + loadRowTable(rowJson) { + } + getJsonRow(row) { + if (row == null) return; + let textareaNameCompany = row.querySelector('td.' + flagNameCompany + ' textarea'); + let textareaNameContact = row.querySelector('td.' + flagNameContact + ' textarea'); + let textareaDepartmentContact = row.querySelector('td.' + flagDepartmentContact + ' textarea'); + let tdAddress = row.querySelector('td.' + flagAddress); + let textareaPhoneNumber = row.querySelector('td.' + flagPhoneNumber + ' textarea'); + let textareaFax = row.querySelector('td.' + flagFax + ' textarea'); + let textareaEmail = row.querySelector('td.' + flagEmail + ' textarea'); + let textareaWebsite = row.querySelector('td.' + flagWebsite + ' textarea'); + let tdCurrency = row.querySelector('td.' + flagCurrency); + let checkboxActive = row.querySelector('td.' + flagActive + ' input[type="checkbox"]'); + + let jsonRow = {}; + jsonRow[attrIdSupplier] = row.getAttribute(attrIdSupplier); + jsonRow[flagNameCompany] = DOM.getElementAttributeValueCurrent(textareaNameCompany); + jsonRow[flagNameContact] = DOM.getElementAttributeValueCurrent(textareaNameContact); + jsonRow[flagDepartmentContact] = DOM.getElementAttributeValueCurrent(textareaDepartmentContact); + jsonRow[attrIdSupplierAddress] = DOM.getElementAttributeValueCurrent(tdAddress); + jsonRow[flagSupplierAddress] = this.getSupplierAddressesFromRow(row); + jsonRow[flagPhoneNumber] = DOM.getElementAttributeValueCurrent(textareaPhoneNumber); + jsonRow[flagFax] = DOM.getElementAttributeValueCurrent(textareaFax); + jsonRow[flagEmail] = DOM.getElementAttributeValueCurrent(textareaEmail); + jsonRow[flagWebsite] = DOM.getElementAttributeValueCurrent(textareaWebsite); + jsonRow[attrIdCurrency] = DOM.getElementAttributeValueCurrent(tdCurrency); + jsonRow[flagActive] = DOM.getElementAttributeValueCurrent(checkboxActive); + return jsonRow; + } + getSupplierAddressesFromRow(row) { + let supplierAddresses = []; + let trs = row.querySelectorAll('td.' + flagAddress + ' tr'); + let address, inputPostcode, inputAddressLine1, inputAddressLine2, inputCity, inputCounty, ddlRegion, inputActive; + trs.forEach((tr) => { + inputPostcode = tr.querySelector('td.' + flagPostcode + ' textarea'); + inputAddressLine1 = tr.querySelector('td.' + flagAddressLine1 + ' textarea'); + inputAddressLine2 = tr.querySelector('td.' + flagAddressLine2 + ' textarea'); + inputCity = tr.querySelector('td.' + flagCity + ' textarea'); + inputCounty = tr.querySelector('td.' + flagCounty + ' textarea'); + ddlRegion = tr.querySelector('td.' + flagRegion + ' select'); + inputActive = tr.querySelector('td.' + flagActive + ' input'); + address = { + [attrIdSupplierAddress]: tr.getAttribute(attrIdSupplierAddress), + [flagPostcode]: DOM.getElementAttributeValueCurrent(inputPostcode), + [flagAddressLine1]: DOM.getElementAttributeValueCurrent(inputAddressLine1), + [flagAddressLine2]: DOM.getElementAttributeValueCurrent(inputAddressLine2), + [flagCity]: DOM.getElementAttributeValueCurrent(inputCity), + [flagCounty]: DOM.getElementAttributeValueCurrent(inputCounty), + [attrIdRegion]: DOM.getElementAttributeValueCurrent(ddlRegion), + [flagActive]: DOM.getElementAttributeValueCurrent(inputActive), + }; + supplierAddresses.push(address); + }); + return supplierAddresses; + } + initialiseRowNew(row) { + super.initialiseRowNew(row); + } + + hookupTableMain() { + super.hookupTableMain(); + this.hookupNameCompanyInputs(); + this.hookupNameContactInputs(); + this.hookupDepartmentContactInputs(); + this.hookupAddressFields(); + this.hookupPhoneNumberInputs(); + this.hookupFaxInputs(); + this.hookupEmailInputs(); + this.hookupWebsiteInputs(); + this.hookupCurrencyFields(); + this.hookupActiveCheckboxes(); + } + hookupNameCompanyInputs() { + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagNameCompany + ' textarea'); + } + hookupNameContactInputs() { + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagNameContact + ' textarea'); + } + hookupDepartmentContactInputs() { + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagDepartmentContact + ' textarea'); + } + + hookupAddressFields() { + this.hookupAddressPreviews(); + this.hookupAddressPostcodeInputs(); + this.hookupAddressLine1Inputs(); + this.hookupAddressLine2Inputs(); + this.hookupAddressCityInputs(); + this.hookupAddressCountyInputs(); + this.hookupAddressRegionDdls(); + this.hookupAddressActiveCheckboxes(); + this.hookupAddressDeleteButtons(); + this.hookupAddressUndeleteButtons(); + this.hookupAddressAddButtons(); + } + hookupAddressPreviews() { + this.hookupEventHandler("click", idTableMain + ' td.' + flagAddress, (event, td) => { + if (!td.classList.contains(flagCollapsed)) return; + this.handleClickAddressPreview(event, td); + }); + } + handleClickAddressPreview(event, element) { + console.log("click address preview"); + this.toggleColumnHeaderCollapsed(flagAddress, false); + element.classList.remove(flagCollapsed); + let row = DOM.getRowFromElement(element); + let idSupplier = row.getAttribute(attrIdSupplier); + let supplierAddressList = idSupplier > 0 ? supplierAddresses[idSupplier] : []; + let tblAddresses = document.createElement("table"); + tblAddresses.classList.add(flagAddress); + let thead = document.createElement("thead"); + let tr = document.createElement("tr"); + let thPostcode = document.createElement("th"); + thPostcode.classList.add(flagPostcode); + thPostcode.textContent = 'Postcode'; + let thAddressLine1 = document.createElement("th"); + thAddressLine1.classList.add(flagAddressLine1); + thAddressLine1.textContent = 'Address Line 1'; + let thAddressLine2 = document.createElement("th"); + thAddressLine2.classList.add(flagAddressLine2); + thAddressLine2.textContent = 'Address Line 2'; + let thCity = document.createElement("th"); + thCity.classList.add(flagCity); + thCity.textContent = 'City'; + let thCounty = document.createElement("th"); + thCounty.classList.add(flagCounty); + thCounty.textContent = 'County'; + let thRegion = document.createElement("th"); + thRegion.classList.add(flagRegion); + thRegion.textContent = 'Region'; + let thActive = document.createElement("th"); + thActive.classList.add(flagActive); + thActive.textContent = 'Active'; + let thAddDelete = document.createElement("th"); + thAddDelete.classList.add(flagAdd); + let buttonAdd = document.createElement("button"); + buttonAdd.classList.add(flagAdd); + buttonAdd.textContent = '+'; + thAddDelete.appendChild(buttonAdd); + + tr.appendChild(thPostcode); + tr.appendChild(thAddressLine1); + tr.appendChild(thAddressLine2); + tr.appendChild(thCity); + tr.appendChild(thCounty); + tr.appendChild(thRegion); + tr.appendChild(thActive); + tr.appendChild(thAddDelete); + thead.appendChild(tr); + tblAddresses.appendChild(thead); + + let tbody = document.createElement("tbody"); + let regionOptions = Utils.getListFromDict(regions); + supplierAddressList.forEach((supplierAddress, index) => { + this.addRowSupplierAddress(tbody, supplierAddress, regionOptions); + }); + tblAddresses.appendChild(tbody); + + let cell = DOM.getCellFromElement(element); + let cellNew = cell.cloneNode(false); + cellNew.appendChild(tblAddresses); + row.replaceChild(cellNew, cell); + console.log("tblAddresses: ", tblAddresses); + this.hookupAddressFields(); + } + addRowSupplierAddress(tbody, supplierAddress, regionOptions) { + console.log("addRowSupplierAddress: ", supplierAddress); + let tdPostcode = document.createElement("td"); + tdPostcode.classList.add(flagPostcode); + let textareaPostcode = document.createElement("textarea"); + textareaPostcode.classList.add(flagPostcode); + DOM.setElementValuesCurrentAndPrevious(textareaPostcode, supplierAddress[flagPostcode]); + tdPostcode.appendChild(textareaPostcode); + + let tdAddressLine1 = document.createElement("td"); + tdAddressLine1.classList.add(flagAddressLine1); + let textareaAddressLine1 = document.createElement("textarea"); + textareaAddressLine1.classList.add(flagAddressLine1); + DOM.setElementValuesCurrentAndPrevious(textareaAddressLine1, supplierAddress[flagAddressLine1]); + tdAddressLine1.appendChild(textareaAddressLine1); + + let tdAddressLine2 = document.createElement("td"); + tdAddressLine2.classList.add(flagAddressLine2); + let textareaAddressLine2 = document.createElement("textarea"); + textareaAddressLine2.classList.add(flagAddressLine2); + DOM.setElementValuesCurrentAndPrevious(textareaAddressLine2, supplierAddress[flagAddressLine2]); + tdAddressLine2.appendChild(textareaAddressLine2); + + let tdCity = document.createElement("td"); + tdCity.classList.add(flagCity); + let textareaCity = document.createElement("textarea"); + textareaCity.classList.add(flagCity); + DOM.setElementValuesCurrentAndPrevious(textareaCity, supplierAddress[flagCity]); + tdCity.appendChild(textareaCity); + + let tdCounty = document.createElement("td"); + tdCounty.classList.add(flagCounty); + let textareaCounty = document.createElement("textarea"); + textareaCounty.classList.add(flagCounty); + DOM.setElementValuesCurrentAndPrevious(textareaCounty, supplierAddress[flagCounty]); + tdCounty.appendChild(textareaCounty); + + let region = supplierAddress[flagRegion]; + if (!region) region = {[attrIdRegion]: ''}; + let tdRegion = document.createElement("td"); + tdRegion.classList.add(flagRegion); + DOM.setElementAttributesValuesCurrentAndPrevious(tdRegion, region[attrIdRegion]); + let ddlRegion = document.createElement("select"); + ddlRegion.classList.add(flagRegion); + let optionJson, option; + regionOptions.forEach((regionOption) => { + optionJson = BusinessObjects.getOptionJsonFromObjectJson(regionOption); + option = DOM.createOption(optionJson); + ddlRegion.appendChild(option); + }); + DOM.setElementValuesCurrentAndPrevious(ddlRegion, region[attrIdRegion]); + tdRegion.appendChild(ddlRegion); + + let tdActive = document.createElement("td"); + tdActive.classList.add(flagActive); + let checkboxActive = document.createElement("input"); + checkboxActive.classList.add(flagActive); + checkboxActive.type = 'checkbox'; + DOM.setElementValuesCurrentAndPrevious(checkboxActive, supplierAddress[flagActive]); + tdActive.appendChild(checkboxActive); + + let tdDelete = document.createElement("td"); + tdDelete.classList.add(flagDelete); + let buttonDelete = document.createElement("button"); + buttonDelete.classList.add(flagDelete); + buttonDelete.textContent = 'x'; + tdDelete.appendChild(buttonDelete); + + let tr = document.createElement("tr"); + tr.setAttribute(attrIdSupplierAddress, supplierAddress[attrIdSupplierAddress]); + tr.appendChild(tdPostcode); + tr.appendChild(tdAddressLine1); + tr.appendChild(tdAddressLine2); + tr.appendChild(tdCity); + tr.appendChild(tdCounty); + tr.appendChild(tdRegion); + tr.appendChild(tdActive); + tr.appendChild(tdDelete); + tbody.appendChild(tr); + } + hookupAddressPostcodeInputs() { + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' textarea.' + flagPostcode); + } + hookupAddressLine1Inputs() { + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' textarea.' + flagAddressLine1); + } + hookupAddressLine2Inputs() { + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' textarea.' + flagAddressLine2); + } + hookupAddressCityInputs() { + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' textarea.' + flagCity); + } + hookupAddressCountyInputs() { + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' textarea.' + flagCounty); + } + hookupAddressRegionDdls() { + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' select.' + flagRegion); + } + hookupAddressActiveCheckboxes() { + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagAddress + ' input.' + flagActive, (event, element) => { + let rowSupplierAddress = element.closest('tr'); + let idAddress = rowSupplierAddress.getAttribute(attrIdSupplierAddress); + DOM.setElementAttributeValueCurrent(rowSupplierAddress, idAddress); + let rowSupplier = rowSupplierAddress.closest(idTableMain + ' > tbody > tr'); + let checkboxesActive = rowSupplier.querySelectorAll('td.' + flagAddress + ' input.' + flagActive); + let isActive = element.checked; + if (isActive) { + checkboxesActive.forEach((checkbox) => { + if (checkbox == element) return; + DOM.setElementValueCurrent(checkbox, false); + }); + } + /* + else if (checkboxesActive.length > 0) { + DOM.setElementValueCurrent(checkboxesActive[0], false); + } + */ + }); + } + hookupAddressDeleteButtons() { + this.hookupEventHandler("click", idTableMain + ' td.' + flagAddress + ' button.' + flagDelete, (event, element) => { + let row = DOM.getRowFromElement(element); + row.classList.add(flagDelete); + + let buttonAdd = document.createElement("button"); + buttonAdd.classList.add(flagAdd); + buttonAdd.textContent = '+'; + element.replaceWith(buttonAdd); + this.hookupAddressUndeleteButtons(); + }); + } + hookupAddressUndeleteButtons() { + this.hookupEventHandler("click", idTableMain + ' td.' + flagAddress + ' td button.' + flagAdd, (event, element) => { + let row = DOM.getRowFromElement(element); + row.classList.remove(flagDelete); + + let buttonDelete = document.createElement("button"); + buttonDelete.classList.add(flagDelete); + buttonDelete.textContent = 'x'; + element.replaceWith(buttonDelete); + this.hookupAddressDeleteButtons(); + }); + } + hookupAddressAddButtons() { + this.hookupEventHandler("click", idTableMain + ' td.' + flagAddress + ' th button.' + flagAdd, (event, element) => { + let row = element.closest(idTableMain + ' > tbody > tr'); + let idSupplier = row.getAttribute(attrIdSupplier); + let hasActiveAddress = row.querySelectorAll('td.' + flagAddress + ' input.' + flagActive + ':checked').length > 0; + let countSupplierAddresses = row.querySelectorAll('td.' + flagAddress + ' td.' + flagAddress).length; + let supplierAddress = { + [attrIdSupplier]: idSupplier, + [attrIdSupplierAddress]: -1 - countSupplierAddresses, + [flagPostcode]: '', + [flagAddressLine1]: '', + [flagAddressLine2]: '', + [flagCity]: '', + [flagCounty]: '', + [attrIdRegion]: '', + [flagActive]: !hasActiveAddress, + }; + let tbody = row.querySelector('td.' + flagAddress + ' table tbody'); + this.addRowSupplierAddress(tbody, supplierAddress, Utils.getListFromDict(regions)); + if (!hasActiveAddress) { + let tdAddress = row.querySelector('td.' + flagAddress); + // tdAddress.setAttribute(attrIdSupplierAddress, supplierAddress[attrIdSupplierAddress]); + DOM.setElementAttributeValueCurrent(tdAddress, supplierAddress[attrIdSupplierAddress]); + } + this.hookupAddressFields(); + }); + } + + hookupPhoneNumberInputs() { + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagPhoneNumber + ' textarea'); + } + hookupFaxInputs() { + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagFax + ' textarea'); + } + hookupEmailInputs() { + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagEmail + ' textarea'); + } + hookupWebsiteInputs() { + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagWebsite + ' textarea'); + } + hookupActiveCheckboxes(){ + this.hookupChangeHandlerTableCells(idTableMain + ' td.' + flagActive + ' input'); + } + + leave() { + super.leave(); + } +} + diff --git a/static/js/router.js b/static/js/router.js index 52e69a6d..554161a7 100644 --- a/static/js/router.js +++ b/static/js/router.js @@ -12,12 +12,15 @@ import PageLicense from './pages/legal/license.js'; // Store import PageStoreBasket from './pages/store/basket.js'; import PageStoreHome from './pages/store/home.js'; +import PageStoreManufacturingPurchaseOrders from './pages/store/manufacturing_purchase_orders.js'; import PageStoreProductCategories from './pages/store/product_categories.js'; import PageStoreProductPermutations from './pages/store/product_permutations.js'; // import PageStoreProductPrices from './pages/store/product_prices.js'; import PageStoreProducts from './pages/store/products.js'; // import PageStoreProductVariations from './pages/store/product_variations.js'; import PageStoreStockItems from './pages/store/stock_items.js'; +import PageStoreSuppliers from './pages/store/suppliers.js'; +import PageStoreSupplierPurchaseOrders from './pages/store/supplier_purchase_orders.js'; // User // import PageUserLogin from './pages/user/login.js'; // import PageUserLogout from './pages/user/logout.js'; @@ -77,12 +80,15 @@ export default class Router { this.pages[hashPageLicense] = { name: 'PageLicense', module: PageLicense }; // pathModule: './pages/legal/license.js' }; this.pages[hashPagePrivacyPolicy] = { name: 'PagePrivacyPolicy', module: PagePrivacyPolicy }; // pathModule: './pages/legal/privacy_policy.js' }; // importModule: () => {return import(/* webpackChunkName: "page_privacy_policy" */ './pages/legal/privacy_policy.js'); } // Store + this.pages[hashPageStoreManufacturingPurchaseOrders] = { name: 'PageManufacturingPurchaseOrders', module: PageStoreManufacturingPurchaseOrders }; // pathModule this.pages[hashPageStoreProductCategories] = { name: 'PageStoreProductCategories', module: PageStoreProductCategories }; // pathModule: './pages/store/product_categories.js' }; this.pages[hashPageStoreProductPermutations] = { name: 'PageStoreProductPermutations', module: PageStoreProductPermutations }; // pathModule: './pages/store/product_permutations.js' }; // this.pages[hashPageStoreProductPrices] = { name: 'PageStoreProductPrices', module: PageStoreProductPrices }; // pathModule: './pages/store/product_prices.js' }; this.pages[hashPageStoreProducts] = { name: 'PageStoreProducts', module: PageStoreProducts }; // pathModule: './pages/store/products.js' }; // this.pages[hashPageStoreProductVariations] = { name: 'PageStoreProductVariations', module: PageStoreProductVariations }; // pathModule: './pages/store/product_variations.js' }; this.pages[hashPageStoreStockItems] = { name: 'PageStoreStockItems', module: PageStoreStockItems }; + this.pages[hashPageStoreSuppliers] = { name: 'PageStoreSuppliers', module: PageStoreSuppliers }; + this.pages[hashPageStoreSupplierPurchaseOrders] = { name: 'PageSupplierPurchaseOrders', module: PageStoreSupplierPurchaseOrders }; // User // this.pages[hashPageUserLogin] = { name: 'PageUserLogin', module: PageUserLogin }; // pathModule: './pages/user/login.js' }; // this.pages[hashPageUserLogout] = { name: 'PageUserLogout', module: PageUserLogout }; // pathModule: './pages/user/logout.js' }; @@ -101,12 +107,15 @@ export default class Router { this.routes[hashPageLicense] = (isPopState = false) => this.navigateToHash(hashPageLicense, isPopState); this.routes[hashPagePrivacyPolicy] = (isPopState = false) => this.navigateToHash(hashPagePrivacyPolicy, isPopState); // Store + this.routes[hashPageStoreManufacturingPurchaseOrders] = (isPopState = false) => this.navigateToHash(hashPageStoreManufacturingPurchaseOrders, isPopState); this.routes[hashPageStoreProductCategories] = (isPopState = false) => this.navigateToHash(hashPageStoreProductCategories, isPopState); this.routes[hashPageStoreProductPermutations] = (isPopState = false) => this.navigateToHash(hashPageStoreProductPermutations, isPopState); // this.routes[hashPageStoreProductPrices] = (isPopState = false) => this.navigateToHash(hashPageStoreProductPrices, isPopState); this.routes[hashPageStoreProducts] = (isPopState = false) => this.navigateToHash(hashPageStoreProducts, isPopState); // this.routes[hashPageStoreProductVariations] = (isPopState = false) => this.navigateToHash(hashPageStoreProductVariations, isPopState); this.routes[hashPageStoreStockItems] = (isPopState = false) => this.navigateToHash(hashPageStoreStockItems, isPopState); + this.routes[hashPageStoreSuppliers] = (isPopState = false) => this.navigateToHash(hashPageStoreSuppliers, isPopState); + this.routes[hashPageStoreSupplierPurchaseOrders] = (isPopState = false) => this.navigateToHash(hashPageStoreSupplierPurchaseOrders, isPopState); // User // this.routes[hashPageUserLogin] = (isPopState = false) => this.navigateToHash(hashPageUserLogin, isPopState); // this.routes[hashPageUserLogout] = (isPopState = false) => this.navigateToHash(hashPageUserLogout, isPopState); diff --git a/templates/components/store/_preview_DDL_currency.html b/templates/components/store/_preview_DDL_currency.html index 16f9e005..0db9e407 100644 --- a/templates/components/store/_preview_DDL_currency.html +++ b/templates/components/store/_preview_DDL_currency.html @@ -1,6 +1,6 @@ -{% with _is_blank_row = (is_blank_row or model.currencies | length == 0 or currency is none) %} +{% with _is_blank_row = (is_blank_row or model.currencies | length == 0 or currency is not defined or currency is none) %} {% if not _is_blank_row %}
{{ address.postcode }}
+ {% else %} +
+ {% endif %} +{% endwith %} \ No newline at end of file diff --git a/templates/components/store/_preview_manufacturing_purchase_order_items.html b/templates/components/store/_preview_manufacturing_purchase_order_items.html new file mode 100644 index 00000000..dc80d35f --- /dev/null +++ b/templates/components/store/_preview_manufacturing_purchase_order_items.html @@ -0,0 +1,13 @@ + +{% with _is_blank_row = (is_blank_row or order_items is not defined or order_items is none or is_blank_row is not defined) %} + {% if not _is_blank_row %} + {% set str_items = order_items.to_preview_str() %} +
{{ str_items }}
+ {% else %} +
+ {% endif %} +{% endwith %} \ No newline at end of file diff --git a/templates/components/store/_preview_order_items.html b/templates/components/store/_preview_order_items.html new file mode 100644 index 00000000..dc80d35f --- /dev/null +++ b/templates/components/store/_preview_order_items.html @@ -0,0 +1,13 @@ + +{% with _is_blank_row = (is_blank_row or order_items is not defined or order_items is none or is_blank_row is not defined) %} + {% if not _is_blank_row %} + {% set str_items = order_items.to_preview_str() %} +
{{ str_items }}
+ {% else %} +
+ {% endif %} +{% endwith %} \ No newline at end of file diff --git a/templates/components/store/_preview_product_permutation_variations.html b/templates/components/store/_preview_product_permutation_variations.html index 97f46887..cec0f001 100644 --- a/templates/components/store/_preview_product_permutation_variations.html +++ b/templates/components/store/_preview_product_permutation_variations.html @@ -1,13 +1,5 @@ -{# -{% if variation_tree is not defined %} - {% set is_blank_row = True %} -{% endif %} -{% if is_blank_row is not defined %} - {% set is_blank_row = True %} -{% endif %} -#} -{% with _is_blank_row = (is_blank_row or variation_tree is not defined or variation_tree is none or is_blank_row is not defined or is_blank_row) %} +{% with _is_blank_row = (is_blank_row or variation_tree is not defined or variation_tree is none or is_blank_row is not defined) %} {% if not _is_blank_row %} {% set str_ids_variations = variation_tree.to_variation_id_pairs_str() %} {% set str_variations = variation_tree.to_preview_str() %} diff --git a/templates/components/store/_row_manufacturing_purchase_order.html b/templates/components/store/_row_manufacturing_purchase_order.html new file mode 100644 index 00000000..33100682 --- /dev/null +++ b/templates/components/store/_row_manufacturing_purchase_order.html @@ -0,0 +1,72 @@ + +{% if is_blank_row %} + + + {% include 'components/store/_preview_DDL_currency.html' %} + + + + + + + + + + + + + + + {% include 'components/store/_preview_order_items.html' %} + + + + + +{% else %} + + {% set currency = order.currency %} + + {% include 'components/store/_preview_DDL_currency.html' %} + + + + + + + + + + + + + + {% set order_items = order.order_items %} + {% set json_str_items = jsonify(order_items.to_json_list()) %} + + {# + {% include 'components/store/_preview_manufacturing_purchase_order_items.html' %} + #} + {% include 'components/store/_preview_order_items.html' %} + + + + + +{% endif %} \ No newline at end of file diff --git a/templates/components/store/_row_stock_item.html b/templates/components/store/_row_stock_item.html index 6955da61..8d26c29a 100644 --- a/templates/components/store/_row_stock_item.html +++ b/templates/components/store/_row_stock_item.html @@ -15,11 +15,11 @@ {% include 'components/store/_preview_DDL_currency.html' %} - - + + - - + + @@ -82,15 +82,15 @@ > {% include 'components/store/_preview_DDL_currency.html' %} - - + - - + + + + + + + + + + + + {% include 'components/store/_preview_address.html' %} + + + + + + + + + + + + + + + {% include 'components/store/_preview_DDL_currency.html' %} + + + + + +{% else %} + + + + + + + + + + + {% set address = supplier.get_address_active() %} + + {% include 'components/store/_preview_address.html' %} + + + + + + + + + + + + + + {% set currency = supplier.currency %} + + {% include 'components/store/_preview_DDL_currency.html' %} + + + + + +{% endif %} \ No newline at end of file diff --git a/templates/components/store/_row_supplier_purchase_order.html b/templates/components/store/_row_supplier_purchase_order.html new file mode 100644 index 00000000..cc3d5efa --- /dev/null +++ b/templates/components/store/_row_supplier_purchase_order.html @@ -0,0 +1,64 @@ + +{% if is_blank_row %} + + + + + + {% include 'components/store/_preview_DDL_currency.html' %} + + + + + + + + + {% include 'components/store/_preview_order_items.html' %} + + + + + +{% else %} + + {% set supplier = order.supplier %} + + {% include 'components/store/_preview_DDL_supplier.html' %} + + {% set currency = order.currency %} + + {% include 'components/store/_preview_DDL_currency.html' %} + + + + + + + + {% set order_items = supplier_purchase_order.order_items %} + {% set json_str_items = jsonify(order_items.to_json_list()) %} + + {% include 'components/store/_preview_order_items.html' %} + + + + + +{% endif %} \ No newline at end of file diff --git a/templates/js/sections/store.js b/templates/js/sections/store.js index 0a131ac9..afa7d258 100644 --- a/templates/js/sections/store.js +++ b/templates/js/sections/store.js @@ -1,6 +1,10 @@ var attrFormType = "{{ model.ATTR_FORM_TYPE }}"; +var attrIdCustomer = "{{ model.ATTR_ID_CUSTOMER }}"; +var attrIdCustomerAddress = "{{ model.ATTR_ID_CUSTOMER_ADDRESS }}"; +var attrIdCustomerSalesOrder = "{{ model.ATTR_ID_CUSTOMER_SALES_ORDER }}"; var attrIdDiscount = "{{ model.ATTR_ID_DISCOUNT }}"; +var attrIdManufacturingPurchaseOrder = "{{ model.ATTR_ID_MANUFACTURING_PURCHASE_ORDER }}"; var attrIdPlant = "{{ model.ATTR_ID_PLANT }}"; var attrIdProduct = "{{ model.ATTR_ID_PRODUCT }}"; var attrIdProductCategory = "{{ model.ATTR_ID_PRODUCT_CATEGORY }}"; @@ -10,15 +14,27 @@ var attrIdProductVariation = "{{ model.ATTR_ID_PRODUCT_VARIATION }}"; var attrIdProductVariationType = "{{ model.ATTR_ID_PRODUCT_VARIATION_TYPE }}"; var attrIdStockItem = "{{ model.ATTR_ID_STOCK_ITEM }}"; var attrIdStorageLocation = "{{ model.ATTR_ID_STORAGE_LOCATION }}"; +var attrIdSupplier = "{{ model.ATTR_ID_SUPPLIER }}"; +var attrIdSupplierAddress = "{{ model.ATTR_ID_SUPPLIER_ADDRESS }}"; +var attrIdSupplierPurchaseOrder = "{{ model.ATTR_ID_SUPPLIER_PURCHASE_ORDER }}"; var flagButtonBasketAdd = "{{ model.FLAG_BUTTON_BASKET_ADD }}"; var flagButtonBuyNow = "{{ model.FLAG_BUTTON_BUY_NOW }}"; +{# var flagCostLocal = "{{ model.FLAG_COST_LOCAL }}"; var flagCostLocalVatExcl = "{{ model.FLAG_COST_LOCAL_VAT_EXCL }}"; var flagCostLocalVatIncl = "{{ model.FLAG_COST_LOCAL_VAT_INCL }}"; +#} +var flagCostTotalLocalVatExcl = "{{ model.FLAG_COST_TOTAL_LOCAL_VAT_EXCL }}"; +var flagCostTotalLocalVatIncl = "{{ model.FLAG_COST_TOTAL_LOCAL_VAT_INCL }}"; +var flagCostUnitLocalVatExcl = "{{ model.FLAG_COST_UNIT_LOCAL_VAT_EXCL }}"; +var flagCostUnitLocalVatIncl = "{{ model.FLAG_COST_UNIT_LOCAL_VAT_INCL }}"; var flagCountUnitMeasurementIntervalExpirationUnsealed = "{{ model.FLAG_COUNT_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED }}"; var flagCountUnitMeasurementIntervalRecurrence = "{{ model.FLAG_COUNT_UNIT_MEASUREMENT_INTERVAL_RECURRENCE }}"; var flagCountUnitMeasurementPerQuantityStep = "{{ model.FLAG_COUNT_UNIT_MEASUREMENT_PER_QUANTITY_STEP }}"; var flagCurrencyCost = "{{ model.FLAG_CURRENCY_COST }}"; +var flagCustomer = "{{ model.FLAG_CUSTOMER }}"; +var flagCustomerAddress = "{{ model.FLAG_CUSTOMER_ADDRESS }}"; +var flagCustomerSalesOrder = "{{ model.FLAG_CUSTOMER_SALES_ORDER }}"; var flagDateConsumed = "{{ model.FLAG_DATE_CONSUMED }}"; var flagDateExpiration = "{{ model.FLAG_DATE_EXPIRATION }}"; var flagDatePurchased = "{{ model.FLAG_DATE_PURCHASED }}"; @@ -33,7 +49,9 @@ var flagIsNotEmpty = "{{ model.FLAG_IS_NOT_EMPTY }}"; var flagIsOutOfStock = "{{ model.FLAG_IS_OUT_OF_STOCK }}"; var flagIsSealed = "{{ model.FLAG_IS_SEALED }}"; var flagIsSubscription = "{{ model.FLAG_IS_SUBSCRIPTION }}"; +var flagLatencyDeliveryDays = "{{ model.FLAG_LATENCY_DELIVERY_DAYS }}"; var flagLatencyManufactureDays = "{{ model.FLAG_LATENCY_MANUFACTURE_DAYS }}"; +var flagManufacturingPurchaseOrder = "{{ model.FLAG_MANUFACTURING_PURCHASE_ORDER }}"; var flagNamePluralUnitMeasurementIntervalExpirationUnsealed = "{{ model.FLAG_NAME_PLURAL_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED }}"; var flagNamePluralUnitMeasurementIntervalRecurrence = "{{ model.FLAG_NAME_PLURAL_UNIT_MEASUREMENT_INTERVAL_RECURRENCE }}"; var flagNamePluralUnitMeasurementQuantity = "{{ model.FLAG_NAME_PLURAL_UNIT_MEASUREMENT_QUANTITY }}"; @@ -41,6 +59,14 @@ var flagNameSingularUnitMeasurementIntervalExpirationUnsealed = "{{ model.FLAG_N var flagNameSingularUnitMeasurementIntervalRecurrence = "{{ model.FLAG_NAME_SINGULAR_UNIT_MEASUREMENT_INTERVAL_RECURRENCE }}"; var flagNameSingularUnitMeasurementQuantity = "{{ model.FLAG_NAME_SINGULAR_UNIT_MEASUREMENT_QUANTITY }}"; var flagPlant = "{{ model.FLAG_PLANT }}"; +{# +var flagPriceLocalVatExcl = "{{ model.FLAG_PRICE_LOCAL_VAT_EXCL }}"; +var flagPriceLocalVatIncl = "{{ model.FLAG_PRICE_LOCAL_VAT_INCL }}"; +#} +var flagPriceTotalLocalVatExcl = "{{ model.FLAG_PRICE_TOTAL_LOCAL_VAT_EXCL }}"; +var flagPriceTotalLocalVatIncl = "{{ model.FLAG_PRICE_TOTAL_LOCAL_VAT_INCL }}"; +var flagPriceUnitLocalVatExcl = "{{ model.FLAG_PRICE_UNIT_LOCAL_VAT_EXCL }}"; +var flagPriceUnitLocalVatIncl = "{{ model.FLAG_PRICE_UNIT_LOCAL_VAT_INCL }}"; var flagProduct = "{{ model.FLAG_PRODUCT }}"; var flagProductCategory = "{{ model.FLAG_PRODUCT_CATEGORY }}"; var flagProductPermutation = "{{ model.FLAG_PRODUCT_PERMUTATION }}"; @@ -56,6 +82,9 @@ var flagQuantityStock = "{{ model.FLAG_QUANTITY_STOCK }}"; var flagRegion = "{{ model.FLAG_REGION }}"; var flagStockItem = "{{ model.FLAG_STOCK_ITEM }}"; var flagStorageLocation = "{{ model.FLAG_STORAGE_LOCATION }}"; +var flagSupplier = "{{ model.FLAG_SUPPLIER }}"; +var flagSupplierAddress = "{{ model.FLAG_SUPPLIER_ADDRESS }}"; +var flagSupplierPurchaseOrder = "{{ model.FLAG_SUPPLIER_PURCHASE_ORDER }}"; var flagSymbolCurrencyCost = "{{ model.FLAG_SYMBOL_CURRENCY_COST }}"; var flagSymbolIsSuffixNotPrefixUnitMeasurementIntervalExpirationUnsealed = "{{ model.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED }}"; var flagSymbolIsSuffixNotPrefixUnitMeasurementIntervalRecurrence = "{{ model.FLAG_SYMBOL_IS_SUFFIX_NOT_PREFIX_UNIT_MEASUREMENT_INTERVAL_RECURRENCE }}"; @@ -66,14 +95,22 @@ var flagSymbolUnitMeasurementQuantity = "{{ model.FLAG_SYMBOL_UNIT_MEASUREMENT_Q var flagUnitMeasurementIntervalExpirationUnsealed = "{{ model.FLAG_UNIT_MEASUREMENT_INTERVAL_EXPIRATION_UNSEALED }}"; var flagUnitMeasurementIntervalRecurrence = "{{ model.FLAG_UNIT_MEASUREMENT_INTERVAL_RECURRENCE }}"; var flagUnitMeasurementQuantity = "{{ model.FLAG_UNIT_MEASUREMENT_QUANTITY }}"; +var hashGetStoreCustomerSalesOrder = "{{ model.HASH_GET_STORE_CUSTOMER_SALES_ORDER }}"; +var hashGetStoreManufacturingPurchaseOrder = "{{ model.HASH_GET_STORE_MANUFACTURING_PURCHASE_ORDER }}"; var hashGetStoreProduct = "{{ model.HASH_GET_STORE_PRODUCT }}"; var hashGetStoreProductCategory = "{{ model.HASH_GET_STORE_PRODUCT_CATEGORY }}"; var hashGetStoreProductPermutation = "{{ model.HASH_GET_STORE_PRODUCT_PERMUTATION }}"; var hashGetStoreStockItem = "{{ model.HASH_GET_STORE_STOCK_ITEM }}"; +var hashGetStoreSupplier = "{{ model.HASH_GET_STORE_SUPPLIER }}"; +var hashGetStoreSupplierPurchaseOrder = "{{ model.HASH_GET_STORE_SUPPLIER_PURCHASE_ORDER }}"; +var hashSaveStoreCustomerSalesOrder = "{{ model.HASH_SAVE_STORE_CUSTOMER_SALES_ORDER }}"; +var hashSaveStoreManufacturingPurchaseOrder = "{{ model.HASH_SAVE_STORE_MANUFACTURING_PURCHASE_ORDER }}"; var hashSaveStoreProduct = "{{ model.HASH_SAVE_STORE_PRODUCT }}"; var hashSaveStoreProductCategory = "{{ model.HASH_SAVE_STORE_PRODUCT_CATEGORY }}"; var hashSaveStoreProductPermutation = "{{ model.HASH_SAVE_STORE_PRODUCT_PERMUTATION }}"; var hashSaveStoreStockItem = "{{ model.HASH_SAVE_STORE_STOCK_ITEM }}"; +var hashSaveStoreSupplier = "{{ model.HASH_SAVE_STORE_SUPPLIER }}"; +var hashSaveStoreSupplierPurchaseOrder = "{{ model.HASH_SAVE_STORE_SUPPLIER_PURCHASE_ORDER }}"; var hashStoreBasketAdd = "{{ model.HASH_STORE_BASKET_ADD }}"; var hashStoreBasketDelete = "{{ model.HASH_STORE_BASKET_DELETE }}"; var hashStoreBasketEdit = "{{ model.HASH_STORE_BASKET_EDIT }}"; diff --git a/templates/layouts/layout.html b/templates/layouts/layout.html index df9ef8f8..3eb7514a 100644 --- a/templates/layouts/layout.html +++ b/templates/layouts/layout.html @@ -61,9 +61,13 @@ var flagAccessLevelRequired = "{{ model.FLAG_ACCESS_LEVEL_REQUIRED }}"; var flagActive = "{{ model.FLAG_ACTIVE }}"; var flagAdd = "{{ model.FLAG_ADD }}"; + var flagAddress = "{{ model.FLAG_ADDRESS }}"; + var flagAddressLine1 = "{{ model.FLAG_ADDRESS_LINE_1 }}"; + var flagAddressLine2 = "{{ model.FLAG_ADDRESS_LINE_2 }}"; var flagCallback = "{{ model.FLAG_CALLBACK }}"; var flagCancel = "{{ model.FLAG_CANCEL }}"; var flagCard = "{{ model.FLAG_CARD }}"; + var flagCity = "{{ model.FLAG_CITY }}"; var flagCloseTemporaryElement = "{{ model.FLAG_CLOSE_TEMPORARY_ELEMENT }}"; var flagCode = "{{ model.FLAG_CODE }}"; var flagCollapsed = "{{ model.FLAG_COLLAPSED }}"; @@ -73,6 +77,7 @@ // var flagContactUs = "{{ model.FLAG_CONTACT_US }}"; var flagContainer = "{{ model.FLAG_CONTAINER }}"; var flagContainerInput = "{{ model.FLAG_CONTAINER_INPUT }}"; + var flagCounty = "{{ model.FLAG_COUNTY }}"; var flagCurrency = "{{ model.FLAG_CURRENCY }}"; var flagDelete = "{{ model.FLAG_DELETE }}"; var flagDescription = "{{ model.FLAG_DESCRIPTION }}"; @@ -82,14 +87,18 @@ var flagDisplayOrder = "{{ model.FLAG_DISPLAY_ORDER }}"; var flagDragging = "dragging"; var flagDragOver = "drag-over"; + var flagEdit = "{{ model.FLAG_EDIT }}"; + var flagEmail = "{{ model.FLAG_EMAIL }}"; var flagError = "{{ model.FLAG_ERROR }}"; var flagExpanded = "{{ model.FLAG_EXPANDED }}"; var flagFailure = "{{ model.FLAG_FAILURE }}"; + var flagFax = "{{ model.FLAG_FAX }}"; var flagFilter = "{{ model.FLAG_FILTER }}"; var flagForm = "{{ model.FLAG_FORM }}"; var flagFormFilters = "{{ model.FLAG_FORM_FILTERS }}"; var flagImageLogo = "{{ model.FLAG_IMAGE_LOGO }}"; var flagInitialised = "{{ model.FLAG_INITIALISED }}"; + var flagItems = "{{ model.FLAG_ITEMS }}"; // var flagKeyPrimary = "{{ model.FLAG_KEY_PRIMARY }}"; var flagMessage = "{{ model.FLAG_MESSAGE }}"; var flagModal = "{{ model.FLAG_MODAL }}"; @@ -104,12 +113,15 @@ var flagNavHome = "{{ model.FLAG_NAV_HOME }}"; var flagNavServices = "{{ model.FLAG_NAV_SERVICES }}"; var flagNavStoreHome = "{{ model.FLAG_NAV_STORE_HOME }}"; + var flagNavStoreManufacturingPurchaseOrders = "{{ model.FLAG_NAV_STORE_MANUFACTURING_PURCHASE_ORDERS }}"; var flagNavStoreProducts = "{{ model.FLAG_NAV_STORE_PRODUCTS }}"; var flagNavStoreProductCategories = "{{ model.FLAG_NAV_STORE_PRODUCT_CATEGORIES }}"; var flagNavStoreProductPermutations = "{{ model.FLAG_NAV_STORE_PRODUCT_PERMUTATIONS }}"; var flagNavStoreProductPrices = "{{ model.FLAG_NAV_STORE_PRODUCT_PRICES }}"; var flagNavStoreProductVariations = "{{ model.FLAG_NAV_STORE_PRODUCT_VARIATIONS }}"; var flagNavStoreStockItems = "{{ model.FLAG_NAV_STORE_STOCK_ITEMS }}"; + var flagNavStoreSuppliers = "{{ model.FLAG_NAV_STORE_SUPPLIERS }}"; + var flagNavStoreSupplierPurchaseOrders = "{{ model.FLAG_NAV_STORE_SUPPLIER_PURCHASE_ORDERS }}"; var flagNavUserAccount = "{{ model.FLAG_NAV_USER_ACCOUNT }}"; var flagNavUserAdmin = "{{ model.FLAG_NAV_USER_ADMIN }}"; var flagNavUserLogin = "{{ model.FLAG_NAV_USER_LOGIN }}"; @@ -117,6 +129,8 @@ var flagOverlay = "{{ model.FLAG_OVERLAY }}"; var flagOverlayClose = "{{ model.FLAG_OVERLAY_CLOSE }}"; var flagPageBody = "{{ model.FLAG_PAGE_BODY }}"; + var flagPhoneNumber = "{{ model.FLAG_PHONE_NUMBER }}"; + var flagPostcode = "{{ model.FLAG_POSTCODE }}"; var flagRow = "{{ model.FLAG_ROW }}"; var flagRowNew = "{{ model.FLAG_ROW_NEW }}"; var flagRows = "{{ model.FLAG_ROWS }}"; @@ -128,6 +142,8 @@ var flagSubmitted = "{{ model.FLAG_SUBMITTED }}"; var flagSuccess = "{{ model.FLAG_SUCCESS }}"; var flagTemporaryElement = "{{ model.FLAG_TEMPORARY_ELEMENT }}"; + var flagUser = "{{ model.FLAG_USER }}"; + var flagWebsite = "{{ model.FLAG_WEBSITE }}"; var hashApplyFiltersStoreProductPermutation = "{{ model.HASH_APPLY_FILTERS_STORE_PRODUCT_PERMUTATION }}"; var hashPageAccessibilityReport = "{{ model.HASH_PAGE_ACCESSIBILITY_REPORT }}"; var hashPageAccessibilityStatement = "{{ model.HASH_PAGE_ACCESSIBILITY_STATEMENT }}"; @@ -145,14 +161,17 @@ var hashPageStoreAdminStripeProducts = "{{ model.HASH_PAGE_STORE_ADMIN_STRIPE_PRODUCTS }}"; #} var hashPageStoreBasket = "{{ model.HASH_PAGE_STORE_BASKET }}"; + var hashPageStoreCustomerSalesOrders = "{{ model.HASH_PAGE_STORE_CUSTOMER_SALES_ORDERS }}"; var hashPageStoreHome = "{{ model.HASH_PAGE_STORE_HOME }}"; + var hashPageStoreManufacturingPurchaseOrders = "{{ model.HASH_PAGE_STORE_MANUFACTURING_PURCHASE_ORDERS }}"; var hashPageStoreProductCategories = "{{ model.HASH_PAGE_STORE_PRODUCT_CATEGORIES }}"; var hashPageStoreProducts = "{{ model.HASH_PAGE_STORE_PRODUCTS }}"; var hashPageStoreProductPermutations = "{{ model.HASH_PAGE_STORE_PRODUCT_PERMUTATIONS }}"; var hashPageStoreProductPrices = "{{ model.HASH_PAGE_STORE_PRODUCT_PRICES }}"; var hashPageStoreProductVariations = "{{ model.HASH_PAGE_STORE_PRODUCT_VARIATIONS }}"; var hashPageStoreStockItems = "{{ model.HASH_PAGE_STORE_STOCK_ITEMS }}"; - var hashPageSuppliers = "{{ model.HASH_PAGE_SUPPLIERS }}"; + var hashPageStoreSuppliers = "{{ model.HASH_PAGE_STORE_SUPPLIERS }}"; + var hashPageStoreSupplierPurchaseOrders = "{{ model.HASH_PAGE_STORE_SUPPLIER_PURCHASE_ORDERS }}"; var hashPageUserAccount = "{{ model.HASH_PAGE_USER_ACCOUNT }}"; var hashPageUserAdmin = "{{ model.HASH_PAGE_USER_ADMIN }}"; var hashPageUserLogin = "{{ model.HASH_PAGE_USER_LOGIN }}"; diff --git a/templates/pages/core/_admin_home.html b/templates/pages/core/_admin_home.html index 1908562c..d6e110f7 100644 --- a/templates/pages/core/_admin_home.html +++ b/templates/pages/core/_admin_home.html @@ -37,6 +37,16 @@
+
+ +
+
+ +
+
+ +
+ + {{ model.form_filters.hidden_tag() }} +
+
+ {{ model.form_filters.active.label }} + {{ model.form_filters.active() }} + {% for error in model.form_filters.active.errors %} +

{{ error }}

+ {% endfor %} +
+
+
+
+ {{ model.form_filters.date_from.label }} + {{ model.form_filters.date_from() }} + {% for error in model.form_filters.date_from.errors %} +

{{ error }}

+ {% endfor %} +
+
+
+
+ {{ model.form_filters.date_to.label }} + {{ model.form_filters.date_to() }} + {% for error in model.form_filters.date_to.errors %} +

{{ error }}

+ {% endfor %} +
+
+ + {% set block_id = 'buttons_table_default' %} + {% include 'components/common/buttons/_buttons_save_cancel.html' %} + + + + + + + + + + + + + + + + + {% set is_blank_row = False %} + {% for manufacturing_purchase_order in model.manufacturing_purchase_orders %} + {% include 'components/store/_row_manufacturing_purchase_order.html' %} + {% endfor %} + + {% set is_blank_row = True %} + {% include 'components/store/_row_manufacturing_purchase_order.html' %} + +
CurrencyCost Total VAT Excl.Cost Total VAT Incl.Price Total VAT Excl.Price Total VAT Incl.ItemsActive
+ + {% include 'components/common/temporary/_overlay_confirm.html' %} + {% include 'components/common/temporary/_overlay_error.html' %} + + + + +{% endblock %} \ No newline at end of file diff --git a/templates/pages/store/_stock_items.html b/templates/pages/store/_stock_items.html index 9af47827..017fbb9f 100644 --- a/templates/pages/store/_stock_items.html +++ b/templates/pages/store/_stock_items.html @@ -56,19 +56,8 @@ {% endfor %} - {% set block_id = 'buttons_table_default' %} {% include 'components/common/buttons/_buttons_save_cancel.html' %} - @@ -77,8 +66,8 @@ - - + + diff --git a/templates/pages/store/_supplier_purchase_orders.html b/templates/pages/store/_supplier_purchase_orders.html new file mode 100644 index 00000000..0ccaa192 --- /dev/null +++ b/templates/pages/store/_supplier_purchase_orders.html @@ -0,0 +1,73 @@ +{% extends 'layouts/layout.html' %} + +{% block page_body %} + + + + {{ model.form_filters.hidden_tag() }} +
+
+ {{ model.form_filters.active.label }} + {{ model.form_filters.active() }} + {% for error in model.form_filters.active.errors %} +

{{ error }}

+ {% endfor %} +
+
+
+
+ {{ model.form_filters.date_from.label }} + {{ model.form_filters.date_from() }} + {% for error in model.form_filters.date_from.errors %} +

{{ error }}

+ {% endfor %} +
+
+
+
+ {{ model.form_filters.date_to.label }} + {{ model.form_filters.date_to() }} + {% for error in model.form_filters.date_to.errors %} +

{{ error }}

+ {% endfor %} +
+
+ + {% set block_id = 'buttons_table_default' %} + {% include 'components/common/buttons/_buttons_save_cancel.html' %} + + + +
Product Variations CurrencyCost Local (VAT excl.)Cost Local (VAT incl.)Cost Local (VAT excl.)Cost Local (VAT incl.) Date Purchased Date Received Storage Location
+ + + + + + + + + + + + {% set is_blank_row = False %} + {% for order in model.supplier_purchase_orders %} + {% include 'components/store/_row_supplier_purchase_order.html' %} + {% endfor %} + + {% set is_blank_row = True %} + {% include 'components/store/_row_supplier_purchase_order.html' %} + +
SupplierCurrencyCost Total VAT Excl.Cost Total VAT Incl.ItemsActive
+ + {% include 'components/common/temporary/_overlay_confirm.html' %} + {% include 'components/common/temporary/_overlay_error.html' %} + + + + +{% endblock %} \ No newline at end of file diff --git a/templates/pages/store/_suppliers.html b/templates/pages/store/_suppliers.html new file mode 100644 index 00000000..984fe58b --- /dev/null +++ b/templates/pages/store/_suppliers.html @@ -0,0 +1,66 @@ +{% extends 'layouts/layout.html' %} + +{% block page_body %} + + +
+ {{ model.form_filters.hidden_tag() }} +
+
+ {{ model.form_filters.active.label }} + {{ model.form_filters.active() }} + {% for error in model.form_filters.active.errors %} +

{{ error }}

+ {% endfor %} +
+
+ + {% set block_id = 'buttons_table_default' %} + {% include 'components/common/buttons/_buttons_save_cancel.html' %} +
+ + + + + + + + + + + + + + + + + + + {% set is_blank_row = False %} + {% for supplier in model.suppliers %} + {% include 'components/store/_row_supplier.html' %} + {% endfor %} + + {% set is_blank_row = True %} + {% include 'components/store/_row_supplier.html' %} + +
CompanyContact NameContact DepartmentAddressPhone NumberFax NumberEmailWebsiteCurrencyActive
+ + {% include 'components/common/temporary/_overlay_confirm.html' %} + {% include 'components/common/temporary/_overlay_error.html' %} + + + + +{% endblock %} \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index 94d920e2..96385f44 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -27,22 +27,18 @@ module.exports = { ], // Core core_home: [ - // path.resolve(__dirname, 'static/js/pages/core/home.js'), path.resolve(__dirname, 'static/css/sections/core.css'), path.resolve(__dirname, 'static/css/pages/core/home.css') ], core_contact: [ - // path.resolve(__dirname, 'static/js/pages/core/contact.js'), path.resolve(__dirname, 'static/css/sections/core.css'), path.resolve(__dirname, 'static/css/pages/core/contact.css') ], core_services: [ - // path.resolve(__dirname, 'static/js/pages/core/services.js'), path.resolve(__dirname, 'static/css/sections/core.css'), path.resolve(__dirname, 'static/css/pages/core/services.css') ], core_admin_home: [ - // path.resolve(__dirname, 'static/js/pages/core/admin_home.js'), path.resolve(__dirname, 'static/css/sections/core.css'), path.resolve(__dirname, 'static/css/pages/core/admin_home.css') ], @@ -55,52 +51,54 @@ module.exports = { ], */ legal_accessibility_statement: [ - // path.resolve(__dirname, 'static/js/pages/legal/accessibility_statement.js'), path.resolve(__dirname, 'static/css/sections/legal.css'), path.resolve(__dirname, 'static/css/pages/legal/accessibility_statement.css') ], legal_retention_schedule: [ - // path.resolve(__dirname, 'static/js/pages/legal/retention_schedule.js'), path.resolve(__dirname, 'static/css/sections/legal.css'), path.resolve(__dirname, 'static/css/pages/legal/retention_schedule.css') ], legal_license: [ - // path.resolve(__dirname, 'static/js/pages/legal/license.js'), path.resolve(__dirname, 'static/css/sections/legal.css'), path.resolve(__dirname, 'static/css/pages/legal/license.css') ], legal_privacy_policy: [ - // path.resolve(__dirname, 'static/js/pages/legal/privacy_policy.js'), path.resolve(__dirname, 'static/css/sections/legal.css'), path.resolve(__dirname, 'static/css/pages/legal/privacy_policy.css') ], // Store store_home: [ - // path.resolve(__dirname, 'static/js/pages/store/home.js'), path.resolve(__dirname, 'static/css/sections/store.css'), path.resolve(__dirname, 'static/css/pages/store/home.css') ], store_products: [ - // path.resolve(__dirname, 'static/js/pages/store/product_categories.js'), path.resolve(__dirname, 'static/css/sections/store.css'), path.resolve(__dirname, 'static/css/pages/store/products.css') ], store_product_categories: [ - // path.resolve(__dirname, 'static/js/pages/store/product_categories.js'), path.resolve(__dirname, 'static/css/sections/store.css'), path.resolve(__dirname, 'static/css/pages/store/product_categories.css') ], store_product_permutations: [ - // path.resolve(__dirname, 'static/js/pages/store/product_permutations.js'), - // path.resolve(__dirname, 'templates/js/sections/store.js'), // templates don't work path.resolve(__dirname, 'static/css/sections/store.css'), path.resolve(__dirname, 'static/css/pages/store/product_permutations.css') ], store_stock_items: [ - // path.resolve(__dirname, 'static/js/pages/store/stock_items.js'), path.resolve(__dirname, 'static/css/sections/store.css'), path.resolve(__dirname, 'static/css/pages/store/stock_items.css') ], + store_suppliers: [ + path.resolve(__dirname, 'static/css/sections/store.css'), + path.resolve(__dirname, 'static/css/pages/store/supplier.css') + ], + store_supplier_purchase_orders: [ + path.resolve(__dirname, 'static/css/sections/store.css'), + path.resolve(__dirname, 'static/css/pages/store/supplier_purchase_order.css') + ], + store_manufacturing_purchase_orders: [ + path.resolve(__dirname, 'static/css/sections/store.css'), + path.resolve(__dirname, 'static/css/pages/store/manufacturing_purchase_order.css') + ], }, output: { filename: 'js/[name].bundle.js',