From ce61b21a9e7c0c185865b18ee711f00149eb9c0b Mon Sep 17 00:00:00 2001 From: Jadowyne Ulve Date: Sat, 9 Aug 2025 11:56:27 -0500 Subject: [PATCH] Fixed Line Resolving in Receipts Module you can now resolve everything by item uuid --- .../items_processes.cpython-313.pyc | Bin 11179 -> 11239 bytes application/items/items_processes.py | 6 +- .../receipts_database.cpython-313.pyc | Bin 31947 -> 34717 bytes .../receipts_processes.cpython-313.pyc | Bin 7920 -> 8017 bytes application/receipts/receipts_database.py | 63 +++++++++++++++ application/receipts/receipts_processes.py | 33 +++++--- application/receipts/sql/GetItemAllByUUID.sql | 75 ++++++++++++++++++ logs/database.log | 5 +- 8 files changed, 168 insertions(+), 14 deletions(-) create mode 100644 application/receipts/sql/GetItemAllByUUID.sql diff --git a/application/items/__pycache__/items_processes.cpython-313.pyc b/application/items/__pycache__/items_processes.cpython-313.pyc index 1a359dcbb74a3b72d2dcc7990d4e1b942ba8eafe..4c88f16c194e7bbb5a37b4b7298b33ac70524420 100644 GIT binary patch delta 1155 zcmYk5PfQb87{KRsN((csZRnq6DbT-2he8Zl*fm*jcL5c&R(G)>fddZApaZ2XU)zni z67{fIVA(A0J8ZldFGh`tm$?{?8gCvvl#^yooYbSbF{?(S?|Y5PO!9l*`~JN7{=B(9 z{&d{^pW7`7>^Zgc?}@eZ?ib|r`47{i&73B*E)X1Rtz)))C~Hrm6MNLeKhDA4F_I1S z+7d!mtgTU@OZeoW5kZ)>MTD>rVQ=QmfEX5Li4rz*&MQQ=8jP~OFjc7-n(1q}Lr9Cc zDY=Og;_UEJ3*D02=zCd}CfU}9sy_3C>zysV<@Ik&ZhE6WG5NA z=vSg?X0q%vg;E(BnF!+yiflP~mWBoydfVTb`UOqX=<4`Y&uay+ochV40eXoC0Cov5 zT{uX+fuF;3D7GNx8Lru&i7l3+Qql(lSdX>=Hd(Q_|@;(`&BduV^KmF%Yz!K2L+7_|eV(nfw>*DwlBGiA|y5L|AM zk70n0(CCqf;V@8C>AlD|P1{UNSrQo{kqAssDLO!I(~;=j-esoSceK_7F*`O4vrGZU z85D=*Q5P#l$tW9z{1h*de`cEAkNVDh_Ja&Y;4C1Fz@{qoRzulX&`V`?p}5Tf?<8ml zeiHA09d2h3d`JX%n`E5bR8C#ep#;1nJ_l?#s0{NEMKOnnAr2rC3`#QqTP%^y9)3dY zAfg?yZ7#U&W3aqK*joJ15p^k7P&G?5@@4oD9k64tNbkl%q=#BDy*Y&n2Vw~EWpIsj zQ}Wy394*9yj(up`PydX^$RG4ZJW7tyYJAj#lZ4_Y+%%Jk!=eKR09kXn;}CHiLisqY zCOb%)zD|aBtTTmWpDP%7#SU58uIwZeG_6GHE;56UE-J4A7_X3w;;YrlEBucB*13mW zx?7#!j&$Lfy!aKA))*|iX3UfU|3!Y0YB}MNyn(<|;@7Uef1#jNa{3;)On0YtwM`Nd bx+FdqaJ@QHTW|Vb@%_tF^!HTEj=>)RV@4K@ delta 1097 zcmYk5OH30{6oz{{LrY(_B5g^r&==seiQ+Sn_*PJ)fDh2%rVO1yhDTe^3d)B+)uU_={r#pV^w7J7KqrY@7JMqS!$tH!jNq2U$`Og1dB%O4wT8ekD zkR|4ex&c+pgi{QX$8u_hI+oKE=%hcY)0yKKk}=gWp%#=PSWb1aq=BmQ15kl+tP76P zZ18x!hUR+2FvDXz)Ud^JjF%MIP$5ZQ1Zx8+3^yPe5lwU{xQlF~sgOjPX;-MG>L9ug zF-TrGjCM1f3`I#By&LL@^f8CEro`&bYK0M1X=nAq1?DW6V)&BFlfwfFB2Q;ynqvsf ze)>DMwPsa_Idy>{7K=e2ZHwJ(JWqv8w!j~Th zPz(8~oH12WS8_116M>>bJp$E}DlM0xjj6gJkCj#>;LJcC!SCflb2SIh$GbtGnc0>H zo0J>9EKjMR1AiZ`I7$os2sT?b7(pZu?T93U6oGSWu>{s+*oWTzh!kQ~18}>I!3rEi zS@D04$y1|6S+NAIV8C8X5O{GV`YTb(+7wEv!8E!Zhy#dn*XZqJBs$IZR=@zcpv!qf zD;9F70JLIS8-1NjkgN1#GEQ>Tn`-xCN1^y1PfaD&EjX|d&|}UwbrMGw?Lq35nl|#O ztt^2$s7rP+4juee}8%tGLGkYw4WyEr>Tuq)S>? zR)p)YgFZ{|VKewWz2iuR#mf?1Lu-b?5*00P0Dgmf)XLT3m0V`v#qzQ1nvvVHe4U&%j@&%Z+!n{g1*WmL_GWtVKxh$ diff --git a/application/items/items_processes.py b/application/items/items_processes.py index 4a66a30..2b78f40 100644 --- a/application/items/items_processes.py +++ b/application/items/items_processes.py @@ -100,12 +100,14 @@ def postNewBlankItem(site_name: str, user_id: int, data: dict, conn=None): database_items.postAddTransaction(site_name, creation_tuple.payload(), conn=conn) + item_uuid = item['item_uuid'] + if self_conn: conn.commit() conn.close() - return False + return False, item_uuid - return conn + return conn, item_uuid def postLinkedItem(site, payload): """ diff --git a/application/receipts/__pycache__/receipts_database.cpython-313.pyc b/application/receipts/__pycache__/receipts_database.cpython-313.pyc index 44772cf4bbcf1a6b811a0c126c14739ecfaee259..f6c88bee37a04ee243085bfd94ef2c6b460daf17 100644 GIT binary patch delta 1926 zcma)+eM}Q~7{~8-?X}W3O6ggyrSzntwt}Jq6&UXYt&YNIi`j&LVnrrW`4!AW1hQq0 zEIP!;M9nsXbIV+|sN4PHvTPH@gk*2{7SSxm%w#6pKj2G@E-`z4r!H>$XP4Y_pWpX+ zxx43n&wc-pd@#(k>%1|)+@MkJ$3CM1(eW+byp79@*G$w{^^n5b_dAk^8ICrk^13J_C%O0x z4pLeRpw?i47ejuy;huzDY1wc+!$5dA<4A|ev?MTi=8{>k*yGhidUK#_odl0fda1ml zqhd!i8VoE-bal`iycJ!9#%G1DxCp;WIq;JQbC_O==DNKt)*bAQZT&m18S~&o%e-{! zzdbaH3Gd;VaKQ;@Aaqa1S!|Q`@-uUGOeDH87#QREl`eHR3wp9`#OHQx6(PjFaiPr{-U_7QzL4(CB87SIogj4|L!X zoy~RR7n|#<&3Dn}JDxRJ7`kMuoix?{IjtdB>rtW@A7)IP6R>H_G8brFTuHPS}NbO*#7V z1ufZ$?;^pThNv)z;v?m^1{)#$P}cN@(pj^ahg+}ysK#v9y@`GYujDkc0Hv&HsYZ1; zVQ))|up6Drlshfr6WuM+DbCY%Fy_yMQw=T{j)}q$hSn>e#%#pck4TG{G2tC0 zvPzjL+D_p93Ma&aIuHvopf1k?!xeKIxT zV^sH=f}wC#eMAn1BDHdFXY+>jv^9=#@`9)IKWZ1Nw|c&KL-|Y5s<6BuE0Hb#^YqE} zRgq|YC>UBP`->tW+!I~#^8IUcFr6yuX&LKHCLC>X!%&Hc?bDZ5Jbj`_&$f;jeFprc(le4KUg`foeiVaYduotRjJ^jRB+n+ z-QuqnPvl*a>PB=oQp6)|Q<8h14o25z2;z|WfdqT&{rQO{SbI;ov9gF8bChRR`ZZ?@ za&d9aZ>U_MKbNOxTx1B$(Tod@K)Pl;T?oukhvr7lm%Q?Jdp{8lVTrwpVT(%;-begg z@oy8g%l9BYX*}J_@Lgtx(ezrHX{sjOwmWq&lg|wMV3c)(vOZAu z26Pls`rL+Nh&bk4;$v9Rw@8;k>d3t^i1pQE&#Z8hqC>6I9A1tG?z79i64f|~cn_VW N_e-)#5&aOe{{mqH6TJWc delta 1043 zcmZ|N%}*0S6aes@cBeq0e3dQiRw6bbq(BT1tV$z#K-0up0&VaEkk(Rx0xe97nj(}0 zC?dw9Lt+eplLrsV!8xdZfCuAOFfmcC9E>3*L@?^b_+~;cM)xrJ&6}4uJM(5Gt$Xzg zRqdEeMhU*kpXvUspd@YbN#@h-VaIT%%9hl;dQA!=B73b~SqOu$kO5>6$^vBxWrMPX zazHskMvze`7nCcM2g(yNflNaApnRbMPyttx6aouHun1HnR17K>GK0)QC7==^1*8aB zKo+4=P^nNEs7y!&sX|&GvhVxC&+W0JjhvBaEFK#j>b(@yu|DLmvTWOHJz8cTDko*+ zqiY=+ja0Ye3y}Ymy{IlhatDz58!T+6W?V++X|(Pr?uOWV_PDMaLm;hH&>Ban!4JV* ziMbpPWYj~yHn~Oe0ov(Qa4)Qx*_iW_jQfEN%zI)>ZyW-iL6Q{vNcX$Sn7<{ZM`2pf zqTY2WI0B3POmnfl82x-&#iJ0Mrkbmq+T8C@lznsO%lHZeR~c@z8E^vloYkIPm(ex) zyEB3(Ah5wkyNVGSr)@(jTWnv~(TM*Itn zUwwpVG<2I63?=Y1BwN_TWo576zjDveneZ|31Dbpe@@XK@M72Q$&%&gEH4bJrVs+P_ z=vYmB5@8BU9=0}S#rPg@n7vIX^5Hok$%Ww*xxqQlhnp}Y@_R@q7#bLf$11!heHCN@ zf<6zq#S_xB&|#&Ak_x^L(|OjKR1sPd#}^wmP6tu_U-itHdOZX2(C~kYZqBH98Hzq+ zXx55MOF%pF*mXXS-Ae7L`p#DV1N`|A{z!L9J0bE~^Y%8_%oSwjlf@$b#G$VpZp F=MQ-?548XQ diff --git a/application/receipts/__pycache__/receipts_processes.cpython-313.pyc b/application/receipts/__pycache__/receipts_processes.cpython-313.pyc index b17dbc0edec95cdf2f91c292ac8ca64ddbdbdf45..63536cd9c192c2d4cf2cebe60065fdbbbcd2d2c4 100644 GIT binary patch delta 1333 zcmb7BO>Em#9QR8c=fjEfVLP$YI!!yeBrQdNGC_(cYQ-3x)=}-vQbv%1>zFnWoa!Y( zbYdFZHVM$sn>56QNeF2Ngf{iC>m)8*(BuxOkwMxHJMAzPu@e_~&uOz1i39KOf6xDq z-^bs3uR06DpRrhkA!q8swT&-xw}cadZ-K*o)&K=OA1G`;5W?W1&FewP2S^)?&Q}@6 zP#A_}Vl+c;!K=h!;yJ$^t;rOQo+_yR1lbDP^D)fkZ$pHnhw%3QKnU+c)Y3Q<%#9D3 zdB{O-$e*eNYysa-O!|d08on!LqsIs_J$a@U#XkfmGJF~6ej>?l$7|6+jbYB@@uDcb zSB*o_^Am@X=STLUmn-}B#}ax1rfJ?z>WBL>-fR#Cy(y(YdaAc!gx~-o2iL&+~GQ%IR*w3hbjXVxzReD&_gg! zGkOG0RybQ6SwWHLQheUp@~kcDNqj3MUla!$Iba}be5x)1r$*67Dn$2aWsWe~lAhEh z;`+Zg%-ZsZo@c2id|VWPjL(V1qdG$te}uvg|6p2A!+$Lue=ipNDbL06m`4Slfz!_e zcoa`cbx_2gNehM>Zg#B?>%CsHfrtl1n zu-7d&+U|9qenlEq$3)G|ZX4mhrSqVH&&%&~>lCJmAIaYth>Axng^4d2$ZV5=Rb#8w zHX5$jv^y5+9;DCqHd_`tL0c2+R(F}mU2L_Mwsd{@byw+FEz9(hr`o2`ZMN->H-PV@ zmvA;y0~!2L=B+moRg5470d-ec+o!B|DY(nh9Uzmo7_^1&BE#+&CWUh&X1mj^w~Q?d zp*Hp@FLD{ulh5OqmFdXmFXgYRjx^g(PxO_szB=B|9J&66lbQX4 z=dzJY!V`fBXLmz$JE6H7jotD|r+o5W`P8qWl_wk%)pq&09i9|!uKdh8{0ja{T?_T| zr7L3&t8KrNeFgaL6!EpOHLM9!+uHa72wWuw9Q>~K1?b?%+J;O`x&Fn~W%Lz!p(`|8 Z#UJD}@D0A4do9=iAhCDakMHIt{{dS4Bjo@9 delta 1229 zcma)4OK1~O6rI<6rtN%^NhXs|^Q&!*sVG4s{fJTPk7~7&*MXGyOKoVY?TBLqKcL_$ z3&p|}sXM`y2x95RO+gWLBbaFyEwKwhH@Xl(5YdhAy*3z&3m?2Y_uX^uJNMpsR_5yt z`I{s)a%8prxIMZUo{HBiNOoIXrG;CpVMS zSft8R7~;X+%{D{K2MPT!*<cxfev-9{-cB{#W{%Yx%BmZmg>Q`RdBbSgLAqu0~JBt+h%u2wi{kJ`N#cPHQbKZo_z1j;>H@cVtUXK$ggg0!i zgExE-2GqT%9qy@_q`84encJypC*~7<&SnQO6>)sbI9nV(d3tngeArCF7u64)zAI=5 zW_@RzMamn27VSZzqKyf2-z1N z!;3%%T83YNBWMW@2D=8{^WLfb7T+{|ae;4L))I?aW?suYoh;*H*8bz=eW%JJXDw~K zBrFSZ>FR>eG+kH_VoRa6`x90uT{^V1HS_ecwY9g@H?3J>{C?CDQ!pc@;dL+x@5F}S zMTfzyzp`qEi&~^krn}!_U>$!Rb;&N>ES~!CoQ>5Bg w@H}!0ornJDsE>9~vF$$EYu+NBd6SwccoU7FyYM->lOIIL{q<5Eq+-p#0fE5tQ~&?~ diff --git a/application/receipts/receipts_database.py b/application/receipts/receipts_database.py index e509527..9b27f26 100644 --- a/application/receipts/receipts_database.py +++ b/application/receipts/receipts_database.py @@ -151,7 +151,39 @@ def getItemAllByBarcode(site, payload, convert=True, conn=None): return item except (Exception, psycopg2.DatabaseError) as error: raise postsqldb.DatabaseError(error, payload, getItemAllByBarcode_sql) + +def getItemAllByUUID(site, payload, convert=True, conn=None): + item = () + self_conn = False + + if not conn: + database_config = config.config() + conn = psycopg2.connect(**database_config) + conn.autocommit = True + self_conn = True + + if convert: + item = {} + + with open(f"application/receipts/sql/getItemAllByUUID.sql", "r+") as file: + getItemAllByUUID_sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(getItemAllByUUID_sql, payload) + rows = cur.fetchone() + if rows and convert: + item = postsqldb.tupleDictionaryFactory(cur.description, rows) + if rows and not convert: + item = rows + + if self_conn: + conn.close() + + return item + except (Exception, psycopg2.DatabaseError) as error: + raise postsqldb.DatabaseError(error, payload, getItemAllByUUID_sql) + def getItemAllByID(site, payload, convert=True, conn=None): item = () self_conn = False @@ -587,6 +619,37 @@ def insertReceiptsTuple(site, payload, convert=True, conn=None): except Exception as error: raise postsqldb.DatabaseError(error, payload, sql) +def insertBarcodesTuple(site: str, payload: list, convert=True, conn=None): + """ payload (tuple): (barcode, item_uuid, in_exchange, out_exchange, descriptor) """ + record = () + self_conn = False + + sql = f"INSERT INTO {site}_barcodes (barcode, item_uuid, in_exchange, out_exchange, descriptor) VALUES (%s, %s, %s, %s, %s) RETURNING *;" + + try: + if not conn: + database_config = config.config() + conn = psycopg2.connect(**database_config) + conn.autocommit = True + self_conn = True + + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + record = postsqldb.tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + record = rows + + if self_conn: + conn.commit() + conn.close() + + return record + + except Exception as error: + raise postsqldb.DatabaseError(error, payload, sql) + def updateItemsTuple(site, payload, convert=True, conn=None): """payload (dict): {'id': row_id, 'update': {... column_to_update: value_to_update_to...}}""" updated = () diff --git a/application/receipts/receipts_processes.py b/application/receipts/receipts_processes.py index 2b2b594..4132e5c 100644 --- a/application/receipts/receipts_processes.py +++ b/application/receipts/receipts_processes.py @@ -107,28 +107,31 @@ def postLine(site, user_id, data, conn=None): conn = psycopg2.connect(**database_config) conn.autocommit = False self_conn = True + transaction_time = datetime.datetime.now() receipt_item = receipts_database.selectReceiptItemsTuple(site, (data['line_id'],), conn=conn) receipt = receipts_database.getReceiptByID(site, (receipt_item['receipt_id'], ), conn=conn) conv_factor = 1.0 + if receipt_item['data']['expires'] is not False: expiration = datetime.datetime.strptime(receipt_item['data']['expires'], "%Y-%m-%d") else: expiration = None - if receipt_item['type'] == 'sku': - linked_item = receipts_database.getLinkedItemByBarcode(site, (receipt_item['barcode'], ), conn=conn) - if len(linked_item) > 1: - conv_factor = linked_item['conv_factor'] - receipt_item['data']['linked_child'] = linked_item['barcode'] - + #if receipt_item['type'] == 'sku': + # linked_item = receipts_database.getLinkedItemByBarcode(site, (receipt_item['barcode'], ), conn=conn) + # if len(linked_item) > 1: + # conv_factor = linked_item['conv_factor'] + # receipt_item['data']['linked_child'] = linked_item['barcode'] + + item_uuid = receipt_item['item_uuid'] if receipt_item['type'] == 'api': new_item_data = { 'barcode': receipt_item['barcode'], 'name': receipt_item['name'], 'subtype': 'FOOD' } - postNewBlankItem(site, user_id, new_item_data, conn=conn) + _, item_uuid = postNewBlankItem(site, user_id, new_item_data, conn=conn) if receipt_item['type'] == "new sku": new_item_data = { @@ -136,14 +139,24 @@ def postLine(site, user_id, data, conn=None): 'name': receipt_item['name'], 'subtype': 'FOOD' } - postNewBlankItem(site, user_id, new_item_data, conn=conn) + _, item_uuid = postNewBlankItem(site, user_id, new_item_data, conn=conn) + barcodes_tuple = database_payloads.BarcodesPayload( + barcode=receipt_item['barcode'], + item_uuid=item_uuid, + in_exchange=1.0, + out_exchange=1.0, + descriptor=receipt_item['name'] + ) + receipts_database.insertBarcodesTuple(site, barcodes_tuple.payload()) - item = receipts_database.getItemAllByBarcode(site, (receipt_item['barcode'], ), conn=conn) + + item = receipts_database.getItemAllByUUID(site, (item_uuid, ), conn=conn) location = receipts_database.selectItemLocationsTuple(site, (item['id'], item['logistics_info']['primary_location']['id']), conn=conn) cost_layers: list = location['cost_layers'] receipt_item['data']['location'] = item['logistics_info']['primary_location']['uuid'] + receipt_item['item_uuid'] = item_uuid transaction = database_payloads.TransactionPayload( timestamp=transaction_time, @@ -182,8 +195,6 @@ def postLine(site, user_id, data, conn=None): receipts_database.updateReceiptItemsTuple(site, {'id': receipt_item['id'], 'update': {'status': "Resolved"}}, conn=conn) - - if self_conn: conn.commit() conn.close() diff --git a/application/receipts/sql/GetItemAllByUUID.sql b/application/receipts/sql/GetItemAllByUUID.sql new file mode 100644 index 0000000..d3c033a --- /dev/null +++ b/application/receipts/sql/GetItemAllByUUID.sql @@ -0,0 +1,75 @@ +WITH passed_id AS (SELECT id AS passed_id FROM %%site_name%%_items WHERE item_uuid=%s), + logistics_id AS (SELECT logistics_info_id FROM %%site_name%%_items WHERE id=(SELECT passed_id FROM passed_id)), + info_id AS (SELECT item_info_id FROM %%site_name%%_items WHERE id=(SELECT passed_id FROM passed_id)), + cte_item_info AS ( + SELECT + %%site_name%%_item_info.*, + row_to_json(units.*) as uom + FROM %%site_name%%_item_info + LEFT JOIN units ON %%site_name%%_item_info.uom = units.id + WHERE %%site_name%%_item_info.id = (SELECT item_info_id FROM info_id) + ), + cte_groups AS ( + SELECT + %%site_name%%_groups.*, + %%site_name%%_group_items.uuid, + %%site_name%%_group_items.item_type, + %%site_name%%_group_items.qty + FROM %%site_name%%_groups + JOIN %%site_name%%_group_items ON %%site_name%%_groups.id = %%site_name%%_group_items.gr_id + WHERE %%site_name%%_group_items.item_id = (SELECT passed_id FROM passed_id) + ), + cte_shopping_lists AS ( + SELECT + %%site_name%%_shopping_lists.*, + %%site_name%%_shopping_list_items.uuid, + %%site_name%%_shopping_list_items.item_type, + %%site_name%%_shopping_list_items.qty + FROM %%site_name%%_shopping_lists + JOIN %%site_name%%_shopping_list_items ON %%site_name%%_shopping_lists.id = %%site_name%%_shopping_list_items.sl_id + WHERE %%site_name%%_shopping_list_items.item_id = (SELECT passed_id FROM passed_id) + ), + cte_itemlinks AS ( + SELECT * FROM %%site_name%%_itemlinks WHERE link=(SELECT passed_id FROM passed_id) + ), + cte_item_locations AS ( + SELECT * FROM %%site_name%%_item_locations + LEFT JOIN %%site_name%%_locations ON %%site_name%%_locations.id = %%site_name%%_item_locations.location_id + WHERE part_id = (SELECT passed_id FROM passed_id) + ), + cte_logistics_info AS ( + SELECT + li.*, + row_to_json(pl) AS primary_location, + row_to_json(ail) AS auto_issue_location, + row_to_json(pz) AS primary_zone, + row_to_json(aiz) AS auto_issue_zone + FROM %%site_name%%_logistics_info AS li + LEFT JOIN %%site_name%%_locations AS pl ON li.primary_location = pl.id + LEFT JOIN %%site_name%%_locations AS ail ON li.auto_issue_location = ail.id + LEFT JOIN %%site_name%%_zones AS pz ON li.primary_zone = pz.id + LEFT JOIN %%site_name%%_zones AS aiz ON li.auto_issue_zone = aiz.id + WHERE li.id=(SELECT logistics_info_id FROM logistics_id) + ) + +SELECT + (SELECT passed_id FROM passed_id) AS passed_id, + %%site_name%%_items.*, + (SELECT COALESCE(row_to_json(logis), '{}') FROM cte_logistics_info logis) AS logistics_info, + row_to_json(%%site_name%%_food_info.*) as food_info, + row_to_json(%%site_name%%_brands.*) as brand, + (SELECT COALESCE(row_to_json(ii), '{}') FROM cte_item_info ii) AS item_info, + (SELECT COALESCE(array_agg(row_to_json(g)), '{}') FROM cte_groups g) AS item_groups, + (SELECT COALESCE(array_agg(row_to_json(sl)), '{}') FROM cte_shopping_lists sl) AS item_shopping_lists, + (SELECT COALESCE(array_agg(row_to_json(il)), '{}') FROM cte_itemlinks il) AS linked_items, + (SELECT COALESCE(array_agg(row_to_json(ils)), '{}') FROM cte_item_locations ils) AS item_locations +FROM %%site_name%%_items + LEFT JOIN %%site_name%%_item_info ON %%site_name%%_items.item_info_id = %%site_name%%_item_info.id + LEFT JOIN %%site_name%%_food_info ON %%site_name%%_items.food_info_id = %%site_name%%_food_info.id + LEFT JOIN %%site_name%%_brands ON %%site_name%%_items.brand = %%site_name%%_brands.id + LEFT JOIN units ON %%site_name%%_item_info.uom = units.id + LEFT JOIN cte_groups ON %%site_name%%_items.id = cte_groups.id + LEFT JOIN cte_shopping_lists ON %%site_name%%_items.id = cte_shopping_lists.id +WHERE %%site_name%%_items.id=(SELECT passed_id FROM passed_id) +GROUP BY + %%site_name%%_items.id, %%site_name%%_item_info.id, %%site_name%%_food_info.id, %%site_name%%_brands.id; \ No newline at end of file diff --git a/logs/database.log b/logs/database.log index c2b3e7e..2989e9d 100644 --- a/logs/database.log +++ b/logs/database.log @@ -46,4 +46,7 @@ sql='UPDATE test_barcodes SET in_exchange = %s, out_exchange = %s, descriptor = %s WHERE barcode=%s RETURNING *;') 2025-08-09 11:07:03.004000 --- ERROR --- DatabaseError(message='not all arguments converted during string formatting', payload=('PLU SKU', 30, None, '8cac7ce9-dfd1-4da8-8856-57f5bdbc752b', 'Bubble Bath Lavender', 1, 1, '{"cost": 0, "expires": false}', 'Unresolved'), - sql='INSERT INTO test_receipt_items(type, receipt_id, barcode, name, qty, uom, data, status) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') \ No newline at end of file + sql='INSERT INTO test_receipt_items(type, receipt_id, barcode, name, qty, uom, data, status) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-08-09 11:52:23.005675 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_barcodes_pkey"DETAIL: Key (barcode)=(%6589%) already exists.', + payload=('%6589%', '7bdc9602-ca87-4e9f-b9ef-fc5e8f0eceb7', 1.0, 1.0, 'Test Item 22'), + sql='INSERT INTO test_barcodes (barcode, item_uuid, in_exchange, out_exchange, descriptor) VALUES (%s, %s, %s, %s, %s) RETURNING *;') \ No newline at end of file