From e01b31ab9a72c4f6b562ca081cc37a56aa03e78a Mon Sep 17 00:00:00 2001 From: Jadowyne Ulve Date: Wed, 6 Aug 2025 15:04:18 -0500 Subject: [PATCH] Updated Transaction SCanner to utilize a barcodes table instead of linked lists. --- .gitignore | 3 +- .../database_payloads.cpython-313.pyc | Bin 27125 -> 27723 bytes .../__pycache__/postsqldb.cpython-313.pyc | Bin 102308 -> 102652 bytes .../administration/sql/CREATE/barcodes.sql | 6 +++ .../administration/sql/CREATE/item.sql | 3 +- .../administration/sql/CREATE/logins.sql | 2 + .../administration/sql/DROP/barcodes.sql | 1 + application/database_payloads.py | 15 +++++++ application/items/sql/selectItemByBarcode.sql | 4 ++ .../poe/__pycache__/poe_api.cpython-313.pyc | Bin 4565 -> 4649 bytes .../__pycache__/poe_database.cpython-313.pyc | Bin 19798 -> 21216 bytes application/poe/poe_api.py | 5 ++- application/poe/poe_database.py | 31 ++++++++++++++ application/poe/sql/getItemAllByBarcode.sql | 4 +- .../poe/sql/scanner/selectItemByBarcode.sql | 39 ++++++++++++++++++ .../poe/static/js/transactionHandler.js | 17 ++++---- application/postsqldb.py | 9 ++++ .../__pycache__/receipts_api.cpython-313.pyc | Bin 19161 -> 19144 bytes application/receipts/receipts_api.py | 1 - .../receipts/static/js/receiptHandler.js | 4 -- logs/database.log | 20 ++++++++- 21 files changed, 145 insertions(+), 19 deletions(-) create mode 100644 application/administration/sql/CREATE/barcodes.sql create mode 100644 application/administration/sql/DROP/barcodes.sql create mode 100644 application/items/sql/selectItemByBarcode.sql create mode 100644 application/poe/sql/scanner/selectItemByBarcode.sql diff --git a/.gitignore b/.gitignore index b14bd21..09fffde 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ static/css/uikit-rtl.css static/css/uikit-rtl.min.css static/css/uikit.css static/css/uikit.min.css -instance/application.cfg.py \ No newline at end of file +instance/application.cfg.py +test.py \ No newline at end of file diff --git a/application/__pycache__/database_payloads.cpython-313.pyc b/application/__pycache__/database_payloads.cpython-313.pyc index 9b6c2c12b81b532cc5f215607a4fb9979d9c5ec1..3ac6fb983307c6b421c1ec00401e6f93a5125b04 100644 GIT binary patch delta 7641 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 diff --git a/application/__pycache__/postsqldb.cpython-313.pyc b/application/__pycache__/postsqldb.cpython-313.pyc index f88743ffefa22158d58e57dd49d110c111fc849a..8c75ecbef4e446180fc0b0469d8b09b6040a6623 100644 GIT binary patch delta 18370 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 J*p)QR`v-pBdvyQ+ delta 594 zcmYk3O=uHA6vt<>n`ScE>1Hve^xL)(jEDL`3zDR^30hHdh;9m&6iP`}j3mu6yFC=8 zR4?`*czB2&dh_H>5f9$Hdk|B-Eb86cLM?i9UTCck=EwWL|9rfed6oG(CH95jM8)Yp zPw#HO5ju-kC?U_td9n@*+Bmam?lvK7kD$nQBQ*;uMhd>OL3#pyvr)Kj#Q74jxt*}% z(;B$S%*Ve_4oQAyEbTchr|w_(op!O+Ds7h5WWCdHf~YH->pqnEBG0RnC)My?!Y(hT zX1dnQ>*WvTo>kfD`^Lo1ohJeg_$KXw)qgg+NJveGn{4FLB&jj%8pDo675~#(PbYdN zI!6h)Wx%vCF<>4QmdLESD@KOYOn6|74bLedM-+nChUduDW+SV~92V!{opB|>q>kdE z0-O}p(Q7KXpoX`suuXpT5oSK#dbsr>y%!sY=i*!>IRKx;AT7N8DPnZx-~Mu5EeN7b z^*CNt7L|}Cg>3Bj02#yTRYbo+V7ML6UzJYXX}Z3|U(4!;z2Te%D4Rq42BwHPaLqO? zzz_3d7N1#St35|%Fe@NVDFm$0?ld-9&ShDJZt`V zf)q$fK}sZ*AQciRh(w|UQAlb*Y9yMMiKP+qgk&C)Mv&$_aOxL6FP4ZlMevsO0nLaR zqFTg{k6|J#DupZ3B6wY|qZr9)>|Y@&gDIyD;zhMU23>Wv@NIzxUMac=Xb3DeI9*-@ zN9`_92va64oM_d;MT;K2jiNI$NV;s!u8G6J;o-slP%zOSi@Jwn5qErK&>as2qtOWK zjzCfc5=Z$NsI@nm)G})GHn+jyr+N;W( znZNW=?%&PHFzUdy-n|_IMjCF8Z5S(7j1?JW<=TEn)X$yBO~kB z+rs(MZoCmqn$nkeHF)Y6?XALItB+f~HvEmJ7;VxTg|}FmwkfzpXDcE`5D+gKJcGq`SvW|gypZZqwsyetQbcGXvM>DD^MpfgHEv1 M1fA_p@fgbf0n66yhX4Qo delta 372 zcmaE`l=0duM!wIyyj%=Gp!%afW3S~zJ_*K66V)~9g@Re67_u0PSc8RvS-~u}VBugk zFpC|?Vu#8K2XlZ~96&KnFpCq&;sUd{fGln>iyO$|0ke33EM72+7s%oRv-p54elUw4 z$Pxgt1d0TJOhK@qU^=6w$i^326*miMd}QGY13Gpi5EmCro~P!zIY^hEl{FH`zqvWh z=sOErERgw)VRN$iTNc&?AX|8IsErUKW7Osh+ZD{L$v_c<&7zJXAQ3I6TxQ0I$unG2 zShIoRew!KH1Xx+~fXv*@V&1{5ti?cP*XF!{Dn>@3$u9$~RX}zZfh;QmSyPk%B0xqK kf%F%FbQTp)_6?HdDg!bZfw(wsa!HWoM&8f7yj%=GAjLi*W9LTR4tqw;$PO4qe`OR@| cdMqMLjE0|?8JMI&gwY2UAol~uxmGS0OM&8f7yj%=G@Q`If#_5f`9rlbXCr`6?WZXCThJF5I75ntbGaQ83i*^E) z6z!h8&q0Rk0FcSX$iPsnGx?#tDBA@?*NZ%^lYiSwZ5DErVrD%Kl;+)R=<LJ%}v}ByMroPTw0dhZZP44%y F1OR4SG5Y`j diff --git a/application/receipts/receipts_api.py b/application/receipts/receipts_api.py index 0c6867d..2d8ccee 100644 --- a/application/receipts/receipts_api.py +++ b/application/receipts/receipts_api.py @@ -263,7 +263,6 @@ def getFile(file_name): @access_api.login_required def getPreview(file_name): path_ = current_app.config['FILES_FOLDER'] + "/receipts/previews" - print(path_) return send_from_directory(path_, file_name) @receipt_api.route('/api/checkAPI', methods=["POST"]) diff --git a/application/receipts/static/js/receiptHandler.js b/application/receipts/static/js/receiptHandler.js index e3b1e05..0d8addf 100644 --- a/application/receipts/static/js/receiptHandler.js +++ b/application/receipts/static/js/receiptHandler.js @@ -215,12 +215,8 @@ async function replenishFilesCards(files) { let card_div = document.createElement('div') card_div.setAttribute('class', 'uk-card uk-card-default uk-card-small') - console.log(files[key]) - let baseStaticUrl = `/receipts/api/getPreview/`; let imgSrc = `${baseStaticUrl}${files[key].preview_image}`; - - console.log(imgSrc) let media_div = document.createElement('div') media_div.setAttribute('class', 'uk-card-media-top') diff --git a/logs/database.log b/logs/database.log index 4b21554..a9f57ba 100644 --- a/logs/database.log +++ b/logs/database.log @@ -1,4 +1,22 @@ 2025-08-03 08:25:07.786121 --- ERROR --- DatabaseError(message=''int' object does not support indexing', payload=1, - sql='SELECT * FROM logins WHERE id=%s;') \ No newline at end of file + sql='SELECT * FROM logins WHERE id=%s;') +2025-08-05 15:17:02.305813 --- ERROR --- DatabaseError(message='column "id" does not existLINE 1: WITH passed_id AS (SELECT id AS passed_id FROM test_barcodes... ^', + payload=('%01231003%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_barcodes WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), info_id AS (SELECT item_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom FROM test_item_info LEFT JOIN units ON test_item_info.uom = units.id WHERE test_item_info.id = (SELECT item_info_id FROM info_id) ), cte_groups AS ( SELECT test_groups.*, test_group_items.uuid, test_group_items.item_type, test_group_items.qty FROM test_groups JOIN test_group_items ON test_groups.id = test_group_items.gr_id WHERE test_group_items.item_id = (SELECT passed_id FROM passed_id) ), cte_shopping_lists AS ( SELECT test_shopping_lists.*, test_shopping_list_items.uuid, test_shopping_list_items.item_type, test_shopping_list_items.qty FROM test_shopping_lists JOIN test_shopping_list_items ON test_shopping_lists.id = test_shopping_list_items.sl_id WHERE test_shopping_list_items.item_id = (SELECT passed_id FROM passed_id) ), cte_itemlinks AS ( SELECT * FROM test_itemlinks WHERE link=(SELECT passed_id FROM passed_id) ), cte_item_locations AS ( SELECT * FROM test_item_locations LEFT JOIN test_locations ON test_locations.id = test_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 test_logistics_info AS li LEFT JOIN test_locations AS pl ON li.primary_location = pl.id LEFT JOIN test_locations AS ail ON li.auto_issue_location = ail.id LEFT JOIN test_zones AS pz ON li.primary_zone = pz.id LEFT JOIN test_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, test_items.*, (SELECT COALESCE(row_to_json(logis), '{}') FROM cte_logistics_info logis) AS logistics_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_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_locationsFROM test_items LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN test_food_info ON test_items.food_info_id = test_food_info.id LEFT JOIN test_brands ON test_items.brand = test_brands.id LEFT JOIN units ON test_item_info.uom = units.id LEFT JOIN cte_groups ON test_items.id = cte_groups.id LEFT JOIN cte_shopping_lists ON test_items.id = cte_shopping_lists.idWHERE test_items.id=(SELECT passed_id FROM passed_id)GROUP BY test_items.id, test_item_info.id, test_food_info.id, test_brands.id;') +2025-08-05 15:19:02.753652 --- ERROR --- DatabaseError(message='tuple index out of range', + payload=('%01231003%',), + sql='WITH item_uuid AS (SELECT item_uuid AS item_uuid FROM test_barcodes WHERE barcode=%s), passed_id As (SELECT id AS passed_id FROM test_items WHERE item_uuid=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), info_id AS (SELECT item_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom FROM test_item_info LEFT JOIN units ON test_item_info.uom = units.id WHERE test_item_info.id = (SELECT item_info_id FROM info_id) ), cte_groups AS ( SELECT test_groups.*, test_group_items.uuid, test_group_items.item_type, test_group_items.qty FROM test_groups JOIN test_group_items ON test_groups.id = test_group_items.gr_id WHERE test_group_items.item_id = (SELECT passed_id FROM passed_id) ), cte_shopping_lists AS ( SELECT test_shopping_lists.*, test_shopping_list_items.uuid, test_shopping_list_items.item_type, test_shopping_list_items.qty FROM test_shopping_lists JOIN test_shopping_list_items ON test_shopping_lists.id = test_shopping_list_items.sl_id WHERE test_shopping_list_items.item_id = (SELECT passed_id FROM passed_id) ), cte_itemlinks AS ( SELECT * FROM test_itemlinks WHERE link=(SELECT passed_id FROM passed_id) ), cte_item_locations AS ( SELECT * FROM test_item_locations LEFT JOIN test_locations ON test_locations.id = test_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 test_logistics_info AS li LEFT JOIN test_locations AS pl ON li.primary_location = pl.id LEFT JOIN test_locations AS ail ON li.auto_issue_location = ail.id LEFT JOIN test_zones AS pz ON li.primary_zone = pz.id LEFT JOIN test_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, test_items.*, (SELECT COALESCE(row_to_json(logis), '{}') FROM cte_logistics_info logis) AS logistics_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_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_locationsFROM test_items LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN test_food_info ON test_items.food_info_id = test_food_info.id LEFT JOIN test_brands ON test_items.brand = test_brands.id LEFT JOIN units ON test_item_info.uom = units.id LEFT JOIN cte_groups ON test_items.id = cte_groups.id LEFT JOIN cte_shopping_lists ON test_items.id = cte_shopping_lists.idWHERE test_items.id=(SELECT passed_id FROM passed_id)GROUP BY test_items.id, test_item_info.id, test_food_info.id, test_brands.id;') +2025-08-05 15:21:40.124158 --- ERROR --- DatabaseError(message='column reference "barcode" is ambiguousLINE 1: ...t_items.item_uuid = test_barcodes.item_uuid WHERE barcode='%... ^', + payload=('%01231003%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_barcodes LEFT JOIN test_items ON test_items.item_uuid = test_barcodes.item_uuid WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), info_id AS (SELECT item_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom FROM test_item_info LEFT JOIN units ON test_item_info.uom = units.id WHERE test_item_info.id = (SELECT item_info_id FROM info_id) ), cte_groups AS ( SELECT test_groups.*, test_group_items.uuid, test_group_items.item_type, test_group_items.qty FROM test_groups JOIN test_group_items ON test_groups.id = test_group_items.gr_id WHERE test_group_items.item_id = (SELECT passed_id FROM passed_id) ), cte_shopping_lists AS ( SELECT test_shopping_lists.*, test_shopping_list_items.uuid, test_shopping_list_items.item_type, test_shopping_list_items.qty FROM test_shopping_lists JOIN test_shopping_list_items ON test_shopping_lists.id = test_shopping_list_items.sl_id WHERE test_shopping_list_items.item_id = (SELECT passed_id FROM passed_id) ), cte_itemlinks AS ( SELECT * FROM test_itemlinks WHERE link=(SELECT passed_id FROM passed_id) ), cte_item_locations AS ( SELECT * FROM test_item_locations LEFT JOIN test_locations ON test_locations.id = test_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 test_logistics_info AS li LEFT JOIN test_locations AS pl ON li.primary_location = pl.id LEFT JOIN test_locations AS ail ON li.auto_issue_location = ail.id LEFT JOIN test_zones AS pz ON li.primary_zone = pz.id LEFT JOIN test_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, test_items.*, (SELECT COALESCE(row_to_json(logis), '{}') FROM cte_logistics_info logis) AS logistics_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_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_locationsFROM test_items LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN test_food_info ON test_items.food_info_id = test_food_info.id LEFT JOIN test_brands ON test_items.brand = test_brands.id LEFT JOIN units ON test_item_info.uom = units.id LEFT JOIN cte_groups ON test_items.id = cte_groups.id LEFT JOIN cte_shopping_lists ON test_items.id = cte_shopping_lists.idWHERE test_items.id=(SELECT passed_id FROM passed_id)GROUP BY test_items.id, test_item_info.id, test_food_info.id, test_brands.id;') +2025-08-05 15:21:59.561578 --- ERROR --- DatabaseError(message='column reference "barcode" is ambiguousLINE 1: ...t_items.item_uuid = test_barcodes.item_uuid WHERE barcode='%... ^', + payload=('%01231003%',), + sql='WITH passed_id AS (SELECT test_items.id AS passed_id FROM test_barcodes LEFT JOIN test_items ON test_items.item_uuid = test_barcodes.item_uuid WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), info_id AS (SELECT item_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom FROM test_item_info LEFT JOIN units ON test_item_info.uom = units.id WHERE test_item_info.id = (SELECT item_info_id FROM info_id) ), cte_groups AS ( SELECT test_groups.*, test_group_items.uuid, test_group_items.item_type, test_group_items.qty FROM test_groups JOIN test_group_items ON test_groups.id = test_group_items.gr_id WHERE test_group_items.item_id = (SELECT passed_id FROM passed_id) ), cte_shopping_lists AS ( SELECT test_shopping_lists.*, test_shopping_list_items.uuid, test_shopping_list_items.item_type, test_shopping_list_items.qty FROM test_shopping_lists JOIN test_shopping_list_items ON test_shopping_lists.id = test_shopping_list_items.sl_id WHERE test_shopping_list_items.item_id = (SELECT passed_id FROM passed_id) ), cte_itemlinks AS ( SELECT * FROM test_itemlinks WHERE link=(SELECT passed_id FROM passed_id) ), cte_item_locations AS ( SELECT * FROM test_item_locations LEFT JOIN test_locations ON test_locations.id = test_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 test_logistics_info AS li LEFT JOIN test_locations AS pl ON li.primary_location = pl.id LEFT JOIN test_locations AS ail ON li.auto_issue_location = ail.id LEFT JOIN test_zones AS pz ON li.primary_zone = pz.id LEFT JOIN test_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, test_items.*, (SELECT COALESCE(row_to_json(logis), '{}') FROM cte_logistics_info logis) AS logistics_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_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_locationsFROM test_items LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN test_food_info ON test_items.food_info_id = test_food_info.id LEFT JOIN test_brands ON test_items.brand = test_brands.id LEFT JOIN units ON test_item_info.uom = units.id LEFT JOIN cte_groups ON test_items.id = cte_groups.id LEFT JOIN cte_shopping_lists ON test_items.id = cte_shopping_lists.idWHERE test_items.id=(SELECT passed_id FROM passed_id)GROUP BY test_items.id, test_item_info.id, test_food_info.id, test_brands.id;') +2025-08-05 15:24:44.958603 --- ERROR --- DatabaseError(message='column reference "barcode" is ambiguousLINE 3: WHERE barcode='%041789001314%'), ^', + payload=('%041789001314%',), + sql='WITH passed_id AS (SELECT test_items.id AS passed_id FROM test_barcodes LEFT JOIN test_items ON test_items.item_uuid = test_barcodes.item_uuid WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), info_id AS (SELECT item_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom FROM test_item_info LEFT JOIN units ON test_item_info.uom = units.id WHERE test_item_info.id = (SELECT item_info_id FROM info_id) ), cte_groups AS ( SELECT test_groups.*, test_group_items.uuid, test_group_items.item_type, test_group_items.qty FROM test_groups JOIN test_group_items ON test_groups.id = test_group_items.gr_id WHERE test_group_items.item_id = (SELECT passed_id FROM passed_id) ), cte_shopping_lists AS ( SELECT test_shopping_lists.*, test_shopping_list_items.uuid, test_shopping_list_items.item_type, test_shopping_list_items.qty FROM test_shopping_lists JOIN test_shopping_list_items ON test_shopping_lists.id = test_shopping_list_items.sl_id WHERE test_shopping_list_items.item_id = (SELECT passed_id FROM passed_id) ), cte_itemlinks AS ( SELECT * FROM test_itemlinks WHERE link=(SELECT passed_id FROM passed_id) ), cte_item_locations AS ( SELECT * FROM test_item_locations LEFT JOIN test_locations ON test_locations.id = test_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 test_logistics_info AS li LEFT JOIN test_locations AS pl ON li.primary_location = pl.id LEFT JOIN test_locations AS ail ON li.auto_issue_location = ail.id LEFT JOIN test_zones AS pz ON li.primary_zone = pz.id LEFT JOIN test_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, test_items.*, (SELECT COALESCE(row_to_json(logis), '{}') FROM cte_logistics_info logis) AS logistics_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_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_locationsFROM test_items LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN test_food_info ON test_items.food_info_id = test_food_info.id LEFT JOIN test_brands ON test_items.brand = test_brands.id LEFT JOIN units ON test_item_info.uom = units.id LEFT JOIN cte_groups ON test_items.id = cte_groups.id LEFT JOIN cte_shopping_lists ON test_items.id = cte_shopping_lists.idWHERE test_items.id=(SELECT passed_id FROM passed_id)GROUP BY test_items.id, test_item_info.id, test_food_info.id, test_brands.id;') +2025-08-05 15:25:24.830194 --- ERROR --- DatabaseError(message='invalid reference to FROM-clause entry for table "test_items"LINE 1: WITH passed_id AS (SELECT test_items.id AS passed_id FROM te... ^HINT: Perhaps you meant to reference the table alias "items".', + payload=('%041789001314%',), + sql='WITH passed_id AS (SELECT test_items.id AS passed_id FROM test_barcodes barcodes LEFT JOIN test_items items ON items.item_uuid = barcodes.item_uuid WHERE barcodes.barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), info_id AS (SELECT item_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom FROM test_item_info LEFT JOIN units ON test_item_info.uom = units.id WHERE test_item_info.id = (SELECT item_info_id FROM info_id) ), cte_groups AS ( SELECT test_groups.*, test_group_items.uuid, test_group_items.item_type, test_group_items.qty FROM test_groups JOIN test_group_items ON test_groups.id = test_group_items.gr_id WHERE test_group_items.item_id = (SELECT passed_id FROM passed_id) ), cte_shopping_lists AS ( SELECT test_shopping_lists.*, test_shopping_list_items.uuid, test_shopping_list_items.item_type, test_shopping_list_items.qty FROM test_shopping_lists JOIN test_shopping_list_items ON test_shopping_lists.id = test_shopping_list_items.sl_id WHERE test_shopping_list_items.item_id = (SELECT passed_id FROM passed_id) ), cte_itemlinks AS ( SELECT * FROM test_itemlinks WHERE link=(SELECT passed_id FROM passed_id) ), cte_item_locations AS ( SELECT * FROM test_item_locations LEFT JOIN test_locations ON test_locations.id = test_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 test_logistics_info AS li LEFT JOIN test_locations AS pl ON li.primary_location = pl.id LEFT JOIN test_locations AS ail ON li.auto_issue_location = ail.id LEFT JOIN test_zones AS pz ON li.primary_zone = pz.id LEFT JOIN test_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, test_items.*, (SELECT COALESCE(row_to_json(logis), '{}') FROM cte_logistics_info logis) AS logistics_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_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_locationsFROM test_items LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN test_food_info ON test_items.food_info_id = test_food_info.id LEFT JOIN test_brands ON test_items.brand = test_brands.id LEFT JOIN units ON test_item_info.uom = units.id LEFT JOIN cte_groups ON test_items.id = cte_groups.id LEFT JOIN cte_shopping_lists ON test_items.id = cte_shopping_lists.idWHERE test_items.id=(SELECT passed_id FROM passed_id)GROUP BY test_items.id, test_item_info.id, test_food_info.id, test_brands.id;') \ No newline at end of file