From 4df70ead2491914c1c1126f7b14f6ff75c7ed22f Mon Sep 17 00:00:00 2001 From: Jadowyne Ulve Date: Sun, 13 Apr 2025 08:27:19 -0500 Subject: [PATCH] Mass update! --- MyDataclasses,py | 19 - MyDataclasses.py | 526 +++++ __pycache__/MyDataclasses.cpython-312.pyc | Bin 0 -> 22704 bytes __pycache__/admin.cpython-312.pyc | Bin 8452 -> 8430 bytes __pycache__/api.cpython-312.pyc | Bin 69523 -> 23020 bytes __pycache__/database.cpython-312.pyc | Bin 20502 -> 85584 bytes __pycache__/external_API.cpython-312.pyc | Bin 0 -> 8472 bytes __pycache__/group_api.cpython-312.pyc | Bin 0 -> 2924 bytes __pycache__/item_API.cpython-312.pyc | Bin 0 -> 32107 bytes __pycache__/main.cpython-312.pyc | Bin 42854 -> 44086 bytes __pycache__/postsqldb.cpython-312.pyc | Bin 0 -> 39253 bytes __pycache__/process.cpython-312.pyc | Bin 0 -> 15967 bytes __pycache__/receipts_API.cpython-312.pyc | Bin 0 -> 21758 bytes __pycache__/recipes_api.cpython-312.pyc | Bin 0 -> 15995 bytes __pycache__/shopping_list_API.cpython-312.pyc | Bin 0 -> 12758 bytes __pycache__/user_api.cpython-312.pyc | Bin 6558 -> 7328 bytes admin.py | 2 +- api.py | 831 +------- database.log | 1721 +++++++++++++++++ database.py | 1553 ++++++++++++++- external_API.py | 121 ++ external_devices.py | 232 --- group_api.py | 34 + html_factory.py | 56 - item_API.py | 474 +++++ main.py | 32 +- postsqldb.py | 930 +++++++++ process.log | 421 ++++ process.py | 298 +++ receipts_API.py | 324 ++++ recipes_api.py | 201 ++ scratch.py | 437 ++--- shopping_list_API.py | 186 ++ sites/default/sql/create/item.sql | 3 +- sites/default/sql/create/item_locations.sql | 4 +- sites/default/sql/create/receipt_items.sql | 1 + .../sql/create/shopping_list_items.sql | 20 + sites/default/sql/create/shopping_lists.sql | 7 +- sites/default/sql/drop/brands.sql | 2 +- .../default/sql/drop/shopping_list_items.sql | 1 + sites/main/sql/create/item.sql | 3 +- sites/main/sql/create/item_locations.sql | 4 +- sites/main/sql/create/receipt_items.sql | 1 + sites/main/sql/create/shopping_list_items.sql | 20 + sites/main/sql/create/shopping_lists.sql | 7 +- sites/main/sql/drop/brands.sql | 2 +- sites/main/sql/drop/shopping_list_items.sql | 1 + sql/CREATE/brands.sql | 4 + sql/CREATE/conversions.sql | 7 + sql/CREATE/cost_layers.sql | 9 + sql/CREATE/food_info.sql | 8 + sql/CREATE/group_items.sql | 20 + sql/CREATE/groups.sql | 7 + sql/CREATE/item.sql | 31 + sql/CREATE/item_info.sql | 13 + sql/CREATE/item_locations.sql | 16 + sql/CREATE/linked_items.sql | 8 + sql/CREATE/locations.sql | 10 + sql/CREATE/logins.sql | 23 + sql/CREATE/logistics_info.sql | 21 + sql/CREATE/receipt_items.sql | 15 + sql/CREATE/receipts.sql | 13 + sql/CREATE/recipe_items.sql | 20 + sql/CREATE/recipes.sql | 9 + sql/CREATE/roles.sql | 11 + sql/CREATE/shopping_list_items.sql | 20 + sql/CREATE/shopping_lists.sql | 9 + sql/CREATE/sites.sql | 12 + sql/CREATE/sku_prefix.sql | 7 + sql/CREATE/transactions.sql | 16 + sql/CREATE/units.sql | 10 + sql/CREATE/vendors.sql | 8 + sql/CREATE/zones.sql | 9 + sql/DROP/brands.sql | 1 + sql/DROP/conversions.sql | 1 + sql/DROP/cost_layers.sql | 1 + sql/DROP/food_info.sql | 1 + sql/DROP/group_items.sql | 1 + sql/DROP/groups.sql | 1 + sql/DROP/item_info.sql | 1 + sql/DROP/item_locations.sql | 1 + sql/DROP/items.sql | 1 + sql/DROP/linked_items.sql | 1 + sql/DROP/locations.sql | 1 + sql/DROP/logistics_info.sql | 1 + sql/DROP/receipt_items.sql | 1 + sql/DROP/receipts.sql | 1 + sql/DROP/recipe_items.sql | 1 + sql/DROP/recipes.sql | 1 + sql/DROP/shopping_list_items.sql | 1 + sql/DROP/shopping_lists.sql | 1 + sql/DROP/sku_prefix.sql | 1 + sql/DROP/transactions.sql | 1 + sql/DROP/units.sql | 1 + sql/DROP/vendors.sql | 1 + sql/DROP/zones.sql | 1 + sql/INSERT/insertConversionsTuple.sql | 4 + sql/INSERT/insertFoodInfoTuple.sql | 4 +- sql/INSERT/insertGroupItemsTuple.sql | 4 + sql/INSERT/insertGroupsTuple.sql | 4 +- sql/INSERT/insertItemInfoTuple.sql | 5 +- sql/INSERT/insertItemLinksTuple.sql | 4 + sql/INSERT/insertLocationsTuple.sql | 4 + sql/INSERT/insertLoginsTuple.sql | 4 +- sql/INSERT/insertLogisticsInfoTuple.sql | 5 +- sql/INSERT/insertReceiptItemsTuple.sql | 4 + sql/INSERT/insertReceiptsTuple.sql | 4 + sql/INSERT/insertRecipeItemsTuple.sql | 4 + sql/INSERT/insertRecipesTuple.sql | 4 + sql/INSERT/insertRolesTuple.sql | 4 + sql/INSERT/insertSKUPrefixTuple.sql | 4 + sql/INSERT/insertShoppingListItemsTuple.sql | 4 + sql/INSERT/insertShoppingListsTuple.sql | 4 + sql/INSERT/insertSitesTuple.sql | 5 + sql/INSERT/insertTransactionsTuple.sql | 2 +- sql/INSERT/insertUnitsTuple.sql | 4 + sql/INSERT/insertVendorsTuple.sql | 4 + sql/INSERT/insertZonesTuple.sql | 4 + sql/SELECT/countZones.sql | 7 + sql/SELECT/getGroups.sql | 3 + sql/SELECT/getItemAllByBarcode.sql | 75 + sql/SELECT/getItemAllByID.sql | 86 + sql/SELECT/getItemLocations.sql | 5 + sql/SELECT/getItemsForModals.sql | 9 + sql/SELECT/getItemsSafetyStock.sql | 11 + sql/SELECT/getItemsWithQOH.sql | 18 + sql/SELECT/getReceiptByID.sql | 17 + sql/SELECT/getReceipts.sql | 7 + sql/SELECT/getRecipeByID.sql | 27 + sql/SELECT/getRecipes.sql | 3 + sql/SELECT/getShoppingListByID.sql | 15 + sql/SELECT/getShoppingLists.sql | 3 + sql/SELECT/getSkuPrefixes.sql | 1 + sql/SELECT/getZonesWithCount.sql | 7 + sql/SELECT/selectShoppingListItem.sql | 4 + sql/updateItemLocation.sql | 4 +- .../230c2b05ff18323c515e21cf9fb81093 | Bin 0 -> 47 bytes .../9db6a7b996bcd7e801a856245be5f1d2 | Bin 0 -> 23 bytes static/css/dark-mode.css | 222 +++ static/css/pantry.css | 86 + static/css/solarized.css | 128 ++ static/handlers/ItemListHandler.js | 396 ++++ static/handlers/groupListHandler.js | 283 +++ static/handlers/itemEditHandler.js | 1364 +++++++++++++ static/handlers/loginHandler.js | 134 ++ static/handlers/receiptHandler.js | 507 +++++ static/handlers/receiptsHandler.js | 145 ++ static/handlers/recipeEditHandler.js | 494 +++++ static/handlers/recipeViewHandler.js | 102 + static/handlers/recipesListHandler.js | 321 +++ static/handlers/shoppingListEditHandler.js | 404 ++++ static/handlers/shoppingListViewHandler.js | 83 + static/handlers/shoppingListsHandler.js | 246 +++ static/handlers/transactionHandler.js | 708 +++++++ static/handlers/transactionsHandler.js | 209 ++ static/itemHandler.js | 210 -- static/receiptHandler.js | 276 --- static/transactionHandler.js | 328 ---- templates/groups/index.html | 546 ++---- templates/itemLookup.html | 176 +- templates/items/index.html | 647 ++----- templates/items/item.html | 995 ---------- templates/items/item_new.html | 661 +++++++ templates/items/itemlink.html | 170 +- templates/items/transactions.html | 452 +---- templates/login.html | 37 - templates/nav.html | 0 templates/other/login.html | 102 + templates/other/transaction.html | 364 ++++ templates/receipts/index.html | 255 +-- templates/receipts/receipt.html | 518 +++-- templates/recipes/index.html | 149 ++ templates/recipes/recipe_edit.html | 331 ++++ templates/recipes/recipe_view.html | 127 ++ templates/shopping-lists/edit.html | 765 +++----- templates/shopping-lists/index.html | 433 ++--- templates/shopping-lists/view.html | 270 +-- templates/signup.html | 27 - templates/transaction.html | 183 -- test.py | 27 +- test.txt | 1604 +++++++++++++-- uom.csv | 36 + user_api.py | 73 +- webserver.py | 113 +- 184 files changed, 18355 insertions(+), 6576 deletions(-) delete mode 100644 MyDataclasses,py create mode 100644 MyDataclasses.py create mode 100644 __pycache__/MyDataclasses.cpython-312.pyc create mode 100644 __pycache__/external_API.cpython-312.pyc create mode 100644 __pycache__/group_api.cpython-312.pyc create mode 100644 __pycache__/item_API.cpython-312.pyc create mode 100644 __pycache__/postsqldb.cpython-312.pyc create mode 100644 __pycache__/process.cpython-312.pyc create mode 100644 __pycache__/receipts_API.cpython-312.pyc create mode 100644 __pycache__/recipes_api.cpython-312.pyc create mode 100644 __pycache__/shopping_list_API.cpython-312.pyc create mode 100644 database.log create mode 100644 external_API.py delete mode 100644 external_devices.py create mode 100644 group_api.py delete mode 100644 html_factory.py create mode 100644 item_API.py create mode 100644 postsqldb.py create mode 100644 process.log create mode 100644 process.py create mode 100644 receipts_API.py create mode 100644 recipes_api.py create mode 100644 shopping_list_API.py create mode 100644 sites/default/sql/create/shopping_list_items.sql create mode 100644 sites/default/sql/drop/shopping_list_items.sql create mode 100644 sites/main/sql/create/shopping_list_items.sql create mode 100644 sites/main/sql/drop/shopping_list_items.sql create mode 100644 sql/CREATE/brands.sql create mode 100644 sql/CREATE/conversions.sql create mode 100644 sql/CREATE/cost_layers.sql create mode 100644 sql/CREATE/food_info.sql create mode 100644 sql/CREATE/group_items.sql create mode 100644 sql/CREATE/groups.sql create mode 100644 sql/CREATE/item.sql create mode 100644 sql/CREATE/item_info.sql create mode 100644 sql/CREATE/item_locations.sql create mode 100644 sql/CREATE/linked_items.sql create mode 100644 sql/CREATE/locations.sql create mode 100644 sql/CREATE/logins.sql create mode 100644 sql/CREATE/logistics_info.sql create mode 100644 sql/CREATE/receipt_items.sql create mode 100644 sql/CREATE/receipts.sql create mode 100644 sql/CREATE/recipe_items.sql create mode 100644 sql/CREATE/recipes.sql create mode 100644 sql/CREATE/roles.sql create mode 100644 sql/CREATE/shopping_list_items.sql create mode 100644 sql/CREATE/shopping_lists.sql create mode 100644 sql/CREATE/sites.sql create mode 100644 sql/CREATE/sku_prefix.sql create mode 100644 sql/CREATE/transactions.sql create mode 100644 sql/CREATE/units.sql create mode 100644 sql/CREATE/vendors.sql create mode 100644 sql/CREATE/zones.sql create mode 100644 sql/DROP/brands.sql create mode 100644 sql/DROP/conversions.sql create mode 100644 sql/DROP/cost_layers.sql create mode 100644 sql/DROP/food_info.sql create mode 100644 sql/DROP/group_items.sql create mode 100644 sql/DROP/groups.sql create mode 100644 sql/DROP/item_info.sql create mode 100644 sql/DROP/item_locations.sql create mode 100644 sql/DROP/items.sql create mode 100644 sql/DROP/linked_items.sql create mode 100644 sql/DROP/locations.sql create mode 100644 sql/DROP/logistics_info.sql create mode 100644 sql/DROP/receipt_items.sql create mode 100644 sql/DROP/receipts.sql create mode 100644 sql/DROP/recipe_items.sql create mode 100644 sql/DROP/recipes.sql create mode 100644 sql/DROP/shopping_list_items.sql create mode 100644 sql/DROP/shopping_lists.sql create mode 100644 sql/DROP/sku_prefix.sql create mode 100644 sql/DROP/transactions.sql create mode 100644 sql/DROP/units.sql create mode 100644 sql/DROP/vendors.sql create mode 100644 sql/DROP/zones.sql create mode 100644 sql/INSERT/insertConversionsTuple.sql create mode 100644 sql/INSERT/insertGroupItemsTuple.sql create mode 100644 sql/INSERT/insertItemLinksTuple.sql create mode 100644 sql/INSERT/insertLocationsTuple.sql create mode 100644 sql/INSERT/insertReceiptItemsTuple.sql create mode 100644 sql/INSERT/insertReceiptsTuple.sql create mode 100644 sql/INSERT/insertRecipeItemsTuple.sql create mode 100644 sql/INSERT/insertRecipesTuple.sql create mode 100644 sql/INSERT/insertRolesTuple.sql create mode 100644 sql/INSERT/insertSKUPrefixTuple.sql create mode 100644 sql/INSERT/insertShoppingListItemsTuple.sql create mode 100644 sql/INSERT/insertShoppingListsTuple.sql create mode 100644 sql/INSERT/insertSitesTuple.sql create mode 100644 sql/INSERT/insertUnitsTuple.sql create mode 100644 sql/INSERT/insertVendorsTuple.sql create mode 100644 sql/INSERT/insertZonesTuple.sql create mode 100644 sql/SELECT/countZones.sql create mode 100644 sql/SELECT/getGroups.sql create mode 100644 sql/SELECT/getItemAllByBarcode.sql create mode 100644 sql/SELECT/getItemAllByID.sql create mode 100644 sql/SELECT/getItemLocations.sql create mode 100644 sql/SELECT/getItemsForModals.sql create mode 100644 sql/SELECT/getItemsSafetyStock.sql create mode 100644 sql/SELECT/getItemsWithQOH.sql create mode 100644 sql/SELECT/getReceiptByID.sql create mode 100644 sql/SELECT/getReceipts.sql create mode 100644 sql/SELECT/getRecipeByID.sql create mode 100644 sql/SELECT/getRecipes.sql create mode 100644 sql/SELECT/getShoppingListByID.sql create mode 100644 sql/SELECT/getShoppingLists.sql create mode 100644 sql/SELECT/getSkuPrefixes.sql create mode 100644 sql/SELECT/getZonesWithCount.sql create mode 100644 sql/SELECT/selectShoppingListItem.sql create mode 100644 static/.webassets-cache/230c2b05ff18323c515e21cf9fb81093 create mode 100644 static/.webassets-cache/9db6a7b996bcd7e801a856245be5f1d2 create mode 100644 static/css/dark-mode.css create mode 100644 static/css/pantry.css create mode 100644 static/css/solarized.css create mode 100644 static/handlers/ItemListHandler.js create mode 100644 static/handlers/groupListHandler.js create mode 100644 static/handlers/itemEditHandler.js create mode 100644 static/handlers/loginHandler.js create mode 100644 static/handlers/receiptHandler.js create mode 100644 static/handlers/receiptsHandler.js create mode 100644 static/handlers/recipeEditHandler.js create mode 100644 static/handlers/recipeViewHandler.js create mode 100644 static/handlers/recipesListHandler.js create mode 100644 static/handlers/shoppingListEditHandler.js create mode 100644 static/handlers/shoppingListViewHandler.js create mode 100644 static/handlers/shoppingListsHandler.js create mode 100644 static/handlers/transactionHandler.js create mode 100644 static/handlers/transactionsHandler.js delete mode 100644 static/itemHandler.js delete mode 100644 static/receiptHandler.js delete mode 100644 static/transactionHandler.js delete mode 100644 templates/items/item.html create mode 100644 templates/items/item_new.html delete mode 100644 templates/login.html create mode 100644 templates/nav.html create mode 100644 templates/other/login.html create mode 100644 templates/other/transaction.html create mode 100644 templates/recipes/index.html create mode 100644 templates/recipes/recipe_edit.html create mode 100644 templates/recipes/recipe_view.html delete mode 100644 templates/signup.html delete mode 100644 templates/transaction.html create mode 100644 uom.csv diff --git a/MyDataclasses,py b/MyDataclasses,py deleted file mode 100644 index cdd9d3d..0000000 --- a/MyDataclasses,py +++ /dev/null @@ -1,19 +0,0 @@ -from dataclasses import dataclass, field -import json -from database import lst2pgarr - -@dataclass -class LogisticsInfoPayload: - barcode: str - primary_location: str - auto_issue_location: str - dynamic_locations: dict = field(default_factory=dict) - location_data: dict = field(default_factory=dict) - quantity_on_hand: float = 0.0 - - def payload(self): - if self.barcode or self.primary_location or self.auto_issue == None: - raise Exception("have to set values") - return (self.barcode, self.primary_location, self.auto_issue_location, - json.dumps(self.dynamic_locations), json.dumps(self.location_data), - self.quantity_on_hand) diff --git a/MyDataclasses.py b/MyDataclasses.py new file mode 100644 index 0000000..704bd95 --- /dev/null +++ b/MyDataclasses.py @@ -0,0 +1,526 @@ +from dataclasses import dataclass, field +import json, datetime +from database import lst2pgarr + +@dataclass +class LogisticsInfoPayload: + barcode: str + primary_location: int + primary_zone: int + auto_issue_location: int + auto_issue_zone: int + + def payload(self): + return (self.barcode, + self.primary_location, + self.primary_zone, + self.auto_issue_location, + self.auto_issue_zone) + +@dataclass +class ItemInfoPayload: + barcode: str + packaging: str = "" + uom_quantity: float = 1.0 + uom: int = 1 + cost: float = 0.0 + safety_stock: float = 0.0 + lead_time_days: float = 0.0 + ai_pick: bool = False + prefixes: list = field(default_factory=list) + + def __post_init__(self): + if not isinstance(self.barcode, str): + raise TypeError(f"barcode must be of type str; not {type(self.barcode)}") + + def payload(self): + return ( + self.barcode, + self.packaging, + self.uom_quantity, + self.uom, + self.cost, + self.safety_stock, + self.lead_time_days, + self.ai_pick, + lst2pgarr(self.prefixes) + ) + +@dataclass +class FoodInfoPayload: + food_groups: list = field(default_factory=list) + ingrediants: list = field(default_factory=list) + nutrients: dict = field(default_factory=dict) + expires: bool = False + default_expiration: float = 0.0 + + def payload(self): + return ( + lst2pgarr(self.food_groups), + lst2pgarr(self.ingrediants), + json.dumps(self.nutrients), + self.expires, + self.default_expiration + ) + +@dataclass +class BrandsPayload: + name: str + + def __post_init__(self): + if not isinstance(self.name, str): + return TypeError(f"brand name should be of type str; not {type(self.name)}") + + def payload(self): + return ( + self.name, + ) + +@dataclass +class ItemsPayload: + barcode: str + item_name: str + item_info_id: int + logistics_info_id: int + food_info_id: int + brand: int = 0 + description: str = "" + tags: list = field(default_factory=list) + links: dict = field(default_factory=dict) + row_type: str = "" + item_type: str = "" + search_string: str ="" + + + def payload(self): + return ( + self.barcode, + self.item_name, + self.brand, + self.description, + lst2pgarr(self.tags), + json.dumps(self.links), + self.item_info_id, + self.logistics_info_id, + self.food_info_id, + self.row_type, + self.item_type, + self.search_string + ) + +@dataclass +class ItemLocationPayload: + part_id: int + location_id: int + quantity_on_hand: float = 0.0 + cost_layers: list = field(default_factory=list) + + def __post_init__(self): + if not isinstance(self.part_id, int): + raise TypeError(f"part_id must be of type int; not {type(self.part_id)}") + if not isinstance(self.location_id, int): + raise TypeError(f"part_id must be of type int; not {type(self.part_id)}") + + def payload(self): + return ( + self.part_id, + self.location_id, + self.quantity_on_hand, + lst2pgarr(self.cost_layers) + ) + +@dataclass +class TransactionPayload: + timestamp: datetime.datetime + logistics_info_id: int + barcode: str + name: str + transaction_type: str + quantity: float + description: str + user_id: int + data: dict = field(default_factory=dict) + + def payload(self): + return ( + self.timestamp, + self.logistics_info_id, + self.barcode, + self.name, + self.transaction_type, + self.quantity, + self.description, + self.user_id, + json.dumps(self.data) + ) + +@dataclass +class CostLayerPayload: + aquisition_date: datetime.datetime + quantity: float + cost: float + currency_type: str + vendor: int = 0 + expires: datetime.datetime = None + + def payload(self): + return ( + self.aquisition_date, + self.quantity, + self.cost, + self.currency_type, + self.expires, + self.vendor + ) + +@dataclass +class LocationPayload: + uuid: str + name: str + zone_id: int + + def __post_init__(self): + if not isinstance(self.uuid, str): + raise TypeError(f"uuid must be of type str; not {type(self.uuid)}") + if not isinstance(self.name, str): + raise TypeError(f"Location name must be of type str; not {type(self.name)}") + if not isinstance(self.zone_id, int): + raise TypeError(f"zone_id must be of type str; not {type(self.zone_id)}") + + def payload(self): + return ( + self.uuid, + self.name, + self.zone_id + ) + +@dataclass +class ZonePayload: + name: str + site_id: int + + def __post_init__(self): + if not isinstance(self.name, str): + raise TypeError(f"Zone name should be of type str; not {type(self.name)}") + + def payload(self): + return ( + self.name, + self.site_id + ) + +@dataclass +class VendorPayload: + vendor_name: str + created_by: int + vendor_address: str = "" + creation_date: datetime.datetime = field(init=False) + phone_number: str = "" + + def __post_init__(self): + if not isinstance(self.vendor_name, str): + raise TypeError(f"vendor_name should be of type str; not {type(self.vendor_name)}") + self.creation_date = datetime.datetime.now() + + + def payload(self): + return ( + self.vendor_name, + self.vendor_address, + self.creation_date, + self.created_by, + self.phone_number + ) + +@dataclass +class ItemLinkPayload: + barcode: str + link: int + data: dict = field(default_factory=dict) + conv_factor: float = 1 + + def __post_init__(self): + if not isinstance(self.barcode, str): + raise TypeError(f"barcode must be of type str; not {type(self.barocde)}") + if not isinstance(self.link, int): + raise TypeError(f"link must be of type str; not {type(self.link)}") + + def payload(self): + return ( + self.barcode, + self.link, + json.dumps(self.data), + self.conv_factor + ) + +@dataclass +class GroupPayload: + name: str + description: str + group_type: str = "plain" + + def payload(self): + return ( + self.name, + self.description, + self.group_type + ) + +@dataclass +class GroupItemPayload: + uuid: str + gr_id: int + item_type: str + item_name:str + uom: str + qty: float = 0.0 + item_id: int = None + links: dict = field(default_factory=dict) + + def payload(self): + return ( + self.uuid, + self.gr_id, + self.item_type, + self.item_name, + self.uom, + self.qty, + self.item_id, + json.dumps(self.links) + ) + +@dataclass +class RecipeItemPayload: + uuid: str + rp_id: int + item_type: str + item_name:str + uom: str + qty: float = 0.0 + item_id: int = None + links: dict = field(default_factory=dict) + + def payload(self): + return ( + self.uuid, + self.rp_id, + self.item_type, + self.item_name, + self.uom, + self.qty, + self.item_id, + json.dumps(self.links) + ) + +@dataclass +class RecipePayload: + name: str + author: int + description: str + creation_date: datetime.datetime = field(init=False) + instructions: list = field(default_factory=list) + picture_path: str = "" + + def __post_init__(self): + self.creation_date = datetime.datetime.now() + + def payload(self): + return ( + self.name, + self.author, + self.description, + self.creation_date, + lst2pgarr(self.instructions), + self.picture_path + ) + +@dataclass +class ReceiptItemPayload: + type: str + receipt_id: int + barcode: str + name: str + qty: float = 1.0 + uom: str = "each" + data: dict = field(default_factory=dict) + status: str = "Unresolved" + + def payload(self): + return ( + self.type, + self.receipt_id, + self.barcode, + self.name, + self.qty, + self.uom, + json.dumps(self.data), + self.status + ) + +@dataclass +class ReceiptPayload: + receipt_id: str + receipt_status: str = "Unresolved" + date_submitted: datetime.datetime = field(init=False) + submitted_by: int = 0 + vendor_id: int = 1 + files: dict = field(default_factory=dict) + + def __post_init__(self): + self.date_submitted = datetime.datetime.now() + + def payload(self): + return ( + self.receipt_id, + self.receipt_status, + self.date_submitted, + self.submitted_by, + self.vendor_id, + json.dumps(self.files) + ) + +@dataclass +class ShoppingListItemPayload: + uuid: str + sl_id: int + item_type: str + item_name: str + uom: str + qty: float + item_id: int = None + links: dict = field(default_factory=dict) + + def payload(self): + return ( + self.uuid, + self.sl_id, + self.item_type, + self.item_name, + self.uom, + self.qty, + self.item_id, + json.dumps(self.links) + ) + +@dataclass +class ShoppingListPayload: + name: str + description: str + author: int + type: str = "plain" + creation_date: datetime.datetime = field(init=False) + + def __post_init__(self): + self.creation_date = datetime.datetime.now() + + def payload(self): + return ( + self.name, + self.description, + self.author, + self.creation_date, + self.type + ) + +@dataclass +class SitePayload: + site_name: str + site_description: str + site_owner_id: int + default_zone: str = None + default_auto_issue_location: str = None + default_primary_location: str = None + creation_date: datetime.datetime = field(init=False) + flags: dict = field(default_factory=dict) + + def __post_init__(self): + self.creation_date = datetime.datetime.now() + + def payload(self): + return ( + self.site_name, + self.site_description, + self.creation_date, + self.site_owner_id, + json.dumps(self.flags), + self.default_zone, + self.default_auto_issue_location, + self.default_primary_location + ) + +@dataclass +class RolePayload: + role_name:str + role_description:str + site_id: int + flags: dict = field(default_factory=dict) + + def payload(self): + return ( + self.role_name, + self.role_description, + self.site_id, + json.dumps(self.flags) + ) + +@dataclass +class SiteManager: + site_name: str + admin_user: tuple + default_zone: int + default_location: int + description: str + create_order: list = field(init=False) + drop_order: list = field(init=False) + + def __post_init__(self): + self.create_order = [ + "logins", + "sites", + "roles", + "units", + "cost_layers", + "linked_items", + "brands", + "food_info", + "item_info", + "zones", + "locations", + "logistics_info", + "transactions", + "item", + "vendors", + "groups", + "group_items", + "receipts", + "receipt_items", + "recipes", + "recipe_items", + "shopping_lists", + "shopping_list_items", + "item_locations", + "conversions" + ] + self.drop_order = [ + "item_info", + "items", + "cost_layers", + "linked_items", + "transactions", + "brands", + "food_info", + "logistics_info", + "zones", + "locations", + "vendors", + "group_items", + "groups", + "receipt_items", + "receipts", + "recipe_items", + "recipes", + "shopping_list_items", + "shopping_lists", + "item_locations", + "conversions" + ] \ No newline at end of file diff --git a/__pycache__/MyDataclasses.cpython-312.pyc b/__pycache__/MyDataclasses.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23bcdf50c7257fe2abbafad348314c303fcb6dab GIT binary patch literal 22704 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 literal 0 HcmV?d00001 diff --git a/__pycache__/admin.cpython-312.pyc b/__pycache__/admin.cpython-312.pyc index bb658722ba9405028f99a1d54552c93a350035d3..4492fed94b834f22c23050135dc31ab1b17c0794 100644 GIT binary patch delta 233 zcmZp1dgsV@nwOW00SNZEzfAuxG?7n&k!PZMjyH3TV6I@4V6IS<5F0(fMj2LlIIj~ZrvT?|2g)hJd9Q&yB{)x>Nrq8*vklV<8Ag@K gPvuf3hs(DzW=y^-FT-VhodJX{GgxnCR$ycV0GL@i6951J delta 279 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 V?KrOOKDO=$F1+bwZl>a%{tNj=fgk_? literal 69523 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 BHShoc diff --git a/__pycache__/external_API.cpython-312.pyc b/__pycache__/external_API.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20700eea816baaadce70edd471fd7710ff40ea81 GIT binary patch literal 8472 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 NvgJW7OWud)`2RU|3%dXS literal 0 HcmV?d00001 diff --git a/__pycache__/group_api.cpython-312.pyc b/__pycache__/group_api.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71ca217d57843796cb3b493b2214ae46a6cd0606 GIT binary patch literal 2924 zcmbtWU2Gd!6~1?VJa%ly`Ek;pq^U#N5+jx0{ZoL|55n2j?mx4ARw*%@Gy@N+C&zzu!CG|VplO0 zS2a~vGc{K?bvI;&T*EZnuo-qEW&{ge#pyD;B#)X=$zx_r^0*n7yxZ)SJYgmz?=gEM z?=^cR?=$-(?>GA;Pnt>Ksx#mYm;>&hIVkthoNo7!c}PC%&SCe6c?2T`5p0FX(c4Pv z4(1RUTKsHqvB%spZo}OKkt0_4d+2s+(BbB>51AL)H?Qjn^F}^oUet;e@OC^nm(~4v zu6cY}NhjVFCrC$lt;(&#T zl@WSiw^*)B0SI4?X+KQ6rE$&8+C?5Ikd~NHaU?3N05dc(Q))7C`&8=D=chk6KTEFp zImato^HZKhUdaN2AY1xMw&>I4`4X7FKnc6*oGvZ<3tn+v9!*$$qO{CIt%K5GST6#N z%|f?|-VdRVo%-d-&qjV@ycK#gamT2i`BG!_%YTkNyOmtKygvH+OSRautJBamqep8) z6V36-okV^73-?D)y{{{=@jayI*y+js{XD?wd-b=n!zO%Qfh6ck0_Ov?DBSJy9Bng!dArU`l%L-UqoZ* zEMj;G(%2lr@OxwOnmUJ;a5^?iQ?MG>O4$ODZq9Ybc5Pp}wsaH7@ZTcTpW)go4p~TR zGI?+n$^_R5rBE}#lNf{fw@|v9idf>ImTz%Y6e2B43yiDafK(V)<~SZMvE`gsDxBj6 zY)}-%C~Rf@tVn1wA-0^Aith}OCjAAj<%sR1!*YK*CRREj_ww?2Mxe|E)7v!(N*UzO zOfl;cmP*w<{{E}qd39^xkH$zd z(Rcl+&GQ@Qcl*cc{bM&~Za&lKpJ*f|*R*C&|MiQTmo_f#CQsCpCvLoSGuud>Y4n_3 z)9?2Uu3z0awRLi1WG&P@n)=E3TB4a8+Ipd${N!4s86VhnXmU38qtNCw(x;2^jeEPV#4~rJ$!uXr24y)`qYGxPH{c&WZ4xeLS7;# zYY!E1+bTuER#b$n1cHiyp_8Kf6m(n@UkDO6;@d8vhoul;g>Q!T*9YT9iF!G35PDX; z4V7A7C-LW(F96&**d8ia%Q50&;clT779~~`Eh>VKhcgn!OooaGg|p({u)8qWZ9H==M~M@dM=TBJWSgdw|I9zJCLe2k7H(qtUm~ z*k9s<>y;Z{Z^S27yWYXkUEEv8z3b@)9=?wg?UFoo?Wi sR8#O3+|e7|)5Lf$+)=Fco!rrHF4b^v13&ei(uHlQ{h8JyorVMd2T;YFL;wH) literal 0 HcmV?d00001 diff --git a/__pycache__/item_API.cpython-312.pyc b/__pycache__/item_API.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b21e2dc2cf8581f5f06deffe6a5da133da47b59b GIT binary patch literal 32107 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 literal 0 HcmV?d00001 diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc index ace77b6d3d71f418af068f604593a7c272299450..6d0c743febd73e4c53d10ac6da0fe294e0e4a4a0 100644 GIT binary patch delta 4721 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 delta 3880 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 diff --git a/__pycache__/postsqldb.cpython-312.pyc b/__pycache__/postsqldb.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff8dc99537f2bb9d25c02470ed26716bbca4a3f3 GIT binary patch literal 39253 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 P-EFayUlEA1cl`eWq)10P literal 0 HcmV?d00001 diff --git a/__pycache__/process.cpython-312.pyc b/__pycache__/process.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0379a10efbbdfc3b7d49039b463099234293e835 GIT binary patch literal 15967 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 A(EtDd literal 0 HcmV?d00001 diff --git a/__pycache__/receipts_API.cpython-312.pyc b/__pycache__/receipts_API.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f59419a1d501e2c552bd50b42eceb841361a6a3d GIT binary patch literal 21758 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%0Akg2u;Tb-?Wea}IBJ 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 literal 0 HcmV?d00001 diff --git a/__pycache__/shopping_list_API.cpython-312.pyc b/__pycache__/shopping_list_API.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6af6dfdd92ca57d593dc8c6d33aaa42898e0e456 GIT binary patch literal 12758 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 literal 6558 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 diff --git a/admin.py b/admin.py index b5d3477..dda93b3 100644 --- a/admin.py +++ b/admin.py @@ -1,5 +1,5 @@ from flask import Blueprint, request, render_template, redirect, session, url_for, send_file, jsonify, Response -import psycopg2, math, json, datetime, main, copy, requests, html_factory +import psycopg2, math, json, datetime, main, copy, requests from config import config, sites_config from main import unfoldCostLayers, get_sites, get_roles, create_site_secondary, getUser from manage import create diff --git a/api.py b/api.py index e4cdea9..746405b 100644 --- a/api.py +++ b/api.py @@ -1,88 +1,17 @@ from flask import Blueprint, request, render_template, redirect, session, url_for, send_file, jsonify, Response -import psycopg2, math, json, datetime, main, copy, requests +import psycopg2, math, json, datetime, main, copy, requests, process, database from config import config, sites_config from main import unfoldCostLayers database_api= Blueprint('database_api', __name__) -@database_api.route("/changeSite") +@database_api.route("/changeSite", methods=["POST"]) def changeSite(): - site = request.args.get('site', 'main') + if request.method == "POST": + site = request.json['site'] session['selected_site'] = site - return jsonify({'status': 'SUCCESS'}) + return jsonify({'error': False, 'message': 'Site Changed!'}) -def paginate_with_params(cur, limit, offset, params): - sql = f"SELECT * FROM main_items LEFT JOIN main_logistics_info ON main_items.logistics_info_id = main_logistics_info.id" - count = f"SELECT COUNT(*) FROM main_items LEFT JOIN main_logistics_info ON main_items.logistics_info_id = main_logistics_info.id" - # WHERE search_string LIKE '%{search_string}%' - strings = [] - count_strings = [] - if params['search_string'] != "": - s = params['search_string'] - strings.append(f" search_string LIKE '%{s}%'") - count_strings.append(f" search_string LIKE '%{s}%'") - - if params['view'] == 1: - s = params['view'] - strings.append(f" main_logistics_info.quantity_on_hand <> 0.00") - count_strings.append(f" main_logistics_info.quantity_on_hand <> 0.00") - - - # LIMIT {limit} OFFSET {offset};" - - if len(strings) > 0: - sql = f"{sql} WHERE{" AND".join(strings)}" - - if len(count_strings) > 0: - count = f"{count} WHERE{" AND".join(count_strings)}" - - sql = f"{sql} ORDER BY main_logistics_info.quantity_on_hand LIMIT {limit} OFFSET {offset};" - count = f"{count};" - print(count) - print(sql) - cur.execute(sql) - pantry_inventory = cur.fetchall() - cur.execute(count) - count = cur.fetchone()[0] - return pantry_inventory, count - -def paginate_default(cur, limit, offset): - sql = f"SELECT * FROM main_items LEFT JOIN main_logistics_info ON main_items.logistics_info_id = main_logistics_info.id LIMIT %s OFFSET %s;" - cur.execute(sql, (limit, offset)) - pantry_inventory = cur.fetchall() - cur.execute("SELECT COUNT(*) FROM main_items;") - count = cur.fetchone()[0] - return pantry_inventory, count - -def paginate_with_params_groups(cur, limit, offset, params): - sql = f"SELECT * FROM main_groups" - count = f"SELECT COUNT(*) FROM main_groups" - # WHERE search_string LIKE '%{search_string}%' - strings = [] - count_strings = [] - if params['search_string'] != "": - s = params['search_string'] - strings.append(f" search_string LIKE '%{s}%'") - count_strings.append(f" search_string LIKE '%{s}%'") - - - # LIMIT {limit} OFFSET {offset};" - - if len(strings) > 0: - sql = f"{sql} WHERE{" AND".join(strings)}" - - if len(count_strings) > 0: - count = f"{count} WHERE{" AND".join(count_strings)}" - - sql = f"{sql} ORDER BY main_logistics_info.quantity_on_hand LIMIT {limit} OFFSET {offset};" - count = f"{count};" - print(count) - print(sql) - cur.execute(sql) - pantry_inventory = cur.fetchall() - cur.execute(count) - count = cur.fetchone()[0] - return pantry_inventory, count @database_api.route("/getGroups") def paginate_groups(): @@ -130,89 +59,6 @@ def paginate_groups(): return jsonify({'groups': new_groups, "end": math.ceil(count/limit)}) -@database_api.route("/getReceipts") -def pagninate_receipts(): - page = int(request.args.get('page', 1)) - limit = int(request.args.get('limit', 10)) - site_name = session['selected_site'] - - offset = (page - 1) * limit - - receipts = [] - count = 0 - - database_config = config() - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - sql = f"SELECT * FROM {site_name}_receipts LIMIT {limit} OFFSET {offset};" - count = f"SELECT COUNT(*) FROM {site_name}_receipts;" - cur.execute(sql) - receipts = cur.fetchall() - cur.execute(count) - count = cur.fetchone()[0] - except (Exception, psycopg2.DatabaseError) as error: - print(error) - - return jsonify({'receipts': receipts, "end": math.ceil(count/limit)}) - -@database_api.route("/getItems") -def pagninate_items(): - page = int(request.args.get('page', 1)) - limit = int(request.args.get('limit', 10)) - search_string = str(request.args.get('search_text', "")) - sort_order = int(request.args.get('sort_order', 1)) - view = int(request.args.get('view', 0)) - site_name = session['selected_site'] - - offset = (page - 1) * limit - - pantry_inventory = [] - count = 0 - - database_config = config() - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - sql = f"SELECT * FROM {site_name}_items LEFT JOIN {site_name}_logistics_info ON {site_name}_items.logistics_info_id = {site_name}_logistics_info.id LIMIT {limit} OFFSET {offset};" - count = f"SELECT COUNT(*) FROM {site_name}_items LEFT JOIN {site_name}_logistics_info ON {site_name}_items.logistics_info_id = {site_name}_logistics_info.id;" - cur.execute(sql) - pantry_inventory = cur.fetchall() - cur.execute(count) - count = cur.fetchone()[0] - except (Exception, psycopg2.DatabaseError) as error: - print(error) - - return jsonify({'items': pantry_inventory, "end": math.ceil(count/limit)}) - -@database_api.route("/getTransactions") -def pagninate_transactions(): - item_id = request.args.get('id', 1) - page = int(request.args.get('page', 1)) - limit = int(request.args.get('limit', 10)) - site_name = session['selected_site'] - - offset = (page - 1) * limit - count = 0 - transactions = [] - - database_config = config() - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - - cur.execute(f"SELECT logistics_info_id FROM {site_name}_items WHERE id={item_id};") - logistics_info_id = cur.fetchone()[0] - sql = f"SELECT * FROM {site_name}_transactions WHERE logistics_info_id={logistics_info_id} LIMIT {limit} OFFSET {offset};" - count = f"SELECT COUNT(*) FROM {site_name}_transactions WHERE logistics_info_id={logistics_info_id};" - cur.execute(sql) - transactions = cur.fetchall() - cur.execute(count) - count = cur.fetchone()[0] - except (Exception, psycopg2.DatabaseError) as error: - print(error) - - return jsonify({'transactions': transactions, "end": math.ceil(count/limit)}) @database_api.route("/getVendors") def get_vendors(): @@ -230,674 +76,7 @@ def get_vendors(): return jsonify(vendors=vendors) -@database_api.route("/getTransaction") -def get_transaction(): - id = int(request.args.get('id', 1)) - database_config = config() - site_name = session['selected_site'] - transaction = [] - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - sql = f"SELECT * FROM {site_name}_transactions WHERE id=%s;" - cur.execute(sql, (id, )) - transaction = list(cur.fetchone()) - except (Exception, psycopg2.DatabaseError) as error: - print(error) - - return jsonify(transaction=transaction) - -@database_api.route("/getLocations") -def get_locations(): - zone_name = request.args.get('zone', 1) - database_config = config() - site_name = session['selected_site'] - locations = [] - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - sql = f"SELECT id FROM {site_name}_zones WHERE name=%s;" - cur.execute(sql, (zone_name,)) - zone_id = cur.fetchone()[0] - - sqltwo = f"SELECT name FROM {site_name}_locations WHERE zone_id=%s;" - cur.execute(sqltwo, (zone_id, )) - locations = [location[0] for location in cur.fetchall()] - except (Exception, psycopg2.DatabaseError) as error: - print(error) - - return jsonify(locations=locations) - -@database_api.route("/getZones") -def get_zones(): - database_config = config() - site_name = session['selected_site'] - zones = [] - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - sql = f"SELECT name FROM {site_name}_zones;" - cur.execute(sql) - zones = [zone[0] for zone in cur.fetchall()] - except (Exception, psycopg2.DatabaseError) as error: - print(error) - print(zones) - return jsonify(zones=zones) - -def checkReceiptState(index, site): - database_config = config() - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - sql = f"SELECT id, status FROM {site}_receipt_items WHERE receipt_id=%s;" - cur.execute(sql, (index, )) - items = cur.fetchall() - number_unresolved = 0 - for item in items: - if item[1] == "Unresolved": - number_unresolved += 1 - - if number_unresolved == 0: - sql = f"UPDATE {site}_receipts SET receipt_status = 'Resolved' WHERE id=%s;" - cur.execute(sql, (index, )) - except (Exception, psycopg2.DatabaseError) as error: - print(error) - -@database_api.route("/deleteReceiptItem", methods=["POST"]) -def deleteReceiptItem(): - database_config = config() - site_name = session['selected_site'] - - if request.method == "POST": - index = request.json['index'] - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - sql = f"DELETE FROM {site_name}_receipt_items WHERE id=%s;" - cur.execute(sql, (index, )) - except (Exception, psycopg2.DatabaseError) as error: - print(error) - return jsonify({}) - -@database_api.route("/saveReceipt", methods=["POST"]) -def saveReceipt(): - database_config = config() - site_name = session['selected_site'] - - if request.method == "POST": - receipt_index = request.json['receipt_index'] - vendor_index = request.json['vendor_index'] - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - sql = f"UPDATE {site_name}_receipts SET vendor_id=%s WHERE id=%s;" - cur.execute(sql, (vendor_index, receipt_index)) - except (Exception, psycopg2.DatabaseError) as error: - print(error) - return jsonify({}) - -@database_api.route("/saveReceiptItem", methods=["POST"]) -def saveReceiptItem(): - database_config = config() - site_name = session['selected_site'] - - if request.method == "POST": - index = request.json['index'] - cost= request.json['cost'] - qty = request.json['qty'] - barcode = request.json['barcode'] - - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - sql = f"SELECT * FROM {site_name}_receipt_items WHERE id=%s;" - cur.execute(sql, (index, )) - receipt_item = list(cur.fetchone()) - _new_type = receipt_item[1] - _new_name = receipt_item[4] - _new_item = receipt_item[6] - _new_cost = cost - if barcode != receipt_item[3]: - # grab the new barcode data... - sql = f"SELECT {site_name}_items.barcode FROM {site_name}_itemlinks LEFT JOIN {site_name}_items ON {site_name}_itemlinks.link = {site_name}_items.id WHERE {site_name}_itemlinks.barcode = %s;" - cur.execute(sql, (barcode, )) - x = cur.fetchone() - if x != None: - barcode = x[0] - # 078742013718 - with open(f"sites/{site_name}/sql/unique/select_item_all_barcode.sql", "r+") as file: - sql = file.read() - cur.execute(sql, (barcode, )) - item = list(cur.fetchone()) - if not item: - return jsonify({}) - - #TODO: implement the api code, this will be a big function in external that will do all the parsing and stuff in the system. - print(item) - _new_type = 'Pantry' - _new_name = item[2] - _new_cost = item[28] - _new_item = item - - - _new_item[28] = _new_cost - sql = f"UPDATE {site_name}_receipt_items SET type = %s, barcode = %s, name = %s, qty = %s, data = %s WHERE id=%s;" - cur.execute(sql, (_new_type, barcode, _new_name, qty, json.dumps(_new_item), index)) - except (Exception, psycopg2.DatabaseError) as error: - print(error) - return jsonify({}) - -@database_api.route("/voidReceiptItem", methods=["POST"]) -def voidReceiptItem(): - database_config = config() - site_name = session['selected_site'] - - if request.method == "POST": - index = request.json['index'] - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - sql = f"UPDATE {site_name}_receipt_items SET status = 'Voided' WHERE id=%s RETURNING receipt_id;" - cur.execute(sql, (index, )) - receipt_id = cur.fetchone()[0] - except (Exception, psycopg2.DatabaseError) as error: - print(error) - - checkReceiptState(receipt_id, site_name) - - return jsonify({}) - -@database_api.route("/resolveReceiptItem", methods=["POST"]) -def resolveReceiptItem(): - database_config = config() - site_name = session['selected_site'] - - if request.method == "POST": - index = request.json['index'] - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - sql = f"SELECT * FROM {site_name}_receipt_items WHERE id=%s;" - cur.execute(sql, (index, )) - receipt_item = cur.fetchone() - sql = f"SELECT receipt_id FROM {site_name}_receipts WHERE id=%s;" - cur.execute(sql, (receipt_item[2], )) - receipt_id = cur.fetchone()[0] - payload = [ - datetime.datetime.now(), - receipt_item[6][8], - receipt_item[3], - receipt_item[4], - "Receipt", - receipt_item[5], - f"{receipt_id}", - 1, - json.dumps({'location': receipt_item[6][15], 'cost': receipt_item[6][28]}) - ] - - print(payload) - main.addTransaction( - conn=conn, - site_name=site_name, - payload=payload, - location=receipt_item[6][15], - logistics_info_id=receipt_item[6][8], - item_id=receipt_item[6][0], - qty=receipt_item[5], - cost=receipt_item[6][28] - ) - - sql = f"UPDATE {site_name}_receipt_items SET status = 'Resolved' WHERE id=%s RETURNING receipt_id;" - cur.execute(sql, (index, )) - receipt_id = cur.fetchone()[0] - - - except (Exception, psycopg2.DatabaseError) as error: - print(error) - - checkReceiptState(receipt_id, site_name) - - return jsonify({}) - -@database_api.route("/getReceiptItem") -def get_receipt_item(): - id = int(request.args.get('index', 1)) - database_config = config() - site_name = session['selected_site'] - receipt_item = [] - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - sql = f"SELECT * FROM {site_name}_receipt_items WHERE id=%s;" - cur.execute(sql, (id, )) - receipt_item = list(cur.fetchone()) - - except (Exception, psycopg2.DatabaseError) as error: - print(error) - - return jsonify({"receipt_item": receipt_item}) - -@database_api.route("/getReceipt") -def get_receipt(): - id = int(request.args.get('id', 1)) - database_config = config() - site_name = session['selected_site'] - receipt = [] - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - sql = f"SELECT * FROM {site_name}_receipts LEFT JOIN {site_name}_vendors ON {site_name}_receipts.vendor_id = {site_name}_vendors.id WHERE {site_name}_receipts.id=%s;" - cur.execute(sql, (id, )) - receipt = list(cur.fetchone()) - sql = f"SELECT * FROM {site_name}_receipt_items WHERE receipt_id=%s;" - cur.execute(sql, (id, )) - receipt_items = cur.fetchall() - - except (Exception, psycopg2.DatabaseError) as error: - print(error) - - return jsonify({"receipt": receipt, "receipt_items": receipt_items}) - - -@database_api.route("/getLinkedItem") -def get_linked_item(): - id = int(request.args.get('id', 1)) - database_config = config() - site_name = session['selected_site'] - - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - sql = f"SELECT * FROM {site_name}_itemlinks WHERE id=%s;" - cur.execute(sql, (id, )) - linked_item = cur.fetchone() - except (Exception, psycopg2.DatabaseError) as error: - print(error) - - return jsonify(linked_item=linked_item) - -@database_api.route("/getItem") -def get_item(): - id = int(request.args.get('id', 1)) - database_config = config() - site_name = session['selected_site'] - - item = [] - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - with open(f"sites/{site_name}/sql/unique/select_item_all.sql", "r+") as file: - sql = file.read() - cur.execute(sql, (id, )) - item = list(cur.fetchone()) - SQL_groups = f"SELECT * FROM {site_name}_groups WHERE included_items @> ARRAY[%s];" - cur.execute(SQL_groups, (item[0], )) - item[25] = list(cur.fetchall()) - SQL_shopping_lists = f"SELECT * FROM {site_name}_shopping_lists WHERE pantry_items @> ARRAY[%s];" - cur.execute(SQL_shopping_lists, (item[0], )) - item[23] = list(cur.fetchall()) - sql_location_data = f"SELECT {site_name}_locations.uuid, {site_name}_item_locations.quantity_on_hand, {site_name}_item_locations.cost_layers FROM {site_name}_item_locations LEFT JOIN {site_name}_locations ON {site_name}_item_locations.location_id = {site_name}_locations.id WHERE part_id=%s;" - cur.execute(sql_location_data, (item[0],)) - # losing cost layers here by uniforming to the javascript, change to take a list? - columns = [desc[0] for desc in cur.description] - x = cur.fetchall() - qty_on_hand = sum([location[1] for location in x]) - y = {location[0]: location[1] for location in x} - item[18] = y - item[19] = qty_on_hand - sql = f"SELECT * FROM {site_name}_itemlinks WHERE link=%s;" - cur.execute(sql, (item[0], )) - linked_items = cur.fetchall() - print(linked_items) - - - except (Exception, psycopg2.DatabaseError) as error: - print(error) - - return jsonify(item=item, linked_items=linked_items) - -@database_api.route("/addItem") -def addItem(): - barcode = str(request.args.get('barcode', "")) - name = str(request.args.get('item_name', "")) - description = str(request.args.get('item_description', "")) - item_type = str(request.args.get('item_type', "")) - subtype = str(request.args.get('sub_type', "")) - site_name = session['selected_site'] - state = "FAILED" - - payload = copy.deepcopy(main.payload_food_item) - - defaults = config(filename=f"sites/{site_name}/site.ini", section="defaults") - uuid = f"{defaults["default_zone"]}@{defaults["default_primary_location"]}" - name = name.replace("'", "@&apostraphe&") - payload["logistics_info"]["primary_location"] = uuid - payload["logistics_info"]["auto_issue_location"] = uuid - - tags = main.lst2pgarr([]) - links = json.dumps({}) - - database_config = config() - with psycopg2.connect(**database_config) as conn: - logistics_info_id = main.create_logistics_info(conn, site_name, barcode, payload["logistics_info"]) - if not logistics_info_id: - return jsonify({'state': str(logistics_info_id)}) - item_info_id = main.create_item_info(conn, site_name, barcode, payload["item_info"]) - if not item_info_id: - return jsonify({'state': str(item_info_id)}) - food_info_id = main.create_food_info(conn, site_name, payload["food_info"]) - if not food_info_id: - return jsonify({'state': str(food_info_id)}) - - sqltwo = f"INSERT INTO {site_name}_items(barcode, item_name, tags, links, item_info_id, logistics_info_id, food_info_id, row_type, item_type, search_string) VALUES('{barcode}', '{name}', '{tags}', '{links}', {item_info_id}, {logistics_info_id}, {food_info_id}, 'single', 'FOOD', '{barcode}%{name}') RETURNING *;" - sqlthree = f"INSERT INTO {site_name}_item_locations(part_id, location_id, quantity_on_hand, cost_layers) VALUES (%s, %s, %s, %s);" - - row = None - try: - with conn.cursor() as cur: - cur.execute(sqltwo) - rows = cur.fetchone() - if rows: - row = rows[:] - cur.execute(f"SELECT id FROM {site_name}_locations WHERE uuid=%s;", (uuid, )) - location_id = cur.fetchone() - cur.execute(sqlthree, (row[0], location_id, 0.0, main.lst2pgarr([]))) - except (Exception, psycopg2.DatabaseError) as error: - print(error) - conn.rollback() - return jsonify({'state': str(error)}) - - - conn.commit() - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - - cur.execute(f"SELECT primary_location FROM {site_name}_logistics_info WHERE id={logistics_info_id};") - location = cur.fetchone()[0] - payload = [ - datetime.datetime.now(), - logistics_info_id, - barcode, - name, - "SYSTEM", - 0.0, - "Item Added to System!", - 1, - json.dumps({'location': location}) - ] - - main.addTransaction( - conn=conn, - site_name=site_name, - payload=payload, - location=location, - logistics_info_id=logistics_info_id, - item_id=row[0], - qty=0.0, - cost=0.0) - - except (Exception, psycopg2.DatabaseError) as error: - print(error) - conn.rollback() - return jsonify({'state': str(error)}) - - return jsonify({'state': "SUCCESS"}) - -@database_api.route("/transact", methods=['POST']) -def addTransaction(): - - if request.method == "POST": - if "site_name" in request.get_json().keys(): - site_name = request.get_json()["site_name"] - print("passed") - elif "selected_site" in session.keys(): - site_name = session['selected_site'] - print(session) - else: - return jsonify({"message": "Failed", "error": "No site selected or sent along with request!"}) - - logistics_info_id = request.get_json()['logistics_info_id'] - barcode = request.get_json()['barcode'] - name = request.get_json()['name'] - location = request.get_json()['location'] - qty = request.get_json()['qty'] - trans_type = request.get_json()['trans_type'] - trans_cost = request.get_json()['trans_cost'] - - database_config = config() - - actual_qty = qty - if trans_type == "Adjust Out": - actual_qty = -qty - - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - cur.execute(f"SELECT id FROM {site_name}_items WHERE barcode=%s;", (barcode,)) - item_id = cur.fetchone() - payload = [ - datetime.datetime.now(), - logistics_info_id, - barcode, - name, - trans_type, - qty, - "", - 1, - json.dumps({'location': location, 'cost': trans_cost}) - ] - - print(payload) - main.addTransaction( - conn=conn, - site_name=site_name, - payload=payload, - location=location, - logistics_info_id=logistics_info_id, - item_id=item_id, - qty=actual_qty, - cost=trans_cost - ) - - except (Exception, psycopg2.DatabaseError) as error: - print(error) - conn.rollback() - return jsonify({'state': str(error)}) - print("SUCCESS") - return jsonify({'state': str("SUCCESS")}) - print("SUCCESS") - return jsonify({'state': str("FAILED")}) - -@database_api.route("/updateItem", methods=['POST']) -def updateItem(): - def transformValues(values): - v = [] - for value in values: - if isinstance(value, dict): - v.append(json.dumps(value)) - elif isinstance(value, list): - v.append(main.lst2pgarr(value)) - else: - v.append(value) - return v - - def manufactureSQL(keys, item_id, table): - if len(keys) > 1: - x = f"({', '.join(keys)})" - y = f"({', '.join(['%s' for _ in keys])})" - else: - x = f"{', '.join(keys)}" - y = f"{', '.join(['%s' for _ in keys])}" - - sql = f"UPDATE {table} SET {x} = {y} WHERE id={item_id};" - sqltwo = f"SELECT {', '.join(keys)} FROM {table} WHERE id={item_id};" - return sql, sqltwo - - if request.method == "POST": - site_name = session['selected_site'] - item_id = request.get_json()['id'] - data = request.get_json() - logistics_info_id = request.get_json()['logistics_info_id'] - food_info_id = request.get_json()['food_info_id'] - item_info_id = request.get_json()['item_info_id'] - updated = request.get_json()['updated'] - item_info = request.get_json()['item_info'] - food_info = request.get_json()['food_info'] - logistics_info = data['logistics_info'] - - save_data = {} - for k, v in updated.items(): - save_data[f"{k}_new"] = v; - for k, v in item_info.items(): - save_data[f"{k}_new"] = v; - for k, v in food_info.items(): - save_data[f"{k}_new"] = v; - for k, v in logistics_info.items(): - save_data[f"{k}_new"] = v; - - database_config = config() - - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - if updated != {}: - values = transformValues(updated.values()) - sql, sqltwo = manufactureSQL(updated.keys(), item_id, f"{site_name}_items") - cur.execute(sqltwo) - old_data = dict(zip(updated.keys(), cur.fetchone())) - for k, v in old_data.items(): - save_data[f"{k}_old"] = v; - cur.execute(sql, values) - - if item_info != {}: - values = transformValues(item_info.values()) - sql, sqltwo = manufactureSQL(item_info.keys(), item_info_id, f"{site_name}_item_info") - cur.execute(sqltwo) - old_data = dict(zip(item_info.keys(), cur.fetchone())) - for k, v in old_data.items(): - save_data[f"{k}_old"] = v; - cur.execute(sql, values) - - if food_info != {}: - values = transformValues(food_info.values()) - sql, sqltwo = manufactureSQL(food_info.keys(), food_info_id, f"{site_name}_food_info") - cur.execute(sqltwo) - old_data = dict(zip(food_info.keys(), cur.fetchone())) - for k, v in old_data.items(): - save_data[f"{k}_old"] = v; - cur.execute(sql, values) - - if logistics_info != {}: - values = transformValues(logistics_info.values()) - sql, sqltwo = manufactureSQL(logistics_info.keys(), logistics_info_id, f"{site_name}_logistics_info") - cur.execute(sqltwo) - old_data = dict(zip(logistics_info.keys(), cur.fetchone())) - for k, v in old_data.items(): - save_data[f"{k}_old"] = v; - cur.execute(sql, values) - - cur.execute(f"SELECT {site_name}_items.id, {site_name}_items.barcode, {site_name}_items.item_name, {site_name}_logistics_info.primary_location FROM {site_name}_items LEFT JOIN {site_name}_logistics_info ON {site_name}_items.logistics_info_id = {site_name}_logistics_info.id WHERE {site_name}_items.id={item_id};") - item_id, barcode, name, primary_location = cur.fetchone() - payload = [ - datetime.datetime.now(), - logistics_info_id, - barcode, - name, - "SYSTEM", - 0.0, - "Updated Item!", - 1, - json.dumps(save_data) - ] - - main.addTransaction( - conn=conn, - site_name=site_name, - payload=payload, - location=primary_location, - logistics_info_id=logistics_info_id, - item_id=item_id, - qty=0.0, - cost=0.0 - ) - - except (Exception, psycopg2.DatabaseError) as error: - print(error) - conn.rollback() - - return jsonify({"state": "SUCCESS"}) - - return jsonify({"status": "FAILED"}) - -@database_api.route("/linkItem", methods=["POST"]) -def linkItemToItem(): - if request.method == "POST": - database_config = config() - site_name = session['selected_site'] - master_index = request.json['master_index'] - sub_index = request.json['sub_index'] - print(master_index, sub_index) - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - with open(f"sites/{site_name}/sql/unique/select_item_all.sql", "r+") as file: - sql = file.read() - cur.execute(sql, (sub_index, )) - sub_item = cur.fetchone() - - # grab all the location data and then get the qty on hand - sql_location_data = f"SELECT {site_name}_locations.uuid, {site_name}_item_locations.quantity_on_hand, {site_name}_item_locations.cost_layers FROM {site_name}_item_locations LEFT JOIN {site_name}_locations ON {site_name}_item_locations.location_id = {site_name}_locations.id WHERE part_id=%s;" - cur.execute(sql_location_data, (sub_item[0],)) - x = cur.fetchall() - qty_on_hand = sum([location[1] for location in x]) - - # Delete sub_item from database and cascade through tables - sql = f"DELETE FROM {site_name}_items WHERE id=%s;" - cur.execute(sql, (sub_index,)) - - # insert sub_item into the links table - sql = f"INSERT INTO {site_name}_itemlinks (barcode, link, data, conv_factor) VALUES (%s, %s, %s, %s);" - cur.execute(sql, (sub_item[1], master_index, json.dumps(sub_item), 1.0)) - - # need to adjust the qty on hand into the master items - - with open(f"sites/{site_name}/sql/unique/select_item_all.sql", "r+") as file: - sql = file.read() - - cur.execute(sql, (master_index,)) - master_item = cur.fetchone() - payload = [ - datetime.datetime.now(), - master_item[8], - master_item[1], - master_item[2], - "Adjust In", - qty_on_hand, - f"COVERSION FROM {sub_item[1]}", - 1, - json.dumps({'location': master_item[15], 'cost': sub_item[28]*qty_on_hand}) - ] - - print(payload) - main.addTransaction( - conn=conn, - site_name=site_name, - payload=payload, - location=master_item[15], - logistics_info_id=master_item[8], - item_id=master_item[0], - qty=qty_on_hand, - cost=sub_item[28]*qty_on_hand - ) - - - except (Exception, psycopg2.DatabaseError) as error: - print(error) - - - return jsonify({}) @database_api.route("/addGroup") def addGroup(): name = str(request.args.get('name', "")) diff --git a/database.log b/database.log new file mode 100644 index 0000000..edd4e96 --- /dev/null +++ b/database.log @@ -0,0 +1,1721 @@ + +2025-03-19 14:36:27.422471 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "sites_site_name_key"DETAIL: Key (site_name)=(test) already exists.', + payload=('test', 'This is my test site', datetime.datetime(2025, 3, 19, 14, 36, 27, 421459), 1, '{}', None, None, None), + sql='INSERT INTO sites(site_name, site_description, creation_date, site_owner_id, flags, default_zone,default_auto_issue_location, default_primary_location) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:41:51.498701 --- ERROR --- DatabaseError(message='malformed array literal: "{n,o,-,s,t,i,c,k, ,g,p,r,a,y,m,l,v,e,d,x,w,h,f,|,5,0}"LINE 3: ...ificial-preservatives-flavors-colors-net-wt-50}', '{n,o,-,s,... ^DETAIL: Unexpected "," character.', + payload=('{en:no-stick-cooking-spray-pam-olive-oil-made-extra-virgin-olive-oil-with-expeller-pressed-no-artificial-preservatives-flavors-colors-net-wt-50}', '{n,o,-,s,t,i,c,k, ,g,p,r,a,y,m,l,v,e,d,x,w,h,f,|,5,0}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "g", "fibers": "", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:41:52.044494 --- ERROR --- DatabaseError(message='malformed array literal: "{C,a,r,b,o,n,t,e,d, ,W,,,H,i,g,h,F,u,c,s,S,y,p,m,l,P,A,N,v,f,.}"LINE 3: ...l-flavouring,en:flavouring,en:caffeine,en:e330}', '{C,a,r,b,... ^DETAIL: Unexpected "," character.', + payload=('{en:carbonated-water,en:water,en:high-fructose-corn-syrup,en:added-sugar,en:disaccharide,en:monosaccharide,en:fructose,en:glucose,en:corn-syrup,en:glucose-fructose-syrup,en:e150a,en:sugar,en:e338,en:natural-flavouring,en:flavouring,en:caffeine,en:e330}', '{C,a,r,b,o,n,t,e,d, ,W,,,H,i,g,h,F,u,c,s,S,y,p,m,l,P,A,N,v,f,.}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "", "fibers": "", "fibers_unit": ""}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:41:52.069785 --- ERROR --- DatabaseError(message='malformed array literal: "{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}"LINE 3: VALUES ('{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,... ^DETAIL: Unexpected "," character.', + payload=('{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}', '{c,,, ,a,r,b,o,n,t,e,d,w,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "0", "proteins_unit": "g", "fats": "0", "fats_unit": "g", "carbohydrates": "46", "carbohydrates_unit": "g", "sugars": "46", "sugars_unit": "g", "sodium": "0.06", "sodium_unit": "mg", "fibers": "0", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:41:54.274588 --- ERROR --- DatabaseError(message='malformed array literal: "{P,o,r,k,,, ,w,a,t,e,b,n,d,l,s,h,2,%,f,i,g,:,p,u,m,c,y,x,v,j,(,),.}"LINE 3: ...:salt,en:maltodextrin,en:lemon,en:citrus-fruit}', '{P,o,r,k,... ^DETAIL: Unexpected "," character.', + payload=('{en:pork,en:animal,en:water,en:beer,en:alcohol,en:and-less-than-2-of-the-following,en:e326,en:corn-syrup,en:added-sugar,en:disaccharide,en:dextrose,en:monosaccharide,en:glucose,en:spice,en:condiment,en:natural-flavouring,en:flavouring,en:e339,en:e262ii,en:e262,en:lemon-juice,en:fruit,en:juice,en:fruit-juice,en:collagen-casing,en:salt,en:maltodextrin,en:lemon,en:citrus-fruit}', '{P,o,r,k,,, ,w,a,t,e,b,n,d,l,s,h,2,%,f,i,g,:,p,u,m,c,y,x,v,j,(,),.}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "9", "proteins_unit": "g", "fats": "20", "fats_unit": "g", "carbohydrates": "2", "carbohydrates_unit": "g", "sugars": "1", "sugars_unit": "g", "sodium": "0.55", "sodium_unit": "mg", "fibers": "0", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:41:56.869612 --- ERROR --- DatabaseError(message='malformed array literal: "{C,A,R,B,O,N,T,E,D, ,W,,,H,I,G,F,U,S,Y,L,V,M,Z,(,P,),s,m,a,r,t,l,o,b,e,•,5,1,0,7,c,n,f,i,-,8,4,3,2,9}"LINE 3: ...-432-97,en:preserves-freshness,en:preservative}', '{C,A,R,B,... ^DETAIL: Unexpected "," character.', + payload=('{en:carbonated-water,en:water,en:high-fructose-corn-syri-natural-and-artificial-flavor,en:e330,en:e211,en:caffeine,en:e414,en:sodium-citrate,en:minerals,en:sodium,en:calciu-smartlobel,en:disodium-edta,en:e444,en:e102,en:blue-bottled-under-the-authority-of-pepsico,en:inc,en:purchase,en:ny-10577-scan-for-info-call-for-info-1-800-432-97,en:preserves-freshness,en:preservative}', '{C,A,R,B,O,N,T,E,D, ,W,,,H,I,G,F,U,S,Y,L,V,M,Z,(,P,),s,m,a,r,t,l,o,b,e,•,5,1,0,7,c,n,f,i,-,8,4,3,2,9}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "g", "fibers": "", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:49:48.467790 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "sites_site_name_key"DETAIL: Key (site_name)=(test) already exists.', + payload=('test', 'This is my test site', datetime.datetime(2025, 3, 19, 14, 49, 48, 466784), 1, '{}', None, None, None), + sql='INSERT INTO sites(site_name, site_description, creation_date, site_owner_id, flags, default_zone,default_auto_issue_location, default_primary_location) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:49:53.691975 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "sites_site_name_key"DETAIL: Key (site_name)=(test) already exists.', + payload=('test', 'This is my test site', datetime.datetime(2025, 3, 19, 14, 49, 53, 691975), 1, '{}', None, None, None), + sql='INSERT INTO sites(site_name, site_description, creation_date, site_owner_id, flags, default_zone,default_auto_issue_location, default_primary_location) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:49:54.200974 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "sites_site_name_key"DETAIL: Key (site_name)=(test) already exists.', + payload=('test', 'This is my test site', datetime.datetime(2025, 3, 19, 14, 49, 54, 199652), 1, '{}', None, None, None), + sql='INSERT INTO sites(site_name, site_description, creation_date, site_owner_id, flags, default_zone,default_auto_issue_location, default_primary_location) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:50:55.176081 --- ERROR --- DatabaseError(message='malformed array literal: "{n,o,-,s,t,i,c,k, ,g,p,r,a,y,m,l,v,e,d,x,w,h,f,|,5,0}"LINE 3: ...ificial-preservatives-flavors-colors-net-wt-50}', '{n,o,-,s,... ^DETAIL: Unexpected "," character.', + payload=('{en:no-stick-cooking-spray-pam-olive-oil-made-extra-virgin-olive-oil-with-expeller-pressed-no-artificial-preservatives-flavors-colors-net-wt-50}', '{n,o,-,s,t,i,c,k, ,g,p,r,a,y,m,l,v,e,d,x,w,h,f,|,5,0}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "g", "fibers": "", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:50:55.766282 --- ERROR --- DatabaseError(message='malformed array literal: "{C,a,r,b,o,n,t,e,d, ,W,,,H,i,g,h,F,u,c,s,S,y,p,m,l,P,A,N,v,f,.}"LINE 3: ...l-flavouring,en:flavouring,en:caffeine,en:e330}', '{C,a,r,b,... ^DETAIL: Unexpected "," character.', + payload=('{en:carbonated-water,en:water,en:high-fructose-corn-syrup,en:added-sugar,en:disaccharide,en:monosaccharide,en:fructose,en:glucose,en:corn-syrup,en:glucose-fructose-syrup,en:e150a,en:sugar,en:e338,en:natural-flavouring,en:flavouring,en:caffeine,en:e330}', '{C,a,r,b,o,n,t,e,d, ,W,,,H,i,g,h,F,u,c,s,S,y,p,m,l,P,A,N,v,f,.}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "", "fibers": "", "fibers_unit": ""}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:50:55.800573 --- ERROR --- DatabaseError(message='malformed array literal: "{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}"LINE 3: VALUES ('{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,... ^DETAIL: Unexpected "," character.', + payload=('{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}', '{c,,, ,a,r,b,o,n,t,e,d,w,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "0", "proteins_unit": "g", "fats": "0", "fats_unit": "g", "carbohydrates": "46", "carbohydrates_unit": "g", "sugars": "46", "sugars_unit": "g", "sodium": "0.06", "sodium_unit": "mg", "fibers": "0", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:50:58.247624 --- ERROR --- DatabaseError(message='malformed array literal: "{P,o,r,k,,, ,w,a,t,e,b,n,d,l,s,h,2,%,f,i,g,:,p,u,m,c,y,x,v,j,(,),.}"LINE 3: ...:salt,en:maltodextrin,en:lemon,en:citrus-fruit}', '{P,o,r,k,... ^DETAIL: Unexpected "," character.', + payload=('{en:pork,en:animal,en:water,en:beer,en:alcohol,en:and-less-than-2-of-the-following,en:e326,en:corn-syrup,en:added-sugar,en:disaccharide,en:dextrose,en:monosaccharide,en:glucose,en:spice,en:condiment,en:natural-flavouring,en:flavouring,en:e339,en:e262ii,en:e262,en:lemon-juice,en:fruit,en:juice,en:fruit-juice,en:collagen-casing,en:salt,en:maltodextrin,en:lemon,en:citrus-fruit}', '{P,o,r,k,,, ,w,a,t,e,b,n,d,l,s,h,2,%,f,i,g,:,p,u,m,c,y,x,v,j,(,),.}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "9", "proteins_unit": "g", "fats": "20", "fats_unit": "g", "carbohydrates": "2", "carbohydrates_unit": "g", "sugars": "1", "sugars_unit": "g", "sodium": "0.55", "sodium_unit": "mg", "fibers": "0", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:51:01.113304 --- ERROR --- DatabaseError(message='malformed array literal: "{C,A,R,B,O,N,T,E,D, ,W,,,H,I,G,F,U,S,Y,L,V,M,Z,(,P,),s,m,a,r,t,l,o,b,e,•,5,1,0,7,c,n,f,i,-,8,4,3,2,9}"LINE 3: ...-432-97,en:preserves-freshness,en:preservative}', '{C,A,R,B,... ^DETAIL: Unexpected "," character.', + payload=('{en:carbonated-water,en:water,en:high-fructose-corn-syri-natural-and-artificial-flavor,en:e330,en:e211,en:caffeine,en:e414,en:sodium-citrate,en:minerals,en:sodium,en:calciu-smartlobel,en:disodium-edta,en:e444,en:e102,en:blue-bottled-under-the-authority-of-pepsico,en:inc,en:purchase,en:ny-10577-scan-for-info-call-for-info-1-800-432-97,en:preserves-freshness,en:preservative}', '{C,A,R,B,O,N,T,E,D, ,W,,,H,I,G,F,U,S,Y,L,V,M,Z,(,P,),s,m,a,r,t,l,o,b,e,•,5,1,0,7,c,n,f,i,-,8,4,3,2,9}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "g", "fibers": "", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:51:21.420962 --- ERROR --- DatabaseError(message='malformed array literal: "{n,o,-,s,t,i,c,k, ,g,p,r,a,y,m,l,v,e,d,x,w,h,f,|,5,0}"LINE 3: ...ificial-preservatives-flavors-colors-net-wt-50}', '{n,o,-,s,... ^DETAIL: Unexpected "," character.', + payload=('{en:no-stick-cooking-spray-pam-olive-oil-made-extra-virgin-olive-oil-with-expeller-pressed-no-artificial-preservatives-flavors-colors-net-wt-50}', '{n,o,-,s,t,i,c,k, ,g,p,r,a,y,m,l,v,e,d,x,w,h,f,|,5,0}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "g", "fibers": "", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:51:21.928350 --- ERROR --- DatabaseError(message='malformed array literal: "{C,a,r,b,o,n,t,e,d, ,W,,,H,i,g,h,F,u,c,s,S,y,p,m,l,P,A,N,v,f,.}"LINE 3: ...l-flavouring,en:flavouring,en:caffeine,en:e330}', '{C,a,r,b,... ^DETAIL: Unexpected "," character.', + payload=('{en:carbonated-water,en:water,en:high-fructose-corn-syrup,en:added-sugar,en:disaccharide,en:monosaccharide,en:fructose,en:glucose,en:corn-syrup,en:glucose-fructose-syrup,en:e150a,en:sugar,en:e338,en:natural-flavouring,en:flavouring,en:caffeine,en:e330}', '{C,a,r,b,o,n,t,e,d, ,W,,,H,i,g,h,F,u,c,s,S,y,p,m,l,P,A,N,v,f,.}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "", "fibers": "", "fibers_unit": ""}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:51:21.961384 --- ERROR --- DatabaseError(message='malformed array literal: "{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}"LINE 3: VALUES ('{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,... ^DETAIL: Unexpected "," character.', + payload=('{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}', '{c,,, ,a,r,b,o,n,t,e,d,w,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "0", "proteins_unit": "g", "fats": "0", "fats_unit": "g", "carbohydrates": "46", "carbohydrates_unit": "g", "sugars": "46", "sugars_unit": "g", "sodium": "0.06", "sodium_unit": "mg", "fibers": "0", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:51:24.296390 --- ERROR --- DatabaseError(message='malformed array literal: "{P,o,r,k,,, ,w,a,t,e,b,n,d,l,s,h,2,%,f,i,g,:,p,u,m,c,y,x,v,j,(,),.}"LINE 3: ...:salt,en:maltodextrin,en:lemon,en:citrus-fruit}', '{P,o,r,k,... ^DETAIL: Unexpected "," character.', + payload=('{en:pork,en:animal,en:water,en:beer,en:alcohol,en:and-less-than-2-of-the-following,en:e326,en:corn-syrup,en:added-sugar,en:disaccharide,en:dextrose,en:monosaccharide,en:glucose,en:spice,en:condiment,en:natural-flavouring,en:flavouring,en:e339,en:e262ii,en:e262,en:lemon-juice,en:fruit,en:juice,en:fruit-juice,en:collagen-casing,en:salt,en:maltodextrin,en:lemon,en:citrus-fruit}', '{P,o,r,k,,, ,w,a,t,e,b,n,d,l,s,h,2,%,f,i,g,:,p,u,m,c,y,x,v,j,(,),.}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "9", "proteins_unit": "g", "fats": "20", "fats_unit": "g", "carbohydrates": "2", "carbohydrates_unit": "g", "sugars": "1", "sugars_unit": "g", "sodium": "0.55", "sodium_unit": "mg", "fibers": "0", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:51:26.954053 --- ERROR --- DatabaseError(message='malformed array literal: "{C,A,R,B,O,N,T,E,D, ,W,,,H,I,G,F,U,S,Y,L,V,M,Z,(,P,),s,m,a,r,t,l,o,b,e,•,5,1,0,7,c,n,f,i,-,8,4,3,2,9}"LINE 3: ...-432-97,en:preserves-freshness,en:preservative}', '{C,A,R,B,... ^DETAIL: Unexpected "," character.', + payload=('{en:carbonated-water,en:water,en:high-fructose-corn-syri-natural-and-artificial-flavor,en:e330,en:e211,en:caffeine,en:e414,en:sodium-citrate,en:minerals,en:sodium,en:calciu-smartlobel,en:disodium-edta,en:e444,en:e102,en:blue-bottled-under-the-authority-of-pepsico,en:inc,en:purchase,en:ny-10577-scan-for-info-call-for-info-1-800-432-97,en:preserves-freshness,en:preservative}', '{C,A,R,B,O,N,T,E,D, ,W,,,H,I,G,F,U,S,Y,L,V,M,Z,(,P,),s,m,a,r,t,l,o,b,e,•,5,1,0,7,c,n,f,i,-,8,4,3,2,9}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "g", "fibers": "", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:54:27.195058 --- ERROR --- DatabaseError(message='malformed array literal: "{n,o,-,s,t,i,c,k, ,g,p,r,a,y,m,l,v,e,d,x,w,h,f,|,5,0}"LINE 3: ...ificial-preservatives-flavors-colors-net-wt-50}', '{n,o,-,s,... ^DETAIL: Unexpected "," character.', + payload=('{en:no-stick-cooking-spray-pam-olive-oil-made-extra-virgin-olive-oil-with-expeller-pressed-no-artificial-preservatives-flavors-colors-net-wt-50}', '{n,o,-,s,t,i,c,k, ,g,p,r,a,y,m,l,v,e,d,x,w,h,f,|,5,0}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "g", "fibers": "", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:54:27.834941 --- ERROR --- DatabaseError(message='malformed array literal: "{C,a,r,b,o,n,t,e,d, ,W,,,H,i,g,h,F,u,c,s,S,y,p,m,l,P,A,N,v,f,.}"LINE 3: ...l-flavouring,en:flavouring,en:caffeine,en:e330}', '{C,a,r,b,... ^DETAIL: Unexpected "," character.', + payload=('{en:carbonated-water,en:water,en:high-fructose-corn-syrup,en:added-sugar,en:disaccharide,en:monosaccharide,en:fructose,en:glucose,en:corn-syrup,en:glucose-fructose-syrup,en:e150a,en:sugar,en:e338,en:natural-flavouring,en:flavouring,en:caffeine,en:e330}', '{C,a,r,b,o,n,t,e,d, ,W,,,H,i,g,h,F,u,c,s,S,y,p,m,l,P,A,N,v,f,.}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "", "fibers": "", "fibers_unit": ""}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:54:27.879739 --- ERROR --- DatabaseError(message='malformed array literal: "{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}"LINE 3: VALUES ('{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,... ^DETAIL: Unexpected "," character.', + payload=('{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}', '{c,,, ,a,r,b,o,n,t,e,d,w,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "0", "proteins_unit": "g", "fats": "0", "fats_unit": "g", "carbohydrates": "46", "carbohydrates_unit": "g", "sugars": "46", "sugars_unit": "g", "sodium": "0.06", "sodium_unit": "mg", "fibers": "0", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:54:30.255974 --- ERROR --- DatabaseError(message='malformed array literal: "{P,o,r,k,,, ,w,a,t,e,b,n,d,l,s,h,2,%,f,i,g,:,p,u,m,c,y,x,v,j,(,),.}"LINE 3: ...:salt,en:maltodextrin,en:lemon,en:citrus-fruit}', '{P,o,r,k,... ^DETAIL: Unexpected "," character.', + payload=('{en:pork,en:animal,en:water,en:beer,en:alcohol,en:and-less-than-2-of-the-following,en:e326,en:corn-syrup,en:added-sugar,en:disaccharide,en:dextrose,en:monosaccharide,en:glucose,en:spice,en:condiment,en:natural-flavouring,en:flavouring,en:e339,en:e262ii,en:e262,en:lemon-juice,en:fruit,en:juice,en:fruit-juice,en:collagen-casing,en:salt,en:maltodextrin,en:lemon,en:citrus-fruit}', '{P,o,r,k,,, ,w,a,t,e,b,n,d,l,s,h,2,%,f,i,g,:,p,u,m,c,y,x,v,j,(,),.}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "9", "proteins_unit": "g", "fats": "20", "fats_unit": "g", "carbohydrates": "2", "carbohydrates_unit": "g", "sugars": "1", "sugars_unit": "g", "sodium": "0.55", "sodium_unit": "mg", "fibers": "0", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:54:32.971379 --- ERROR --- DatabaseError(message='malformed array literal: "{C,A,R,B,O,N,T,E,D, ,W,,,H,I,G,F,U,S,Y,L,V,M,Z,(,P,),s,m,a,r,t,l,o,b,e,•,5,1,0,7,c,n,f,i,-,8,4,3,2,9}"LINE 3: ...-432-97,en:preserves-freshness,en:preservative}', '{C,A,R,B,... ^DETAIL: Unexpected "," character.', + payload=('{en:carbonated-water,en:water,en:high-fructose-corn-syri-natural-and-artificial-flavor,en:e330,en:e211,en:caffeine,en:e414,en:sodium-citrate,en:minerals,en:sodium,en:calciu-smartlobel,en:disodium-edta,en:e444,en:e102,en:blue-bottled-under-the-authority-of-pepsico,en:inc,en:purchase,en:ny-10577-scan-for-info-call-for-info-1-800-432-97,en:preserves-freshness,en:preservative}', '{C,A,R,B,O,N,T,E,D, ,W,,,H,I,G,F,U,S,Y,L,V,M,Z,(,P,),s,m,a,r,t,l,o,b,e,•,5,1,0,7,c,n,f,i,-,8,4,3,2,9}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "g", "fibers": "", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:56:35.749498 --- ERROR --- DatabaseError(message='malformed array literal: "{n,o,-,s,t,i,c,k, ,g,p,r,a,y,m,l,v,e,d,x,w,h,f,|,5,0}"LINE 3: ...ificial-preservatives-flavors-colors-net-wt-50}', '{n,o,-,s,... ^DETAIL: Unexpected "," character.', + payload=('{en:no-stick-cooking-spray-pam-olive-oil-made-extra-virgin-olive-oil-with-expeller-pressed-no-artificial-preservatives-flavors-colors-net-wt-50}', '{n,o,-,s,t,i,c,k, ,g,p,r,a,y,m,l,v,e,d,x,w,h,f,|,5,0}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "g", "fibers": "", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:56:36.282177 --- ERROR --- DatabaseError(message='malformed array literal: "{C,a,r,b,o,n,t,e,d, ,W,,,H,i,g,h,F,u,c,s,S,y,p,m,l,P,A,N,v,f,.}"LINE 3: ...l-flavouring,en:flavouring,en:caffeine,en:e330}', '{C,a,r,b,... ^DETAIL: Unexpected "," character.', + payload=('{en:carbonated-water,en:water,en:high-fructose-corn-syrup,en:added-sugar,en:disaccharide,en:monosaccharide,en:fructose,en:glucose,en:corn-syrup,en:glucose-fructose-syrup,en:e150a,en:sugar,en:e338,en:natural-flavouring,en:flavouring,en:caffeine,en:e330}', '{C,a,r,b,o,n,t,e,d, ,W,,,H,i,g,h,F,u,c,s,S,y,p,m,l,P,A,N,v,f,.}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "", "fibers": "", "fibers_unit": ""}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:56:36.311650 --- ERROR --- DatabaseError(message='malformed array literal: "{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}"LINE 3: VALUES ('{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,... ^DETAIL: Unexpected "," character.', + payload=('{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}', '{c,,, ,a,r,b,o,n,t,e,d,w,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "0", "proteins_unit": "g", "fats": "0", "fats_unit": "g", "carbohydrates": "46", "carbohydrates_unit": "g", "sugars": "46", "sugars_unit": "g", "sodium": "0.06", "sodium_unit": "mg", "fibers": "0", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:56:38.381903 --- ERROR --- DatabaseError(message='malformed array literal: "{P,o,r,k,,, ,w,a,t,e,b,n,d,l,s,h,2,%,f,i,g,:,p,u,m,c,y,x,v,j,(,),.}"LINE 3: ...:salt,en:maltodextrin,en:lemon,en:citrus-fruit}', '{P,o,r,k,... ^DETAIL: Unexpected "," character.', + payload=('{en:pork,en:animal,en:water,en:beer,en:alcohol,en:and-less-than-2-of-the-following,en:e326,en:corn-syrup,en:added-sugar,en:disaccharide,en:dextrose,en:monosaccharide,en:glucose,en:spice,en:condiment,en:natural-flavouring,en:flavouring,en:e339,en:e262ii,en:e262,en:lemon-juice,en:fruit,en:juice,en:fruit-juice,en:collagen-casing,en:salt,en:maltodextrin,en:lemon,en:citrus-fruit}', '{P,o,r,k,,, ,w,a,t,e,b,n,d,l,s,h,2,%,f,i,g,:,p,u,m,c,y,x,v,j,(,),.}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "9", "proteins_unit": "g", "fats": "20", "fats_unit": "g", "carbohydrates": "2", "carbohydrates_unit": "g", "sugars": "1", "sugars_unit": "g", "sodium": "0.55", "sodium_unit": "mg", "fibers": "0", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:56:40.965828 --- ERROR --- DatabaseError(message='malformed array literal: "{C,A,R,B,O,N,T,E,D, ,W,,,H,I,G,F,U,S,Y,L,V,M,Z,(,P,),s,m,a,r,t,l,o,b,e,•,5,1,0,7,c,n,f,i,-,8,4,3,2,9}"LINE 3: ...-432-97,en:preserves-freshness,en:preservative}', '{C,A,R,B,... ^DETAIL: Unexpected "," character.', + payload=('{en:carbonated-water,en:water,en:high-fructose-corn-syri-natural-and-artificial-flavor,en:e330,en:e211,en:caffeine,en:e414,en:sodium-citrate,en:minerals,en:sodium,en:calciu-smartlobel,en:disodium-edta,en:e444,en:e102,en:blue-bottled-under-the-authority-of-pepsico,en:inc,en:purchase,en:ny-10577-scan-for-info-call-for-info-1-800-432-97,en:preserves-freshness,en:preservative}', '{C,A,R,B,O,N,T,E,D, ,W,,,H,I,G,F,U,S,Y,L,V,M,Z,(,P,),s,m,a,r,t,l,o,b,e,•,5,1,0,7,c,n,f,i,-,8,4,3,2,9}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "g", "fibers": "", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:57:29.949369 --- ERROR --- DatabaseError(message='malformed array literal: "{n,o,-,s,t,i,c,k, ,g,p,r,a,y,m,l,v,e,d,x,w,h,f,|,5,0}"LINE 3: ...ificial-preservatives-flavors-colors-net-wt-50}', '{n,o,-,s,... ^DETAIL: Unexpected "," character.', + payload=('{en:no-stick-cooking-spray-pam-olive-oil-made-extra-virgin-olive-oil-with-expeller-pressed-no-artificial-preservatives-flavors-colors-net-wt-50}', '{n,o,-,s,t,i,c,k, ,g,p,r,a,y,m,l,v,e,d,x,w,h,f,|,5,0}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "g", "fibers": "", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:57:30.445350 --- ERROR --- DatabaseError(message='malformed array literal: "{C,a,r,b,o,n,t,e,d, ,W,,,H,i,g,h,F,u,c,s,S,y,p,m,l,P,A,N,v,f,.}"LINE 3: ...l-flavouring,en:flavouring,en:caffeine,en:e330}', '{C,a,r,b,... ^DETAIL: Unexpected "," character.', + payload=('{en:carbonated-water,en:water,en:high-fructose-corn-syrup,en:added-sugar,en:disaccharide,en:monosaccharide,en:fructose,en:glucose,en:corn-syrup,en:glucose-fructose-syrup,en:e150a,en:sugar,en:e338,en:natural-flavouring,en:flavouring,en:caffeine,en:e330}', '{C,a,r,b,o,n,t,e,d, ,W,,,H,i,g,h,F,u,c,s,S,y,p,m,l,P,A,N,v,f,.}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "", "fibers": "", "fibers_unit": ""}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:57:30.482176 --- ERROR --- DatabaseError(message='malformed array literal: "{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}"LINE 3: VALUES ('{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,... ^DETAIL: Unexpected "," character.', + payload=('{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}', '{c,,, ,a,r,b,o,n,t,e,d,w,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "0", "proteins_unit": "g", "fats": "0", "fats_unit": "g", "carbohydrates": "46", "carbohydrates_unit": "g", "sugars": "46", "sugars_unit": "g", "sodium": "0.06", "sodium_unit": "mg", "fibers": "0", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:57:32.484221 --- ERROR --- DatabaseError(message='malformed array literal: "{P,o,r,k,,, ,w,a,t,e,b,n,d,l,s,h,2,%,f,i,g,:,p,u,m,c,y,x,v,j,(,),.}"LINE 3: ...:salt,en:maltodextrin,en:lemon,en:citrus-fruit}', '{P,o,r,k,... ^DETAIL: Unexpected "," character.', + payload=('{en:pork,en:animal,en:water,en:beer,en:alcohol,en:and-less-than-2-of-the-following,en:e326,en:corn-syrup,en:added-sugar,en:disaccharide,en:dextrose,en:monosaccharide,en:glucose,en:spice,en:condiment,en:natural-flavouring,en:flavouring,en:e339,en:e262ii,en:e262,en:lemon-juice,en:fruit,en:juice,en:fruit-juice,en:collagen-casing,en:salt,en:maltodextrin,en:lemon,en:citrus-fruit}', '{P,o,r,k,,, ,w,a,t,e,b,n,d,l,s,h,2,%,f,i,g,:,p,u,m,c,y,x,v,j,(,),.}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "9", "proteins_unit": "g", "fats": "20", "fats_unit": "g", "carbohydrates": "2", "carbohydrates_unit": "g", "sugars": "1", "sugars_unit": "g", "sodium": "0.55", "sodium_unit": "mg", "fibers": "0", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 14:57:34.898794 --- ERROR --- DatabaseError(message='malformed array literal: "{C,A,R,B,O,N,T,E,D, ,W,,,H,I,G,F,U,S,Y,L,V,M,Z,(,P,),s,m,a,r,t,l,o,b,e,•,5,1,0,7,c,n,f,i,-,8,4,3,2,9}"LINE 3: ...-432-97,en:preserves-freshness,en:preservative}', '{C,A,R,B,... ^DETAIL: Unexpected "," character.', + payload=('{en:carbonated-water,en:water,en:high-fructose-corn-syri-natural-and-artificial-flavor,en:e330,en:e211,en:caffeine,en:e414,en:sodium-citrate,en:minerals,en:sodium,en:calciu-smartlobel,en:disodium-edta,en:e444,en:e102,en:blue-bottled-under-the-authority-of-pepsico,en:inc,en:purchase,en:ny-10577-scan-for-info-call-for-info-1-800-432-97,en:preserves-freshness,en:preservative}', '{C,A,R,B,O,N,T,E,D, ,W,,,H,I,G,F,U,S,Y,L,V,M,Z,(,P,),s,m,a,r,t,l,o,b,e,•,5,1,0,7,c,n,f,i,-,8,4,3,2,9}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "g", "fibers": "", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 15:00:20.968131 --- ERROR --- DatabaseError(message='malformed array literal: "{n,o,-,s,t,i,c,k, ,g,p,r,a,y,m,l,v,e,d,x,w,h,f,|,5,0}"LINE 3: ...ificial-preservatives-flavors-colors-net-wt-50}', '{n,o,-,s,... ^DETAIL: Unexpected "," character.', + payload=('{en:no-stick-cooking-spray-pam-olive-oil-made-extra-virgin-olive-oil-with-expeller-pressed-no-artificial-preservatives-flavors-colors-net-wt-50}', '{n,o,-,s,t,i,c,k, ,g,p,r,a,y,m,l,v,e,d,x,w,h,f,|,5,0}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "g", "fibers": "", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 15:00:21.697897 --- ERROR --- DatabaseError(message='malformed array literal: "{C,a,r,b,o,n,t,e,d, ,W,,,H,i,g,h,F,u,c,s,S,y,p,m,l,P,A,N,v,f,.}"LINE 3: ...l-flavouring,en:flavouring,en:caffeine,en:e330}', '{C,a,r,b,... ^DETAIL: Unexpected "," character.', + payload=('{en:carbonated-water,en:water,en:high-fructose-corn-syrup,en:added-sugar,en:disaccharide,en:monosaccharide,en:fructose,en:glucose,en:corn-syrup,en:glucose-fructose-syrup,en:e150a,en:sugar,en:e338,en:natural-flavouring,en:flavouring,en:caffeine,en:e330}', '{C,a,r,b,o,n,t,e,d, ,W,,,H,i,g,h,F,u,c,s,S,y,p,m,l,P,A,N,v,f,.}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "", "fibers": "", "fibers_unit": ""}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 15:00:21.731824 --- ERROR --- DatabaseError(message='malformed array literal: "{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}"LINE 3: VALUES ('{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,... ^DETAIL: Unexpected "," character.', + payload=('{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}', '{c,,, ,a,r,b,o,n,t,e,d,w,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "0", "proteins_unit": "g", "fats": "0", "fats_unit": "g", "carbohydrates": "46", "carbohydrates_unit": "g", "sugars": "46", "sugars_unit": "g", "sodium": "0.06", "sodium_unit": "mg", "fibers": "0", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 15:00:24.310086 --- ERROR --- DatabaseError(message='malformed array literal: "{P,o,r,k,,, ,w,a,t,e,b,n,d,l,s,h,2,%,f,i,g,:,p,u,m,c,y,x,v,j,(,),.}"LINE 3: ...:salt,en:maltodextrin,en:lemon,en:citrus-fruit}', '{P,o,r,k,... ^DETAIL: Unexpected "," character.', + payload=('{en:pork,en:animal,en:water,en:beer,en:alcohol,en:and-less-than-2-of-the-following,en:e326,en:corn-syrup,en:added-sugar,en:disaccharide,en:dextrose,en:monosaccharide,en:glucose,en:spice,en:condiment,en:natural-flavouring,en:flavouring,en:e339,en:e262ii,en:e262,en:lemon-juice,en:fruit,en:juice,en:fruit-juice,en:collagen-casing,en:salt,en:maltodextrin,en:lemon,en:citrus-fruit}', '{P,o,r,k,,, ,w,a,t,e,b,n,d,l,s,h,2,%,f,i,g,:,p,u,m,c,y,x,v,j,(,),.}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "9", "proteins_unit": "g", "fats": "20", "fats_unit": "g", "carbohydrates": "2", "carbohydrates_unit": "g", "sugars": "1", "sugars_unit": "g", "sodium": "0.55", "sodium_unit": "mg", "fibers": "0", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 15:00:28.181626 --- ERROR --- DatabaseError(message='malformed array literal: "{C,A,R,B,O,N,T,E,D, ,W,,,H,I,G,F,U,S,Y,L,V,M,Z,(,P,),s,m,a,r,t,l,o,b,e,•,5,1,0,7,c,n,f,i,-,8,4,3,2,9}"LINE 3: ...-432-97,en:preserves-freshness,en:preservative}', '{C,A,R,B,... ^DETAIL: Unexpected "," character.', + payload=('{en:carbonated-water,en:water,en:high-fructose-corn-syri-natural-and-artificial-flavor,en:e330,en:e211,en:caffeine,en:e414,en:sodium-citrate,en:minerals,en:sodium,en:calciu-smartlobel,en:disodium-edta,en:e444,en:e102,en:blue-bottled-under-the-authority-of-pepsico,en:inc,en:purchase,en:ny-10577-scan-for-info-call-for-info-1-800-432-97,en:preserves-freshness,en:preservative}', '{C,A,R,B,O,N,T,E,D, ,W,,,H,I,G,F,U,S,Y,L,V,M,Z,(,P,),s,m,a,r,t,l,o,b,e,•,5,1,0,7,c,n,f,i,-,8,4,3,2,9}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "g", "fibers": "", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO test_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 15:01:38.354494 --- ERROR --- DatabaseError(message='malformed array literal: "{n,o,-,s,t,i,c,k, ,g,p,r,a,y,m,l,v,e,d,x,w,h,f,|,5,0}"LINE 3: ...ificial-preservatives-flavors-colors-net-wt-50}', '{n,o,-,s,... ^DETAIL: Unexpected "," character.', + payload=('{en:no-stick-cooking-spray-pam-olive-oil-made-extra-virgin-olive-oil-with-expeller-pressed-no-artificial-preservatives-flavors-colors-net-wt-50}', '{n,o,-,s,t,i,c,k, ,g,p,r,a,y,m,l,v,e,d,x,w,h,f,|,5,0}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "g", "fibers": "", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO main_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 15:01:39.091670 --- ERROR --- DatabaseError(message='malformed array literal: "{C,a,r,b,o,n,t,e,d, ,W,,,H,i,g,h,F,u,c,s,S,y,p,m,l,P,A,N,v,f,.}"LINE 3: ...l-flavouring,en:flavouring,en:caffeine,en:e330}', '{C,a,r,b,... ^DETAIL: Unexpected "," character.', + payload=('{en:carbonated-water,en:water,en:high-fructose-corn-syrup,en:added-sugar,en:disaccharide,en:monosaccharide,en:fructose,en:glucose,en:corn-syrup,en:glucose-fructose-syrup,en:e150a,en:sugar,en:e338,en:natural-flavouring,en:flavouring,en:caffeine,en:e330}', '{C,a,r,b,o,n,t,e,d, ,W,,,H,i,g,h,F,u,c,s,S,y,p,m,l,P,A,N,v,f,.}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "", "fibers": "", "fibers_unit": ""}', False, 0.0), + sql='INSERT INTO main_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 15:01:39.122455 --- ERROR --- DatabaseError(message='malformed array literal: "{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}"LINE 3: VALUES ('{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,... ^DETAIL: Unexpected "," character.', + payload=('{c,a,r,b,o,n,t,e,d, ,w,,,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}', '{c,,, ,a,r,b,o,n,t,e,d,w,h,i,g,f,u,s,y,p,j,l,v,m,z,(,),5}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "0", "proteins_unit": "g", "fats": "0", "fats_unit": "g", "carbohydrates": "46", "carbohydrates_unit": "g", "sugars": "46", "sugars_unit": "g", "sodium": "0.06", "sodium_unit": "mg", "fibers": "0", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO main_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 15:01:42.144637 --- ERROR --- DatabaseError(message='malformed array literal: "{P,o,r,k,,, ,w,a,t,e,b,n,d,l,s,h,2,%,f,i,g,:,p,u,m,c,y,x,v,j,(,),.}"LINE 3: ...:salt,en:maltodextrin,en:lemon,en:citrus-fruit}', '{P,o,r,k,... ^DETAIL: Unexpected "," character.', + payload=('{en:pork,en:animal,en:water,en:beer,en:alcohol,en:and-less-than-2-of-the-following,en:e326,en:corn-syrup,en:added-sugar,en:disaccharide,en:dextrose,en:monosaccharide,en:glucose,en:spice,en:condiment,en:natural-flavouring,en:flavouring,en:e339,en:e262ii,en:e262,en:lemon-juice,en:fruit,en:juice,en:fruit-juice,en:collagen-casing,en:salt,en:maltodextrin,en:lemon,en:citrus-fruit}', '{P,o,r,k,,, ,w,a,t,e,b,n,d,l,s,h,2,%,f,i,g,:,p,u,m,c,y,x,v,j,(,),.}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "9", "proteins_unit": "g", "fats": "20", "fats_unit": "g", "carbohydrates": "2", "carbohydrates_unit": "g", "sugars": "1", "sugars_unit": "g", "sodium": "0.55", "sodium_unit": "mg", "fibers": "0", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO main_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 15:01:45.898068 --- ERROR --- DatabaseError(message='malformed array literal: "{C,A,R,B,O,N,T,E,D, ,W,,,H,I,G,F,U,S,Y,L,V,M,Z,(,P,),s,m,a,r,t,l,o,b,e,•,5,1,0,7,c,n,f,i,-,8,4,3,2,9}"LINE 3: ...-432-97,en:preserves-freshness,en:preservative}', '{C,A,R,B,... ^DETAIL: Unexpected "," character.', + payload=('{en:carbonated-water,en:water,en:high-fructose-corn-syri-natural-and-artificial-flavor,en:e330,en:e211,en:caffeine,en:e414,en:sodium-citrate,en:minerals,en:sodium,en:calciu-smartlobel,en:disodium-edta,en:e444,en:e102,en:blue-bottled-under-the-authority-of-pepsico,en:inc,en:purchase,en:ny-10577-scan-for-info-call-for-info-1-800-432-97,en:preserves-freshness,en:preservative}', '{C,A,R,B,O,N,T,E,D, ,W,,,H,I,G,F,U,S,Y,L,V,M,Z,(,P,),s,m,a,r,t,l,o,b,e,•,5,1,0,7,c,n,f,i,-,8,4,3,2,9}', '{"serving": "", "serving_unit": "", "calories": "", "calories_unit": "None", "proteins": "", "proteins_unit": "g", "fats": "", "fats_unit": "g", "carbohydrates": "", "carbohydrates_unit": "g", "sugars": "", "sugars_unit": "g", "sodium": "", "sodium_unit": "g", "fibers": "", "fibers_unit": "g"}', False, 0.0), + sql='INSERT INTO main_food_info(ingrediants, food_groups, nutrients, expires, default_expiration) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 15:24:34.268066 --- ERROR --- DatabaseError(message='null value in column "item_type" of relation "test_items" violates not-null constraintDETAIL: Failing row contains (2420, %085239110744%, Diced Tomatoes, 1, , {}, {}, 2450, 2450, 2420, single, null, &&%085239110744%&&Diced Tomatoes&&).', + payload=('%085239110744%', 'Diced Tomatoes', 1, '', '{}', '{}', 2450, 2450, 2420, 'single', None, '&&%085239110744%&&Diced Tomatoes&&'), + sql='INSERT INTO test_items(barcode, item_name, brand, description, tags, links, item_info_id, logistics_info_id, food_info_id, row_type, item_type, search_string) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 15:24:34.275772 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01201303%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:24:34.285777 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%07831504%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:24:34.295490 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01231003%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:24:34.304806 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%049000007251%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:24:34.314640 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%04905004%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:24:34.323110 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01231003%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:24:34.330796 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:24:34.338177 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%07831504%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:24:34.346223 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%FIBERONE%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:24:34.353814 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:24:34.362011 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:24:34.369416 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:24:34.375914 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:24:34.384479 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:24:34.392456 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:24:34.400547 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:24:34.408550 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:24:34.417426 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%04963406%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:24:34.425024 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:26:23.542486 --- ERROR --- DatabaseError(message='null value in column "item_type" of relation "test_items" violates not-null constraintDETAIL: Failing row contains (2422, %085239110744%, Diced Tomatoes, 1, , {}, {}, 2452, 2452, 2422, single, null, &&%085239110744%&&Diced Tomatoes&&).', + payload=('%085239110744%', 'Diced Tomatoes', 1, '', '{}', '{}', 2452, 2452, 2422, 'single', None, '&&%085239110744%&&Diced Tomatoes&&'), + sql='INSERT INTO test_items(barcode, item_name, brand, description, tags, links, item_info_id, logistics_info_id, food_info_id, row_type, item_type, search_string) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 15:26:23.550679 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01201303%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:26:23.558832 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%07831504%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:26:23.566519 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01231003%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:26:23.574410 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%049000007251%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:26:23.582457 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%04905004%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:26:23.590494 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01231003%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:26:23.598954 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:26:23.606624 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%07831504%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:26:23.614475 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%FIBERONE%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:26:23.622267 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:26:23.630290 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:26:23.638330 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:26:23.645659 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:26:23.653421 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:26:23.661556 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:26:23.669451 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:26:23.678515 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:26:23.685986 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%04963406%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:26:23.694799 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.023584 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_logistics_info_barcode_key"DETAIL: Key (barcode)=(%194346066674%) already exists.', + payload=('%194346066674%', 1, 1, 1, 1), + sql='INSERT INTO test_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 15:27:07.031336 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.039649 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.047219 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%test123%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.055467 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%%poptart%%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.063442 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.071542 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.079304 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000231315%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.087192 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000231346%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.091852 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000183669%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.099208 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000130311%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.108464 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%DicedTomatoes%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.116312 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%DicedTomatoes%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.123628 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01201303%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.131791 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%07831504%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.139810 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01231003%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.147612 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%049000007251%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.155886 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%04905004%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.163577 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01231003%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.171429 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.180046 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%07831504%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.188010 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%FIBERONE%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.195229 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.203456 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.211597 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.219621 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.228627 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.236261 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.244440 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.252545 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.260698 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%04963406%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:27:07.269477 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.230475 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_logistics_info_barcode_key"DETAIL: Key (barcode)=(%194346066674%) already exists.', + payload=('%194346066674%', 1, 1, 1, 1), + sql='INSERT INTO test_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 15:31:10.237981 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%194346066674%', 2243, '{"id": null, "barcode": "%194346066674%", "name": "Bath Tissue", "brands": "Great Value", "brands_tags": ["Great Value"], "categories": [""], "food_groups_tags": [""], "ingredients_hierarchy": [""], "ingredients_text_en": "", "nutriments": {"carbohydrates": "0", "carbohydrates_100g": 0, "carbohydrates_unit": "", "carbohydrates_value": 0, "energy": 0, "energy-kcal": 0, "energy-kcal_100g": 0, "energy-kcal_unit": "", "energy-kcal_value": 0, "energy-kcal_value_computed": 0, "energy_100g": 0, "energy_unit": "", "energy_value": 0, "fat": 0, "fat_100g": 0, "fat_unit": "", "fat_value": 0, "fruits-vegetables-legumes-estimate-from-ingredients_100g": 0, "fruits-vegetables-legumes-estimate-from-ingredients_serving": 0, "fruits-vegetables-nuts-estimate-from-ingredients_100g": 0, "fruits-vegetables-nuts-estimate-from-ingredients_serving": 0, "nova-group": 0, "nova-group_100g": 0, "nova-group_serving": 0, "proteins": "0", "proteins_100g": 0, "proteins_unit": "", "proteins_value": 0, "saturated-fat": 0, "saturated-fat_100g": 0, "saturated-fat_unit": "", "saturated-fat_value": 0, "sugars": "0", "sugars_100g": 0, "sugars_unit": "", "sugars_value": 0, "serving": "", "calories": "", "fats": "", "sodium": "", "fibers": "", "serving_unit": "", "calories_unit": null, "fats_unit": "", "sodium_unit": "", "fibers_unit": ""}, "packaging": "case", "product_name": "Bath Tissue", "product_quantity": 1, "product_quantity_unit": "case", "quantity": 1, "cost": 0, "transactions_id": 260, "safety_stock": "None", "lead_time": 0, "groups": [], "links": [], "AI_Pickable": "FALSE", "entry_type": "ITEM", "linked_list": [], "search_string": "Great Value&&&&Bath Tissue", "qty_on_hand": 1}', '12'), + sql='INSERT INTO test_itemlinks(barcode, link, data, conv_factor) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-03-19 15:31:10.243882 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.251395 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.259470 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%test123%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.268159 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%%poptart%%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.276318 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.284456 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.292716 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000231315%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.300418 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000231346%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.308740 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000183669%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.316130 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000130311%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.324250 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%DicedTomatoes%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.332690 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%DicedTomatoes%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.340437 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01201303%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.348522 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%07831504%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.356004 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01231003%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.364768 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%049000007251%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.373328 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%04905004%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.381134 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01231003%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.389177 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.397305 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%07831504%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.405962 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%FIBERONE%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.413475 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.421573 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.429606 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.438404 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.446132 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.454212 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.462474 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.470630 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.478509 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%04963406%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:10.487403 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.348704 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_logistics_info_barcode_key"DETAIL: Key (barcode)=(%194346066674%) already exists.', + payload=('%194346066674%', 1, 1, 1, 1), + sql='INSERT INTO test_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 15:31:28.356213 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%194346066674%', 2243, '{"id": null, "barcode": "%194346066674%", "name": "Bath Tissue", "brands": "Great Value", "brands_tags": ["Great Value"], "categories": [""], "food_groups_tags": [""], "ingredients_hierarchy": [""], "ingredients_text_en": "", "nutriments": {"carbohydrates": "0", "carbohydrates_100g": 0, "carbohydrates_unit": "", "carbohydrates_value": 0, "energy": 0, "energy-kcal": 0, "energy-kcal_100g": 0, "energy-kcal_unit": "", "energy-kcal_value": 0, "energy-kcal_value_computed": 0, "energy_100g": 0, "energy_unit": "", "energy_value": 0, "fat": 0, "fat_100g": 0, "fat_unit": "", "fat_value": 0, "fruits-vegetables-legumes-estimate-from-ingredients_100g": 0, "fruits-vegetables-legumes-estimate-from-ingredients_serving": 0, "fruits-vegetables-nuts-estimate-from-ingredients_100g": 0, "fruits-vegetables-nuts-estimate-from-ingredients_serving": 0, "nova-group": 0, "nova-group_100g": 0, "nova-group_serving": 0, "proteins": "0", "proteins_100g": 0, "proteins_unit": "", "proteins_value": 0, "saturated-fat": 0, "saturated-fat_100g": 0, "saturated-fat_unit": "", "saturated-fat_value": 0, "sugars": "0", "sugars_100g": 0, "sugars_unit": "", "sugars_value": 0, "serving": "", "calories": "", "fats": "", "sodium": "", "fibers": "", "serving_unit": "", "calories_unit": null, "fats_unit": "", "sodium_unit": "", "fibers_unit": ""}, "packaging": "case", "product_name": "Bath Tissue", "product_quantity": 1, "product_quantity_unit": "case", "quantity": 1, "cost": 0, "transactions_id": 260, "safety_stock": "None", "lead_time": 0, "groups": [], "links": [], "AI_Pickable": "FALSE", "entry_type": "ITEM", "linked_list": [], "search_string": "Great Value&&&&Bath Tissue", "qty_on_hand": 1}', '12'), + sql='INSERT INTO test_itemlinks(barcode, link, data, conv_factor) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-03-19 15:31:28.361126 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.369883 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.377646 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%test123%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.385069 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%%poptart%%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.393162 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.401077 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.409528 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000231315%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.417548 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000231346%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.425716 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000183669%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.433171 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000130311%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.441580 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%DicedTomatoes%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.449676 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%DicedTomatoes%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.457602 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01201303%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.464831 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%07831504%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.473322 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01231003%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.480547 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%049000007251%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.488443 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%04905004%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.496522 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01231003%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.504632 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.512456 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%07831504%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.520367 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%FIBERONE%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.528695 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.536158 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.544343 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.552127 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.560073 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.567627 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.576455 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.584196 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.592674 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%04963406%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:31:28.600183 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.256297 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_logistics_info_barcode_key"DETAIL: Key (barcode)=(%194346066674%) already exists.', + payload=('%194346066674%', 1, 1, 1, 1), + sql='INSERT INTO test_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 15:32:33.264350 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%194346066674%', 2243, '{"id": null, "barcode": "%194346066674%", "name": "Bath Tissue", "brands": "Great Value", "brands_tags": ["Great Value"], "categories": [""], "food_groups_tags": [""], "ingredients_hierarchy": [""], "ingredients_text_en": "", "nutriments": {"carbohydrates": "0", "carbohydrates_100g": 0, "carbohydrates_unit": "", "carbohydrates_value": 0, "energy": 0, "energy-kcal": 0, "energy-kcal_100g": 0, "energy-kcal_unit": "", "energy-kcal_value": 0, "energy-kcal_value_computed": 0, "energy_100g": 0, "energy_unit": "", "energy_value": 0, "fat": 0, "fat_100g": 0, "fat_unit": "", "fat_value": 0, "fruits-vegetables-legumes-estimate-from-ingredients_100g": 0, "fruits-vegetables-legumes-estimate-from-ingredients_serving": 0, "fruits-vegetables-nuts-estimate-from-ingredients_100g": 0, "fruits-vegetables-nuts-estimate-from-ingredients_serving": 0, "nova-group": 0, "nova-group_100g": 0, "nova-group_serving": 0, "proteins": "0", "proteins_100g": 0, "proteins_unit": "", "proteins_value": 0, "saturated-fat": 0, "saturated-fat_100g": 0, "saturated-fat_unit": "", "saturated-fat_value": 0, "sugars": "0", "sugars_100g": 0, "sugars_unit": "", "sugars_value": 0, "serving": "", "calories": "", "fats": "", "sodium": "", "fibers": "", "serving_unit": "", "calories_unit": null, "fats_unit": "", "sodium_unit": "", "fibers_unit": ""}, "packaging": "case", "product_name": "Bath Tissue", "product_quantity": 1, "product_quantity_unit": "case", "quantity": 1, "cost": 0, "transactions_id": 260, "safety_stock": "None", "lead_time": 0, "groups": [], "links": [], "AI_Pickable": "FALSE", "entry_type": "ITEM", "linked_list": [], "search_string": "Great Value&&&&Bath Tissue", "qty_on_hand": 1}', '12'), + sql='INSERT INTO test_itemlinks(barcode, link, data, conv_factor) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-03-19 15:32:33.269359 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.277356 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.285602 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%test123%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.293842 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%%poptart%%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.301972 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.309914 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.317935 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000231315%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.325438 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000231346%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.333619 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000183669%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.341857 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000130311%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.349790 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%DicedTomatoes%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.357362 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%DicedTomatoes%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.365222 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01201303%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.373164 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%07831504%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.380703 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01231003%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.389658 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%049000007251%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.397327 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%04905004%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.405066 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01231003%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.413270 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.421759 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%07831504%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.429797 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%FIBERONE%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.438712 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.445997 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.454472 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.462496 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.470570 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.479439 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.487754 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.496109 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.504067 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%04963406%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:33.511681 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.291836 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_logistics_info_barcode_key"DETAIL: Key (barcode)=(%194346066674%) already exists.', + payload=('%194346066674%', 1, 1, 1, 1), + sql='INSERT INTO test_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 15:32:57.297675 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%194346066674%', 2243, '{"id": null, "barcode": "%194346066674%", "name": "Bath Tissue", "brands": "Great Value", "brands_tags": ["Great Value"], "categories": [""], "food_groups_tags": [""], "ingredients_hierarchy": [""], "ingredients_text_en": "", "nutriments": {"carbohydrates": "0", "carbohydrates_100g": 0, "carbohydrates_unit": "", "carbohydrates_value": 0, "energy": 0, "energy-kcal": 0, "energy-kcal_100g": 0, "energy-kcal_unit": "", "energy-kcal_value": 0, "energy-kcal_value_computed": 0, "energy_100g": 0, "energy_unit": "", "energy_value": 0, "fat": 0, "fat_100g": 0, "fat_unit": "", "fat_value": 0, "fruits-vegetables-legumes-estimate-from-ingredients_100g": 0, "fruits-vegetables-legumes-estimate-from-ingredients_serving": 0, "fruits-vegetables-nuts-estimate-from-ingredients_100g": 0, "fruits-vegetables-nuts-estimate-from-ingredients_serving": 0, "nova-group": 0, "nova-group_100g": 0, "nova-group_serving": 0, "proteins": "0", "proteins_100g": 0, "proteins_unit": "", "proteins_value": 0, "saturated-fat": 0, "saturated-fat_100g": 0, "saturated-fat_unit": "", "saturated-fat_value": 0, "sugars": "0", "sugars_100g": 0, "sugars_unit": "", "sugars_value": 0, "serving": "", "calories": "", "fats": "", "sodium": "", "fibers": "", "serving_unit": "", "calories_unit": null, "fats_unit": "", "sodium_unit": "", "fibers_unit": ""}, "packaging": "case", "product_name": "Bath Tissue", "product_quantity": 1, "product_quantity_unit": "case", "quantity": 1, "cost": 0, "transactions_id": 260, "safety_stock": "None", "lead_time": 0, "groups": [], "links": [], "AI_Pickable": "FALSE", "entry_type": "ITEM", "linked_list": [], "search_string": "Great Value&&&&Bath Tissue", "qty_on_hand": 1}', '12'), + sql='INSERT INTO test_itemlinks(barcode, link, data, conv_factor) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-03-19 15:32:57.302063 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.309448 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.317558 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%test123%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.325978 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%%poptart%%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.333622 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.341481 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.349660 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000231315%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.357600 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000231346%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.365444 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000183669%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.373992 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000130311%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.381471 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%DicedTomatoes%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.390154 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%DicedTomatoes%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.398451 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01201303%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.405686 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%07831504%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.413902 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01231003%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.422345 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%049000007251%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.430092 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%04905004%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.438140 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01231003%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.446719 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.454838 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%07831504%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.463496 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%FIBERONE%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.471481 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.479616 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.488213 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.495315 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.504453 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.511498 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.520450 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.527706 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.536284 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%04963406%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:32:57.543633 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:05.901260 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_logistics_info_barcode_key"DETAIL: Key (barcode)=(%194346066674%) already exists.', + payload=('%194346066674%', 1, 1, 1, 1), + sql='INSERT INTO test_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 15:33:05.907429 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%194346066674%', 2243, '{"id": null, "barcode": "%194346066674%", "name": "Bath Tissue", "brands": "Great Value", "brands_tags": ["Great Value"], "categories": [""], "food_groups_tags": [""], "ingredients_hierarchy": [""], "ingredients_text_en": "", "nutriments": {"carbohydrates": "0", "carbohydrates_100g": 0, "carbohydrates_unit": "", "carbohydrates_value": 0, "energy": 0, "energy-kcal": 0, "energy-kcal_100g": 0, "energy-kcal_unit": "", "energy-kcal_value": 0, "energy-kcal_value_computed": 0, "energy_100g": 0, "energy_unit": "", "energy_value": 0, "fat": 0, "fat_100g": 0, "fat_unit": "", "fat_value": 0, "fruits-vegetables-legumes-estimate-from-ingredients_100g": 0, "fruits-vegetables-legumes-estimate-from-ingredients_serving": 0, "fruits-vegetables-nuts-estimate-from-ingredients_100g": 0, "fruits-vegetables-nuts-estimate-from-ingredients_serving": 0, "nova-group": 0, "nova-group_100g": 0, "nova-group_serving": 0, "proteins": "0", "proteins_100g": 0, "proteins_unit": "", "proteins_value": 0, "saturated-fat": 0, "saturated-fat_100g": 0, "saturated-fat_unit": "", "saturated-fat_value": 0, "sugars": "0", "sugars_100g": 0, "sugars_unit": "", "sugars_value": 0, "serving": "", "calories": "", "fats": "", "sodium": "", "fibers": "", "serving_unit": "", "calories_unit": null, "fats_unit": "", "sodium_unit": "", "fibers_unit": ""}, "packaging": "case", "product_name": "Bath Tissue", "product_quantity": 1, "product_quantity_unit": "case", "quantity": 1, "cost": 0, "transactions_id": 260, "safety_stock": "None", "lead_time": 0, "groups": [], "links": [], "AI_Pickable": "FALSE", "entry_type": "ITEM", "linked_list": [], "search_string": "Great Value&&&&Bath Tissue", "qty_on_hand": 1}', '12'), + sql='INSERT INTO test_itemlinks(barcode, link, data, conv_factor) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-03-19 15:33:05.912457 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:05.920814 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:05.928821 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%test123%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:05.937342 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%%poptart%%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:05.944895 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:05.954265 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:05.962197 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000231315%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:05.970449 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000231346%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:05.978406 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000183669%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:05.987430 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%012000130311%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:05.995294 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%DicedTomatoes%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.004444 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%DicedTomatoes%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.011336 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01201303%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.019699 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%07831504%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.028505 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01231003%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.036661 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%049000007251%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.045209 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%04905004%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.053455 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%01231003%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.061838 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%PenneNoodles%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.069309 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%07831504%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.078409 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%FIBERONE%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.086341 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.094684 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.102970 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.111667 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.120629 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SmokedSausage%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.128594 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.137428 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.145853 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpagehttiMeatballs%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.153963 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%04963406%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 15:33:06.162456 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('%SpaghettiSauce%',), + sql='WITH passed_id AS (SELECT id AS passed_id FROM test_items WHERE barcode=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_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_item_info.*) as item_info, row_to_json(test_food_info.*) as food_info, row_to_json(test_brands.*) as brand, (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 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-03-19 18:41:51.871167 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_shopping_lists_name_key"DETAIL: Key (name)=(test2) already exists.', + payload=('test2', 'This is the second test', 1, datetime.datetime(2025, 3, 19, 18, 41, 51, 869521), 'plain_list'), + sql='INSERT INTO test_shopping_lists(name, description, author, creation_date, type) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-03-19 18:52:53.385792 --- ERROR --- DatabaseError(message=''NoneType' object is not subscriptable', + payload=(5, 5), + sql='SELECT * FROM test_shopping_listsLIMIT %s OFFSET %s;') +2025-03-19 18:52:54.290657 --- ERROR --- DatabaseError(message=''NoneType' object is not subscriptable', + payload=(5, 5), + sql='SELECT * FROM test_shopping_listsLIMIT %s OFFSET %s;') +2025-03-19 18:53:10.033561 --- ERROR --- DatabaseError(message=''NoneType' object is not subscriptable', + payload=(5, 5), + sql='SELECT * FROM test_shopping_listsLIMIT %s OFFSET %s;') +2025-03-19 18:54:33.781346 --- ERROR --- DatabaseError(message=''NoneType' object is not subscriptable', + payload=(5, 5), + sql='SELECT * FROM test_shopping_listsLIMIT %s OFFSET %s;') +2025-03-19 18:55:19.805867 --- ERROR --- DatabaseError(message=''NoneType' object is not subscriptable', + payload=(5, 5), + sql='SELECT * FROM test_shopping_listsLIMIT %s OFFSET %s;') +2025-03-19 18:56:48.566895 --- ERROR --- DatabaseError(message=''NoneType' object is not subscriptable', + payload=(5, 5), + sql='SELECT * FROM test_shopping_lists LIMIT %s OFFSET %s;') +2025-03-19 18:57:28.915918 --- ERROR --- DatabaseError(message=''NoneType' object is not subscriptable', + payload=(5, 5), + sql='SELECT * FROM test_shopping_lists LIMIT %s OFFSET %s;') +2025-03-20 17:54:34.069242 --- ERROR --- DatabaseError(message='not all arguments converted during string formatting', + payload=%038000221248%, + sql='SELECT * FROM test_itemlinks WHERE barcode=%s;') +2025-03-21 17:32:54.209121 --- ERROR --- DatabaseError(message='invalid input syntax for type jsonLINE 1: ...ole grain oats', qty = '1', uom = 'each', links = 'google.co... ^DETAIL: Token "google" is invalid.CONTEXT: JSON data, line 1: google...', + payload={'id': 4, 'update': {'item_name': 'Whole grain oats', 'qty': '1', 'uom': 'each', 'links': 'google.com'}}, + sql='UPDATE test_shopping_list_items SET item_name = %s, qty = %s, uom = %s, links = %s WHERE id=%s RETURNING *;') +2025-03-21 17:33:34.010623 --- ERROR --- DatabaseError(message='invalid input syntax for type jsonLINE 1: ...ole grain oats', qty = '1', uom = 'each', links = 'google.co... ^DETAIL: Token "google" is invalid.CONTEXT: JSON data, line 1: google...', + payload={'id': 4, 'update': {'item_name': 'Whole grain oats', 'qty': '1', 'uom': 'each', 'links': 'google.com'}}, + sql='UPDATE test_shopping_list_items SET item_name = %s, qty = %s, uom = %s, links = %s WHERE id=%s RETURNING *;') +2025-03-21 17:34:21.233927 --- ERROR --- DatabaseError(message='invalid input syntax for type jsonLINE 1: ...ole grain oats', qty = '1', uom = 'each', links = 'google.co... ^DETAIL: Token "google" is invalid.CONTEXT: JSON data, line 1: google...', + payload={'id': 4, 'update': {'item_name': 'Whole grain oats', 'qty': '1', 'uom': 'each', 'links': 'google.com'}}, + sql='UPDATE test_shopping_list_items SET item_name = %s, qty = %s, uom = %s, links = %s WHERE id=%s RETURNING *;') +2025-03-22 07:55:04.913515 --- ERROR --- DatabaseError(message='syntax error at or near "DSC"LINE 14: ORDER BY sum_cte.total_sum DSC ^', + payload=('', 50, 0), + sql='WITH sum_cte AS ( SELECT mi.id, SUM(mil.quantity_on_hand)::FLOAT8 AS total_sum FROM main_item_locations mil JOIN main_items mi ON mil.part_id = mi.id GROUP BY mi.id)SELECT main_items.*, row_to_json(main_item_info.*) as item_info, sum_cte.total_sum as total_qohFROM main_itemsLEFT JOIN sum_cte ON main_items.id = sum_cte.idLEFT JOIN main_item_info ON main_items.item_info_id = main_item_info.id WHERE main_items.search_string LIKE '%%' || %s || '%%' AND sum_cte.total_sum > 0ORDER BY sum_cte.total_sum DSCLIMIT %s OFFSET %s;') +2025-03-23 12:22:07.792923 --- ERROR --- DatabaseError(message='column "g" does not existLINE 2: (SELECT COALESCE(array_agg(row_to_json(g)), '{}') FROM t... ^', + payload=(5, 0), + sql='SELECT *, (SELECT COALESCE(array_agg(row_to_json(g)), '{}') FROM test_shopping_list_items WHERE sl_id = test_shopping_lists) AS sl_items FROM test_shopping_lists LIMIT %s OFFSET %s;') +2025-03-23 12:22:20.046597 --- ERROR --- DatabaseError(message='operator does not exist: integer = test_shopping_listsLINE 2: ...'{}') FROM test_shopping_list_items g WHERE sl_id = test_sho... ^HINT: No operator matches the given name and argument types. You might need to add explicit type casts.', + payload=(5, 0), + sql='SELECT *, (SELECT COALESCE(array_agg(row_to_json(g)), '{}') FROM test_shopping_list_items g WHERE sl_id = test_shopping_lists) AS sl_items FROM test_shopping_lists LIMIT %s OFFSET %s;') +2025-03-23 12:22:35.373028 --- ERROR --- DatabaseError(message='malformed array literal: "[]"LINE 2: (SELECT COALESCE(array_agg(row_to_json(g)), '[]') FROM t... ^DETAIL: "[" must introduce explicitly-specified array dimensions.', + payload=(5, 0), + sql='SELECT *, (SELECT COALESCE(array_agg(row_to_json(g)), '[]') FROM test_shopping_list_items g WHERE sl_id = test_shopping_lists) AS sl_items FROM test_shopping_lists LIMIT %s OFFSET %s;') +2025-03-23 15:14:31.483955 --- ERROR --- DatabaseError(message='insert or update on table "test_shopping_list_items" violates foreign key constraint "fk_item_id"DETAIL: Key (item_id)=(0) is not present in table "test_items".', + payload=('5fskqqy', '5', 'custom', 'MyCustomItem', 'Box', 1, 0, '{"main": "https://www.upcitemdb.com/upc/28400199148"}'), + sql='INSERT INTO test_shopping_list_items(uuid, sl_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-03-23 16:58:49.303277 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_shopping_list_items_uuid_key"DETAIL: Key (uuid)=(%078742015101%) already exists.', + payload=('%078742015101%', '3', 'sku', '100% grated parmesan cheese', 'each', 1, 2149, '{}'), + sql='INSERT INTO test_shopping_list_items(uuid, sl_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-03-23 16:58:50.643859 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_shopping_list_items_uuid_key"DETAIL: Key (uuid)=(%078742015101%) already exists.', + payload=('%078742015101%', '3', 'sku', '100% grated parmesan cheese', 'each', 1, 2149, '{}'), + sql='INSERT INTO test_shopping_list_items(uuid, sl_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-03-23 16:58:50.829794 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_shopping_list_items_uuid_key"DETAIL: Key (uuid)=(%078742015101%) already exists.', + payload=('%078742015101%', '3', 'sku', '100% grated parmesan cheese', 'each', 1, 2149, '{}'), + sql='INSERT INTO test_shopping_list_items(uuid, sl_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-03-23 16:58:58.630008 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_shopping_list_items_uuid_key"DETAIL: Key (uuid)=(%078742015101%) already exists.', + payload=('%078742015101%', '3', 'sku', '100% grated parmesan cheese', 'each', 1, 2149, '{}'), + sql='INSERT INTO test_shopping_list_items(uuid, sl_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-03-23 17:45:22.233163 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_shopping_list_items_uuid_sl_id_key"DETAIL: Key (uuid, sl_id)=(%078742015101%, 5) already exists.', + payload=('%078742015101%', '5', 'sku', '100% grated parmesan cheese', 'each', 1, 2149, '{}'), + sql='INSERT INTO test_shopping_list_items(uuid, sl_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-03-23 17:45:22.848888 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_shopping_list_items_uuid_sl_id_key"DETAIL: Key (uuid, sl_id)=(%078742015101%, 5) already exists.', + payload=('%078742015101%', '5', 'sku', '100% grated parmesan cheese', 'each', 1, 2149, '{}'), + sql='INSERT INTO test_shopping_list_items(uuid, sl_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-03-23 17:45:23.113705 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_shopping_list_items_uuid_sl_id_key"DETAIL: Key (uuid, sl_id)=(%078742015101%, 5) already exists.', + payload=('%078742015101%', '5', 'sku', '100% grated parmesan cheese', 'each', 1, 2149, '{}'), + sql='INSERT INTO test_shopping_list_items(uuid, sl_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-03-23 17:45:23.375900 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_shopping_list_items_uuid_sl_id_key"DETAIL: Key (uuid, sl_id)=(%078742015101%, 5) already exists.', + payload=('%078742015101%', '5', 'sku', '100% grated parmesan cheese', 'each', 1, 2149, '{}'), + sql='INSERT INTO test_shopping_list_items(uuid, sl_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-03-23 17:45:23.832867 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_shopping_list_items_uuid_sl_id_key"DETAIL: Key (uuid, sl_id)=(%078742015101%, 5) already exists.', + payload=('%078742015101%', '5', 'sku', '100% grated parmesan cheese', 'each', 1, 2149, '{}'), + sql='INSERT INTO test_shopping_list_items(uuid, sl_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-03-23 17:45:24.198342 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_shopping_list_items_uuid_sl_id_key"DETAIL: Key (uuid, sl_id)=(%078742015101%, 5) already exists.', + payload=('%078742015101%', '5', 'sku', '100% grated parmesan cheese', 'each', 1, 2149, '{}'), + sql='INSERT INTO test_shopping_list_items(uuid, sl_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-03-23 17:45:24.383560 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_shopping_list_items_uuid_sl_id_key"DETAIL: Key (uuid, sl_id)=(%078742015101%, 5) already exists.', + payload=('%078742015101%', '5', 'sku', '100% grated parmesan cheese', 'each', 1, 2149, '{}'), + sql='INSERT INTO test_shopping_list_items(uuid, sl_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-03-23 17:45:34.555592 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_shopping_list_items_uuid_sl_id_key"DETAIL: Key (uuid, sl_id)=(%078742015101%, 5) already exists.', + payload=('%078742015101%', '5', 'sku', '100% grated parmesan cheese', 'each', 1, 2149, '{}'), + sql='INSERT INTO test_shopping_list_items(uuid, sl_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-03-29 09:11:14.676444 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "main_logistics_info_barcode_key"DETAIL: Key (barcode)=(%070847898245%) already exists.', + payload=('%070847898245%', 1, 1, 1, 1), + sql='INSERT INTO main_logistics_info(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) VALUES (%s, %s, %s, %s, %s) RETURNING *;') +2025-04-03 17:22:29.828709 --- ERROR --- DatabaseError(message='table "test_sku_prefix" does not exist', + payload=DROP TABLE test_sku_prefix CASCADE;, + sql='PrefixTable') +2025-04-03 17:47:25.451559 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_sku_prefix_name_uuid_key"DETAIL: Key (name, uuid)=(testprefix, testuuid) already exists.', + payload=('testuuid', 'testprefix', 'this is a test prefix!'), + sql='INSERT INTO test_sku_prefix(uuid, name, description) VALUES (%s, %s, %s) RETURNING *;') +2025-04-05 12:21:16.322390 --- ERROR --- DatabaseError(message='missing FROM-clause entry for table "test_recipes"LINE 13: JOIN logins ON test_recipes.author = logins.id ^', + payload=(2,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT * FROM test_recipe_items items WHERE items.rp_id = (SELECT passed_id FROM passed_id) )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as submitted_by, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_items, row_to_json(test_vendors.*) as vendorFROM test_receiptsJOIN logins ON test_recipes.author = logins.idWHERE test_recipe.id=(SELECT passed_id FROM passed_id)') +2025-04-05 12:22:09.957162 --- ERROR --- DatabaseError(message='missing FROM-clause entry for table "test_recipe"LINE 13: WHERE test_recipe.id=(SELECT passed_id FROM passed_id) ^', + payload=(2,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT * FROM test_recipe_items items WHERE items.rp_id = (SELECT passed_id FROM passed_id) )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as submitted_by, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipe.id=(SELECT passed_id FROM passed_id)') +2025-04-05 12:24:36.650645 --- ERROR --- DatabaseError(message='name 'row' is not defined', + payload=(2,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT * FROM test_recipe_items items WHERE items.rp_id = (SELECT passed_id FROM passed_id) )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as submitted_by, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-05 20:59:40.968589 --- ERROR --- DatabaseError(message='column "item_name" of relation "test_recipes" does not existLINE 1: UPDATE test_recipes SET item_name = 'Spicy Bacon Chilli12' W... ^', + payload={'id': 1, 'update': {'item_name': 'Spicy Bacon Chilli12'}}, + sql='UPDATE test_recipes SET item_name = %s WHERE id=%s RETURNING *;') +2025-04-05 21:23:23.842735 --- ERROR --- DatabaseError(message='syntax error at or near "WHERE"LINE 1: UPDATE test_recipes SET WHERE id=1 RETURNING *; ^', + payload={'id': 1, 'update': {}}, + sql='UPDATE test_recipes SET WHERE id=%s RETURNING *;') +2025-04-05 21:27:02.277422 --- ERROR --- DatabaseError(message='syntax error at or near "WHERE"LINE 1: UPDATE test_recipes SET WHERE id=1 RETURNING *; ^', + payload={'id': 1, 'update': {}}, + sql='UPDATE test_recipes SET WHERE id=%s RETURNING *;') +2025-04-05 21:29:51.251551 --- ERROR --- DatabaseError(message='syntax error at or near "WHERE"LINE 1: UPDATE test_recipes SET WHERE id=1 RETURNING *; ^', + payload={'id': 1, 'update': {}}, + sql='UPDATE test_recipes SET WHERE id=%s RETURNING *;') +2025-04-06 08:59:42.901643 --- ERROR --- DatabaseError(message='syntax error at or near "test_items"LINE 4: LEFT test_items ON items.item_id = test_items.id ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT * FROM test_recipe_items items LEFT test_items ON items.item_id = test_items.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-06 09:09:43.896386 --- ERROR --- DatabaseError(message='syntax error at or near "COALESCE"LINE 4: COALESCE(test_items.barcode, items.uuid) AS uuid... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT * COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-06 16:49:33.943922 --- ERROR --- DatabaseError(message='column "linked_items" of relation "main_item_info" does not existLINE 2: (barcode, linked_items, shopping_lists, recipes, groups, ^', + payload=('%037000771807%', '{}', '{}', '{}', '{}', '', 1.0, 'each', 0.0, 0.0, 0.0, False), + sql='INSERT INTO main_item_info(barcode, linked_items, shopping_lists, recipes, groups, packaging, uom_quantity, uom, cost, safety_stock, lead_time_days, ai_pick) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:43.995134 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "units_plural_key"DETAIL: Key (plural)=(pinches) already exists.', + payload=('pinches', ' pinch', ' Pinch', ' Less than 1/8 teaspoon.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:43.999768 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('tsp', ' tsp', ' Teaspoon', ' 5 millilitres in Australia New Zealand UK Canada and the US but approximately 4.93 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.008680 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('dsp', ' dsp', ' Dessertspoon', ' 10 millilitres in Australia.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.015714 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('tbsp', ' tbsp', ' Tablespoon', ' 20 millilitres in Australia or 15 millilitres in New Zealand the UK Canada and the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.024247 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('fl oz', ' fl oz', ' Fluid ounce', ' 28.41 millilitres in the UK or approximately 29.57 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.032074 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('cups', ' cup', ' Cup', ' 250 millilitres in Australia and New Zealand or approximately 170.48 millilitres in the UK or approximately 227.31 millilitres in Canada and approximately 236.59 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.039602 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('pt', ' pt', ' Pint', ' 570 millilitres in Australia approximately 568.26 millilitres in New Zealand the UK and Canada and approximately 473.18 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.047805 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('qt', ' qt', ' Quart', ' Approximately 1136.52 millilitres in Australia New Zealand the UK and Canada and approximately 946.35 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.056200 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('gal', ' gal', ' Gallon', ' Approximately 4546.09 millilitres in Australia New Zealand the UK and Canada and approximately 3785.41 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.062489 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('jiggers', ' jigger', ' Jigger', ' 1.5 fluid ounces.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.070300 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('oz', ' oz', ' Ounce', ' 1/4 lb for butter which can also be measured as 3 tablespoons.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.078265 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('L', ' L', ' Liter', ' Commonly used for volume measurement in the metric system.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.086375 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('mL', ' mL', ' Milliliter', ' Commonly used for volume measurement in the metric system.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.093920 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('dm3', ' dm3', ' Cubic decimeter', ' Equivalent to 1 liter.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.100773 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('g', ' g', ' Gram', ' Commonly used for weight measurement in the metric system.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.109147 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('kg', ' kg', ' Kilogram', ' Commonly used for weight measurement in the metric system.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.116151 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('lbs', ' lb', ' Pound', ' Used for weight measurement in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.123798 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('fluid scruples', ' fluid scruple', ' Fluid scruple', " A unit used in the apothecaries' system but not commonly used in cooking."), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.131105 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('cm3', ' cm3', ' Cubic centimeter', ' Equivalent to 1 milliliter.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.138678 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('breakfast cups', ' breakfast cup', ' Breakfast cup', ' Similar in size to the US customary cup and the metric cup.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.147224 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('tumblers', ' tumbler', ' Tumblerful', ' A unit used in British cookery books and recipes.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.155810 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('winefulls', ' winefull', ' Wineglassful', ' A unit used in British cookery books and recipes.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.162996 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('coffee cups', ' coffee cup', ' Coffee cup', ' Can vary from 100 to 200 millilitres.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.171595 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('sticks of butter', ' stick of butter', ' Stick of butter', ' 1/4 lb or 3 tablespoons.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.179159 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('smidgens', ' smidgen', ' Smidgen', ' An approximate unit of measure.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.186951 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('dashes', ' dash', ' Dash', ' An approximate unit of measure.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.194886 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('drops', ' drop', ' Drop', ' An approximate unit of measure.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.202379 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('eaches', ' each', ' Each', ' A single unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.210756 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('boxes', ' box', ' Box', ' A Single box of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.217824 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('crates', ' crate', ' Crate', ' a single crate of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.225840 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('jars', ' jar', ' Jar', ' A single Jar of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.233830 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('cans', ' can', ' Can', ' A Single Can of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.241115 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('bars', ' bar', ' Bars', ' A Single bar of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.248836 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('loaves', ' loaf', ' Loaf', ' A single loaf of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.256251 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('packs', ' pack', ' Pack', ' A Single Pack of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:10:44.263842 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=CREATE TABLE IF NOT EXISTS units ( + id SERIAL PRIMARY KEY, + plural VARCHAR(32), + single VARCHAR(32), + fullname VARCHAR(255), + description TEXT, + unique(plural), + unique(single), + unique(fullname) +);, + sql='UnitsTable') +2025-04-07 18:11:11.901876 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "units_plural_key"DETAIL: Key (plural)=(pinches) already exists.', + payload=('pinches', ' pinch', ' Pinch', ' Less than 1/8 teaspoon.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:11.908951 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('tsp', ' tsp', ' Teaspoon', ' 5 millilitres in Australia New Zealand UK Canada and the US but approximately 4.93 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:11.917103 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('dsp', ' dsp', ' Dessertspoon', ' 10 millilitres in Australia.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:11.924693 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('tbsp', ' tbsp', ' Tablespoon', ' 20 millilitres in Australia or 15 millilitres in New Zealand the UK Canada and the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:11.932160 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('fl oz', ' fl oz', ' Fluid ounce', ' 28.41 millilitres in the UK or approximately 29.57 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:11.940305 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('cups', ' cup', ' Cup', ' 250 millilitres in Australia and New Zealand or approximately 170.48 millilitres in the UK or approximately 227.31 millilitres in Canada and approximately 236.59 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:11.947171 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('pt', ' pt', ' Pint', ' 570 millilitres in Australia approximately 568.26 millilitres in New Zealand the UK and Canada and approximately 473.18 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:11.954815 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('qt', ' qt', ' Quart', ' Approximately 1136.52 millilitres in Australia New Zealand the UK and Canada and approximately 946.35 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:11.962887 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('gal', ' gal', ' Gallon', ' Approximately 4546.09 millilitres in Australia New Zealand the UK and Canada and approximately 3785.41 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:11.970928 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('jiggers', ' jigger', ' Jigger', ' 1.5 fluid ounces.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:11.978694 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('oz', ' oz', ' Ounce', ' 1/4 lb for butter which can also be measured as 3 tablespoons.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:11.986020 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('L', ' L', ' Liter', ' Commonly used for volume measurement in the metric system.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:11.994224 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('mL', ' mL', ' Milliliter', ' Commonly used for volume measurement in the metric system.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.001600 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('dm3', ' dm3', ' Cubic decimeter', ' Equivalent to 1 liter.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.009228 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('g', ' g', ' Gram', ' Commonly used for weight measurement in the metric system.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.017172 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('kg', ' kg', ' Kilogram', ' Commonly used for weight measurement in the metric system.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.024445 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('lbs', ' lb', ' Pound', ' Used for weight measurement in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.031947 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('fluid scruples', ' fluid scruple', ' Fluid scruple', " A unit used in the apothecaries' system but not commonly used in cooking."), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.040208 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('cm3', ' cm3', ' Cubic centimeter', ' Equivalent to 1 milliliter.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.048172 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('breakfast cups', ' breakfast cup', ' Breakfast cup', ' Similar in size to the US customary cup and the metric cup.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.055868 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('tumblers', ' tumbler', ' Tumblerful', ' A unit used in British cookery books and recipes.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.063104 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('winefulls', ' winefull', ' Wineglassful', ' A unit used in British cookery books and recipes.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.071383 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('coffee cups', ' coffee cup', ' Coffee cup', ' Can vary from 100 to 200 millilitres.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.079081 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('sticks of butter', ' stick of butter', ' Stick of butter', ' 1/4 lb or 3 tablespoons.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.087113 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('smidgens', ' smidgen', ' Smidgen', ' An approximate unit of measure.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.095194 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('dashes', ' dash', ' Dash', ' An approximate unit of measure.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.103901 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('drops', ' drop', ' Drop', ' An approximate unit of measure.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.111035 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('eaches', ' each', ' Each', ' A single unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.120008 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('boxes', ' box', ' Box', ' A Single box of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.127986 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('crates', ' crate', ' Crate', ' a single crate of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.135808 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('jars', ' jar', ' Jar', ' A single Jar of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.144135 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('cans', ' can', ' Can', ' A Single Can of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.152889 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('bars', ' bar', ' Bars', ' A Single bar of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.161167 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('loaves', ' loaf', ' Loaf', ' A single loaf of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:11:12.169462 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('packs', ' pack', ' Pack', ' A Single Pack of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.005060 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "units_plural_key"DETAIL: Key (plural)=(Plural) already exists.', + payload=('Plural', ' Single', ' Fullname', ' Description'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.012765 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('tsp', ' tsp', ' Teaspoon', ' 5 millilitres in Australia New Zealand UK Canada and the US but approximately 4.93 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.022257 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('dsp', ' dsp', ' Dessertspoon', ' 10 millilitres in Australia.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.030830 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('tbsp', ' tbsp', ' Tablespoon', ' 20 millilitres in Australia or 15 millilitres in New Zealand the UK Canada and the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.039674 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('fl oz', ' fl oz', ' Fluid ounce', ' 28.41 millilitres in the UK or approximately 29.57 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.048175 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('cups', ' cup', ' Cup', ' 250 millilitres in Australia and New Zealand or approximately 170.48 millilitres in the UK or approximately 227.31 millilitres in Canada and approximately 236.59 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.056041 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('pt', ' pt', ' Pint', ' 570 millilitres in Australia approximately 568.26 millilitres in New Zealand the UK and Canada and approximately 473.18 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.064251 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('qt', ' qt', ' Quart', ' Approximately 1136.52 millilitres in Australia New Zealand the UK and Canada and approximately 946.35 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.072942 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('gal', ' gal', ' Gallon', ' Approximately 4546.09 millilitres in Australia New Zealand the UK and Canada and approximately 3785.41 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.081401 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('jiggers', ' jigger', ' Jigger', ' 1.5 fluid ounces.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.090546 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('oz', ' oz', ' Ounce', ' 1/4 lb for butter which can also be measured as 3 tablespoons.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.099456 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('L', ' L', ' Liter', ' Commonly used for volume measurement in the metric system.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.107916 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('mL', ' mL', ' Milliliter', ' Commonly used for volume measurement in the metric system.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.116091 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('dm3', ' dm3', ' Cubic decimeter', ' Equivalent to 1 liter.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.124020 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('g', ' g', ' Gram', ' Commonly used for weight measurement in the metric system.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.132775 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('kg', ' kg', ' Kilogram', ' Commonly used for weight measurement in the metric system.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.140932 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('lbs', ' lb', ' Pound', ' Used for weight measurement in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.148932 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('fluid scruples', ' fluid scruple', ' Fluid scruple', " A unit used in the apothecaries' system but not commonly used in cooking."), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.157444 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('cm3', ' cm3', ' Cubic centimeter', ' Equivalent to 1 milliliter.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.166119 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('breakfast cups', ' breakfast cup', ' Breakfast cup', ' Similar in size to the US customary cup and the metric cup.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.174918 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('tumblers', ' tumbler', ' Tumblerful', ' A unit used in British cookery books and recipes.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.182730 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('winefulls', ' winefull', ' Wineglassful', ' A unit used in British cookery books and recipes.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.191743 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('coffee cups', ' coffee cup', ' Coffee cup', ' Can vary from 100 to 200 millilitres.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.200252 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('sticks of butter', ' stick of butter', ' Stick of butter', ' 1/4 lb or 3 tablespoons.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.209374 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('smidgens', ' smidgen', ' Smidgen', ' An approximate unit of measure.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.217544 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('dashes', ' dash', ' Dash', ' An approximate unit of measure.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.226129 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('drops', ' drop', ' Drop', ' An approximate unit of measure.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.236147 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('eaches', ' each', ' Each', ' A single unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.244366 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('boxes', ' box', ' Box', ' A Single box of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.253119 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('crates', ' crate', ' Crate', ' a single crate of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.261763 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('jars', ' jar', ' Jar', ' A single Jar of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.269773 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('cans', ' can', ' Can', ' A Single Can of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.279465 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('bars', ' bar', ' Bars', ' A Single bar of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.287480 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('loaves', ' loaf', ' Loaf', ' A single loaf of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.296201 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('packs', ' pack', ' Pack', ' A Single Pack of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:12:49.306000 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=PrefixTable, + sql='DROP TABLE units CASCADE;') +2025-04-07 18:13:10.285371 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "units_plural_key"DETAIL: Key (plural)=(Plural) already exists.', + payload=('Plural', ' Single', ' Fullname', ' Description'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.294121 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('tsp', ' tsp', ' Teaspoon', ' 5 millilitres in Australia New Zealand UK Canada and the US but approximately 4.93 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.302719 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('dsp', ' dsp', ' Dessertspoon', ' 10 millilitres in Australia.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.312275 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('tbsp', ' tbsp', ' Tablespoon', ' 20 millilitres in Australia or 15 millilitres in New Zealand the UK Canada and the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.320616 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('fl oz', ' fl oz', ' Fluid ounce', ' 28.41 millilitres in the UK or approximately 29.57 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.329231 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('cups', ' cup', ' Cup', ' 250 millilitres in Australia and New Zealand or approximately 170.48 millilitres in the UK or approximately 227.31 millilitres in Canada and approximately 236.59 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.339234 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('pt', ' pt', ' Pint', ' 570 millilitres in Australia approximately 568.26 millilitres in New Zealand the UK and Canada and approximately 473.18 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.347584 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('qt', ' qt', ' Quart', ' Approximately 1136.52 millilitres in Australia New Zealand the UK and Canada and approximately 946.35 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.356397 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('gal', ' gal', ' Gallon', ' Approximately 4546.09 millilitres in Australia New Zealand the UK and Canada and approximately 3785.41 millilitres in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.364495 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('jiggers', ' jigger', ' Jigger', ' 1.5 fluid ounces.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.371981 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('oz', ' oz', ' Ounce', ' 1/4 lb for butter which can also be measured as 3 tablespoons.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.380838 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('L', ' L', ' Liter', ' Commonly used for volume measurement in the metric system.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.389480 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('mL', ' mL', ' Milliliter', ' Commonly used for volume measurement in the metric system.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.396988 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('dm3', ' dm3', ' Cubic decimeter', ' Equivalent to 1 liter.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.406045 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('g', ' g', ' Gram', ' Commonly used for weight measurement in the metric system.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.414346 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('kg', ' kg', ' Kilogram', ' Commonly used for weight measurement in the metric system.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.422811 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('lbs', ' lb', ' Pound', ' Used for weight measurement in the US.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.431743 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('fluid scruples', ' fluid scruple', ' Fluid scruple', " A unit used in the apothecaries' system but not commonly used in cooking."), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.440322 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('cm3', ' cm3', ' Cubic centimeter', ' Equivalent to 1 milliliter.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.448693 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('breakfast cups', ' breakfast cup', ' Breakfast cup', ' Similar in size to the US customary cup and the metric cup.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.457055 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('tumblers', ' tumbler', ' Tumblerful', ' A unit used in British cookery books and recipes.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.465266 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('winefulls', ' winefull', ' Wineglassful', ' A unit used in British cookery books and recipes.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.473926 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('coffee cups', ' coffee cup', ' Coffee cup', ' Can vary from 100 to 200 millilitres.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.481942 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('sticks of butter', ' stick of butter', ' Stick of butter', ' 1/4 lb or 3 tablespoons.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.490407 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('smidgens', ' smidgen', ' Smidgen', ' An approximate unit of measure.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.498270 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('dashes', ' dash', ' Dash', ' An approximate unit of measure.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.507063 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('drops', ' drop', ' Drop', ' An approximate unit of measure.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.516062 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('eaches', ' each', ' Each', ' A single unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.524222 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('boxes', ' box', ' Box', ' A Single box of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.532729 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('crates', ' crate', ' Crate', ' a single crate of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.541345 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('jars', ' jar', ' Jar', ' A single Jar of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.549306 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('cans', ' can', ' Can', ' A Single Can of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.558787 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('bars', ' bar', ' Bars', ' A Single bar of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.567370 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('loaves', ' loaf', ' Loaf', ' A single loaf of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:10.574985 --- ERROR --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', + payload=('packs', ' pack', ' Pack', ' A Single Pack of a unit.'), + sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') +2025-04-07 18:13:18.198596 --- ERROR --- DatabaseError(message='table "units" does not exist', + payload=PrefixTable, + sql='DROP TABLE units CASCADE;') +2025-04-07 18:49:02.343762 --- ERROR --- DatabaseError(message='operator does not exist: test_item_info = integerLINE 8: WHERE test_item_info = (SELECT item_info_id FROM ite... ^HINT: No operator matches the given name and argument types. You might need to add explicit type casts.', + payload=(2016,), + sql='WITH passed_id AS (SELECT %s AS passed_id), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), item_info_id AS (SELECT item_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), cte_item_info AS ( SELECT * FROM test_item_info LEFT JOIN units ON test_item_info.uom = units.id WHERE test_item_info = (SELECT item_info_id FROM item_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(array_agg(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-04-07 18:50:39.627298 --- ERROR --- DatabaseError(message='relation "item_info_id" does not existLINE 8: ... WHERE test_item_info = (SELECT info_id FROM item_info_... ^', + payload=(2016,), + sql='WITH passed_id AS (SELECT %s AS passed_id), 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 * FROM test_item_info LEFT JOIN units ON test_item_info.uom = units.id WHERE test_item_info = (SELECT info_id FROM item_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(array_agg(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-04-07 18:51:14.119335 --- ERROR --- DatabaseError(message='operator does not exist: test_item_info = integerLINE 8: WHERE test_item_info = (SELECT item_info_id FROM inf... ^HINT: No operator matches the given name and argument types. You might need to add explicit type casts.', + payload=(2016,), + sql='WITH passed_id AS (SELECT %s AS passed_id), 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 * FROM test_item_info LEFT JOIN units ON test_item_info.uom = units.id WHERE test_item_info = (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(array_agg(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-04-07 18:53:02.040807 --- ERROR --- DatabaseError(message='syntax error at or near "FROM"LINE 8: FROM test_item_info ^', + payload=(2016,), + sql='WITH passed_id AS (SELECT %s AS passed_id), 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(array_agg(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-04-07 19:13:00.718908 --- ERROR --- DatabaseError(message='invalid reference to FROM-clause entry for table "test_receipt_items"LINE 6: LEFT JOIN units ON test_receipt_items.uom = unit... ^HINT: Perhaps you meant to reference the table alias "items".', + payload=(5,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_receipt_items AS ( SELECT items.* , (SELECT COALESCE(row_to_json(un), '{}') FROM units un) AS uom FROM test_receipt_items items LEFT JOIN units ON test_receipt_items.uom = units.id WHERE items.receipt_id = (SELECT passed_id FROM passed_id) )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_receipts.*, logins.username as submitted_by, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_receipt_items ris) AS receipt_items, row_to_json(test_vendors.*) as vendorFROM test_receiptsJOIN logins ON test_receipts.submitted_by = logins.idLEFT JOIN test_vendors ON test_receipts.vendor_id = test_vendors.id WHERE test_receipts.id=(SELECT passed_id FROM passed_id)') +2025-04-07 19:13:24.483942 --- ERROR --- DatabaseError(message='operator does not exist: character varying = integerLINE 6: LEFT JOIN units ON items.uom = units.id ^HINT: No operator matches the given name and argument types. You might need to add explicit type casts.', + payload=(5,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_receipt_items AS ( SELECT items.* , (SELECT COALESCE(row_to_json(un), '{}') FROM units un) AS uom FROM test_receipt_items items LEFT JOIN units ON items.uom = units.id WHERE items.receipt_id = (SELECT passed_id FROM passed_id) )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_receipts.*, logins.username as submitted_by, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_receipt_items ris) AS receipt_items, row_to_json(test_vendors.*) as vendorFROM test_receiptsJOIN logins ON test_receipts.submitted_by = logins.idLEFT JOIN test_vendors ON test_receipts.vendor_id = test_vendors.id WHERE test_receipts.id=(SELECT passed_id FROM passed_id)') +2025-04-07 19:15:47.046817 --- ERROR --- DatabaseError(message='operator does not exist: character varying = integerLINE 5: LEFT JOIN units ON items.uom = units.id ^HINT: No operator matches the given name and argument types. You might need to add explicit type casts.', + payload=(5,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_receipt_items AS ( SELECT items.* FROM test_receipt_items items LEFT JOIN units ON items.uom = units.id WHERE items.receipt_id = (SELECT passed_id FROM passed_id) )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_receipts.*, logins.username as submitted_by, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_receipt_items ris) AS receipt_items, row_to_json(test_vendors.*) as vendorFROM test_receiptsJOIN logins ON test_receipts.submitted_by = logins.idLEFT JOIN test_vendors ON test_receipts.vendor_id = test_vendors.id WHERE test_receipts.id=(SELECT passed_id FROM passed_id)') +2025-04-07 19:16:34.486882 --- ERROR --- DatabaseError(message='operator does not exist: character varying = integerLINE 5: ... LEFT JOIN units ON test_receipt_items.uom = units.id ^HINT: No operator matches the given name and argument types. You might need to add explicit type casts.', + payload=(5,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_receipt_items AS ( SELECT test_receipt_items.* FROM test_receipt_items LEFT JOIN units ON test_receipt_items.uom = units.id WHERE test_receipt_items.receipt_id = (SELECT passed_id FROM passed_id) )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_receipts.*, logins.username as submitted_by, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_receipt_items ris) AS receipt_items, row_to_json(test_vendors.*) as vendorFROM test_receiptsJOIN logins ON test_receipts.submitted_by = logins.idLEFT JOIN test_vendors ON test_receipts.vendor_id = test_vendors.id WHERE test_receipts.id=(SELECT passed_id FROM passed_id)') +2025-04-07 19:19:55.680893 --- ERROR --- DatabaseError(message='more than one row returned by a subquery used as an expression', + payload=(5,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_receipt_items AS ( SELECT items.* , (SELECT COALESCE(row_to_json(un), '{}') FROM units un) AS uom FROM test_receipt_items items LEFT JOIN units ON items.uom = units.id WHERE items.receipt_id = (SELECT passed_id FROM passed_id) )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_receipts.*, logins.username as submitted_by, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_receipt_items ris) AS receipt_items, row_to_json(test_vendors.*) as vendorFROM test_receiptsJOIN logins ON test_receipts.submitted_by = logins.idLEFT JOIN test_vendors ON test_receipts.vendor_id = test_vendors.id WHERE test_receipts.id=(SELECT passed_id FROM passed_id)') +2025-04-08 06:49:10.286120 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_shopping_list_items_uuid_sl_id_key"DETAIL: Key (uuid, sl_id)=(%078742015101%, 5) already exists.', + payload=('%078742015101%', '5', 'sku', '100% grated parmesan cheese', 1, 1, 2149, '{}'), + sql='INSERT INTO test_shopping_list_items(uuid, sl_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-09 17:00:37.142181 --- ERROR --- DatabaseError(message='syntax error at or near ";"LINE 24: GROUP BY test_item_info.id; ^', + payload=(2149,), + sql='WITH passed_id AS (SELECT %s AS passed_id), 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_two 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_conversions AS ( SELECT conversions.* FROM conversions WHERE conversions.id = ANY(SELECT unnest(conversions_column) FROM test_item_info) ), cte_item_info AS ( SELECT cte_item_info.*, json_agg(cte_conversions) AS conversions FROM cte_item_info LEFT JOIN cte_conversions ON true GROUP BY test_item_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-04-09 17:00:53.165583 --- ERROR --- DatabaseError(message='relation "conversions" does not existLINE 15: FROM conversions ^', + payload=(2149,), + sql='WITH passed_id AS (SELECT %s AS passed_id), 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_two 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_conversions AS ( SELECT conversions.* FROM conversions WHERE conversions.id = ANY(SELECT unnest(conversions_column) FROM test_item_info) ), cte_item_info AS ( SELECT cte_item_info.*, json_agg(cte_conversions) AS conversions FROM cte_item_info LEFT JOIN cte_conversions ON true GROUP BY test_item_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-04-09 17:02:26.029976 --- ERROR --- DatabaseError(message='column "conversions" does not existLINE 16: ... WHERE test_conversions.id = ANY(SELECT unnest(conversion... ^', + payload=(2149,), + sql='WITH passed_id AS (SELECT %s AS passed_id), 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_two 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_conversions AS ( SELECT test_conversions.* FROM test_conversions WHERE test_conversions.id = ANY(SELECT unnest(conversions) FROM test_item_info) ), cte_item_info AS ( SELECT cte_item_info.*, json_agg(cte_conversions) AS conversions FROM cte_item_info LEFT JOIN cte_conversions ON true GROUP BY test_item_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-04-09 17:02:55.461835 --- ERROR --- DatabaseError(message='column "conversions" does not existLINE 16: ... WHERE test_conversions.id = ANY(SELECT unnest(conversion... ^', + payload=(2149,), + sql='WITH passed_id AS (SELECT %s AS passed_id), 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_two 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_conversions AS ( SELECT test_conversions.* FROM test_conversions WHERE test_conversions.id = ANY(SELECT unnest(conversions) FROM test_item_info) ), cte_item_info AS ( SELECT cte_item_info_two.*, json_agg(cte_conversions) AS conversions FROM cte_item_info_two LEFT JOIN cte_conversions ON true GROUP BY test_item_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-04-09 17:03:42.594269 --- ERROR --- DatabaseError(message='column "conversions" does not existLINE 16: ... WHERE test_conversions.id = ANY(SELECT unnest(conversion... ^', + payload=(2149,), + sql='WITH passed_id AS (SELECT %s AS passed_id), 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_conversions AS ( SELECT test_conversions.* FROM test_conversions WHERE test_conversions.id = ANY(SELECT unnest(conversions) FROM test_item_info) ), 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-04-09 17:05:18.810964 --- ERROR --- DatabaseError(message='missing FROM-clause entry for table "cte_conversions"LINE 14: row_to_json(cte_conversions.*) as conversions ^', + payload=(2149,), + sql='WITH passed_id AS (SELECT %s AS passed_id), 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_conversions AS ( SELECT test_conversions.* FROM test_conversions WHERE test_conversions.item_id = (SELECT passed_id FROM passed_id) ), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom, row_to_json(cte_conversions.*) as conversions 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-04-09 17:06:11.023787 --- ERROR --- DatabaseError(message='syntax error at or near "SELECT"LINE 14: row_to_json(SELECT * FROM cte_conversions) as conver... ^', + payload=(2149,), + sql='WITH passed_id AS (SELECT %s AS passed_id), 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_conversions AS ( SELECT test_conversions.* FROM test_conversions WHERE test_conversions.item_id = (SELECT passed_id FROM passed_id) ), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom, row_to_json(SELECT * FROM cte_conversions) as conversions 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-04-09 17:06:29.417010 --- ERROR --- DatabaseError(message='syntax error at or near "FROM"LINE 14: row_to_json(* FROM cte_conversions) as conversions ^', + payload=(2149,), + sql='WITH passed_id AS (SELECT %s AS passed_id), 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_conversions AS ( SELECT test_conversions.* FROM test_conversions WHERE test_conversions.item_id = (SELECT passed_id FROM passed_id) ), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom, row_to_json(* FROM cte_conversions) as conversions 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-04-09 17:07:43.627785 --- ERROR --- DatabaseError(message='missing FROM-clause entry for table "cte_conversions"LINE 14: row_to_json(cte_conversions.*) AS conversions ... ^', + payload=(2149,), + sql='WITH passed_id AS (SELECT %s AS passed_id), 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_conversions AS ( SELECT test_conversions.* FROM test_conversions WHERE test_conversions.item_id = (SELECT passed_id FROM passed_id) ), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom, row_to_json(cte_conversions.*) AS conversions 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-04-09 17:08:29.263327 --- ERROR --- DatabaseError(message='more than one row returned by a subquery used as an expression', + payload=(2149,), + sql='WITH passed_id AS (SELECT %s AS passed_id), 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_conversions AS ( SELECT test_conversions.* FROM test_conversions WHERE test_conversions.item_id = (SELECT passed_id FROM passed_id) ), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom, (SELECT row_to_json(convs) FROM cte_conversions convs) AS conversions 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-04-11 16:18:53.997845 --- ERROR --- DatabaseError(message='invalid input syntax for type integer: "each"LINE 3: ...S ('new sku', 10, '%076808514377%', 'unknown', 1, 'each', '{... ^', + payload=('new sku', 10, '%076808514377%', 'unknown', 1, 'each', '{"cost": 0, "expires": false}', 'Unresolved'), + sql='INSERT INTO main_receipt_items(type, receipt_id, barcode, name, qty, uom, data, status) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-11 17:33:40.206669 --- ERROR --- DatabaseError(message='column "prefixes" specified more than onceLINE 3: ...uom, cost, safety_stock, lead_time_days, ai_pick, prefixes) ^', + payload=('%076808514377%', '{}', '', 1.0, 1, 0.0, 0.0, 0.0, False, []), + sql='INSERT INTO main_item_info(barcode, prefixes, packaging, uom_quantity, uom, cost, safety_stock, lead_time_days, ai_pick, prefixes) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-11 17:36:36.692381 --- ERROR --- DatabaseError(message='not all arguments converted during string formatting', + payload=('%076808514377%', '{}', '', 1.0, 1, 0.0, 0.0, 0.0, False, []), + sql='INSERT INTO main_item_info(barcode, packaging, uom_quantity, uom, cost, safety_stock, lead_time_days, ai_pick, prefixes) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') + + + + + + +2025-04-12 09:38:34.044274 --- ERROR --- DatabaseError(message='syntax error at or near "test_item_info"LINE 18: ...on_agg(p.*) FROM test_prefixes as p WHERE p.id IN test_item_... ^', + payload=(2149,), + sql='WITH passed_id AS (SELECT %s AS passed_id), 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_conversions AS ( SELECT test_conversions.id as conv_id, test_conversions.conv_factor as conv_factor, units.* as uom FROM test_conversions LEFT JOIN units ON test_conversions.uom_id = units.id WHERE test_conversions.item_id = (SELECT passed_id FROM passed_id) ), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom, COALESCE((SELECT json_agg(convs) FROM cte_conversions convs), '[]'::json) AS conversions, COALESCE((SELECT json_agg(p.*) FROM test_prefixes as p WHERE p.id IN test_item_info.prefixes), '[]'::json) as prefixes 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-04-12 09:39:52.102309 --- ERROR --- DatabaseError(message='relation "test_prefixes" does not existLINE 18: COALESCE((SELECT json_agg(p.*) FROM test_prefixes as... ^', + payload=(2149,), + sql='WITH passed_id AS (SELECT %s AS passed_id), 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_conversions AS ( SELECT test_conversions.id as conv_id, test_conversions.conv_factor as conv_factor, units.* as uom FROM test_conversions LEFT JOIN units ON test_conversions.uom_id = units.id WHERE test_conversions.item_id = (SELECT passed_id FROM passed_id) ), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom, COALESCE((SELECT json_agg(convs) FROM cte_conversions convs), '[]'::json) AS conversions, COALESCE((SELECT json_agg(p.*) FROM test_prefixes as p WHERE p.id IN (test_item_info.prefixes)), '[]'::json) as prefixes 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-04-12 09:40:26.149289 --- ERROR --- DatabaseError(message='operator does not exist: integer = integer[]LINE 18: ...son_agg(p.*) FROM test_sku_prefix as p WHERE p.id IN (test_i... ^HINT: No operator matches the given name and argument types. You might need to add explicit type casts.', + payload=(2149,), + sql='WITH passed_id AS (SELECT %s AS passed_id), 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_conversions AS ( SELECT test_conversions.id as conv_id, test_conversions.conv_factor as conv_factor, units.* as uom FROM test_conversions LEFT JOIN units ON test_conversions.uom_id = units.id WHERE test_conversions.item_id = (SELECT passed_id FROM passed_id) ), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom, COALESCE((SELECT json_agg(convs) FROM cte_conversions convs), '[]'::json) AS conversions, COALESCE((SELECT json_agg(p.*) FROM test_sku_prefix as p WHERE p.id IN (test_item_info.prefixes)), '[]'::json) as prefixes 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-04-12 09:41:00.418051 --- ERROR --- DatabaseError(message='operator does not exist: integer @> integer[]LINE 18: ...son_agg(p.*) FROM test_sku_prefix as p WHERE p.id @> test_it... ^HINT: No operator matches the given name and argument types. You might need to add explicit type casts.', + payload=(2149,), + sql='WITH passed_id AS (SELECT %s AS passed_id), 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_conversions AS ( SELECT test_conversions.id as conv_id, test_conversions.conv_factor as conv_factor, units.* as uom FROM test_conversions LEFT JOIN units ON test_conversions.uom_id = units.id WHERE test_conversions.item_id = (SELECT passed_id FROM passed_id) ), cte_item_info AS ( SELECT test_item_info.*, row_to_json(units.*) as uom, COALESCE((SELECT json_agg(convs) FROM cte_conversions convs), '[]'::json) AS conversions, COALESCE((SELECT json_agg(p.*) FROM test_sku_prefix as p WHERE p.id @> test_item_info.prefixes), '[]'::json) as prefixes 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-04-12 10:40:51.886361 --- ERROR --- DatabaseError(message='type object 'ItemInfoTable' has no attribute 'cursor'', + payload=test, + sql='SELECT * FROM _item_info WHERE id=%s;') +2025-04-12 14:04:48.983858 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "main_sku_prefix_name_uuid_key"DETAIL: Key (name, uuid)=(Soda, %1000%) already exists.', + payload=('%1000%', 'Soda', ''), + sql='INSERT INTO main_sku_prefix(uuid, name, description) VALUES (%s, %s, %s) RETURNING *;') +2025-04-12 14:47:01.980333 --- ERROR --- DatabaseError(message='invalid input syntax for type integer: " Pinch"LINE 1: ... SET name = 'Coca-Cola 12 Pack', qty = '1', uom = ' Pinch', ... ^', + payload={'id': 66, 'update': {'name': 'Coca-Cola 12 Pack', 'qty': '1', 'uom': ' Pinch', 'data': {'cost': '0', 'expires': False, 'api_data': {'id': '0049000028904', 'lc': 'en', '_id': '0049000028904', 'rev': 20, 'code': '0049000028904', 'lang': 'en', 'link': '', 'teams': 'swipe-studio', 'brands': 'Coca-Cola', 'images': {'1': {'sizes': {'100': {'h': 60, 'w': 100}, '400': {'h': 239, 'w': 400}, 'full': {'h': 957, 'w': 1600}}, 'uploader': 'openfoodfacts-contributors', 'uploaded_t': '1478385267'}, '2': {'sizes': {'100': {'h': 100, 'w': 75}, '400': {'h': 400, 'w': 300}, 'full': {'h': 3328, 'w': 2496}}, 'uploader': 'tanyad1013', 'uploaded_t': 1555187983}, '3': {'sizes': {'100': {'h': 100, 'w': 75}, '400': {'h': 400, 'w': 300}, 'full': {'h': 3328, 'w': 2496}}, 'uploader': 'tanyad1013', 'uploaded_t': 1555188029}, '5': {'sizes': {'100': {'h': 100, 'w': 100}, '400': {'h': 400, 'w': 400}, 'full': {'h': 1400, 'w': 1400}}, 'uploader': 'thaialagata', 'uploaded_t': 1640260897}, 'front_en': {'x1': '0', 'x2': '0', 'y1': '0', 'y2': '0', 'rev': '16', 'angle': '0', 'imgid': '5', 'sizes': {'100': {'h': 78, 'w': 100}, '200': {'h': 156, 'w': 200}, '400': {'h': 311, 'w': 400}, 'full': {'h': 1080, 'w': 1389}}, 'geometry': '0x0-0-0', 'normalize': 'false', 'white_magic': 'false', 'coordinates_image_size': 'full'}, 'ingredients_en': {'x1': None, 'x2': None, 'y1': None, 'y2': None, 'rev': '8', 'angle': None, 'imgid': '3', 'sizes': {'100': {'h': 100, 'w': 75}, '200': {'h': 200, 'w': 150}, '400': {'h': 400, 'w': 300}, 'full': {'h': 3328, 'w': 2496}}, 'geometry': '0x0-0-0', 'normalize': None, 'white_magic': None}}, 'labels': '', 'origin': '', 'states': 'en:to-be-completed, en:nutrition-facts-completed, en:ingredients-completed, en:expiration-date-to-be-completed, en:packaging-code-to-be-completed, en:characteristics-to-be-completed, en:origins-to-be-completed, en:categories-completed, en:brands-completed, en:packaging-completed, en:quantity-completed, en:product-name-completed, en:photos-to-be-validated, en:packaging-photo-to-be-selected, en:nutrition-photo-to-be-selected, en:ingredients-photo-selected, en:front-photo-selected, en:photos-uploaded', 'stores': '', 'traces': '', 'creator': 'openfoodfacts-contributors', 'origins': '', 'scans_n': 18, 'sortkey': 1609090427, 'complete': 0, 'quantity': '12 cans', '_keywords': ['beverage', 'carbonated', 'coca-cola', 'drink'], 'allergens': '', 'countries': 'United States', 'created_t': 1478385267, 'emb_codes': '', 'image_url': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/front_en.16.400.jpg', 'labels_lc': 'en', 'languages': {'en:english': 4}, 'max_imgid': '5', 'misc_tags': ['en:ecoscore-extended-data-computed', 'en:ecoscore-extended-data-version-4', 'en:ecoscore-not-computed', 'en:nutriscore-2021-e-2023-e', 'en:nutriscore-2021-same-as-2023', 'en:nutriscore-computed', 'en:nutrition-fruits-vegetables-legumes-estimate-from-ingredients', 'en:nutrition-fruits-vegetables-nuts-estimate-from-ingredients', 'en:nutrition-no-fiber', 'en:nutrition-no-fiber-or-fruits-vegetables-nuts', 'en:packagings-not-complete', 'en:packagings-not-empty', 'en:packagings-not-empty-but-not-complete', 'en:packagings-number-of-components-2'], 'origin_en': '', 'packaging': 'Aluminium-can, Card-box', 'traces_lc': 'en', 'categories': 'Beverages, Carbonated drinks', 'codes_tags': ['code-13', 'conflict-with-upc-12', '0049000028xxx', '004900002xxxx', '00490000xxxxx', '0049000xxxxxx', '004900xxxxxxx', '00490xxxxxxxx', '0049xxxxxxxxx', '004xxxxxxxxxx', '00xxxxxxxxxxx', '0xxxxxxxxxxxx'], 'labels_old': '', 'nova_group': 4, 'nutriments': {'fat': 0, 'salt': 112.5, 'energy': 586, 'sodium': 45, 'sugars': 39, 'fat_100g': 0, 'fat_unit': 'g', 'proteins': 0, 'fat_value': 0, 'salt_100g': 31.7, 'salt_unit': 'g', 'nova-group': 4, 'salt_value': 112.5, 'energy-kcal': 140, 'energy_100g': 165, 'energy_unit': 'kcal', 'fat_serving': 0, 'sodium_100g': 12.7, 'sodium_unit': 'g', 'sugars_100g': 11, 'sugars_unit': 'g', 'energy_value': 140, 'salt_serving': 112.5, 'sodium_value': 45, 'sugars_value': 39, 'carbohydrates': 39, 'proteins_100g': 0, 'proteins_unit': 'g', 'energy_serving': 586, 'proteins_value': 0, 'sodium_serving': 45, 'sugars_serving': 39, 'nova-group_100g': 4, 'energy-kcal_100g': 39.4, 'energy-kcal_unit': 'kcal', 'proteins_serving': 0, 'energy-kcal_value': 140, 'carbohydrates_100g': 11, 'carbohydrates_unit': 'g', 'nova-group_serving': 4, 'nutrition-score-fr': 32, 'carbohydrates_value': 39, 'energy-kcal_serving': 140, 'carbohydrates_serving': 39, 'nutrition-score-fr_100g': 32, 'energy-kcal_value_computed': 156, 'fruits-vegetables-nuts-estimate-from-ingredients_100g': 0, 'fruits-vegetables-legumes-estimate-from-ingredients_100g': 0, 'fruits-vegetables-nuts-estimate-from-ingredients_serving': 0, 'fruits-vegetables-legumes-estimate-from-ingredients_serving': 0}, 'nutriscore': {'2021': {'data': {'fiber': 0, 'energy': 165, 'is_fat': 0, 'sodium': 12700, 'sugars': 11, 'is_water': 0, 'proteins': 0, 'is_cheese': 0, 'fiber_value': 0, 'is_beverage': 1, 'energy_value': 165, 'fiber_points': 0, 'sodium_value': 12700, 'sugars_value': 11, 'energy_points': 6, 'saturated_fat': 0, 'sodium_points': 10, 'sugars_points': 8, 'proteins_value': 0, 'negative_points': 24, 'positive_points': 0, 'proteins_points': 0, 'saturated_fat_ratio': 0, 'saturated_fat_value': 0, 'saturated_fat_points': 0, 'fruits_vegetables_nuts_colza_walnut_olive_oils': 0, 'fruits_vegetables_nuts_colza_walnut_olive_oils_value': 0, 'fruits_vegetables_nuts_colza_walnut_olive_oils_points': 0}, 'grade': 'e', 'score': 24, 'category_available': 1, 'nutrients_available': 1, 'nutriscore_computed': 1, 'nutriscore_applicable': 1}, '2023': {'data': {'is_water': 0, 'is_cheese': 0, 'components': {'negative': [{'id': 'energy', 'unit': 'kJ', 'value': 165, 'points': 3, 'points_max': 10}, {'id': 'sugars', 'unit': 'g', 'value': 11, 'points': 9, 'points_max': 10}, {'id': 'saturated_fat', 'unit': 'g', 'value': 0, 'points': 0, 'points_max': 10}, {'id': 'salt', 'unit': 'g', 'value': 31.7, 'points': 20, 'points_max': 20}, {'id': 'non_nutritive_sweeteners', 'unit': 'number', 'value': 0, 'points': 0, 'points_max': 4}], 'positive': [{'id': 'proteins', 'unit': 'g', 'value': 0, 'points': 0, 'points_max': 7}, {'id': 'fiber', 'unit': 'g', 'value': None, 'points': 0, 'points_max': 5}, {'id': 'fruits_vegetables_legumes', 'unit': '%', 'value': 0, 'points': 0, 'points_max': 6}]}, 'is_beverage': 1, 'count_proteins': 1, 'negative_points': 32, 'positive_points': 0, 'positive_nutrients': ['proteins', 'fiber', 'fruits_vegetables_legumes'], 'is_red_meat_product': 0, 'negative_points_max': 54, 'positive_points_max': 18, 'count_proteins_reason': 'beverage', 'is_fat_oil_nuts_seeds': 0}, 'grade': 'e', 'score': 32, 'category_available': 1, 'nutrients_available': 1, 'nutriscore_computed': 1, 'nutriscore_applicable': 1}}, 'origins_lc': 'en', 'packagings': [{'shape': 'en:can', 'material': 'en:aluminium'}, {'shape': 'en:box'}], 'teams_tags': ['swipe-studio'], 'update_key': 'sort', 'additives_n': 2, 'brands_tags': ['coca-cola'], 'cities_tags': [], 'food_groups': 'en:unsweetened-beverages', 'ingredients': [{'id': 'en:pledse-recycle-cans', 'text': 'pledse recycle cans', 'percent_max': 100, 'percent_min': 9.09090909090909, 'is_in_taxonomy': 0, 'percent_estimate': 54.5454545454545}, {'id': 'en:cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'text': 'cartons cts ainer fructose corn syrup 1 can phosphoric acid', 'percent_max': 50, 'percent_min': 0, 'is_in_taxonomy': 0, 'percent_estimate': 22.7272727272727}, {'id': 'en:natural-carbonated-water', 'text': 'natural carbonated water', 'percent_max': 33.3333333333333, 'percent_min': 0, 'is_in_taxonomy': 0, 'percent_estimate': 11.3636363636364}, {'id': 'en:high-caramel-color', 'text': 'high caramel color', 'percent_max': 25, 'percent_min': 0, 'is_in_taxonomy': 0, 'percent_estimate': 5.68181818181818}, {'id': 'en:flavouring', 'text': 'flavors', 'vegan': 'maybe', 'vegetarian': 'maybe', 'percent_max': '5', 'percent_min': 0, 'is_in_taxonomy': 1, 'percent_estimate': 2.5}, {'id': 'en:caffeine', 'text': 'caffeine', 'vegan': 'yes', 'vegetarian': 'yes', 'percent_max': '5', 'percent_min': 0, 'is_in_taxonomy': 1, 'percent_estimate': 1.59090909090909}, {'id': 'en:canned-under-authority-of-the-coca-cola-company-atlanta', 'text': 'canned under authority of the coca-cola company atlanta', 'percent_max': '5', 'percent_min': 0, 'is_in_taxonomy': 0, 'percent_estimate': 0.795454545454547}, {'id': 'en:ga-30313', 'text': 'ga 30313', 'percent_max': '5', 'percent_min': 0, 'is_in_taxonomy': 0, 'percent_estimate': 0.397727272727273}, {'id': 'en:canner-s-name-and-address-appear-on-each-can', 'text': "canner's name and address appear on each can", 'percent_max': '5', 'percent_min': 0, 'is_in_taxonomy': 0, 'percent_estimate': 0.19886363636364}, {'id': 'en:caffeine-content', 'text': 'caffeine content', 'quantity': '34 mg', 'quantity_g': 0.034, 'ingredients': [{'id': 'en:12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke', 'text': '12 fl oz 02017 the coca-cola 140 daily value 0% 2% 14% g company consumer information ugars 78%| call 1-800-438-2653 coke', 'percent_max': '5', 'percent_min': 0, 'is_in_taxonomy': 0, 'percent_estimate': 0.0994318181818201}], 'percent_max': '5', 'percent_min': 0, 'is_in_taxonomy': 0, 'percent_estimate': 0.0994318181818201}, {'id': 'en:com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans', 'text': 'com l saturated fat tary fiber and potassium coke scan here for more food information rchase floz cans', 'percent_max': '5', 'percent_min': 0, 'is_in_taxonomy': 0, 'percent_estimate': 0.099431818181813}], 'labels_tags': [], 'nova_groups': '4', 'origins_old': '', 'states_tags': ['en:to-be-completed', 'en:nutrition-facts-completed', 'en:ingredients-completed', 'en:expiration-date-to-be-completed', 'en:packaging-code-to-be-completed', 'en:characteristics-to-be-completed', 'en:origins-to-be-completed', 'en:categories-completed', 'en:brands-completed', 'en:packaging-completed', 'en:quantity-completed', 'en:product-name-completed', 'en:photos-to-be-validated', 'en:packaging-photo-to-be-selected', 'en:nutrition-photo-to-be-selected', 'en:ingredients-photo-selected', 'en:front-photo-selected', 'en:photos-uploaded'], 'stores_tags': [], 'traces_tags': [], 'allergens_lc': 'en', 'completeness': 0.775, 'countries_lc': 'en', 'data_sources': 'App - Horizon, App - InFood, Apps', 'editors_tags': ['ecoscore-impact-estimator', 'foodless', 'inf', 'openfoodfacts-contributors', 'swipe-studio', 'tanyad1013', 'teolemon', 'thaialagata'], 'generic_name': '', 'last_image_t': 1640260897, 'origins_tags': [], 'packaging_lc': 'en', 'packagings_n': 2, 'product_name': 'Coca-Cola', 'product_type': 'food', 'serving_size': '355ml', 'categories_lc': 'en', 'checkers_tags': [], 'ecoscore_data': {'scores': {}, 'status': 'unknown', 'missing': {'labels': 1, 'origins': 1, 'packagings': 1, 'agb_category': 1}, 'agribalyse': {'warning': 'missing_agribalyse_match'}, 'adjustments': {'packaging': {'score': -28, 'value': -13, 'warning': 'unspecified_material', 'packagings': [{'shape': 'en:can', 'material': 'en:heavy-aluminium', 'ecoscore_shape_ratio': 1, 'ecoscore_material_score': 72}, {'shape': 'en:box', 'material': 'en:unknown', 'ecoscore_shape_ratio': 1, 'ecoscore_material_score': 0}], 'non_recyclable_and_non_biodegradable_materials': 0}, 'production_system': {'value': 0, 'labels': [], 'warning': 'no_label'}, 'threatened_species': {}, 'origins_of_ingredients': {'value': -5, 'values': {'ad': -5, 'al': -5, 'at': -5, 'ax': -5, 'ba': -5, 'be': -5, 'bg': -5, 'ch': -5, 'cy': -5, 'cz': -5, 'de': -5, 'dk': -5, 'dz': -5, 'ee': -5, 'eg': -5, 'es': -5, 'fi': -5, 'fo': -5, 'fr': -5, 'gg': -5, 'gi': -5, 'gr': -5, 'hr': -5, 'hu': -5, 'ie': -5, 'il': -5, 'im': -5, 'is': -5, 'it': -5, 'je': -5, 'lb': -5, 'li': -5, 'lt': -5, 'lu': -5, 'lv': -5, 'ly': -5, 'ma': -5, 'mc': -5, 'md': -5, 'me': -5, 'mk': -5, 'mt': -5, 'nl': -5, 'no': -5, 'pl': -5, 'ps': -5, 'pt': -5, 'ro': -5, 'rs': -5, 'se': -5, 'si': -5, 'sj': -5, 'sk': -5, 'sm': -5, 'sy': -5, 'tn': -5, 'tr': -5, 'ua': -5, 'uk': -5, 'us': -5, 'va': -5, 'xk': -5, 'world': -5}, 'warning': 'origins_are_100_percent_unknown', 'epi_score': 0, 'epi_value': -5, 'aggregated_origins': [{'origin': 'en:unknown', 'percent': 100, 'epi_score': '0', 'transportation_score': 0}], 'transportation_score': 0, 'transportation_value': 0, 'transportation_scores': {'ad': 0, 'al': 0, 'at': 0, 'ax': 0, 'ba': 0, 'be': 0, 'bg': 0, 'ch': 0, 'cy': 0, 'cz': 0, 'de': 0, 'dk': 0, 'dz': 0, 'ee': 0, 'eg': 0, 'es': 0, 'fi': 0, 'fo': 0, 'fr': 0, 'gg': 0, 'gi': 0, 'gr': 0, 'hr': 0, 'hu': 0, 'ie': 0, 'il': 0, 'im': 0, 'is': 0, 'it': 0, 'je': 0, 'lb': 0, 'li': 0, 'lt': 0, 'lu': 0, 'lv': 0, 'ly': 0, 'ma': 0, 'mc': 0, 'md': 0, 'me': 0, 'mk': 0, 'mt': 0, 'nl': 0, 'no': 0, 'pl': 0, 'ps': 0, 'pt': 0, 'ro': 0, 'rs': 0, 'se': 0, 'si': 0, 'sj': 0, 'sk': 0, 'sm': 0, 'sy': 0, 'tn': 0, 'tr': 0, 'ua': 0, 'uk': 0, 'us': 0, 'va': 0, 'xk': 0, 'world': 0}, 'transportation_values': {'ad': 0, 'al': 0, 'at': 0, 'ax': 0, 'ba': 0, 'be': 0, 'bg': 0, 'ch': 0, 'cy': 0, 'cz': 0, 'de': 0, 'dk': 0, 'dz': 0, 'ee': 0, 'eg': 0, 'es': 0, 'fi': 0, 'fo': 0, 'fr': 0, 'gg': 0, 'gi': 0, 'gr': 0, 'hr': 0, 'hu': 0, 'ie': 0, 'il': 0, 'im': 0, 'is': 0, 'it': 0, 'je': 0, 'lb': 0, 'li': 0, 'lt': 0, 'lu': 0, 'lv': 0, 'ly': 0, 'ma': 0, 'mc': 0, 'md': 0, 'me': 0, 'mk': 0, 'mt': 0, 'nl': 0, 'no': 0, 'pl': 0, 'ps': 0, 'pt': 0, 'ro': 0, 'rs': 0, 'se': 0, 'si': 0, 'sj': 0, 'sk': 0, 'sm': 0, 'sy': 0, 'tn': 0, 'tr': 0, 'ua': 0, 'uk': 0, 'us': 0, 'va': 0, 'xk': 0, 'world': 0}, 'origins_from_categories': ['en:unknown'], 'origins_from_origins_field': ['en:unknown']}}, 'missing_agribalyse_match_warning': 1}, 'ecoscore_tags': ['unknown'], 'ingredients_n': 12, 'minerals_tags': [], 'packaging_old': 'en:card-box,en:aluminium-can', 'pnns_groups_1': 'Beverages', 'pnns_groups_2': 'Unsweetened beverages', 'vitamins_tags': [], 'weighers_tags': [], 'additives_tags': ['en:e150c', 'en:e338'], 'allergens_tags': [], 'categories_old': 'Beverages, Carbonated drinks', 'countries_tags': ['en:united-states'], 'ecoscore_grade': 'unknown', 'emb_codes_tags': [], 'informers_tags': ['openfoodfacts-contributors', 'tanyad1013', 'teolemon', 'swipe-studio', 'ecoscore-impact-estimator'], 'ingredients_lc': 'en', 'languages_tags': ['en:english', 'en:1'], 'last_updated_t': 1738753791, 'nutrition_data': 'on', 'packaging_tags': ['en:aluminium-can', 'en:card-box'], 'packaging_text': '', 'popularity_key': 23900000011, 'schema_version': 998, 'unique_scans_n': 11, 'categories_tags': ['en:beverages', 'en:carbonated-drinks'], 'correctors_tags': ['openfoodfacts-contributors', 'tanyad1013', 'teolemon', 'inf', 'swipe-studio', 'thaialagata', 'ecoscore-impact-estimator'], 'expiration_date': '', 'generic_name_en': '', 'image_front_url': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/front_en.16.400.jpg', 'image_small_url': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/front_en.16.200.jpg', 'image_thumb_url': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/front_en.16.100.jpg', 'languages_codes': {'en': 4}, 'last_modified_t': 1728751740, 'nutrient_levels': {'fat': 'low', 'salt': 'high', 'sugars': 'high'}, 'nutriscore_data': {'grade': 'e', 'score': 32, 'is_water': 0, 'is_cheese': 0, 'components': {'negative': [{'id': 'energy', 'unit': 'kJ', 'value': 165, 'points': 3, 'points_max': 10}, {'id': 'sugars', 'unit': 'g', 'value': 11, 'points': 9, 'points_max': 10}, {'id': 'saturated_fat', 'unit': 'g', 'value': 0, 'points': 0, 'points_max': 10}, {'id': 'salt', 'unit': 'g', 'value': 31.7, 'points': 20, 'points_max': 20}, {'id': 'non_nutritive_sweeteners', 'unit': 'number', 'value': 0, 'points': 0, 'points_max': 4}], 'positive': [{'id': 'proteins', 'unit': 'g', 'value': 0, 'points': 0, 'points_max': 7}, {'id': 'fiber', 'unit': 'g', 'value': None, 'points': 0, 'points_max': 5}, {'id': 'fruits_vegetables_legumes', 'unit': '%', 'value': 0, 'points': 0, 'points_max': 6}]}, 'is_beverage': 1, 'count_proteins': 1, 'negative_points': 32, 'positive_points': 0, 'positive_nutrients': ['proteins', 'fiber', 'fruits_vegetables_legumes'], 'is_red_meat_product': 0, 'negative_points_max': 54, 'positive_points_max': 18, 'count_proteins_reason': 'beverage', 'is_fat_oil_nuts_seeds': 0}, 'nutriscore_tags': ['e'], 'popularity_tags': ['top-country-fr-scans-2019', 'bottom-25-percent-scans-2020', 'bottom-20-percent-scans-2020', 'top-85-percent-scans-2020', 'top-90-percent-scans-2020', 'top-5000-us-scans-2020', 'top-10000-us-scans-2020', 'top-50000-us-scans-2020', 'top-100000-us-scans-2020', 'top-country-us-scans-2020', 'top-75-percent-scans-2021', 'top-80-percent-scans-2021', 'top-85-percent-scans-2021', 'top-90-percent-scans-2021', 'top-5000-ua-scans-2021', 'top-10000-ua-scans-2021', 'top-50000-ua-scans-2021', 'top-100000-ua-scans-2021', 'top-country-ua-scans-2021', 'top-50000-us-scans-2021', 'top-100000-us-scans-2021', 'top-75-percent-scans-2022', 'top-80-percent-scans-2022', 'top-85-percent-scans-2022', 'top-90-percent-scans-2022', 'top-1000-us-scans-2022', 'top-5000-us-scans-2022', 'top-10000-us-scans-2022', 'top-50000-us-scans-2022', 'top-100000-us-scans-2022', 'top-country-us-scans-2022', 'top-75-percent-scans-2023', 'top-80-percent-scans-2023', 'top-85-percent-scans-2023', 'top-90-percent-scans-2023', 'top-5000-mx-scans-2023', 'top-10000-mx-scans-2023', 'top-50000-mx-scans-2023', 'top-100000-mx-scans-2023', 'top-country-mx-scans-2023', 'top-100000-scans-2024', 'at-least-5-scans-2024', 'at-least-10-scans-2024', 'top-75-percent-scans-2024', 'top-80-percent-scans-2024', 'top-85-percent-scans-2024', 'top-90-percent-scans-2024', 'top-10000-us-scans-2024', 'top-50000-us-scans-2024', 'top-100000-us-scans-2024', 'top-country-us-scans-2024', 'top-100000-fr-scans-2024', 'top-50000-it-scans-2024', 'top-100000-it-scans-2024', 'top-10000-in-scans-2024', 'top-50000-in-scans-2024', 'top-100000-in-scans-2024', 'top-5000-lv-scans-2024', 'top-10000-lv-scans-2024', 'top-50000-lv-scans-2024', 'top-100000-lv-scans-2024', 'top-5000-sg-scans-2024', 'top-10000-sg-scans-2024', 'top-50000-sg-scans-2024', 'top-100000-sg-scans-2024', 'top-50000-nl-scans-2024', 'top-100000-nl-scans-2024', 'top-50000-es-scans-2024', 'top-100000-es-scans-2024'], 'product_name_en': 'Coca-Cola', 'purchase_places': '', 'selected_images': {'front': {'small': {'en': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/front_en.16.200.jpg'}, 'thumb': {'en': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/front_en.16.100.jpg'}, 'display': {'en': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/front_en.16.400.jpg'}}, 'ingredients': {'small': {'en': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/ingredients_en.8.200.jpg'}, 'thumb': {'en': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/ingredients_en.8.100.jpg'}, 'display': {'en': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/ingredients_en.8.400.jpg'}}}, 'amino_acids_tags': [], 'entry_dates_tags': ['2016-11-05', '2016-11', '2016'], 'food_groups_tags': ['en:beverages', 'en:unsweetened-beverages'], 'ingredients_tags': ['en:pledse-recycle-cans', 'en:cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'en:natural-carbonated-water', 'en:high-caramel-color', 'en:flavouring', 'en:caffeine', 'en:canned-under-authority-of-the-coca-cola-company-atlanta', 'en:ga-30313', 'en:canner-s-name-and-address-appear-on-each-can', 'en:caffeine-content', 'en:com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans', 'en:12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke'], 'ingredients_text': "pledse recycle cans, cartons cts ainer fructose corn syrup 1 can phosphoric acid, natural carbonated water, high caramel color, flavors, caffeine, canned under authority of the coca-cola company atlanta, ga 30313, canner's name and address appear on each can, caffeine content: 34 mg/12 fl oz 02017 the coca-cola 140 daily value 0% 2% 14% g company consumer information ugars 78%| call 1-800-438-2653 coke,com l saturated fat tary fiber and potassium coke scan here for more food information rchase floz cans", 'labels_hierarchy': [], 'nova_group_debug': '', 'nova_groups_tags': ['en:4-ultra-processed-food-and-drink-products'], 'nucleotides_tags': [], 'nutriscore_grade': 'e', 'nutriscore_score': 32, 'nutrition_grades': 'e', 'product_quantity': '0', 'serving_quantity': '355', 'states_hierarchy': ['en:to-be-completed', 'en:nutrition-facts-completed', 'en:ingredients-completed', 'en:expiration-date-to-be-completed', 'en:packaging-code-to-be-completed', 'en:characteristics-to-be-completed', 'en:origins-to-be-completed', 'en:categories-completed', 'en:brands-completed', 'en:packaging-completed', 'en:quantity-completed', 'en:product-name-completed', 'en:photos-to-be-validated', 'en:packaging-photo-to-be-selected', 'en:nutrition-photo-to-be-selected', 'en:ingredients-photo-selected', 'en:front-photo-selected', 'en:photos-uploaded'], 'traces_from_user': '(en) ', 'traces_hierarchy': [], 'data_quality_tags': ['en:packaging-data-incomplete', 'en:ingredients-percent-analysis-ok', 'en:ecoscore-extended-data-computed', 'en:ecoscore-extended-data-less-precise-than-agribalyse', 'en:food-groups-1-known', 'en:food-groups-2-known', 'en:food-groups-3-unknown', 'en:ingredients-unknown-score-above-5', 'en:ingredients-80-percent-unknown', 'en:ingredients-ingredient-tag-length-greater-than-50', 'en:ingredients-ingredient-tag-length-greater-than-100', 'en:nutrition-value-very-high-for-category-salt', 'en:product-quantity-under-1g', 'en:serving-quantity-over-product-quantity', 'en:ecoscore-origins-of-ingredients-origins-are-100-percent-unknown', 'en:ecoscore-packaging-unspecified-material', 'en:ecoscore-production-system-no-label'], 'data_sources_tags': ['app-horizon', 'app-infood', 'apps'], 'ingredients_debug': ['pledse recycle cans& cartons cts ainer FRUCTOSE CORN SYRUP 1 Can PHOSPHORIC ACID', ',', None, None, None, ' NATURAL CARBONATED WATER', ',', None, None, None, ' HIGH CARAMEL COLOR', ',', None, None, None, ' FLAVORS', ',', None, None, None, ' CAFFEINE', '. ', None, None, None, 'CANNED UNDER AUTHORITY OF THE COCA-COLA COMPANY ATLANTA', ',', None, None, None, ' GA 30313', '. ', None, None, None, "CANNER'S NAME AND ADDRESS APPEAR ON EACH CAN", '. ', None, None, None, 'CAFFEINE CONTENT', ':', ':', None, None, ' 34 mg', '/', None, None, '/', '12 fl oz 02017 THE COCA-COLA 140 Daily Value 0% 2% 14% g COMPANY CONSUMER INFORMATION ugars 78%| CALL 1-800-438-2653 coke.com l saturated fat tary fiber and potassium Coke SCAN HERE FoR MORE FOOD INFORMATION RCHASE FLOZ CANS'], 'origins_hierarchy': [], 'packaging_text_en': '', 'ingredients_n_tags': ['12', '11-20'], 'minerals_prev_tags': [], 'nutriscore_version': '2023', 'nutrition_data_per': 'serving', 'nutrition_grade_fr': 'e', 'photographers_tags': ['openfoodfacts-contributors', 'tanyad1013', 'thaialagata'], 'pnns_groups_1_tags': ['beverages', 'known'], 'pnns_groups_2_tags': ['unsweetened-beverages', 'known'], 'vitamins_prev_tags': [], 'allergens_from_user': '(en) ', 'allergens_hierarchy': [], 'category_properties': {}, 'countries_hierarchy': ['en:united-states'], 'ingredients_text_en': "pledse recycle cans, cartons cts ainer fructose corn syrup 1 can phosphoric acid, natural carbonated water, high caramel color, flavors, caffeine, canned under authority of the coca-cola company atlanta, ga 30313, canner's name and address appear on each can, caffeine content: 34 mg/12 fl oz 02017 the coca-cola 140 daily value 0% 2% 14% g company consumer information ugars 78%| call 1-800-438-2653 coke,com l saturated fat tary fiber and potassium coke scan here for more food information rchase floz cans", 'known_ingredients_n': 2, 'languages_hierarchy': ['en:english'], 'main_countries_tags': [], 'nova_groups_markers': {'4': [['additives', 'en:e150c'], ['ingredients', 'en:flavouring']]}, 'packaging_hierarchy': ['en:Aluminium-can', 'en:Card-box'], 'added_countries_tags': [], 'categories_hierarchy': ['en:beverages', 'en:carbonated-drinks'], 'compared_to_category': 'en:carbonated-drinks', 'ingredients_analysis': {'en:vegan-status-unknown': ['en:pledse-recycle-cans', 'en:cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'en:natural-carbonated-water', 'en:high-caramel-color', 'en:canned-under-authority-of-the-coca-cola-company-atlanta', 'en:ga-30313', 'en:canner-s-name-and-address-appear-on-each-can', 'en:caffeine-content', 'en:12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke', 'en:com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans'], 'en:palm-oil-content-unknown': ['en:pledse-recycle-cans', 'en:cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'en:natural-carbonated-water', 'en:high-caramel-color', 'en:canned-under-authority-of-the-coca-cola-company-atlanta', 'en:ga-30313', 'en:canner-s-name-and-address-appear-on-each-can', 'en:caffeine-content', 'en:12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke', 'en:com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans'], 'en:vegetarian-status-unknown': ['en:pledse-recycle-cans', 'en:cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'en:natural-carbonated-water', 'en:high-caramel-color', 'en:canned-under-authority-of-the-coca-cola-company-atlanta', 'en:ga-30313', 'en:canner-s-name-and-address-appear-on-each-can', 'en:caffeine-content', 'en:12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke', 'en:com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans']}, 'last_edit_dates_tags': ['2024-10-12', '2024-10', '2024'], 'manufacturing_places': '', 'nutrient_levels_tags': ['en:fat-in-low-quantity', 'en:sugars-in-high-quantity', 'en:salt-in-high-quantity'], 'nutriscore_2021_tags': ['e'], 'nutriscore_2023_tags': ['e'], 'packagings_materials': {'all': {}, 'en:metal': {}, 'en:unknown': {}}, 'purchase_places_tags': [], 'amino_acids_prev_tags': [], 'categories_properties': {}, 'ciqual_food_name_tags': ['unknown'], 'image_front_small_url': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/front_en.16.200.jpg', 'image_front_thumb_url': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/front_en.16.100.jpg', 'image_ingredients_url': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/ingredients_en.8.400.jpg', 'ingredients_hierarchy': ['en:pledse-recycle-cans', 'en:cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'en:natural-carbonated-water', 'en:high-caramel-color', 'en:flavouring', 'en:caffeine', 'en:canned-under-authority-of-the-coca-cola-company-atlanta', 'en:ga-30313', 'en:canner-s-name-and-address-appear-on-each-can', 'en:caffeine-content', 'en:com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans', 'en:12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke'], 'ingredients_ids_debug': ['pledse-recycle-cans-cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'natural-carbonated-water', 'high-caramel-color', 'flavors', 'caffeine', 'canned-under-authority-of-the-coca-cola-company-atlanta', 'ga-30313', 'canner-s-name-and-address-appear-on-each-can', 'caffeine-content', '34-mg', '12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke-com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans'], 'last_image_dates_tags': ['2021-12-23', '2021-12', '2021'], 'nucleotides_prev_tags': [], 'nutrition_grades_tags': ['e'], 'nutrition_score_debug': '', 'packaging_shapes_tags': ['en:box', 'en:can'], 'serving_quantity_unit': 'ml', 'unknown_ingredients_n': 10, 'data_quality_bugs_tags': [], 'data_quality_info_tags': ['en:packaging-data-incomplete', 'en:ingredients-percent-analysis-ok', 'en:ecoscore-extended-data-computed', 'en:ecoscore-extended-data-less-precise-than-agribalyse', 'en:food-groups-1-known', 'en:food-groups-2-known', 'en:food-groups-3-unknown'], 'ingredients_text_debug': "pledse recycle cans& cartons cts ainer FRUCTOSE CORN SYRUP 1 Can PHOSPHORIC ACID, NATURAL CARBONATED WATER, HIGH CARAMEL COLOR, FLAVORS, CAFFEINE. CANNED UNDER AUTHORITY OF THE COCA-COLA COMPANY ATLANTA, GA 30313. CANNER'S NAME AND ADDRESS APPEAR ON EACH CAN. CAFFEINE CONTENT: 34 mg/12 fl oz 02017 THE COCA-COLA 140 Daily Value 0% 2% 14% g COMPANY CONSUMER INFORMATION ugars 78%| CALL 1-800-438-2653 coke.com l saturated fat tary fiber and potassium Coke SCAN HERE FoR MORE FOOD INFORMATION RCHASE FLOZ CANS", 'removed_countries_tags': [], 'unknown_nutrients_tags': [], 'additives_original_tags': ['en:e338', 'en:e150c'], 'traces_from_ingredients': '', 'data_quality_errors_tags': [], 'debug_param_sorted_langs': ['en'], 'ingredients_sweeteners_n': 0, 'nutrition_score_beverage': 1, 'packaging_materials_tags': ['en:aluminium'], 'packaging_recycling_tags': [], 'ingredients_analysis_tags': ['en:palm-oil-content-unknown', 'en:vegan-status-unknown', 'en:vegetarian-status-unknown'], 'ingredients_original_tags': ['en:pledse-recycle-cans', 'en:cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'en:natural-carbonated-water', 'en:high-caramel-color', 'en:flavouring', 'en:caffeine', 'en:canned-under-authority-of-the-coca-cola-company-atlanta', 'en:ga-30313', 'en:canner-s-name-and-address-appear-on-each-can', 'en:caffeine-content', 'en:com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans', 'en:12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke'], 'interface_version_created': '20120622', 'manufacturing_places_tags': [], 'nutriscore_score_opposite': -32, 'allergens_from_ingredients': '', 'categories_properties_tags': ['all-products', 'categories-known', 'agribalyse-food-code-unknown', 'agribalyse-proxy-food-code-unknown', 'ciqual-food-code-unknown', 'agribalyse-unknown'], 'data_quality_warnings_tags': ['en:ingredients-unknown-score-above-5', 'en:ingredients-80-percent-unknown', 'en:ingredients-ingredient-tag-length-greater-than-50', 'en:ingredients-ingredient-tag-length-greater-than-100', 'en:nutrition-value-very-high-for-category-salt', 'en:product-quantity-under-1g', 'en:serving-quantity-over-product-quantity', 'en:ecoscore-origins-of-ingredients-origins-are-100-percent-unknown', 'en:ecoscore-packaging-unspecified-material', 'en:ecoscore-production-system-no-label'], 'interface_version_modified': '20150316.jqm2', 'image_ingredients_small_url': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/ingredients_en.8.200.jpg', 'image_ingredients_thumb_url': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/ingredients_en.8.100.jpg', 'ingredients_from_palm_oil_n': 0, 'nutrition_data_prepared_per': '100g', 'ingredients_percent_analysis': 1, 'ingredients_from_palm_oil_tags': [], 'ingredients_text_with_allergens': "pledse recycle cans, cartons cts ainer fructose corn syrup 1 can phosphoric acid, natural carbonated water, high caramel color, flavors, caffeine, canned under authority of the coca-cola company atlanta, ga 30313, canner's name and address appear on each can, caffeine content: 34 mg/12 fl oz 02017 the coca-cola 140 daily value 0% 2% 14% g company consumer information ugars 78%| call 1-800-438-2653 coke,com l saturated fat tary fiber and potassium coke scan here for more food information rchase floz cans", 'ingredients_without_ciqual_codes': ['en:12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke', 'en:caffeine', 'en:caffeine-content', 'en:canned-under-authority-of-the-coca-cola-company-atlanta', 'en:canner-s-name-and-address-appear-on-each-can', 'en:cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'en:com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans', 'en:flavouring', 'en:ga-30313', 'en:high-caramel-color', 'en:natural-carbonated-water', 'en:pledse-recycle-cans'], 'nutrition_score_warning_no_fiber': 1, 'ingredients_without_ecobalyse_ids': ['en:12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke', 'en:caffeine', 'en:caffeine-content', 'en:canned-under-authority-of-the-coca-cola-company-atlanta', 'en:canner-s-name-and-address-appear-on-each-can', 'en:cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'en:com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans', 'en:flavouring', 'en:ga-30313', 'en:high-caramel-color', 'en:natural-carbonated-water', 'en:pledse-recycle-cans'], 'other_nutritional_substances_tags': [], 'ingredients_text_with_allergens_en': "pledse recycle cans, cartons cts ainer fructose corn syrup 1 can phosphoric acid, natural carbonated water, high caramel color, flavors, caffeine, canned under authority of the coca-cola company atlanta, ga 30313, canner's name and address appear on each can, caffeine content: 34 mg/12 fl oz 02017 the coca-cola 140 daily value 0% 2% 14% g company consumer information ugars 78%| call 1-800-438-2653 coke,com l saturated fat tary fiber and potassium coke scan here for more food information rchase floz cans", 'ingredients_without_ciqual_codes_n': 12, 'ingredients_without_ecobalyse_ids_n': 12, 'ingredients_with_specified_percent_n': 0, 'ingredients_non_nutritive_sweeteners_n': 0, 'ingredients_with_specified_percent_sum': 0, 'ingredients_with_unspecified_percent_n': 11, 'ingredients_that_may_be_from_palm_oil_n': 0, 'ingredients_with_unspecified_percent_sum': 100, 'ingredients_that_may_be_from_palm_oil_tags': [], 'ingredients_from_or_that_may_be_from_palm_oil_n': 0, 'nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients': 1, 'nutrition_score_warning_fruits_vegetables_legumes_estimate_from_ingredients': 1, 'nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients_value': 0, 'nutrition_score_warning_fruits_vegetables_legumes_estimate_from_ingredients_value': 0}}}}, + sql='UPDATE main_receipt_items SET name = %s, qty = %s, uom = %s, data = %s WHERE id=%s RETURNING *;') +2025-04-12 14:48:31.330764 --- ERROR --- DatabaseError(message='invalid input syntax for type integer: " Pinch"LINE 1: ...pt_items SET name = 'Coca-Cola', qty = '1', uom = ' Pinch', ... ^', + payload={'id': 66, 'update': {'name': 'Coca-Cola', 'qty': '1', 'uom': ' Pinch', 'data': {'cost': '7.92', 'expires': False, 'api_data': {'id': '0049000028904', 'lc': 'en', '_id': '0049000028904', 'rev': 20, 'code': '0049000028904', 'lang': 'en', 'link': '', 'teams': 'swipe-studio', 'brands': 'Coca-Cola', 'images': {'1': {'sizes': {'100': {'h': 60, 'w': 100}, '400': {'h': 239, 'w': 400}, 'full': {'h': 957, 'w': 1600}}, 'uploader': 'openfoodfacts-contributors', 'uploaded_t': '1478385267'}, '2': {'sizes': {'100': {'h': 100, 'w': 75}, '400': {'h': 400, 'w': 300}, 'full': {'h': 3328, 'w': 2496}}, 'uploader': 'tanyad1013', 'uploaded_t': 1555187983}, '3': {'sizes': {'100': {'h': 100, 'w': 75}, '400': {'h': 400, 'w': 300}, 'full': {'h': 3328, 'w': 2496}}, 'uploader': 'tanyad1013', 'uploaded_t': 1555188029}, '5': {'sizes': {'100': {'h': 100, 'w': 100}, '400': {'h': 400, 'w': 400}, 'full': {'h': 1400, 'w': 1400}}, 'uploader': 'thaialagata', 'uploaded_t': 1640260897}, 'front_en': {'x1': '0', 'x2': '0', 'y1': '0', 'y2': '0', 'rev': '16', 'angle': '0', 'imgid': '5', 'sizes': {'100': {'h': 78, 'w': 100}, '200': {'h': 156, 'w': 200}, '400': {'h': 311, 'w': 400}, 'full': {'h': 1080, 'w': 1389}}, 'geometry': '0x0-0-0', 'normalize': 'false', 'white_magic': 'false', 'coordinates_image_size': 'full'}, 'ingredients_en': {'x1': None, 'x2': None, 'y1': None, 'y2': None, 'rev': '8', 'angle': None, 'imgid': '3', 'sizes': {'100': {'h': 100, 'w': 75}, '200': {'h': 200, 'w': 150}, '400': {'h': 400, 'w': 300}, 'full': {'h': 3328, 'w': 2496}}, 'geometry': '0x0-0-0', 'normalize': None, 'white_magic': None}}, 'labels': '', 'origin': '', 'states': 'en:to-be-completed, en:nutrition-facts-completed, en:ingredients-completed, en:expiration-date-to-be-completed, en:packaging-code-to-be-completed, en:characteristics-to-be-completed, en:origins-to-be-completed, en:categories-completed, en:brands-completed, en:packaging-completed, en:quantity-completed, en:product-name-completed, en:photos-to-be-validated, en:packaging-photo-to-be-selected, en:nutrition-photo-to-be-selected, en:ingredients-photo-selected, en:front-photo-selected, en:photos-uploaded', 'stores': '', 'traces': '', 'creator': 'openfoodfacts-contributors', 'origins': '', 'scans_n': 18, 'sortkey': 1609090427, 'complete': 0, 'quantity': '12 cans', '_keywords': ['beverage', 'carbonated', 'coca-cola', 'drink'], 'allergens': '', 'countries': 'United States', 'created_t': 1478385267, 'emb_codes': '', 'image_url': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/front_en.16.400.jpg', 'labels_lc': 'en', 'languages': {'en:english': 4}, 'max_imgid': '5', 'misc_tags': ['en:ecoscore-extended-data-computed', 'en:ecoscore-extended-data-version-4', 'en:ecoscore-not-computed', 'en:nutriscore-2021-e-2023-e', 'en:nutriscore-2021-same-as-2023', 'en:nutriscore-computed', 'en:nutrition-fruits-vegetables-legumes-estimate-from-ingredients', 'en:nutrition-fruits-vegetables-nuts-estimate-from-ingredients', 'en:nutrition-no-fiber', 'en:nutrition-no-fiber-or-fruits-vegetables-nuts', 'en:packagings-not-complete', 'en:packagings-not-empty', 'en:packagings-not-empty-but-not-complete', 'en:packagings-number-of-components-2'], 'origin_en': '', 'packaging': 'Aluminium-can, Card-box', 'traces_lc': 'en', 'categories': 'Beverages, Carbonated drinks', 'codes_tags': ['code-13', 'conflict-with-upc-12', '0049000028xxx', '004900002xxxx', '00490000xxxxx', '0049000xxxxxx', '004900xxxxxxx', '00490xxxxxxxx', '0049xxxxxxxxx', '004xxxxxxxxxx', '00xxxxxxxxxxx', '0xxxxxxxxxxxx'], 'labels_old': '', 'nova_group': 4, 'nutriments': {'fat': 0, 'salt': 112.5, 'energy': 586, 'sodium': 45, 'sugars': 39, 'fat_100g': 0, 'fat_unit': 'g', 'proteins': 0, 'fat_value': 0, 'salt_100g': 31.7, 'salt_unit': 'g', 'nova-group': 4, 'salt_value': 112.5, 'energy-kcal': 140, 'energy_100g': 165, 'energy_unit': 'kcal', 'fat_serving': 0, 'sodium_100g': 12.7, 'sodium_unit': 'g', 'sugars_100g': 11, 'sugars_unit': 'g', 'energy_value': 140, 'salt_serving': 112.5, 'sodium_value': 45, 'sugars_value': 39, 'carbohydrates': 39, 'proteins_100g': 0, 'proteins_unit': 'g', 'energy_serving': 586, 'proteins_value': 0, 'sodium_serving': 45, 'sugars_serving': 39, 'nova-group_100g': 4, 'energy-kcal_100g': 39.4, 'energy-kcal_unit': 'kcal', 'proteins_serving': 0, 'energy-kcal_value': 140, 'carbohydrates_100g': 11, 'carbohydrates_unit': 'g', 'nova-group_serving': 4, 'nutrition-score-fr': 32, 'carbohydrates_value': 39, 'energy-kcal_serving': 140, 'carbohydrates_serving': 39, 'nutrition-score-fr_100g': 32, 'energy-kcal_value_computed': 156, 'fruits-vegetables-nuts-estimate-from-ingredients_100g': 0, 'fruits-vegetables-legumes-estimate-from-ingredients_100g': 0, 'fruits-vegetables-nuts-estimate-from-ingredients_serving': 0, 'fruits-vegetables-legumes-estimate-from-ingredients_serving': 0}, 'nutriscore': {'2021': {'data': {'fiber': 0, 'energy': 165, 'is_fat': 0, 'sodium': 12700, 'sugars': 11, 'is_water': 0, 'proteins': 0, 'is_cheese': 0, 'fiber_value': 0, 'is_beverage': 1, 'energy_value': 165, 'fiber_points': 0, 'sodium_value': 12700, 'sugars_value': 11, 'energy_points': 6, 'saturated_fat': 0, 'sodium_points': 10, 'sugars_points': 8, 'proteins_value': 0, 'negative_points': 24, 'positive_points': 0, 'proteins_points': 0, 'saturated_fat_ratio': 0, 'saturated_fat_value': 0, 'saturated_fat_points': 0, 'fruits_vegetables_nuts_colza_walnut_olive_oils': 0, 'fruits_vegetables_nuts_colza_walnut_olive_oils_value': 0, 'fruits_vegetables_nuts_colza_walnut_olive_oils_points': 0}, 'grade': 'e', 'score': 24, 'category_available': 1, 'nutrients_available': 1, 'nutriscore_computed': 1, 'nutriscore_applicable': 1}, '2023': {'data': {'is_water': 0, 'is_cheese': 0, 'components': {'negative': [{'id': 'energy', 'unit': 'kJ', 'value': 165, 'points': 3, 'points_max': 10}, {'id': 'sugars', 'unit': 'g', 'value': 11, 'points': 9, 'points_max': 10}, {'id': 'saturated_fat', 'unit': 'g', 'value': 0, 'points': 0, 'points_max': 10}, {'id': 'salt', 'unit': 'g', 'value': 31.7, 'points': 20, 'points_max': 20}, {'id': 'non_nutritive_sweeteners', 'unit': 'number', 'value': 0, 'points': 0, 'points_max': 4}], 'positive': [{'id': 'proteins', 'unit': 'g', 'value': 0, 'points': 0, 'points_max': 7}, {'id': 'fiber', 'unit': 'g', 'value': None, 'points': 0, 'points_max': 5}, {'id': 'fruits_vegetables_legumes', 'unit': '%', 'value': 0, 'points': 0, 'points_max': 6}]}, 'is_beverage': 1, 'count_proteins': 1, 'negative_points': 32, 'positive_points': 0, 'positive_nutrients': ['proteins', 'fiber', 'fruits_vegetables_legumes'], 'is_red_meat_product': 0, 'negative_points_max': 54, 'positive_points_max': 18, 'count_proteins_reason': 'beverage', 'is_fat_oil_nuts_seeds': 0}, 'grade': 'e', 'score': 32, 'category_available': 1, 'nutrients_available': 1, 'nutriscore_computed': 1, 'nutriscore_applicable': 1}}, 'origins_lc': 'en', 'packagings': [{'shape': 'en:can', 'material': 'en:aluminium'}, {'shape': 'en:box'}], 'teams_tags': ['swipe-studio'], 'update_key': 'sort', 'additives_n': 2, 'brands_tags': ['coca-cola'], 'cities_tags': [], 'food_groups': 'en:unsweetened-beverages', 'ingredients': [{'id': 'en:pledse-recycle-cans', 'text': 'pledse recycle cans', 'percent_max': 100, 'percent_min': 9.09090909090909, 'is_in_taxonomy': 0, 'percent_estimate': 54.5454545454545}, {'id': 'en:cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'text': 'cartons cts ainer fructose corn syrup 1 can phosphoric acid', 'percent_max': 50, 'percent_min': 0, 'is_in_taxonomy': 0, 'percent_estimate': 22.7272727272727}, {'id': 'en:natural-carbonated-water', 'text': 'natural carbonated water', 'percent_max': 33.3333333333333, 'percent_min': 0, 'is_in_taxonomy': 0, 'percent_estimate': 11.3636363636364}, {'id': 'en:high-caramel-color', 'text': 'high caramel color', 'percent_max': 25, 'percent_min': 0, 'is_in_taxonomy': 0, 'percent_estimate': 5.68181818181818}, {'id': 'en:flavouring', 'text': 'flavors', 'vegan': 'maybe', 'vegetarian': 'maybe', 'percent_max': '5', 'percent_min': 0, 'is_in_taxonomy': 1, 'percent_estimate': 2.5}, {'id': 'en:caffeine', 'text': 'caffeine', 'vegan': 'yes', 'vegetarian': 'yes', 'percent_max': '5', 'percent_min': 0, 'is_in_taxonomy': 1, 'percent_estimate': 1.59090909090909}, {'id': 'en:canned-under-authority-of-the-coca-cola-company-atlanta', 'text': 'canned under authority of the coca-cola company atlanta', 'percent_max': '5', 'percent_min': 0, 'is_in_taxonomy': 0, 'percent_estimate': 0.795454545454547}, {'id': 'en:ga-30313', 'text': 'ga 30313', 'percent_max': '5', 'percent_min': 0, 'is_in_taxonomy': 0, 'percent_estimate': 0.397727272727273}, {'id': 'en:canner-s-name-and-address-appear-on-each-can', 'text': "canner's name and address appear on each can", 'percent_max': '5', 'percent_min': 0, 'is_in_taxonomy': 0, 'percent_estimate': 0.19886363636364}, {'id': 'en:caffeine-content', 'text': 'caffeine content', 'quantity': '34 mg', 'quantity_g': 0.034, 'ingredients': [{'id': 'en:12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke', 'text': '12 fl oz 02017 the coca-cola 140 daily value 0% 2% 14% g company consumer information ugars 78%| call 1-800-438-2653 coke', 'percent_max': '5', 'percent_min': 0, 'is_in_taxonomy': 0, 'percent_estimate': 0.0994318181818201}], 'percent_max': '5', 'percent_min': 0, 'is_in_taxonomy': 0, 'percent_estimate': 0.0994318181818201}, {'id': 'en:com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans', 'text': 'com l saturated fat tary fiber and potassium coke scan here for more food information rchase floz cans', 'percent_max': '5', 'percent_min': 0, 'is_in_taxonomy': 0, 'percent_estimate': 0.099431818181813}], 'labels_tags': [], 'nova_groups': '4', 'origins_old': '', 'states_tags': ['en:to-be-completed', 'en:nutrition-facts-completed', 'en:ingredients-completed', 'en:expiration-date-to-be-completed', 'en:packaging-code-to-be-completed', 'en:characteristics-to-be-completed', 'en:origins-to-be-completed', 'en:categories-completed', 'en:brands-completed', 'en:packaging-completed', 'en:quantity-completed', 'en:product-name-completed', 'en:photos-to-be-validated', 'en:packaging-photo-to-be-selected', 'en:nutrition-photo-to-be-selected', 'en:ingredients-photo-selected', 'en:front-photo-selected', 'en:photos-uploaded'], 'stores_tags': [], 'traces_tags': [], 'allergens_lc': 'en', 'completeness': 0.775, 'countries_lc': 'en', 'data_sources': 'App - Horizon, App - InFood, Apps', 'editors_tags': ['ecoscore-impact-estimator', 'foodless', 'inf', 'openfoodfacts-contributors', 'swipe-studio', 'tanyad1013', 'teolemon', 'thaialagata'], 'generic_name': '', 'last_image_t': 1640260897, 'origins_tags': [], 'packaging_lc': 'en', 'packagings_n': 2, 'product_name': 'Coca-Cola', 'product_type': 'food', 'serving_size': '355ml', 'categories_lc': 'en', 'checkers_tags': [], 'ecoscore_data': {'scores': {}, 'status': 'unknown', 'missing': {'labels': 1, 'origins': 1, 'packagings': 1, 'agb_category': 1}, 'agribalyse': {'warning': 'missing_agribalyse_match'}, 'adjustments': {'packaging': {'score': -28, 'value': -13, 'warning': 'unspecified_material', 'packagings': [{'shape': 'en:can', 'material': 'en:heavy-aluminium', 'ecoscore_shape_ratio': 1, 'ecoscore_material_score': 72}, {'shape': 'en:box', 'material': 'en:unknown', 'ecoscore_shape_ratio': 1, 'ecoscore_material_score': 0}], 'non_recyclable_and_non_biodegradable_materials': 0}, 'production_system': {'value': 0, 'labels': [], 'warning': 'no_label'}, 'threatened_species': {}, 'origins_of_ingredients': {'value': -5, 'values': {'ad': -5, 'al': -5, 'at': -5, 'ax': -5, 'ba': -5, 'be': -5, 'bg': -5, 'ch': -5, 'cy': -5, 'cz': -5, 'de': -5, 'dk': -5, 'dz': -5, 'ee': -5, 'eg': -5, 'es': -5, 'fi': -5, 'fo': -5, 'fr': -5, 'gg': -5, 'gi': -5, 'gr': -5, 'hr': -5, 'hu': -5, 'ie': -5, 'il': -5, 'im': -5, 'is': -5, 'it': -5, 'je': -5, 'lb': -5, 'li': -5, 'lt': -5, 'lu': -5, 'lv': -5, 'ly': -5, 'ma': -5, 'mc': -5, 'md': -5, 'me': -5, 'mk': -5, 'mt': -5, 'nl': -5, 'no': -5, 'pl': -5, 'ps': -5, 'pt': -5, 'ro': -5, 'rs': -5, 'se': -5, 'si': -5, 'sj': -5, 'sk': -5, 'sm': -5, 'sy': -5, 'tn': -5, 'tr': -5, 'ua': -5, 'uk': -5, 'us': -5, 'va': -5, 'xk': -5, 'world': -5}, 'warning': 'origins_are_100_percent_unknown', 'epi_score': 0, 'epi_value': -5, 'aggregated_origins': [{'origin': 'en:unknown', 'percent': 100, 'epi_score': '0', 'transportation_score': 0}], 'transportation_score': 0, 'transportation_value': 0, 'transportation_scores': {'ad': 0, 'al': 0, 'at': 0, 'ax': 0, 'ba': 0, 'be': 0, 'bg': 0, 'ch': 0, 'cy': 0, 'cz': 0, 'de': 0, 'dk': 0, 'dz': 0, 'ee': 0, 'eg': 0, 'es': 0, 'fi': 0, 'fo': 0, 'fr': 0, 'gg': 0, 'gi': 0, 'gr': 0, 'hr': 0, 'hu': 0, 'ie': 0, 'il': 0, 'im': 0, 'is': 0, 'it': 0, 'je': 0, 'lb': 0, 'li': 0, 'lt': 0, 'lu': 0, 'lv': 0, 'ly': 0, 'ma': 0, 'mc': 0, 'md': 0, 'me': 0, 'mk': 0, 'mt': 0, 'nl': 0, 'no': 0, 'pl': 0, 'ps': 0, 'pt': 0, 'ro': 0, 'rs': 0, 'se': 0, 'si': 0, 'sj': 0, 'sk': 0, 'sm': 0, 'sy': 0, 'tn': 0, 'tr': 0, 'ua': 0, 'uk': 0, 'us': 0, 'va': 0, 'xk': 0, 'world': 0}, 'transportation_values': {'ad': 0, 'al': 0, 'at': 0, 'ax': 0, 'ba': 0, 'be': 0, 'bg': 0, 'ch': 0, 'cy': 0, 'cz': 0, 'de': 0, 'dk': 0, 'dz': 0, 'ee': 0, 'eg': 0, 'es': 0, 'fi': 0, 'fo': 0, 'fr': 0, 'gg': 0, 'gi': 0, 'gr': 0, 'hr': 0, 'hu': 0, 'ie': 0, 'il': 0, 'im': 0, 'is': 0, 'it': 0, 'je': 0, 'lb': 0, 'li': 0, 'lt': 0, 'lu': 0, 'lv': 0, 'ly': 0, 'ma': 0, 'mc': 0, 'md': 0, 'me': 0, 'mk': 0, 'mt': 0, 'nl': 0, 'no': 0, 'pl': 0, 'ps': 0, 'pt': 0, 'ro': 0, 'rs': 0, 'se': 0, 'si': 0, 'sj': 0, 'sk': 0, 'sm': 0, 'sy': 0, 'tn': 0, 'tr': 0, 'ua': 0, 'uk': 0, 'us': 0, 'va': 0, 'xk': 0, 'world': 0}, 'origins_from_categories': ['en:unknown'], 'origins_from_origins_field': ['en:unknown']}}, 'missing_agribalyse_match_warning': 1}, 'ecoscore_tags': ['unknown'], 'ingredients_n': 12, 'minerals_tags': [], 'packaging_old': 'en:card-box,en:aluminium-can', 'pnns_groups_1': 'Beverages', 'pnns_groups_2': 'Unsweetened beverages', 'vitamins_tags': [], 'weighers_tags': [], 'additives_tags': ['en:e150c', 'en:e338'], 'allergens_tags': [], 'categories_old': 'Beverages, Carbonated drinks', 'countries_tags': ['en:united-states'], 'ecoscore_grade': 'unknown', 'emb_codes_tags': [], 'informers_tags': ['openfoodfacts-contributors', 'tanyad1013', 'teolemon', 'swipe-studio', 'ecoscore-impact-estimator'], 'ingredients_lc': 'en', 'languages_tags': ['en:english', 'en:1'], 'last_updated_t': 1738753791, 'nutrition_data': 'on', 'packaging_tags': ['en:aluminium-can', 'en:card-box'], 'packaging_text': '', 'popularity_key': 23900000011, 'schema_version': 998, 'unique_scans_n': 11, 'categories_tags': ['en:beverages', 'en:carbonated-drinks'], 'correctors_tags': ['openfoodfacts-contributors', 'tanyad1013', 'teolemon', 'inf', 'swipe-studio', 'thaialagata', 'ecoscore-impact-estimator'], 'expiration_date': '', 'generic_name_en': '', 'image_front_url': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/front_en.16.400.jpg', 'image_small_url': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/front_en.16.200.jpg', 'image_thumb_url': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/front_en.16.100.jpg', 'languages_codes': {'en': 4}, 'last_modified_t': 1728751740, 'nutrient_levels': {'fat': 'low', 'salt': 'high', 'sugars': 'high'}, 'nutriscore_data': {'grade': 'e', 'score': 32, 'is_water': 0, 'is_cheese': 0, 'components': {'negative': [{'id': 'energy', 'unit': 'kJ', 'value': 165, 'points': 3, 'points_max': 10}, {'id': 'sugars', 'unit': 'g', 'value': 11, 'points': 9, 'points_max': 10}, {'id': 'saturated_fat', 'unit': 'g', 'value': 0, 'points': 0, 'points_max': 10}, {'id': 'salt', 'unit': 'g', 'value': 31.7, 'points': 20, 'points_max': 20}, {'id': 'non_nutritive_sweeteners', 'unit': 'number', 'value': 0, 'points': 0, 'points_max': 4}], 'positive': [{'id': 'proteins', 'unit': 'g', 'value': 0, 'points': 0, 'points_max': 7}, {'id': 'fiber', 'unit': 'g', 'value': None, 'points': 0, 'points_max': 5}, {'id': 'fruits_vegetables_legumes', 'unit': '%', 'value': 0, 'points': 0, 'points_max': 6}]}, 'is_beverage': 1, 'count_proteins': 1, 'negative_points': 32, 'positive_points': 0, 'positive_nutrients': ['proteins', 'fiber', 'fruits_vegetables_legumes'], 'is_red_meat_product': 0, 'negative_points_max': 54, 'positive_points_max': 18, 'count_proteins_reason': 'beverage', 'is_fat_oil_nuts_seeds': 0}, 'nutriscore_tags': ['e'], 'popularity_tags': ['top-country-fr-scans-2019', 'bottom-25-percent-scans-2020', 'bottom-20-percent-scans-2020', 'top-85-percent-scans-2020', 'top-90-percent-scans-2020', 'top-5000-us-scans-2020', 'top-10000-us-scans-2020', 'top-50000-us-scans-2020', 'top-100000-us-scans-2020', 'top-country-us-scans-2020', 'top-75-percent-scans-2021', 'top-80-percent-scans-2021', 'top-85-percent-scans-2021', 'top-90-percent-scans-2021', 'top-5000-ua-scans-2021', 'top-10000-ua-scans-2021', 'top-50000-ua-scans-2021', 'top-100000-ua-scans-2021', 'top-country-ua-scans-2021', 'top-50000-us-scans-2021', 'top-100000-us-scans-2021', 'top-75-percent-scans-2022', 'top-80-percent-scans-2022', 'top-85-percent-scans-2022', 'top-90-percent-scans-2022', 'top-1000-us-scans-2022', 'top-5000-us-scans-2022', 'top-10000-us-scans-2022', 'top-50000-us-scans-2022', 'top-100000-us-scans-2022', 'top-country-us-scans-2022', 'top-75-percent-scans-2023', 'top-80-percent-scans-2023', 'top-85-percent-scans-2023', 'top-90-percent-scans-2023', 'top-5000-mx-scans-2023', 'top-10000-mx-scans-2023', 'top-50000-mx-scans-2023', 'top-100000-mx-scans-2023', 'top-country-mx-scans-2023', 'top-100000-scans-2024', 'at-least-5-scans-2024', 'at-least-10-scans-2024', 'top-75-percent-scans-2024', 'top-80-percent-scans-2024', 'top-85-percent-scans-2024', 'top-90-percent-scans-2024', 'top-10000-us-scans-2024', 'top-50000-us-scans-2024', 'top-100000-us-scans-2024', 'top-country-us-scans-2024', 'top-100000-fr-scans-2024', 'top-50000-it-scans-2024', 'top-100000-it-scans-2024', 'top-10000-in-scans-2024', 'top-50000-in-scans-2024', 'top-100000-in-scans-2024', 'top-5000-lv-scans-2024', 'top-10000-lv-scans-2024', 'top-50000-lv-scans-2024', 'top-100000-lv-scans-2024', 'top-5000-sg-scans-2024', 'top-10000-sg-scans-2024', 'top-50000-sg-scans-2024', 'top-100000-sg-scans-2024', 'top-50000-nl-scans-2024', 'top-100000-nl-scans-2024', 'top-50000-es-scans-2024', 'top-100000-es-scans-2024'], 'product_name_en': 'Coca-Cola', 'purchase_places': '', 'selected_images': {'front': {'small': {'en': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/front_en.16.200.jpg'}, 'thumb': {'en': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/front_en.16.100.jpg'}, 'display': {'en': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/front_en.16.400.jpg'}}, 'ingredients': {'small': {'en': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/ingredients_en.8.200.jpg'}, 'thumb': {'en': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/ingredients_en.8.100.jpg'}, 'display': {'en': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/ingredients_en.8.400.jpg'}}}, 'amino_acids_tags': [], 'entry_dates_tags': ['2016-11-05', '2016-11', '2016'], 'food_groups_tags': ['en:beverages', 'en:unsweetened-beverages'], 'ingredients_tags': ['en:pledse-recycle-cans', 'en:cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'en:natural-carbonated-water', 'en:high-caramel-color', 'en:flavouring', 'en:caffeine', 'en:canned-under-authority-of-the-coca-cola-company-atlanta', 'en:ga-30313', 'en:canner-s-name-and-address-appear-on-each-can', 'en:caffeine-content', 'en:com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans', 'en:12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke'], 'ingredients_text': "pledse recycle cans, cartons cts ainer fructose corn syrup 1 can phosphoric acid, natural carbonated water, high caramel color, flavors, caffeine, canned under authority of the coca-cola company atlanta, ga 30313, canner's name and address appear on each can, caffeine content: 34 mg/12 fl oz 02017 the coca-cola 140 daily value 0% 2% 14% g company consumer information ugars 78%| call 1-800-438-2653 coke,com l saturated fat tary fiber and potassium coke scan here for more food information rchase floz cans", 'labels_hierarchy': [], 'nova_group_debug': '', 'nova_groups_tags': ['en:4-ultra-processed-food-and-drink-products'], 'nucleotides_tags': [], 'nutriscore_grade': 'e', 'nutriscore_score': 32, 'nutrition_grades': 'e', 'product_quantity': '0', 'serving_quantity': '355', 'states_hierarchy': ['en:to-be-completed', 'en:nutrition-facts-completed', 'en:ingredients-completed', 'en:expiration-date-to-be-completed', 'en:packaging-code-to-be-completed', 'en:characteristics-to-be-completed', 'en:origins-to-be-completed', 'en:categories-completed', 'en:brands-completed', 'en:packaging-completed', 'en:quantity-completed', 'en:product-name-completed', 'en:photos-to-be-validated', 'en:packaging-photo-to-be-selected', 'en:nutrition-photo-to-be-selected', 'en:ingredients-photo-selected', 'en:front-photo-selected', 'en:photos-uploaded'], 'traces_from_user': '(en) ', 'traces_hierarchy': [], 'data_quality_tags': ['en:packaging-data-incomplete', 'en:ingredients-percent-analysis-ok', 'en:ecoscore-extended-data-computed', 'en:ecoscore-extended-data-less-precise-than-agribalyse', 'en:food-groups-1-known', 'en:food-groups-2-known', 'en:food-groups-3-unknown', 'en:ingredients-unknown-score-above-5', 'en:ingredients-80-percent-unknown', 'en:ingredients-ingredient-tag-length-greater-than-50', 'en:ingredients-ingredient-tag-length-greater-than-100', 'en:nutrition-value-very-high-for-category-salt', 'en:product-quantity-under-1g', 'en:serving-quantity-over-product-quantity', 'en:ecoscore-origins-of-ingredients-origins-are-100-percent-unknown', 'en:ecoscore-packaging-unspecified-material', 'en:ecoscore-production-system-no-label'], 'data_sources_tags': ['app-horizon', 'app-infood', 'apps'], 'ingredients_debug': ['pledse recycle cans& cartons cts ainer FRUCTOSE CORN SYRUP 1 Can PHOSPHORIC ACID', ',', None, None, None, ' NATURAL CARBONATED WATER', ',', None, None, None, ' HIGH CARAMEL COLOR', ',', None, None, None, ' FLAVORS', ',', None, None, None, ' CAFFEINE', '. ', None, None, None, 'CANNED UNDER AUTHORITY OF THE COCA-COLA COMPANY ATLANTA', ',', None, None, None, ' GA 30313', '. ', None, None, None, "CANNER'S NAME AND ADDRESS APPEAR ON EACH CAN", '. ', None, None, None, 'CAFFEINE CONTENT', ':', ':', None, None, ' 34 mg', '/', None, None, '/', '12 fl oz 02017 THE COCA-COLA 140 Daily Value 0% 2% 14% g COMPANY CONSUMER INFORMATION ugars 78%| CALL 1-800-438-2653 coke.com l saturated fat tary fiber and potassium Coke SCAN HERE FoR MORE FOOD INFORMATION RCHASE FLOZ CANS'], 'origins_hierarchy': [], 'packaging_text_en': '', 'ingredients_n_tags': ['12', '11-20'], 'minerals_prev_tags': [], 'nutriscore_version': '2023', 'nutrition_data_per': 'serving', 'nutrition_grade_fr': 'e', 'photographers_tags': ['openfoodfacts-contributors', 'tanyad1013', 'thaialagata'], 'pnns_groups_1_tags': ['beverages', 'known'], 'pnns_groups_2_tags': ['unsweetened-beverages', 'known'], 'vitamins_prev_tags': [], 'allergens_from_user': '(en) ', 'allergens_hierarchy': [], 'category_properties': {}, 'countries_hierarchy': ['en:united-states'], 'ingredients_text_en': "pledse recycle cans, cartons cts ainer fructose corn syrup 1 can phosphoric acid, natural carbonated water, high caramel color, flavors, caffeine, canned under authority of the coca-cola company atlanta, ga 30313, canner's name and address appear on each can, caffeine content: 34 mg/12 fl oz 02017 the coca-cola 140 daily value 0% 2% 14% g company consumer information ugars 78%| call 1-800-438-2653 coke,com l saturated fat tary fiber and potassium coke scan here for more food information rchase floz cans", 'known_ingredients_n': 2, 'languages_hierarchy': ['en:english'], 'main_countries_tags': [], 'nova_groups_markers': {'4': [['additives', 'en:e150c'], ['ingredients', 'en:flavouring']]}, 'packaging_hierarchy': ['en:Aluminium-can', 'en:Card-box'], 'added_countries_tags': [], 'categories_hierarchy': ['en:beverages', 'en:carbonated-drinks'], 'compared_to_category': 'en:carbonated-drinks', 'ingredients_analysis': {'en:vegan-status-unknown': ['en:pledse-recycle-cans', 'en:cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'en:natural-carbonated-water', 'en:high-caramel-color', 'en:canned-under-authority-of-the-coca-cola-company-atlanta', 'en:ga-30313', 'en:canner-s-name-and-address-appear-on-each-can', 'en:caffeine-content', 'en:12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke', 'en:com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans'], 'en:palm-oil-content-unknown': ['en:pledse-recycle-cans', 'en:cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'en:natural-carbonated-water', 'en:high-caramel-color', 'en:canned-under-authority-of-the-coca-cola-company-atlanta', 'en:ga-30313', 'en:canner-s-name-and-address-appear-on-each-can', 'en:caffeine-content', 'en:12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke', 'en:com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans'], 'en:vegetarian-status-unknown': ['en:pledse-recycle-cans', 'en:cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'en:natural-carbonated-water', 'en:high-caramel-color', 'en:canned-under-authority-of-the-coca-cola-company-atlanta', 'en:ga-30313', 'en:canner-s-name-and-address-appear-on-each-can', 'en:caffeine-content', 'en:12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke', 'en:com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans']}, 'last_edit_dates_tags': ['2024-10-12', '2024-10', '2024'], 'manufacturing_places': '', 'nutrient_levels_tags': ['en:fat-in-low-quantity', 'en:sugars-in-high-quantity', 'en:salt-in-high-quantity'], 'nutriscore_2021_tags': ['e'], 'nutriscore_2023_tags': ['e'], 'packagings_materials': {'all': {}, 'en:metal': {}, 'en:unknown': {}}, 'purchase_places_tags': [], 'amino_acids_prev_tags': [], 'categories_properties': {}, 'ciqual_food_name_tags': ['unknown'], 'image_front_small_url': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/front_en.16.200.jpg', 'image_front_thumb_url': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/front_en.16.100.jpg', 'image_ingredients_url': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/ingredients_en.8.400.jpg', 'ingredients_hierarchy': ['en:pledse-recycle-cans', 'en:cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'en:natural-carbonated-water', 'en:high-caramel-color', 'en:flavouring', 'en:caffeine', 'en:canned-under-authority-of-the-coca-cola-company-atlanta', 'en:ga-30313', 'en:canner-s-name-and-address-appear-on-each-can', 'en:caffeine-content', 'en:com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans', 'en:12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke'], 'ingredients_ids_debug': ['pledse-recycle-cans-cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'natural-carbonated-water', 'high-caramel-color', 'flavors', 'caffeine', 'canned-under-authority-of-the-coca-cola-company-atlanta', 'ga-30313', 'canner-s-name-and-address-appear-on-each-can', 'caffeine-content', '34-mg', '12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke-com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans'], 'last_image_dates_tags': ['2021-12-23', '2021-12', '2021'], 'nucleotides_prev_tags': [], 'nutrition_grades_tags': ['e'], 'nutrition_score_debug': '', 'packaging_shapes_tags': ['en:box', 'en:can'], 'serving_quantity_unit': 'ml', 'unknown_ingredients_n': 10, 'data_quality_bugs_tags': [], 'data_quality_info_tags': ['en:packaging-data-incomplete', 'en:ingredients-percent-analysis-ok', 'en:ecoscore-extended-data-computed', 'en:ecoscore-extended-data-less-precise-than-agribalyse', 'en:food-groups-1-known', 'en:food-groups-2-known', 'en:food-groups-3-unknown'], 'ingredients_text_debug': "pledse recycle cans& cartons cts ainer FRUCTOSE CORN SYRUP 1 Can PHOSPHORIC ACID, NATURAL CARBONATED WATER, HIGH CARAMEL COLOR, FLAVORS, CAFFEINE. CANNED UNDER AUTHORITY OF THE COCA-COLA COMPANY ATLANTA, GA 30313. CANNER'S NAME AND ADDRESS APPEAR ON EACH CAN. CAFFEINE CONTENT: 34 mg/12 fl oz 02017 THE COCA-COLA 140 Daily Value 0% 2% 14% g COMPANY CONSUMER INFORMATION ugars 78%| CALL 1-800-438-2653 coke.com l saturated fat tary fiber and potassium Coke SCAN HERE FoR MORE FOOD INFORMATION RCHASE FLOZ CANS", 'removed_countries_tags': [], 'unknown_nutrients_tags': [], 'additives_original_tags': ['en:e338', 'en:e150c'], 'traces_from_ingredients': '', 'data_quality_errors_tags': [], 'debug_param_sorted_langs': ['en'], 'ingredients_sweeteners_n': 0, 'nutrition_score_beverage': 1, 'packaging_materials_tags': ['en:aluminium'], 'packaging_recycling_tags': [], 'ingredients_analysis_tags': ['en:palm-oil-content-unknown', 'en:vegan-status-unknown', 'en:vegetarian-status-unknown'], 'ingredients_original_tags': ['en:pledse-recycle-cans', 'en:cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'en:natural-carbonated-water', 'en:high-caramel-color', 'en:flavouring', 'en:caffeine', 'en:canned-under-authority-of-the-coca-cola-company-atlanta', 'en:ga-30313', 'en:canner-s-name-and-address-appear-on-each-can', 'en:caffeine-content', 'en:com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans', 'en:12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke'], 'interface_version_created': '20120622', 'manufacturing_places_tags': [], 'nutriscore_score_opposite': -32, 'allergens_from_ingredients': '', 'categories_properties_tags': ['all-products', 'categories-known', 'agribalyse-food-code-unknown', 'agribalyse-proxy-food-code-unknown', 'ciqual-food-code-unknown', 'agribalyse-unknown'], 'data_quality_warnings_tags': ['en:ingredients-unknown-score-above-5', 'en:ingredients-80-percent-unknown', 'en:ingredients-ingredient-tag-length-greater-than-50', 'en:ingredients-ingredient-tag-length-greater-than-100', 'en:nutrition-value-very-high-for-category-salt', 'en:product-quantity-under-1g', 'en:serving-quantity-over-product-quantity', 'en:ecoscore-origins-of-ingredients-origins-are-100-percent-unknown', 'en:ecoscore-packaging-unspecified-material', 'en:ecoscore-production-system-no-label'], 'interface_version_modified': '20150316.jqm2', 'image_ingredients_small_url': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/ingredients_en.8.200.jpg', 'image_ingredients_thumb_url': 'https://images.openfoodfacts.org/images/products/004/900/002/8904/ingredients_en.8.100.jpg', 'ingredients_from_palm_oil_n': 0, 'nutrition_data_prepared_per': '100g', 'ingredients_percent_analysis': 1, 'ingredients_from_palm_oil_tags': [], 'ingredients_text_with_allergens': "pledse recycle cans, cartons cts ainer fructose corn syrup 1 can phosphoric acid, natural carbonated water, high caramel color, flavors, caffeine, canned under authority of the coca-cola company atlanta, ga 30313, canner's name and address appear on each can, caffeine content: 34 mg/12 fl oz 02017 the coca-cola 140 daily value 0% 2% 14% g company consumer information ugars 78%| call 1-800-438-2653 coke,com l saturated fat tary fiber and potassium coke scan here for more food information rchase floz cans", 'ingredients_without_ciqual_codes': ['en:12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke', 'en:caffeine', 'en:caffeine-content', 'en:canned-under-authority-of-the-coca-cola-company-atlanta', 'en:canner-s-name-and-address-appear-on-each-can', 'en:cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'en:com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans', 'en:flavouring', 'en:ga-30313', 'en:high-caramel-color', 'en:natural-carbonated-water', 'en:pledse-recycle-cans'], 'nutrition_score_warning_no_fiber': 1, 'ingredients_without_ecobalyse_ids': ['en:12-fl-oz-02017-the-coca-cola-140-daily-value-0-2-14-g-company-consumer-information-ugars-78-call-1-800-438-2653-coke', 'en:caffeine', 'en:caffeine-content', 'en:canned-under-authority-of-the-coca-cola-company-atlanta', 'en:canner-s-name-and-address-appear-on-each-can', 'en:cartons-cts-ainer-fructose-corn-syrup-1-can-phosphoric-acid', 'en:com-l-saturated-fat-tary-fiber-and-potassium-coke-scan-here-for-more-food-information-rchase-floz-cans', 'en:flavouring', 'en:ga-30313', 'en:high-caramel-color', 'en:natural-carbonated-water', 'en:pledse-recycle-cans'], 'other_nutritional_substances_tags': [], 'ingredients_text_with_allergens_en': "pledse recycle cans, cartons cts ainer fructose corn syrup 1 can phosphoric acid, natural carbonated water, high caramel color, flavors, caffeine, canned under authority of the coca-cola company atlanta, ga 30313, canner's name and address appear on each can, caffeine content: 34 mg/12 fl oz 02017 the coca-cola 140 daily value 0% 2% 14% g company consumer information ugars 78%| call 1-800-438-2653 coke,com l saturated fat tary fiber and potassium coke scan here for more food information rchase floz cans", 'ingredients_without_ciqual_codes_n': 12, 'ingredients_without_ecobalyse_ids_n': 12, 'ingredients_with_specified_percent_n': 0, 'ingredients_non_nutritive_sweeteners_n': 0, 'ingredients_with_specified_percent_sum': 0, 'ingredients_with_unspecified_percent_n': 11, 'ingredients_that_may_be_from_palm_oil_n': 0, 'ingredients_with_unspecified_percent_sum': 100, 'ingredients_that_may_be_from_palm_oil_tags': [], 'ingredients_from_or_that_may_be_from_palm_oil_n': 0, 'nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients': 1, 'nutrition_score_warning_fruits_vegetables_legumes_estimate_from_ingredients': 1, 'nutrition_score_warning_fruits_vegetables_nuts_estimate_from_ingredients_value': 0, 'nutrition_score_warning_fruits_vegetables_legumes_estimate_from_ingredients_value': 0}}}}, + sql='UPDATE main_receipt_items SET name = %s, qty = %s, uom = %s, data = %s WHERE id=%s RETURNING *;') +2025-04-12 14:48:46.046062 --- ERROR --- DatabaseError(message='invalid input syntax for type integer: " Pinch"LINE 1: ...= 'Blueberry bagels, blueberry', qty = '1', uom = ' Pinch', ... ^', + payload={'id': 61, 'update': {'name': 'Blueberry bagels, blueberry', 'qty': '1', 'uom': ' Pinch', 'data': {'cost': '2.43', 'expires': False}}}, + sql='UPDATE main_receipt_items SET name = %s, qty = %s, uom = %s, data = %s WHERE id=%s RETURNING *;') +2025-04-12 14:49:19.676918 --- ERROR --- DatabaseError(message='invalid input syntax for type integer: " Pinch"LINE 1: ..._items SET name = 'Cooked rice', qty = '2', uom = ' Pinch', ... ^', + payload={'id': 63, 'update': {'name': 'Cooked rice', 'qty': '2', 'uom': ' Pinch', 'data': {'cost': '2.48', 'expires': False}}}, + sql='UPDATE main_receipt_items SET name = %s, qty = %s, uom = %s, data = %s WHERE id=%s RETURNING *;') +2025-04-12 14:49:35.333826 --- ERROR --- DatabaseError(message='invalid input syntax for type integer: " Pinch"LINE 1: ..._items SET name = 'Cooked rice', qty = '2', uom = ' Pinch', ... ^', + payload={'id': 63, 'update': {'name': 'Cooked rice', 'qty': '2', 'uom': ' Pinch', 'data': {'cost': '2.48', 'expires': False}}}, + sql='UPDATE main_receipt_items SET name = %s, qty = %s, uom = %s, data = %s WHERE id=%s RETURNING *;') +2025-04-12 15:41:19.681064 --- ERROR --- DatabaseError(message='column "files" of relation "test_recipes" does not existLINE 1: UPDATE test_recipes SET files = '{"Order_details_-_Walmart.c... ^', + payload={'id': '7', 'update': {'files': {'Order_details_-_Walmart.com_04122025.pdf': {'file_path': 'Order_details_-_Walmart.com_04122025.pdf', 'file_type': 'application/pdf', 'file_size': 255703, 'uploaded_by': 'jadowyne'}}}}, + sql='UPDATE test_recipes SET files = %s WHERE id=%s RETURNING *;') +2025-04-12 17:33:28.283678 --- ERROR --- DatabaseError(message='tuple index out of range', + payload=('', 50, 0), + sql='WITH passed_id AS (SELECT %s AS passed_id), info_id AS (SELECT item_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), sum_cte AS ( SELECT mi.id, SUM(mil.quantity_on_hand)::FLOAT8 AS total_sum FROM test_item_locations mil JOIN test_items mi ON mil.part_id = mi.id GROUP BY mi.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) )SELECT test_items.*, (SELECT COALESCE(row_to_json(ii), '{}') FROM cte_item_info ii) AS item_info, sum_cte.total_sum as total_qohFROM test_itemsLEFT JOIN sum_cte ON test_items.id = sum_cte.idLEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.idWHERE test_items.search_string LIKE '%%' || %s || '%%'ORDER BY test_items.item_name ASCLIMIT %s OFFSET %s;') +2025-04-12 17:36:38.542221 --- ERROR --- DatabaseError(message='subquery must return only one columnLINE 11: (SELECT * FROM units WHERE id=test_item_info.uom) as uom ^', + payload=('', 50, 0), + sql='WITH sum_cte AS ( SELECT mi.id, SUM(mil.quantity_on_hand)::FLOAT8 AS total_sum FROM test_item_locations mil JOIN test_items mi ON mil.part_id = mi.id GROUP BY mi.id )SELECT test_items.*, row_to_json(test_item_info.*) as item_info, sum_cte.total_sum as total_qoh, (SELECT * FROM units WHERE id=test_item_info.uom) as uomFROM test_itemsLEFT JOIN sum_cte ON test_items.id = sum_cte.idLEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.idWHERE test_items.search_string LIKE '%%' || %s || '%%'ORDER BY test_items.item_name ASCLIMIT %s OFFSET %s;') +2025-04-12 17:38:03.263608 --- ERROR --- DatabaseError(message='subquery must return only one columnLINE 11: (SELECT * FROM units WHERE units.id=test_item_info.uom) ... ^', + payload=('', 50, 0), + sql='WITH sum_cte AS ( SELECT mi.id, SUM(mil.quantity_on_hand)::FLOAT8 AS total_sum FROM test_item_locations mil JOIN test_items mi ON mil.part_id = mi.id GROUP BY mi.id )SELECT test_items.*, row_to_json(test_item_info.*) as item_info, sum_cte.total_sum as total_qoh, (SELECT * FROM units WHERE units.id=test_item_info.uom) as uomFROM test_itemsLEFT JOIN sum_cte ON test_items.id = sum_cte.idLEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.idWHERE test_items.search_string LIKE '%%' || %s || '%%'ORDER BY test_items.item_name ASCLIMIT %s OFFSET %s;') +2025-04-12 17:38:40.948842 --- ERROR --- DatabaseError(message='subquery must return only one columnLINE 11: (SELECT units.* FROM units WHERE units.id=test_item_info... ^', + payload=('', 50, 0), + sql='WITH sum_cte AS ( SELECT mi.id, SUM(mil.quantity_on_hand)::FLOAT8 AS total_sum FROM test_item_locations mil JOIN test_items mi ON mil.part_id = mi.id GROUP BY mi.id )SELECT test_items.*, row_to_json(test_item_info.*) as item_info, sum_cte.total_sum as total_qoh, (SELECT units.* FROM units WHERE units.id=test_item_info.uom) as uomFROM test_itemsLEFT JOIN sum_cte ON test_items.id = sum_cte.idLEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.idWHERE test_items.search_string LIKE '%%' || %s || '%%'ORDER BY test_items.item_name ASCLIMIT %s OFFSET %s;') +2025-04-12 18:10:19.256336 --- ERROR --- DatabaseError(message='COALESCE types integer and character varying cannot be matchedLINE 5: COALESCE(test_item_info.uom, items.uom) AS uom, ^', + payload=(2,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:13:23.317269 --- ERROR --- DatabaseError(message='COALESCE types integer and character varying cannot be matchedLINE 5: COALESCE(test_item_info.uom, items.uom) AS uom, ^', + payload=(2,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:29:43.068612 --- ERROR --- DatabaseError(message='column test_item_info.conversions does not existLINE 8: COALESCE(array_agg(test_item_info.conversions), ... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, COALESCE(array_agg(test_item_info.conversions), '[]'::json) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:30:31.073095 --- ERROR --- DatabaseError(message='syntax error at or near "SELECT"LINE 8: COALESCE(array_agg(SELECT * FROM test_conversion... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, COALESCE(array_agg(SELECT * FROM test_conversions WHERE item_id=(SELECT passed_id FROM passed_id)), '[]'::json) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:30:56.976889 --- ERROR --- DatabaseError(message='syntax error at or near "AS"LINE 8: ...s WHERE item_id=(SELECT passed_id FROM passed_id) AS convers... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, (SELECT * FROM test_conversions WHERE item_id=(SELECT passed_id FROM passed_id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:31:32.917433 --- ERROR --- DatabaseError(message='syntax error at or near "AS"LINE 8: ...RE conv.item_id=(SELECT passed_id FROM passed_id) AS convers... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, (SELECT * FROM test_conversions conv WHERE conv.item_id=(SELECT passed_id FROM passed_id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:31:41.215951 --- ERROR --- DatabaseError(message='syntax error at or near "AS"LINE 8: ...RE conv.item_id=(SELECT passed_id FROM passed_id) AS convers... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, (SELECT conv.* FROM test_conversions conv WHERE conv.item_id=(SELECT passed_id FROM passed_id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:32:10.052409 --- ERROR --- DatabaseError(message='subquery must return only one columnLINE 8: (SELECT conv.* FROM test_conversions conv WHERE ... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, (SELECT conv.* FROM test_conversions conv WHERE conv.item_id=(SELECT passed_id FROM passed_id)) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:32:18.359130 --- ERROR --- DatabaseError(message='syntax error at or near "SELECT"LINE 8: array_agg(SELECT conv.* FROM test_conversions co... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, array_agg(SELECT conv.* FROM test_conversions conv WHERE conv.item_id=(SELECT passed_id FROM passed_id)) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:32:47.717764 --- ERROR --- DatabaseError(message='syntax error at or near "SELECT"LINE 8: array_agg(row_to_json(SELECT conv.* FROM test_co... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, array_agg(row_to_json(SELECT conv.* FROM test_conversions conv WHERE conv.item_id=(SELECT passed_id FROM passed_id))) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:32:55.779238 --- ERROR --- DatabaseError(message='syntax error at or near "AS"LINE 8: ...E conv.item_id=(SELECT passed_id FROM passed_id)) AS convers... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, array_agg((SELECT conv.* FROM test_conversions conv WHERE conv.item_id=(SELECT passed_id FROM passed_id)) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:33:11.361795 --- ERROR --- DatabaseError(message='subquery must return only one columnLINE 8: array_agg((SELECT conv.* FROM test_conversions c... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, array_agg((SELECT conv.* FROM test_conversions conv WHERE conv.item_id=(SELECT passed_id FROM passed_id))) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:36:44.331323 --- ERROR --- DatabaseError(message='COALESCE types test_conversions[] and json cannot be matchedLINE 8: ...nversions conv WHERE conv.item_id=test_items.id), '[]'::json... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, COALESCE((SELECT array_agg(conv) FROM test_conversions conv WHERE conv.item_id=test_items.id), '[]'::json) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:37:05.400764 --- ERROR --- DatabaseError(message='COALESCE types test_conversions[] and json cannot be matchedLINE 8: ...nversions conv WHERE conv.item_id=test_items.id), '{}'::json... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, COALESCE((SELECT array_agg(conv) FROM test_conversions conv WHERE conv.item_id=test_items.id), '{}'::json) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:37:34.772339 --- ERROR --- DatabaseError(message='COALESCE types test_conversions[] and json cannot be matchedLINE 8: ...nversions conv WHERE conv.item_id=test_items.id), '[]'::json... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, COALESCE((SELECT array_agg(conv) FROM test_conversions conv WHERE conv.item_id=test_items.id), '[]'::json) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:37:42.827271 --- ERROR --- DatabaseError(message='malformed array literal: "[]"LINE 8: ...nversions conv WHERE conv.item_id=test_items.id), '[]') AS c... ^DETAIL: "[" must introduce explicitly-specified array dimensions.', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, COALESCE((SELECT array_agg(conv) FROM test_conversions conv WHERE conv.item_id=test_items.id), '[]') AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:38:29.456797 --- ERROR --- DatabaseError(message='type "type_of_conversion[]" does not existLINE 8: ... conv WHERE conv.item_id=test_items.id), ARRAY[]::type_of_co... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, COALESCE((SELECT array_agg(conv) FROM test_conversions conv WHERE conv.item_id=test_items.id), ARRAY[]::type_of_conversion[]) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:38:37.378760 --- ERROR --- DatabaseError(message='cannot determine type of empty arrayLINE 8: ...nversions conv WHERE conv.item_id=test_items.id), ARRAY[]) A... ^HINT: Explicitly cast to the desired type, for example ARRAY[]::integer[].', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, COALESCE((SELECT array_agg(conv) FROM test_conversions conv WHERE conv.item_id=test_items.id), ARRAY[]) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:39:17.420643 --- ERROR --- DatabaseError(message='COALESCE could not convert type integer[] to test_conversions[]LINE 8: ...nversions conv WHERE conv.item_id=test_items.id), ARRAY[]::i... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, COALESCE((SELECT array_agg(conv) FROM test_conversions conv WHERE conv.item_id=test_items.id), ARRAY[]::integer[]) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:48:41.423855 --- ERROR --- DatabaseError(message='subquery must return only one columnLINE 5: (SELECT * FROM units WHERE id=COALESCE(test_item... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, (SELECT * FROM units WHERE id=COALESCE(test_item_info.uom, items.uom)) as uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, (SELECT COALESCE(array_agg(conv), '{}') FROM test_conversions conv WHERE conv.item_id=test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:49:05.057244 --- ERROR --- DatabaseError(message='subquery must return only one columnLINE 5: (SELECT * FROM units WHERE units.id=COALESCE(tes... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, (SELECT * FROM units WHERE units.id=COALESCE(test_item_info.uom, items.uom)) as uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, (SELECT COALESCE(array_agg(conv), '{}') FROM test_conversions conv WHERE conv.item_id=test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:49:40.541238 --- ERROR --- DatabaseError(message='subquery must return only one columnLINE 5: (SELECT units.* FROM units WHERE units.id=COALES... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, (SELECT units.* FROM units WHERE units.id=COALESCE(test_item_info.uom, items.uom)) as uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, (SELECT COALESCE(array_agg(conv), '{}') FROM test_conversions conv WHERE conv.item_id=test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 18:50:56.070555 --- ERROR --- DatabaseError(message='invalid reference to FROM-clause entry for table "units"LINE 7: WHERE units.id=COALESCE(test_item_info.uom, ... ^HINT: Perhaps you meant to reference the table alias "u".', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, (SELECT u.* FROM units u JOIN test_item_info si ON u.id = COALESCE(si.uom, items.uom) WHERE units.id=COALESCE(test_item_info.uom, items.uom)) as uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, (SELECT COALESCE(array_agg(conv), '{}') FROM test_conversions conv WHERE conv.item_id=test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:02:26.980825 --- ERROR --- DatabaseError(message='function array_agg(test_conversions, units) does not existLINE 9: (SELECT COALESCE(array_agg(conv.*, units.*), '{}... ^HINT: No function matches the given name and argument types. You might need to add explicit type casts.', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT COALESCE(array_agg(conv.*, units.*), '{}') FROM test_conversions conv JOIN units ON conv.uom_id = units.id WHERE conv.item_id=test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:02:47.287761 --- ERROR --- DatabaseError(message='column "units.id" must appear in the GROUP BY clause or be used in an aggregate functionLINE 9: ... (SELECT COALESCE(array_agg(conv), '{}'), units.* FR... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT COALESCE(array_agg(conv), '{}'), units.* FROM test_conversions conv JOIN units ON conv.uom_id = units.id WHERE conv.item_id=test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:03:21.792399 --- ERROR --- DatabaseError(message='subquery must return only one columnLINE 9: (SELECT COALESCE(array_agg(conv), '{}'), COALESC... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT COALESCE(array_agg(conv), '{}'), COALESCE(array_agg(units.*), '{}') FROM test_conversions conv JOIN units ON conv.uom_id = units.id WHERE conv.item_id=test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:03:28.192710 --- ERROR --- DatabaseError(message='subquery must return only one columnLINE 9: (SELECT COALESCE(array_agg(conv), '{}'), COALESC... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT COALESCE(array_agg(conv), '{}'), COALESCE(array_agg(units), '{}') FROM test_conversions conv JOIN units ON conv.uom_id = units.id WHERE conv.item_id=test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:05:06.060302 --- ERROR --- DatabaseError(message='function row_to_json(test_conversions, units) does not existLINE 9: (SELECT COALESCE(array_agg(row_to_json(conv, un... ^HINT: No function matches the given name and argument types. You might need to add explicit type casts.', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT COALESCE(array_agg(row_to_json(conv, unit_conv.*)), '{}') FROM test_conversions conv LEFT JOIN units unit_conv ON conv.uom_id = unit_conv.id WHERE conv.item_id=test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:06:11.616756 --- ERROR --- DatabaseError(message='subquery must return only one columnLINE 9: (SELECT conv.*, unit_conv.* ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT conv.*, unit_conv.* FROM test_conversions conv LEFT JOIN units unit_conv ON conv.uom_id = unit_conv.id WHERE conv.item_id=test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:06:23.233789 --- ERROR --- DatabaseError(message='function array_agg(test_conversions, units) does not existLINE 9: (SELECT array_agg(conv.*, unit_conv.*) ^HINT: No function matches the given name and argument types. You might need to add explicit type casts.', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT array_agg(conv.*, unit_conv.*) FROM test_conversions conv LEFT JOIN units unit_conv ON conv.uom_id = unit_conv.id WHERE conv.item_id=test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:06:46.193165 --- ERROR --- DatabaseError(message='missing FROM-clause entry for table "unit_conv"LINE 9: (SELECT array_agg(conv.*, unit_conv.*) ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT array_agg(conv.*, unit_conv.*) FROM test_conversions conv LEFT JOIN units ON conv.uom_id = units.id WHERE conv.item_id=test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:07:04.030707 --- ERROR --- DatabaseError(message='function row_to_json(test_conversions, units) does not existLINE 9: (SELECT row_to_json(conv.*, units.*) ^HINT: No function matches the given name and argument types. You might need to add explicit type casts.', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT row_to_json(conv.*, units.*) FROM test_conversions conv LEFT JOIN units ON conv.uom_id = units.id WHERE conv.item_id=test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:07:34.817799 --- ERROR --- DatabaseError(message='subquery must return only one columnLINE 9: (SELECT row_to_json(conv), row_to_json(units) ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT row_to_json(conv), row_to_json(units) FROM test_conversions conv LEFT JOIN units ON conv.uom_id = units.id WHERE conv.item_id=test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:07:58.995085 --- ERROR --- DatabaseError(message='syntax error at or near "AS"LINE 12: WHERE conv.item_id=test_items.id) AS convers... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT COALESCE(array_agg(conv)), '{}') FROM test_conversions conv LEFT JOIN units unit_conv ON conv.uom_id = unit_conv.id WHERE conv.item_id=test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:09:20.023644 --- ERROR --- DatabaseError(message='function array_agg() does not existLINE 9: (SELECT COALESCE(array_agg(*), '{}') FROM test_c... ^HINT: No function matches the given name and argument types. You might need to add explicit type casts.', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT COALESCE(array_agg(*), '{}') FROM test_conversions conv LEFT JOIN units ON conv.uom_id = units.id WHERE conv.item_id=test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:10:15.749310 --- ERROR --- DatabaseError(message='operator does not exist: json || jsonLINE 9: ... (SELECT COALESCE(array_agg(row_to_json(conv) || json_bu... ^HINT: No operator matches the given name and argument types. You might need to add explicit type casts.', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, COALESCE(test_item_info.uom, items.uom) AS uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT COALESCE(array_agg(row_to_json(conv) || json_build_object('unit', row_to_json(units))), '{}') FROM test_conversions conv LEFT JOIN units ON conv.uom_id = units.id WHERE conv.item_id = test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:15:01.594053 --- ERROR --- DatabaseError(message='function row_to_json(integer) does not existLINE 5: row_to_json(test_item_info.uom) AS item_uom, ^HINT: No function matches the given name and argument types. You might need to add explicit type casts.', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, row_to_json(test_item_info.uom) AS item_uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT COALESCE(array_agg(jsonb_build_object('conversion', conv, 'unit', units)), '{}') FROM test_conversions conv LEFT JOIN units ON conv.uom_id = units.id WHERE conv.item_id = test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:17:41.975720 --- ERROR --- DatabaseError(message='malformed record literal: "{}"LINE 5: (SELECT COALESCE(units, '{}') FROM units WHERE u... ^DETAIL: Missing left parenthesis.', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, (SELECT COALESCE(units, '{}') FROM units WHERE units.id=test_item_info.uom) AS item_uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT COALESCE(array_agg(jsonb_build_object('conversion', conv, 'unit', units)), '{}') FROM test_conversions conv LEFT JOIN units ON conv.uom_id = units.id WHERE conv.item_id = test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:18:35.753325 --- ERROR --- DatabaseError(message='cannot cast type units to jsonbLINE 5: (SELECT COALESCE(units::jsonb, '{}'::jsonb) FROM... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, (SELECT COALESCE(units::jsonb, '{}'::jsonb) FROM units WHERE units.id=test_item_info.uom) AS item_uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT COALESCE(array_agg(jsonb_build_object('conversion', conv, 'unit', units)), '{}') FROM test_conversions conv LEFT JOIN units ON conv.uom_id = units.id WHERE conv.item_id = test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:18:44.421031 --- ERROR --- DatabaseError(message='COALESCE types units and jsonb cannot be matchedLINE 5: (SELECT COALESCE(units, '{}'::jsonb) FROM units ... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, (SELECT COALESCE(units, '{}'::jsonb) FROM units WHERE units.id=test_item_info.uom) AS item_uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT COALESCE(array_agg(jsonb_build_object('conversion', conv, 'unit', units)), '{}') FROM test_conversions conv LEFT JOIN units ON conv.uom_id = units.id WHERE conv.item_id = test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:18:55.989049 --- ERROR --- DatabaseError(message='COALESCE could not convert type jsonb to jsonLINE 5: (SELECT COALESCE(row_to_json(units), '{}'::jsonb... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, (SELECT COALESCE(row_to_json(units), '{}'::jsonb) FROM units WHERE units.id=test_item_info.uom) AS item_uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT COALESCE(array_agg(jsonb_build_object('conversion', conv, 'unit', units)), '{}') FROM test_conversions conv LEFT JOIN units ON conv.uom_id = units.id WHERE conv.item_id = test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:19:07.610999 --- ERROR --- DatabaseError(message='function row_to_jsonb(units) does not existLINE 5: (SELECT COALESCE(row_to_jsonb(units), '{}'::json... ^HINT: No function matches the given name and argument types. You might need to add explicit type casts.', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, (SELECT COALESCE(row_to_jsonb(units), '{}'::jsonb) FROM units WHERE units.id=test_item_info.uom) AS item_uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT COALESCE(array_agg(jsonb_build_object('conversion', conv, 'unit', units)), '{}') FROM test_conversions conv LEFT JOIN units ON conv.uom_id = units.id WHERE conv.item_id = test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:19:30.854594 --- ERROR --- DatabaseError(message='COALESCE types units and jsonb cannot be matchedLINE 5: (SELECT COALESCE(units, '{}'::jsonb) FROM units ... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, (SELECT COALESCE(units, '{}'::jsonb) FROM units WHERE units.id=test_item_info.uom) AS item_uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT COALESCE(array_agg(jsonb_build_object('conversion', conv, 'unit', units)), '{}') FROM test_conversions conv LEFT JOIN units ON conv.uom_id = units.id WHERE conv.item_id = test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:19:42.083075 --- ERROR --- DatabaseError(message='COALESCE types units[] and jsonb cannot be matchedLINE 5: (SELECT COALESCE(array_agg(units), '{}'::jsonb) ... ^', + payload=(1,), + sql='WITH passed_id AS (SELECT %s AS passed_id), cte_recipe_items AS ( SELECT items.*, COALESCE(test_items.barcode, items.uuid) AS uuid, (SELECT COALESCE(array_agg(units), '{}'::jsonb) FROM units WHERE units.id=test_item_info.uom) AS item_uom, COALESCE(test_items.item_name, items.item_name) AS item_name, COALESCE(test_items.links, items.links) AS links, row_to_json(units.*) as uom, (SELECT COALESCE(array_agg(jsonb_build_object('conversion', conv, 'unit', units)), '{}') FROM test_conversions conv LEFT JOIN units ON conv.uom_id = units.id WHERE conv.item_id = test_items.id) AS conversions FROM test_recipe_items items LEFT JOIN test_items ON items.item_id = test_items.id LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN units ON units.id = COALESCE(test_item_info.uom, items.uom) WHERE items.rp_id = (SELECT passed_id FROM passed_id) ORDER BY items.item_name ASC )SELECT (SELECT passed_id FROM passed_id) AS passed_id, test_recipes.*, logins.username as author, (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_itemsFROM test_recipesJOIN logins ON test_recipes.author = logins.idWHERE test_recipes.id=(SELECT passed_id FROM passed_id)') +2025-04-12 19:41:28.073518 --- ERROR --- DatabaseError(message='can't adapt type 'dict'', + payload=('%024600017008%', 1, 'sku', 'Kosher salt', {'id': 1, 'plural': 'pinches', 'single': ' pinch', 'fullname': ' Pinch', 'description': ' Less than 1/8 teaspoon.'}, 1.0, 141, '{}'), + sql='INSERT INTO main_recipe_items(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-12 19:41:29.705915 --- ERROR --- DatabaseError(message='can't adapt type 'dict'', + payload=('%024600017008%', 1, 'sku', 'Kosher salt', {'id': 1, 'plural': 'pinches', 'single': ' pinch', 'fullname': ' Pinch', 'description': ' Less than 1/8 teaspoon.'}, 1.0, 141, '{}'), + sql='INSERT INTO main_recipe_items(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-12 19:41:30.665242 --- ERROR --- DatabaseError(message='can't adapt type 'dict'', + payload=('%024600017008%', 1, 'sku', 'Kosher salt', {'id': 1, 'plural': 'pinches', 'single': ' pinch', 'fullname': ' Pinch', 'description': ' Less than 1/8 teaspoon.'}, 1.0, 141, '{}'), + sql='INSERT INTO main_recipe_items(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-12 19:41:30.856239 --- ERROR --- DatabaseError(message='can't adapt type 'dict'', + payload=('%024600017008%', 1, 'sku', 'Kosher salt', {'id': 1, 'plural': 'pinches', 'single': ' pinch', 'fullname': ' Pinch', 'description': ' Less than 1/8 teaspoon.'}, 1.0, 141, '{}'), + sql='INSERT INTO main_recipe_items(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-12 19:41:32.196396 --- ERROR --- DatabaseError(message='can't adapt type 'dict'', + payload=('%024600017008%', 1, 'sku', 'Kosher salt', {'id': 1, 'plural': 'pinches', 'single': ' pinch', 'fullname': ' Pinch', 'description': ' Less than 1/8 teaspoon.'}, 1.0, 141, '{}'), + sql='INSERT INTO main_recipe_items(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-12 19:41:32.490794 --- ERROR --- DatabaseError(message='can't adapt type 'dict'', + payload=('%024600017008%', 1, 'sku', 'Kosher salt', {'id': 1, 'plural': 'pinches', 'single': ' pinch', 'fullname': ' Pinch', 'description': ' Less than 1/8 teaspoon.'}, 1.0, 141, '{}'), + sql='INSERT INTO main_recipe_items(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-12 19:41:32.801129 --- ERROR --- DatabaseError(message='can't adapt type 'dict'', + payload=('%024600017008%', 1, 'sku', 'Kosher salt', {'id': 1, 'plural': 'pinches', 'single': ' pinch', 'fullname': ' Pinch', 'description': ' Less than 1/8 teaspoon.'}, 1.0, 141, '{}'), + sql='INSERT INTO main_recipe_items(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-12 19:41:33.025698 --- ERROR --- DatabaseError(message='can't adapt type 'dict'', + payload=('%024600017008%', 1, 'sku', 'Kosher salt', {'id': 1, 'plural': 'pinches', 'single': ' pinch', 'fullname': ' Pinch', 'description': ' Less than 1/8 teaspoon.'}, 1.0, 141, '{}'), + sql='INSERT INTO main_recipe_items(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-12 19:41:33.378933 --- ERROR --- DatabaseError(message='can't adapt type 'dict'', + payload=('%024600017008%', 1, 'sku', 'Kosher salt', {'id': 1, 'plural': 'pinches', 'single': ' pinch', 'fullname': ' Pinch', 'description': ' Less than 1/8 teaspoon.'}, 1.0, 141, '{}'), + sql='INSERT INTO main_recipe_items(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-12 19:41:33.548775 --- ERROR --- DatabaseError(message='can't adapt type 'dict'', + payload=('%024600017008%', 1, 'sku', 'Kosher salt', {'id': 1, 'plural': 'pinches', 'single': ' pinch', 'fullname': ' Pinch', 'description': ' Less than 1/8 teaspoon.'}, 1.0, 141, '{}'), + sql='INSERT INTO main_recipe_items(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-12 19:41:33.707772 --- ERROR --- DatabaseError(message='can't adapt type 'dict'', + payload=('%024600017008%', 1, 'sku', 'Kosher salt', {'id': 1, 'plural': 'pinches', 'single': ' pinch', 'fullname': ' Pinch', 'description': ' Less than 1/8 teaspoon.'}, 1.0, 141, '{}'), + sql='INSERT INTO main_recipe_items(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-12 19:41:33.860014 --- ERROR --- DatabaseError(message='can't adapt type 'dict'', + payload=('%024600017008%', 1, 'sku', 'Kosher salt', {'id': 1, 'plural': 'pinches', 'single': ' pinch', 'fullname': ' Pinch', 'description': ' Less than 1/8 teaspoon.'}, 1.0, 141, '{}'), + sql='INSERT INTO main_recipe_items(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-12 19:41:34.045904 --- ERROR --- DatabaseError(message='can't adapt type 'dict'', + payload=('%024600017008%', 1, 'sku', 'Kosher salt', {'id': 1, 'plural': 'pinches', 'single': ' pinch', 'fullname': ' Pinch', 'description': ' Less than 1/8 teaspoon.'}, 1.0, 141, '{}'), + sql='INSERT INTO main_recipe_items(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-12 19:41:34.213021 --- ERROR --- DatabaseError(message='can't adapt type 'dict'', + payload=('%024600017008%', 1, 'sku', 'Kosher salt', {'id': 1, 'plural': 'pinches', 'single': ' pinch', 'fullname': ' Pinch', 'description': ' Less than 1/8 teaspoon.'}, 1.0, 141, '{}'), + sql='INSERT INTO main_recipe_items(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-12 19:41:34.384538 --- ERROR --- DatabaseError(message='can't adapt type 'dict'', + payload=('%024600017008%', 1, 'sku', 'Kosher salt', {'id': 1, 'plural': 'pinches', 'single': ' pinch', 'fullname': ' Pinch', 'description': ' Less than 1/8 teaspoon.'}, 1.0, 141, '{}'), + sql='INSERT INTO main_recipe_items(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-12 19:41:34.540850 --- ERROR --- DatabaseError(message='can't adapt type 'dict'', + payload=('%024600017008%', 1, 'sku', 'Kosher salt', {'id': 1, 'plural': 'pinches', 'single': ' pinch', 'fullname': ' Pinch', 'description': ' Less than 1/8 teaspoon.'}, 1.0, 141, '{}'), + sql='INSERT INTO main_recipe_items(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-12 19:42:38.639831 --- ERROR --- DatabaseError(message='can't adapt type 'dict'', + payload=('%024600017008%', 1, 'sku', 'Kosher salt', {'id': 1, 'plural': 'pinches', 'single': ' pinch', 'fullname': ' Pinch', 'description': ' Less than 1/8 teaspoon.'}, 1.0, 141, '{}'), + sql='INSERT INTO main_recipe_items(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-12 19:43:17.295673 --- ERROR --- DatabaseError(message='can't adapt type 'dict'', + payload=('%024600017008%', 1, 'sku', 'Kosher salt', {'id': 1, 'plural': 'pinches', 'single': ' pinch', 'fullname': ' Pinch', 'description': ' Less than 1/8 teaspoon.'}, 1.0, 141, '{}'), + sql='INSERT INTO main_recipe_items(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') +2025-04-12 19:43:45.390676 --- ERROR --- DatabaseError(message='can't adapt type 'dict'', + payload=('%024600017008%', 1, 'sku', 'Kosher salt', {'id': 1, 'plural': 'pinches', 'single': ' pinch', 'fullname': ' Pinch', 'description': ' Less than 1/8 teaspoon.'}, 1.0, 141, '{}'), + sql='INSERT INTO main_recipe_items(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') \ No newline at end of file diff --git a/database.py b/database.py index b14bdc1..f0bce71 100644 --- a/database.py +++ b/database.py @@ -1,9 +1,24 @@ +from datetime import datetime +import psycopg2, json +import psycopg2.extras +from dataclasses import dataclass, field +import random +import string + class DatabaseError(Exception): def __init__(self, message, payload=[], sql=""): super().__init__(message) self.payload = payload - self.message = message - self.sql = sql + self.message = str(message).replace("\n", "") + self.sql = sql.replace("\n", "") + self.log_error() + + def log_error(self): + with open("database.log", "a+") as file: + file.write("\n") + file.write(f"{datetime.now()} --- ERROR --- DatabaseError(message='{self.message}',\n") + file.write(f"{" "*41}payload={self.payload},\n") + file.write(f"{" "*41}sql='{self.sql}')") def __str__(self): return f"DatabaseError(message='{self.message}', payload={self.payload}, sql='{self.sql}')" @@ -15,9 +30,266 @@ def tupleDictionaryFactory(columns, row): def lst2pgarr(alist): return '{' + ','.join(alist) + '}' +def updateStringFactory(updated_values: dict): + set_clause = ', '.join([f"{key} = %s" for key in updated_values.keys()]) + values = [] + for value in updated_values.values(): + if isinstance(value, dict): + value = json.dumps(value) + values.append(value) + + return set_clause, values + +def getUUID(n): + random_string = ''.join(random.choices(string.ascii_letters + string.digits, k=n)) + return random_string + # ------------------------- # Insert Database Functions # ------------------------- +def insertShoppingListsTuple(conn, site, payload, convert=False): + """insert payload into shopping_lists table of site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: inserted tuple + """ + shopping_list = () + with open(f"sql/INSERT/insertShoppingListsTuple.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + shopping_list = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + shopping_list = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return shopping_list + +def insertShoppingListItemsTuple(conn, site, payload, convert=False): + """insert payload into shopping_list_items table of site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (uuid[str], sl_id[int], item_type[str], item_name[str], uom[str], + qty[float], item_id[int], links[jsonb]) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: inserted tuple + """ + shopping_list_item = () + with open(f"sql/INSERT/insertShoppingListItemsTuple.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + shopping_list_item = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + shopping_list_item = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return shopping_list_item + +def insertReceiptsTuple(conn, site, payload, convert=False): + """insert payload into receipt table of site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: inserted tuple + """ + receipt = () + with open(f"sql/INSERT/insertReceiptsTuple.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + receipt = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + receipt = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return receipt + +def insertReceiptItemsTuple(conn, site, payload, convert=False): + """insert payload into receipt_items table of site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (type[str], receipt_id[int], barcode[str], name[str], + qty[float], data[jsonb], status[str]) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: inserted tuple + """ + receipt_item = () + with open(f"sql/INSERT/insertReceiptItemsTuple.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + receipt_item = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + receipt_item = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return receipt_item + +def insertItemLinksTuple(conn, site, payload, convert=False): + """insert payload into itemlinks table of site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (barcode[str], link[int], data[jsonb], conv_factor[float]) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: inserted tuple + """ + link = () + with open(f"sql/INSERT/insertItemLinksTuple.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + link = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + link = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return link + +def insertVendorsTuple(conn, site, payload, convert=False): + """insert payload into vendors table of site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): (vendor_name[str], vendor_address[str], creation_date[timestampe], + created_by[int], phone_number[str]) + payload (tuple): (vendor_name[str], vendor_address[str], creation_date[timestamp], created_by[int], phone_number[str]) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: inserted tuple + """ + vendor = () + with open(f"sql/INSERT/insertVendorsTuple.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + vendor = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + vendor = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return vendor + +def insertZonesTuple(conn, site, payload, convert=False): + """insert payload into zones table of site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (name[str],) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: inserted tuple + """ + zone = () + with open(f"sql/INSERT/insertZonesTuple.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + zone = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + zone = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return zone + +def insertLocationsTuple(conn, site, payload, convert=False): + """insert payload into locations table of site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (uuid[str], name[str], zone_id[int], items[jsonb]) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: inserted tuple + """ + location = () + with open(f"sql/INSERT/insertLocationsTuple.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + location = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + location = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return location + def insertLoginsTuple(conn, payload, convert=False): """Inserts payload into logins table @@ -48,6 +320,96 @@ def insertLoginsTuple(conn, payload, convert=False): return login +def insertRecipeItemsTuple(conn, site, payload, convert=False): + """insert into recipe_items table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (stre): + payload (tuple): (uuid[str], rp_id[int], item_type[str], item_name[str], uom[str], qty[float], item_id[int], links[jsonb]) + convert (bool, optional): Determines if to return tuple as a dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: inserted tuple + """ + recipe_item = () + with open(f"sql/INSERT/insertRecipeItemsTuple.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + recipe_item = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + recipe_item = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return recipe_item + +def insertRecipesTuple(conn, site, payload, convert=False): + """insert into recipes table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (stre): + payload (tuple): (name[str], author[int], description[str], creation_date[timestamp], instructions[list], picture_path[str]) + convert (bool, optional): Determines if to return tuple as a dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: inserted tuple + """ + recipe = () + with open(f"sql/INSERT/insertRecipesTuple.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + recipe = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + recipe = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return recipe + +def insertGroupItemsTuple(conn, site, payload, convert=False): + """insert into group_items table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (stre): + payload (tuple): (uuid[str], gr_id[int], item_type[str], item_name[str], uom[str], qty[float], item_id[int], links[jsonb]) + convert (bool, optional): Determines if to return tuple as a dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: inserted tuple + """ + group_item = () + with open(f"sql/INSERT/insertGroupItemsTuple.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + group_item = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + group_item = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return group_item + def insertGroupsTuple(conn, site, payload, convert=False): """insert into groups table for site @@ -325,6 +687,65 @@ def insertTransactionsTuple(conn, site, payload, convert=False): raise DatabaseError(error, payload, sql) return transaction +def insertSitesTuple(conn, payload, convert=False): + """inserts payload into sites table + + Args: + conn (_T_connector@connect): Postgresql Connector + payload (tuple): (site_name[str], site_description[str], creation_date[timestamp], site_owner_id[int], + flags[dict], default_zone[str], default_auto_issue_location[str], default_primary_location[str]) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: inserted tuple + """ + site_tuple = () + with open(f"sql/INSERT/insertSitesTuple.sql", "r+") as file: + sql = file.read() + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + site_tuple = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + site_tuple = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return site_tuple + +def insertRolesTuple(conn, payload, convert=False): + """inserts payload into roles table + + Args: + conn (_T_connector@connect): Postgresql Connector + payload (tuple): (role_name[str], role_description[str], site_id[int], flags[jsonb]) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: inserted tuple + """ + role_tuple = () + with open(f"sql/INSERT/insertRolesTuple.sql", "r+") as file: + sql = file.read() + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + role_tuple = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + role_tuple = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return role_tuple + # ------------------------- # Update Database Functions # ------------------------- @@ -369,35 +790,472 @@ def updateCostLayersTuple(conn, site, payload): # ------------------------- # Delete Database Functions # ------------------------- -def deleteCostLayersTuple(conn, site_name, payload): - """deletes tuple from cost_layers table for site_name +def __deleteTupleById(conn, site_name, payload, table, convert=False): + """This is a basic funtion to delete a tuple from a table in site with an id. All + tables in this database has id's associated with them. + + Args: + conn (_T_connector@connect): Postgresql Connector + site_name (str): + payload (tuple): (table_to_delete_from, tuple_id) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: deleted tuple + """ + deleted = () + sql = f"WITH deleted_rows AS (DELETE FROM {table} WHERE id IN ({','.join(['%s'] * len(payload))}) RETURNING *) SELECT * FROM deleted_rows;" + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchall() + if rows and convert: + deleted = [tupleDictionaryFactory(cur.description, r) for r in rows] + elif rows and not convert: + deleted = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return deleted + +def deleteItemsTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from items table for site Args: conn (_T_connector@connect): Postgresql Connector site (str): - payload (tuple): (cost_layer_id, ) + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_items" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteCostLayersTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from cost_layers table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_cost_layers" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteLoginsTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from cost_layers table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = "logins" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteZonesTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from zones table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_zones" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteRolesTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from roles table + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"roles" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteBrandsTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from brands table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_brands" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteFoodInfoTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from food_info table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_food_info" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteGroupsTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from groups table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_groups" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteGroupItemsTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from group_items table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_group_items" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteItemInfoTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from item_info table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_item_info" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteItemLocationsTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from item_locations table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_item_locations" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteItemLinksTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from itemlinks table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_itemlinks" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteLocationsTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from locations table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_locations" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteLogisticsInfoTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from logistics_info table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_logistics_info" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteRecipesTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from recipes table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_recipes" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteRecipeItemsTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from recipe_items table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_recipe_items" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteShoppingListsTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from shopping_lists table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_shopping_lists" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteShoppingListItemsTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from shopping_list_items table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_shopping_list_items" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteTransactionsTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from transactions table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_transactions" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteVendorsTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from vendors table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_vendors" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteReceiptsTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from receipts table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_receipts" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteReceiptItemsTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from receipt_items table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"{site}_receipt_items" + return __deleteTupleById(conn, site, payload, table, convert) + +def deleteSitesTuple(conn, site, payload, convert=False): + """deletes tuple/s with ids from sites table + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + payload (tuple): (id1, id2, id3, ...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Returns: + tuple or dict: deleted tuple + """ + table = f"sites" + return __deleteTupleById(conn, site, payload, table, convert) + +# ------------------------- +# Update Database Functions +# ------------------------- +def __updateTuple(conn, site, table, payload, convert=False): + """_summary_ + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + table (str): + payload (dict): {'id': row_id, 'update': {... column_to_update: value_to_update_to...}} + convert (bool, optional): determines if to return tuple as dictionary. Defaults to False. Raises: - DatabaseError: returns all database errors and encompasses payload and sql info. - + DatabaseError: + Returns: - tuple: deleted row returned as a tuple + tuple or dict: updated tuple """ - cost_layer = () - sql = f"WITH deleted_row AS (DELETE FROM {site_name}_cost_layers WHERE id=%s RETURNING *) SELECT * FROM deleted_row;" + updated = () + + set_clause, values = updateStringFactory(payload['update']) + values.append(payload['id']) + sql = f"UPDATE {table} SET {set_clause} WHERE id=%s RETURNING *;" try: with conn.cursor() as cur: - cur.execute(sql, payload) + cur.execute(sql, values) rows = cur.fetchone() - if rows: - cost_layer = rows + if rows and convert: + updated = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + updated = rows except Exception as error: raise DatabaseError(error, payload, sql) - return cost_layer + return updated # ------------------------- # Select Database Functions # ------------------------- +def __selectTuple(conn, site, table, payload, convert=False): + selected = () + sql = f"SELECT * FROM {table} WHERE id=%s;" + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + selected = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + selected = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return selected + +def __selectTuples(conn, site, table, convert=False): + selected = () + sql = f"SELECT * FROM {table};" + try: + with conn.cursor() as cur: + cur.execute(sql) + rows = cur.fetchall() + if rows and convert: + selected = [tupleDictionaryFactory(cur.description, row) for row in rows] + elif rows and not convert: + selected = rows + except Exception as error: + raise DatabaseError(error, (), sql) + return selected + +def _paginateTableTuples(conn, site, table, payload, convert=False): + recordset = [] + sql = f"SELECT * FROM {table} LIMIT {payload[0]} OFFSET {payload[1]};" + try: + if convert: + with conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as cur: + cur.execute(sql, payload) + recordset = cur.fetchall() + recordset = [dict(record) for record in recordset] + cur.execute(f"SELECT COUNT(*) FROM {table}") + count = cur.fetchone() + else: + with conn.cursor() as cur: + cur.execute(sql, payload) + recordset = cur.fetchall() + cur.execute(f"SELECT COUNT(*) FROM {table}") + count = cur.fetchone() + except Exception as error: + raise DatabaseError(error, payload, sql) + + return recordset, count + def selectItemLocationsTuple(conn, site_name, payload, convert=False): """select a single tuple from ItemLocations table for site_name @@ -452,6 +1310,123 @@ def selectCostLayersTuple(conn, site_name, payload, convert=False): return error return cost_layers +def selectSiteTuple(conn, payload, convert=False): + """Select a single Site from sites using site_name + + Args: + conn (_T_connector@connect): Postgresql Connector + payload (tuple): (site_name,) + convert (bool, optional): determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: selected tuples + """ + site = () + select_site_sql = f"SELECT * FROM sites WHERE site_name = %s;" + try: + with conn.cursor() as cur: + cur.execute(select_site_sql, payload) + rows = cur.fetchone() + if rows and convert: + site = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + site = rows + except Exception as error: + raise DatabaseError(error, payload, select_site_sql) + return site + +def selectSitesTuple(conn, payload, convert=False): + site = () + select_sites_sql = f"SELECT * FROM sites WHERE id IN ({','.join(['%s'] * len(payload))}) RETURNING *;" + try: + with conn.cursor() as cur: + cur.execute(select_sites_sql, payload) + rows = cur.fetchall() + if rows and convert: + site = [tupleDictionaryFactory(cur.description, site) for site in rows] + elif rows and not convert: + site = rows + except Exception as error: + return error + return site + +def selectRolesTuple(conn, payload, convert=False): + """Select all Roles from roles table using site_id + + Args: + conn (_T_connector@connect): Postgresql Connector + payload (tuple): (site_id,) + convert (bool, optional): determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: selected tuples + """ + roles = () + select_roles_sql = f"SELECT * FROM roles WHERE site_id = %s;" + try: + with conn.cursor() as cur: + cur.execute(select_roles_sql, payload) + rows = cur.fetchall() + if rows and convert: + roles = [tupleDictionaryFactory(cur.description, role) for role in rows] + elif rows and not convert: + roles = rows + except Exception as error: + raise DatabaseError(error, payload, select_roles_sql) + return roles + + + +# ------------------------- +# Create Database Functions +# ------------------------- +def __createTable(conn, site, table): + """creates table in site database + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + table (str): + + Raises: + DatabaseError: + """ + with open(f"sql/CREATE/{table}.sql", 'r') as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql) + except Exception as error: + raise DatabaseError(error, sql, table) + +# ----------------------- +# Drop Database Functions +# ----------------------- +def __dropTable(conn, site, table): + """drops table from site database + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + table (str): + + Raises: + DatabaseError: + """ + with open(f"sql/DROP/{table}.sql", 'r') as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql) + except Exception as error: + raise DatabaseError(error, sql, table) + # ------------------------- # Custom Database Functions # ------------------------- @@ -468,7 +1443,553 @@ def getItemLocation(conn, site_name, payload): """ item_location = list(selectItemLocationsTuple(conn, site_name, payload)) - print(item_location) item_location[4] = selectCostLayersTuple(conn, site_name, (item_location[0], )) - return item_location \ No newline at end of file + return item_location + +def getUser(conn, payload, convert=False): + """_summary_ + + Args: + conn (_type_): _description_ + payload (tuple): (username, password) + convert (bool, optional): _description_. Defaults to False. + + Raises: + DatabaseError: _description_ + + Returns: + _type_: _description_ + """ + user = () + try: + with conn.cursor() as cur: + sql = f"SELECT * FROM logins WHERE username=%s;" + cur.execute(sql, (payload[0],)) + rows = cur.fetchone() + if rows and rows[2] == payload[1] and convert: + user = tupleDictionaryFactory(cur.description, rows) + elif rows and rows[2] == payload[1] and not convert: + user = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return user + +def updateRemoveLoginSite(conn, payload, convert=False): + sql = f"UPDATE logins SET sites = array_remove(sites, %s) WHERE id = %s RETURNING *;" + login = () + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + login = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + login = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return login + +def updateRemoveLoginRole(conn, payload, convert=False): + sql = f"UPDATE logins SET site_roles = array_remove(site_roles, %s) WHERE id = %s RETURNING *;" + login = () + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + login = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + login = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return login + +def updateRemoveLoginSitesRoles(conn, payload, convert=False): + """update logins table with payload + + Args: + conn (_T_connector@connect): Postgresql Connector + payload (tuple): (site_id, role_id, login_id) + convert (bool, optional): determins if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: updated tuple + """ + sql = f"UPDATE logins SET sites = array_remove(sites, %s), site_roles = array_remove(site_roles, %s) WHERE id = %s RETURNING *;" + login = () + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + login = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + login = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + + return login + +def updateUsersSites(conn, site_id): + try: + select_sql = f"SELECT logins.id FROM logins WHERE sites @> ARRAY[%s];" + with conn.cursor() as cur: + cur.execute(select_sql, (site_id, )) + user = tuple([row[0] for row in cur.fetchall()]) + + update_sql = f"UPDATE logins SET sites = array_remove(sites, %s) WHERE id = %s;" + with conn.cursor() as cur: + for user_id in user: + cur.execute(update_sql, (site_id, user_id)) + except Exception as error: + raise error + +def updateUsersRoles(conn, role_id): + try: + select_sql = f"SELECT logins.id FROM logins WHERE site_roles @> ARRAY[%s];" + with conn.cursor() as cur: + cur.execute(select_sql, (role_id, )) + users = tuple([row[0] for row in cur.fetchall()]) + + update_sql = f"UPDATE logins SET site_roles = array_remove(site_roles, %s) WHERE id = %s;" + with conn.cursor() as cur: + for user_id in users: + cur.execute(update_sql, (role_id, user_id)) + except Exception as error: + raise error + +def updateAddLoginSitesRoles(conn, payload, convert=False): + """update logins table with payload + + Args: + conn (_T_connector@connect): Postgresql Connector + payload (tuple): (site_id, role_id, login_id) + convert (bool, optional): determins if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: updated tuple + """ + sql = f"UPDATE logins SET sites = sites || %s, site_roles = site_roles || %s WHERE id=%s RETURNING *;" + login = () + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + login = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + login = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + + return login + +def getItemsWithQOH(conn, site, payload, convert=True): + + # used in items/index.html (getItems) + recordset = [] + count = 0 + with open(f"sql/SELECT/getItemsWithQOH.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + if convert: + with conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as cur: + cur.execute(sql, payload) + recordset = cur.fetchall() + recordset = [dict(record) for record in recordset] + cur.execute(f"SELECT COUNT(*) FROM {site}_items WHERE search_string LIKE '%%' || %s || '%%';", (payload[0], )) + count = cur.fetchone() + else: + with conn.cursor() as cur: + cur.execute(sql, payload) + recordset = cur.fetchall() + cur.execute(f"SELECT COUNT(*) FROM {site}_items WHERE search_string LIKE '%%' || %s || '%%';", (payload[0], )) + count = cur.fetchone() + except Exception as error: + raise DatabaseError(error, payload, sql) + return recordset, count + +def getItemsForModal(conn, site, payload, convert=True): + """ This database query returns all the items in the database specific for use with modals + in the system. It returns all items that ARE NOT of the type link which is a linked item that + we do not want anyone being able to interact with outside of editing info. + + Args: + conn (_T_connector@connect): PostgreSQL connector + site (str): + payload (tuple): (search_string, limit, offset) + convert (bool, optional): Determines if the items are returned as tuples or dictionaries. Defaults to True. + + Raises: + DatabaseError: + + Returns: + tuple: + """ + recordset = [] + count = 0 + with open(f"sql/SELECT/getItemsForModals.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + if convert: + with conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as cur: + cur.execute(sql, payload) + recordset = cur.fetchall() + recordset = [dict(record) for record in recordset] + cur.execute(f"SELECT COUNT(*) FROM {site}_items WHERE search_string LIKE '%%' || %s || '%%' AND {site}_items.row_type <> 'link';", (payload[0], )) + count = cur.fetchone() + else: + with conn.cursor() as cur: + cur.execute(sql, payload) + recordset = cur.fetchall() + cur.execute(f"SELECT COUNT(*) FROM {site}_items WHERE search_string LIKE '%%' || %s || '%%' AND {site}_items.row_type <> 'link';", (payload[0], )) + count = cur.fetchone() + except Exception as error: + raise DatabaseError(error, payload, sql) + return recordset, count + +def getItemAllByID(conn, site, payload, convert=False): + item = () + with open(f"sql/SELECT/getItemAllByID.sql", "r+") as file: + getItemAllByID_sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(getItemAllByID_sql, payload) + rows = cur.fetchone() + if rows and convert: + item = tupleDictionaryFactory(cur.description, rows) + if rows and not convert: + item = rows + except (Exception, psycopg2.DatabaseError) as error: + raise DatabaseError(error, payload, getItemAllByID_sql) + return item + +def getLinkedItemByBarcode(conn, site, payload, convert=True): + item = () + sql = f"SELECT * FROM {site}_itemlinks WHERE barcode=%s;" + if convert: + item = {} + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + item = tupleDictionaryFactory(cur.description, rows) + if rows and not convert: + item = rows + except (Exception, psycopg2.DatabaseError) as error: + raise DatabaseError(error, payload, sql) + return item + +def getItemAllByBarcode(conn, site, payload, convert=True): + + item = () + if convert: + item = {} + linked_item = getLinkedItemByBarcode(conn, site, (payload[0],)) + + if len(linked_item) > 1: + item = getItemAllByID(conn, site, payload=(linked_item['link'], ), convert=convert) + item['item_info']['uom_quantity'] = linked_item['conv_factor'] + else: + with open(f"sql/SELECT/getItemAllByBarcode.sql", "r+") as file: + getItemAllByBarcode_sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(getItemAllByBarcode_sql, payload) + rows = cur.fetchone() + if rows and convert: + item = tupleDictionaryFactory(cur.description, rows) + if rows and not convert: + item = rows + except (Exception, psycopg2.DatabaseError) as error: + raise DatabaseError(error, payload, getItemAllByBarcode_sql) + return item + +def getZonesWithCount(conn, site, payload, convert=False): + """_summary_ + + Args: + conn (_type_): _description_ + site (_type_): _description_ + payload (_type_): (limit, offset) + convert (bool, optional): _description_. Defaults to False. + + Raises: + DatabaseError: _description_ + + Returns: + _type_: _description_ + """ + zones = () + count = 0 + with open(f"sql/SELECT/getZonesWithCount.sql", "r+") as file: + getZonesWithCount_sql = file.read().replace("%%site_name%%", site) + with open(f"sql/SELECT/countZones.sql", "r+") as file: + countZones_sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(getZonesWithCount_sql, payload) + rows = cur.fetchall() + if rows and convert: + zones = [tupleDictionaryFactory(cur.description, row) for row in rows] + if rows and not convert: + zones = rows + if rows: + cur.execute(countZones_sql) + count = cur.fetchone() + except (Exception, psycopg2.DatabaseError) as error: + raise DatabaseError(error, payload, getZonesWithCount_sql) + return zones, count + +def queryTuple(conn, sql, payload, convert=False): + queryset = () + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + queryset = tupleDictionaryFactory(cur.description, rows) + if rows and not convert: + queryset = rows + except (Exception, psycopg2.DatabaseError) as error: + raise DatabaseError(error, payload, sql) + return queryset + +def queryTuples(conn, sql, payload, convert=False): + querysets = [] + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchall() + if rows and convert: + querysets = [tupleDictionaryFactory(cur.description, row) for row in rows] + if rows and not convert: + querysets = rows + except (Exception, psycopg2.DatabaseError) as error: + raise DatabaseError(error, payload, sql) + return querysets + +def getItemLocations(conn, site, payload, convert=False): + locations = [] + count = 0 + with open(f"sql/SELECT/getItemLocations.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchall() + if rows and convert: + locations = [tupleDictionaryFactory(cur.description, row) for row in rows] + if rows and not convert: + locations = rows + + cur.execute(f"SELECT COUNT(*) FROM {site}_item_locations WHERE part_id=%s;", (payload[0],)) + count = cur.fetchone()[0] + except (Exception, psycopg2.DatabaseError) as error: + raise DatabaseError(error, payload, sql) + return locations, count + +def getReceipts(conn, site, payload, convert=False): + receipts = [] + count = 0 + with open(f"sql/SELECT/getReceipts.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchall() + if rows and convert: + receipts = [tupleDictionaryFactory(cur.description, row) for row in rows] + if rows and not convert: + receipts = rows + + cur.execute(f"SELECT COUNT(*) FROM {site}_receipts;") + count = cur.fetchone()[0] + except (Exception, psycopg2.DatabaseError) as error: + raise DatabaseError(error, payload, sql) + return receipts, count + +def getReceiptByID(conn, site, payload, convert=False): + receipt = [] + with open(f"sql/SELECT/getReceiptByID.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + row = cur.fetchone() + if row and convert: + receipt = tupleDictionaryFactory(cur.description, row) + if row and not convert: + receipt = row + except (Exception, psycopg2.DatabaseError) as error: + raise DatabaseError(error, payload, sql) + return receipt + +def request_receipt_id(conn, site_name): + """gets the next id for receipts_id, currently returns a 8 digit number + + Args: + site (str): site to get the next id for + + Returns: + json: receipt_id, message, error keys + """ + next_receipt_id = None + sql = f"SELECT receipt_id FROM {site_name}_receipts ORDER BY id DESC LIMIT 1;" + try: + with conn.cursor() as cur: + cur.execute(sql) + next_receipt_id = cur.fetchone() + if next_receipt_id == None: + next_receipt_id = "00000001" + else: + next_receipt_id = next_receipt_id[0] + next_receipt_id = int(next_receipt_id.split("-")[1]) + 1 + y = str(next_receipt_id) + len_str = len(y) + x = "".join(["0" for _ in range(8 - len_str)]) + next_receipt_id = x + y + except (Exception, psycopg2.DatabaseError) as error: + raise DatabaseError(error, payload=(), sql=sql) + + return next_receipt_id + +def getShoppingLists(conn, site, payload, convert=True): + """_summary_ + + Args: + conn (_type_): _description_ + site (_type_): _description_ + payload (_type_): (limit, offset) + convert (bool, optional): _description_. Defaults to True. + + Raises: + DatabaseError: _description_ + + Returns: + _type_: _description_ + """ + recordset = [] + count = 0 + with open(f"sql/SELECT/getShoppingLists.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchall() + if rows and convert: + recordset = [tupleDictionaryFactory(cur.description, row) for row in rows] + if rows and not convert: + recordset = rows + + cur.execute(f"SELECT COUNT(*) FROM {site}_shopping_lists;") + count = cur.fetchone()[0] + except (Exception, psycopg2.DatabaseError) as error: + raise DatabaseError(error, payload, sql) + return recordset, count + +def getShoppingList(conn, site, payload, convert=True): + """_summary_ + + Args: + conn (_type_): _description_ + site (_type_): _description_ + payload (_type_): (shopping_list_id, ) + convert (bool, optional): _description_. Defaults to True. + + Raises: + DatabaseError: _description_ + + Returns: + _type_: _description_ + """ + recordset = [] + if convert: + recordset = {} + + with open(f"sql/SELECT/getShoppingListByID.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + recordset = tupleDictionaryFactory(cur.description, rows) + if rows and not convert: + recordset = rows + + except (Exception, psycopg2.DatabaseError) as error: + raise DatabaseError(error, payload, sql) + return recordset + +def getGroups(conn, site, payload, convert=True): + """_summary_ + + Args: + conn (_type_): _description_ + site (_type_): _description_ + payload (_type_): (limit, offset) + convert (bool, optional): _description_. Defaults to True. + + Raises: + DatabaseError: _description_ + + Returns: + _type_: _description_ + """ + recordset = [] + count = 0 + with open(f"sql/SELECT/getGroups.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchall() + if rows and convert: + recordset = [tupleDictionaryFactory(cur.description, row) for row in rows] + if rows and not convert: + recordset = rows + + cur.execute(f"SELECT COUNT(*) FROM {site}_groups;") + count = cur.fetchone()[0] + except (Exception, psycopg2.DatabaseError) as error: + raise DatabaseError(error, payload, sql) + return recordset, count + +def getItemsSafetyStock(conn, site, convert=True): + """_summary_ + + Args: + conn (_type_): _description_ + site (_type_): _description_ + payload (_type_): (limit, offset) + convert (bool, optional): _description_. Defaults to True. + + Raises: + DatabaseError: _description_ + + Returns: + _type_: _description_ + """ + recordsets = [] + with open(f"sql/SELECT/getItemsSafetyStock.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql) + rows = cur.fetchall() + if rows and convert: + recordsets = [tupleDictionaryFactory(cur.description, row) for row in rows] + if rows and not convert: + recordsets = rows + except (Exception, psycopg2.DatabaseError) as error: + raise DatabaseError(error, None, sql) + return recordsets \ No newline at end of file diff --git a/external_API.py b/external_API.py new file mode 100644 index 0000000..e0fde2c --- /dev/null +++ b/external_API.py @@ -0,0 +1,121 @@ +from flask import Blueprint, request, render_template, redirect, session, url_for, send_file, jsonify, Response +import psycopg2, math, json, datetime, main, copy, requests, process, database, pprint, MyDataclasses +from config import config, sites_config +from main import unfoldCostLayers +from threading import Thread +from queue import Queue +import time, process +from user_api import login_required + +external_api = Blueprint('external', __name__) + +@external_api.route('/external/getItemLocations', methods=["GET"]) +def getItemLocations(): + recordset = [] + count = 0 + if request.method == "GET": + item_id = int(request.args.get('id', 1)) + page = int(request.args.get('page', 1)) + limit = int(request.args.get('limit', 10)) + site_name = session['selected_site'] + offset = (page - 1) * limit + database_config = config() + with psycopg2.connect(**database_config) as conn: + recordset, count = database.getItemLocations(conn, site_name, (item_id, limit, offset), convert=True) + print(count) + return jsonify({"locations":recordset, "end":math.ceil(count/limit), "error":False, "message":"item fetched succesfully!"}) + return jsonify({"locations":recordset, "end": math.ceil(count/limit), "error":True, "message":"There was an error with this GET statement"}) + +@external_api.route('/external/getItem', methods=["GET"]) +def getItem(): + record = {} + if request.method == "GET": + item_id = int(request.args.get('id', 1)) + site_name = session['selected_site'] + database_config = config() + with psycopg2.connect(**database_config) as conn: + record = database.getItemAllByID(conn, site_name, (item_id, ), convert=True) + return jsonify({"item":record, "error":False, "message":"item fetched succesfully!"}) + return jsonify({"item":record, "error":True, "message":"There was an error with this GET statement"}) + +@external_api.route('/external/getItem/barcode', methods=["GET"]) +def getItemBarcode(): + record = {} + if request.method == "GET": + item_barcode = f"%{str(request.args.get('barcode', 1))}%" + site_name = session['selected_site'] + database_config = config() + with psycopg2.connect(**database_config) as conn: + record = database.getItemAllByBarcode(conn, site_name, (item_barcode, ), convert=True) + + print(record) + if record == {}: + return jsonify({"item":None, "error":True, "message":"Item either does not exist or there was a larger problem!"}) + else: + return jsonify({"item":record, "error":False, "message":"item fetched succesfully!"}) + return jsonify({"item":record, "error":True, "message":"There was an error with this GET statement"}) + +@external_api.route('/external/getModalItems', methods=["GET"]) +@login_required +def getModalItems(): + recordset = [] + count = {'count': 0} + if request.method == "GET": + page = int(request.args.get('page', 1)) + limit = int(request.args.get('limit', 10)) + search_string = request.args.get('search_string', '') + site_name = session['selected_site'] + offset = (page - 1) * limit + database_config = config() + with psycopg2.connect(**database_config) as conn: + payload = (search_string, limit, offset) + recordset, count = database.getItemsForModal(conn, site_name, payload, convert=True) + return jsonify({"items":recordset, "end":math.ceil(count['count']/limit), "error":False, "message":"items fetched succesfully!"}) + return jsonify({"items":recordset, "end":math.ceil(count['count']/limit), "error":True, "message":"There was an error with this GET statement"}) + +@external_api.route('/external/postTransaction', methods=["POST"]) +def post_transaction(): + if request.method == "POST": + database_config = config() + with psycopg2.connect(**database_config) as conn: + result = process.postTransaction( + conn=conn, + site_name=session['selected_site'], + user_id=session['user_id'], + data=dict(request.json) + ) + return jsonify(result) + return jsonify({"error":True, "message":"There was an error with this POST statement"}) + + +@external_api.route('/external/postReceipt', methods=["POST"]) +def post_receipt(): + if request.method == "POST": + site_name = session['selected_site'] + user_id = session['user_id'] + database_config = config() + with psycopg2.connect(**database_config) as conn: + items = request.json['items'] + receipt_id = database.request_receipt_id(conn, site_name) + receipt_id = f"SIR-{receipt_id}" + receipt = MyDataclasses.ReceiptPayload( + receipt_id=receipt_id, + submitted_by=user_id + ) + receipt = database.insertReceiptsTuple(conn, site_name, receipt.payload(), convert=True) + + for item in items: + + receipt_item = MyDataclasses.ReceiptItemPayload( + type=item['type'], + receipt_id=receipt['id'], + barcode=item['item']['barcode'], + name=item['item']['item_name'], + qty=item['item']['qty'], + uom=item['item']['uom'], + data=item['item']['data'] + ) + database.insertReceiptItemsTuple(conn, site_name, receipt_item.payload()) + + return jsonify({"error":False, "message":"Transaction Complete!"}) + return jsonify({"error":True, "message":"There was an error with this POST statement"}) \ No newline at end of file diff --git a/external_devices.py b/external_devices.py deleted file mode 100644 index 635b484..0000000 --- a/external_devices.py +++ /dev/null @@ -1,232 +0,0 @@ -from flask import Blueprint, request, render_template, redirect, session, url_for, send_file, jsonify, Response -import psycopg2, math, json, datetime, main, copy, openfoodfacts -from config import config, sites_config -from main import unfoldCostLayers - -external_api= Blueprint('external_api', __name__) - -open_food_api = openfoodfacts.API(user_agent="MyAwesomeApp/1.0") - -open_food_enabled = False - - -def parseOpenFoodsData(data: dict): - print(data) - x = [ - ("brands_tags", list, []), # process into items.tags - ("categories_tags", list, []), # process into items.tags - ("countries_tags", list, []), # process into items.tags - ("labels_hierarchy", list, []), # process into items.tags - ("ingredients_text_en", str, ""), # process into a list of food_info.ingrediants - ("nutriments", dict, {}), # process into food_info.nutrients - ("product_name", str, ""), # #process into items.item_name - ("serving_size", str, ""), # add to nutriments - ("code", str, "") # process into items.barcode - ] - - dummy = {} - keys = data.keys() - for key in x: - if key[0] in keys and isinstance(data[key[0]], key[1]): - dummy[key[0]] = data[key[0]] - else: - dummy[key[0]] = key[2] - - tags = dummy["brands_tags"] + dummy["categories_tags"] + dummy["countries_tags"] + dummy["labels_hierarchy"] - ingredients = str(dummy["ingredients_text_en"]).split(", ") - nutriments = dummy["nutriments"] - nutriments["serving_size"] = dummy["serving_size"] - - payload = copy.deepcopy(main.payload_food_item) - payload["tags"] = tags - payload["product_name"] = dummy["product_name"] - payload["food_info"]["ingrediants"] = ingredients - payload["food_info"]["nutrients"] = nutriments - - print(payload) - - -@external_api.route("/api/getLink//") -def get_linked_item(site, barcode): - database_config = config() - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - cur.execute(f"SELECT * FROM {site}_itemlinks WHERE barcode=%s;", (barcode, )) - item = cur.fetchone() - if item: - return jsonify({"item": item}), 200 - except (Exception, psycopg2.DatabaseError) as error: - print(error) - conn.rollback() - return jsonify({'state': str(error)}), 500 - return jsonify({"item": []}), 500 - -@external_api.route("/api/getItem//") -def get_item(site, barcode): - database_config = config() - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - with open(f"sites/{site}/sql/unique/select_item_all_barcode.sql", "r+") as file: - sql = file.read() - cur.execute(sql, (barcode, )) - item = cur.fetchone() - if item: - return jsonify({"item": item}), 200 - except (Exception, psycopg2.DatabaseError) as error: - print(error) - conn.rollback() - return jsonify({'state': str(error)}), 500 - return jsonify({"item": []}), 500 - -@external_api.route("/api/getOpenFacts//") -def get_open_facts(site, barcode): - if open_food_enabled: - data = open_food_api.product.get(barcode) - if data != None: - return jsonify({"item": data}), 500 - return jsonify({"item": []}), 500 - - -@external_api.route("/api/addTransaction", methods=['POST']) -def add_transaction(): - - if request.method == "POST": - print(request.get_json()) - site_name = request.get_json()["site_name"] - logistics_info_id = request.get_json()['logistics_info_id'] - barcode = request.get_json()['barcode'] - name = request.get_json()['name'] - location = request.get_json()['location'] - qty = float(request.get_json()['qty']) - trans_type = request.get_json()['trans_type'] - trans_cost = request.get_json()['trans_cost'] - - database_config = config() - - actual_qty = qty - if trans_type == "Adjust Out": - actual_qty = -qty - - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - cur.execute(f"SELECT id FROM {site_name}_items WHERE barcode=%s;", (barcode,)) - item_id = cur.fetchone() - payload = [ - datetime.datetime.now(), - logistics_info_id, - barcode, - name, - trans_type, - qty, - "", - 1, - json.dumps({'location': location, 'cost': trans_cost}) - ] - - print(payload) - main.addTransaction( - conn=conn, - site_name=site_name, - payload=payload, - location=location, - logistics_info_id=logistics_info_id, - item_id=item_id, - qty=actual_qty, - cost=trans_cost - ) - - except (Exception, psycopg2.DatabaseError) as error: - print(error) - conn.rollback() - return jsonify({'state': str(error)}) - print("SUCCESS") - return jsonify({'state': str("SUCCESS")}) - print("SUCCESS") - return jsonify({'state': str("FAILED")}) - - -@external_api.route("/api/requestReceiptId/") -def request_receipt_id(site): - """gets the next id for receipts_id, currently returns a 8 digit number - - Args: - site (str): site to get the next id for - - Returns: - json: receipt_id, message, error keys - """ - database_config = config() - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - cur.execute(f"SELECT receipt_id FROM {site}_receipts ORDER BY id DESC LIMIT 1;") - next_receipt_id = cur.fetchone() - print(next_receipt_id) - if next_receipt_id == None: - next_receipt_id = "00000001" - else: - next_receipt_id = next_receipt_id[0] - next_receipt_id = int(next_receipt_id.split("-")[1]) + 1 - y = str(next_receipt_id) - len_str = len(y) - x = "".join(["0" for _ in range(8 - len_str)]) - next_receipt_id = x + y - except (Exception, psycopg2.DatabaseError) as error: - print(error) - conn.rollback() - return jsonify({"message": "Failed", "error": str(error)}) - return jsonify({"receipt_id": next_receipt_id, "message": "Success", "error": "None"}), 200 - -@external_api.route("/api/addReceipt", methods=["POST"]) -def add_receipt(): - """Receives a payload and adds the receipt to the system for - - payload = { - receipt_id: str - receipt_status: str - date_submitted: timestamp - submitted_by: INT - vendor_id: INT - files: dict - items: list = (tuples) - (type, 0, barcode, name, qty, data, status), - site_name: str - } - - Returns: - Success: dict with "error", "message" keys - """ - if request.method == "POST": - site_name = request.get_json()["site_name"] - receipt_id = request.get_json()["receipt_id"] - receipt_status = request.get_json()["receipt_status"] - date_submitted = request.get_json()['date_submitted'] - submitted_by = request.get_json()["submitted_by"] - vendor_id = request.get_json()["vendor_id"] - files = request.get_json()["files"] - items = request.get_json()["items"] - payload = (receipt_id, receipt_status, date_submitted, submitted_by, vendor_id, json.dumps(files)) - database_config = config() - - with psycopg2.connect(**database_config) as conn: - try: - with conn.cursor() as cur: - insert_receipt = f"INSERT INTO {site_name}_receipts (receipt_id, receipt_status, date_submitted, submitted_by, vendor_id, files) VALUES (%s, %s, %s, %s, %s, %s) RETURNING id;" - cur.execute(insert_receipt, payload) - row_id = cur.fetchone()[0] - print(row_id) - insert_item = f"INSERT INTO {site_name}_receipt_items (type, receipt_id, barcode, name, qty, data, status) VALUES (%s, %s, %s, %s, %s, %s, %s);" - for item in items: - item = list(item) - item[1] = row_id - item[5] = json.dumps(item[5]) - cur.execute(insert_item, item) - except (Exception, psycopg2.DatabaseError) as error: - print(error) - conn.rollback() - return jsonify({"message": "Failed", "error": str(error)}) - return jsonify({"message": "Success", "error": "None"}) - return jsonify({"message": "Failed", "error": "Must be a post method!"}) diff --git a/group_api.py b/group_api.py new file mode 100644 index 0000000..f0066ee --- /dev/null +++ b/group_api.py @@ -0,0 +1,34 @@ +from flask import Blueprint, request, render_template, redirect, session, url_for, send_file, jsonify, Response +import psycopg2, math, json, datetime, main, copy, requests, process, database, pprint, MyDataclasses +from config import config, sites_config +from main import unfoldCostLayers +from user_api import login_required + +groups_api = Blueprint('groups_api', __name__) + +@groups_api.route("/groups") +@login_required +def groups(): + sites = [site[1] for site in main.get_sites(session['user']['sites'])] + return render_template("groups/index.html", + current_site=session['selected_site'], + sites=sites) + +@groups_api.route("/group/") +@login_required +def group(id): + sites = [site[1] for site in main.get_sites(session['user']['sites'])] + return render_template("groups/group.html", id=id, current_site=session['selected_site'], sites=sites) + +@groups_api.route('/groups/getGroups', methods=["GET"]) +def getGroups(): + groups = [] + if request.method == "GET": + page = int(request.args.get('page', 1)) + limit = int(request.args.get('limit', 1)) + offset = (page-1)*limit + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + groups, count = database.getGroups(conn, site_name, (limit, offset), convert=True) + return jsonify({'groups': groups, 'end': math.ceil(count/limit), 'error': False, 'message': 'bleh'}) \ No newline at end of file diff --git a/html_factory.py b/html_factory.py deleted file mode 100644 index 9684b03..0000000 --- a/html_factory.py +++ /dev/null @@ -1,56 +0,0 @@ -import math - - -def manufactureUsersTable(rows): - table = """ - - - - - - - %%rows%% - -
Username
- """ - - string_rows = [] - for row in rows: - string_row = f""" - {row[1]} - """ - string_rows.append(string_row) - - table = table.replace("%%rows%%", "".join(string_rows)) - - return table - - -def manufacturePagination(current_page:int , count:int, limit:int): - total_pages = math.ceil(count/limit) - pag = "" - limits = "hx-vals='{" + f'"limit": "{str(limit)}"' + "}'" - if count >= limit: - pag += '
" - - return pag - \ No newline at end of file diff --git a/item_API.py b/item_API.py new file mode 100644 index 0000000..50c2ae4 --- /dev/null +++ b/item_API.py @@ -0,0 +1,474 @@ +from flask import Blueprint, request, render_template, redirect, session, url_for, send_file, jsonify, Response +import psycopg2, math, json, datetime, main, copy, requests, process, database, pprint, MyDataclasses +from config import config, sites_config +from main import unfoldCostLayers +from user_api import login_required +import postsqldb + +items_api = Blueprint('items_api', __name__) + +@items_api.route("/item//itemLink/") +@login_required +def itemLink(parent_id, id): + sites = [site[1] for site in main.get_sites(session['user']['sites'])] + return render_template("items/itemlink.html", current_site=session['selected_site'], sites=sites, proto={'referrer': request.referrer}, id=id) + +@items_api.route("/item/getTransactions", methods=["GET"]) +def getTransactions(): + if request.method == "GET": + recordset = [] + count = 0 + logistics_info_id = int(request.args.get('logistics_info_id', 1)) + page = int(request.args.get('page', 1)) + limit = int(request.args.get('limit', 50)) + site_name = session['selected_site'] + offset = (page - 1) * limit + database_config = config() + with psycopg2.connect(**database_config) as conn: + sql = f"SELECT * FROM {site_name}_transactions WHERE logistics_info_id=%s LIMIT %s OFFSET %s;" + recordset = database.queryTuples(conn, sql, (logistics_info_id, limit, offset), convert=True) + sql = f"SELECT COUNT(*) FROM {site_name}_transactions WHERE logistics_info_id=%s;" + count = database.queryTuple(conn, sql, payload=(logistics_info_id, )) + return jsonify({"transactions": recordset, "end": math.ceil(count[0]/limit), "error": False, "message": ""}) + return jsonify({"transactions": recordset, "end": math.ceil(count[0]/limit), "error": True, "message": "There was an error in your GET request!"}) + +@items_api.route("/item/getTransaction", methods=["GET"]) +def getTransaction(): + transaction = {} + if request.method == "GET": + id = int(request.args.get('id', 1)) + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + transaction = database.__selectTuple(conn, site_name, f"{site_name}_transactions", payload=(id, ), convert=True) + return jsonify({"transaction": transaction, "error": False, "message": ""}) + return jsonify({"transaction": transaction, "error": True, "message": "There was an error in your GET request!"}) + +@items_api.route("/item/getItem") +def get_item(): + id = int(request.args.get('id', 1)) + database_config = config() + site_name = session['selected_site'] + item = [] + with psycopg2.connect(**database_config) as conn: + item = database.getItemAllByID(conn, site_name, payload=(id, ), convert=True) + return jsonify(item=item) + +@items_api.route("/item/getItemsWithQOH", methods=['GET']) +@login_required +def pagninate_items(): + pantry_inventory = [] + count = {'count': 0} + if request.method == "GET": + page = int(request.args.get('page', 1)) + limit = int(request.args.get('limit', 10)) + search_string = str(request.args.get('search_text', "")) + sort_order = request.args.get('sort_order', "") + view = request.args.get('view', "") + site_name = session['selected_site'] + offset = (page - 1) * limit + + database_config = config() + with psycopg2.connect(**database_config) as conn: + pantry_inventory, count = database.getItemsWithQOH(conn, site_name, (search_string, limit, offset), convert=True) + + return jsonify({'items': pantry_inventory, "end": math.ceil(count['count']/limit), 'error':False, 'message': 'Items Loaded Successfully!'}) + return jsonify({'items': pantry_inventory, "end": math.ceil(count['count']/limit), 'error':True, 'message': 'There was a problem loading the items!'}) + +@items_api.route('/item/getModalItems', methods=["GET"]) +@login_required +def getModalItems(): + recordset = [] + count = {'count': 0} + if request.method == "GET": + page = int(request.args.get('page', 1)) + limit = int(request.args.get('limit', 10)) + search_string = request.args.get('search_string', '') + site_name = session['selected_site'] + offset = (page - 1) * limit + database_config = config() + with psycopg2.connect(**database_config) as conn: + payload = (search_string, limit, offset) + recordset, count = database.getItemsForModal(conn, site_name, payload, convert=True) + return jsonify({"items":recordset, "end":math.ceil(count['count']/limit), "error":False, "message":"items fetched succesfully!"}) + return jsonify({"items":recordset, "end":math.ceil(count['count']/limit), "error":True, "message":"There was an error with this GET statement"}) + +@items_api.route('/item/getPrefixes', methods=["GET"]) +@login_required +def getModalPrefixes(): + recordset = [] + count = {'count': 0} + if request.method == "GET": + page = int(request.args.get('page', 1)) + limit = int(request.args.get('limit', 10)) + site_name = session['selected_site'] + offset = (page - 1) * limit + database_config = config() + with psycopg2.connect(**database_config) as conn: + payload = (limit, offset) + recordset, count = postsqldb.SKUPrefixTable.getPrefixes(conn, site_name, payload, convert=True) + return jsonify({"prefixes":recordset, "end":math.ceil(count/limit), "error":False, "message":"items fetched succesfully!"}) + return jsonify({"prefixes":recordset, "end":math.ceil(count/limit), "error":True, "message":"There was an error with this GET statement"}) + + +@items_api.route('/item/getZones', methods=['GET']) +def getZones(): + page = int(request.args.get('page', 1)) + limit = int(request.args.get('limit', 1)) + database_config = config() + site_name = session['selected_site'] + zones = [] + offset = (page - 1) * limit + payload = (limit, offset) + count = 0 + with psycopg2.connect(**database_config) as conn: + zones, count = database.getZonesWithCount(conn, site_name, payload, convert=True) + print(count, len(zones)) + return jsonify(zones=zones, endpage=math.ceil(count[0]/limit)) + +@items_api.route('/item/getLocations', methods=['get']) +def getLocationsByZone(): + zone_id = int(request.args.get('id', 1)) + page = int(request.args.get('page', 1)) + limit = int(request.args.get('limit', 1)) + + offset = (page-1)*limit + database_config = config() + site_name = session['selected_site'] + locations = [] + count=0 + with psycopg2.connect(**database_config) as conn: + sql = f"SELECT * FROM {site_name}_locations WHERE zone_id=%s LIMIT %s OFFSET %s;" + locations = database.queryTuples(conn, sql, (zone_id, limit, offset), convert=True) + sql = f"SELECT COUNT(*) FROM {site_name}_locations WHERE zone_id=%s;" + count = database.queryTuple(conn, sql, (zone_id, )) + return jsonify(locations=locations, endpage=math.ceil(count[0]/limit)) + +@items_api.route('/item/getBrands', methods=['GET']) +def getBrands(): + page = int(request.args.get('page', 1)) + limit = int(request.args.get('limit', 1)) + offset = (page-1)*limit + database_config = config() + site_name = session['selected_site'] + brands = [] + count = 0 + with psycopg2.connect(**database_config) as conn: + brands, count = database._paginateTableTuples(conn, site_name, f"{site_name}_brands", (limit, offset), convert=True) + return jsonify(brands=brands, endpage=math.ceil(count['count']/limit)) + +@items_api.route('/item/updateItem', methods=['POST']) +def updateItem(): + if request.method == "POST": + id = request.get_json()['id'] + data = request.get_json()['data'] + + database_config = config() + site_name = session['selected_site'] + + transaction_data = {} + for key in data.keys(): + for key_2 in data[key].keys(): + transaction_data[f"{key_2}_new"] = data[key][key_2] + + with psycopg2.connect(**database_config) as conn: + item = database.getItemAllByID(conn, site_name, (id, ), convert=True) + if 'item_info' in data.keys() and data['item_info'] != {}: + for key in data['item_info'].keys(): + transaction_data[f"{key}_old"] = item['item_info'][key] + item_info_id = item['item_info_id'] + item_info = database.__updateTuple(conn, site_name, f"{site_name}_item_info", {'id': item_info_id, 'update': data['item_info']}, convert=True) + if 'food_info' in data.keys() and data['food_info'] != {}: + for key in data['food_info'].keys(): + transaction_data[f"{key}_old"] = item['food_info'][key] + food_info_id = item['food_info_id'] + print(food_info_id, data['food_info']) + food_info = database.__updateTuple(conn, site_name, f"{site_name}_food_info", {'id': food_info_id, 'update': data['food_info']}, convert=True) + if 'logistics_info' in data.keys() and data['logistics_info'] != {}: + for key in data['logistics_info'].keys(): + transaction_data[f"{key}_old"] = item['logistics_info'][key] + logistics_info_id = item['logistics_info_id'] + print(logistics_info_id, data['logistics_info']) + logistics_info = database.__updateTuple(conn, site_name, f"{site_name}_logistics_info", {'id': logistics_info_id, 'update': data['logistics_info']}, convert=True) + if 'item' in data.keys() and data['item'] != {}: + for key in data['item'].keys(): + if key == "brand": + transaction_data[f"{key}_old"] = item['brand']['id'] + else: + transaction_data[f"{key}_old"] = item[key] + item = database.__updateTuple(conn, site_name, f"{site_name}_items", {'id': id, 'update': data['item']}, convert=True) + + trans = MyDataclasses.TransactionPayload( + timestamp=datetime.datetime.now(), + logistics_info_id=item['logistics_info_id'], + barcode=item['barcode'], + name=item['item_name'], + transaction_type="UPDATE", + quantity=0.0, + description="Item was updated!", + user_id=session['user_id'], + data=transaction_data + ) + database.insertTransactionsTuple(conn, site_name, trans.payload()) + + return jsonify(error=False, message="Item updated successfully!") + return jsonify(error=True, message="Unable to save, ERROR!") + +@items_api.route('/item/updateItemLink', methods=['POST']) +def updateItemLink(): + if request.method == "POST": + id = request.get_json()['id'] + conv_factor = request.get_json()['conv_factor'] + barcode = request.get_json()['barcode'] + old_conv_factor = request.get_json()['old_conv'] + + + database_config = config() + site_name = session['selected_site'] + user_id = session['user_id'] + transaction_time = datetime.datetime.now() + with psycopg2.connect(**database_config) as conn: + linkedItem = database.getItemAllByBarcode(conn, site_name, (barcode, ), convert=True) + + transaction = MyDataclasses.TransactionPayload( + timestamp=transaction_time, + logistics_info_id=linkedItem['logistics_info_id'], + barcode=barcode, + name=linkedItem['item_name'], + transaction_type='UPDATE', + quantity=0.0, + description='Link updated!', + user_id=user_id, + data={'new_conv_factor': conv_factor, 'old_conv_factor': old_conv_factor} + ) + + database.__updateTuple(conn, site_name, f"{site_name}_itemlinks", {'id': id, 'update': {'conv_factor': conv_factor}}) + database.insertTransactionsTuple(conn, site_name, transaction.payload()) + return jsonify(error=False, message="Linked Item was updated successfully") + return jsonify(error=True, message="Unable to save this change, ERROR!") + + +@items_api.route('/item/getLinkedItem', methods=["GET"]) +@login_required +def getLinkedItem(): + linked_item = {} + if request.method == "GET": + id = int(request.args.get('id', 1)) + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + linked_item = database.__selectTuple(conn, site_name, f"{site_name}_itemlinks", (id, ), convert=True) + return jsonify({'linked_item': linked_item, 'error': False, 'message': 'Linked Item added!!'}) + return jsonify({'linked_item': linked_item, 'error': True, 'message': 'These was an error with adding to the linked list!'}) + +@items_api.route('/item/addLinkedItem', methods=["POST"]) +def addLinkedItem(): + if request.method == "POST": + parent_id = request.get_json()['parent_id'] + child_id = request.get_json()['child_id'] + conv_factor = request.get_json()['conv_factor'] + + database_config = config() + site_name = session['selected_site'] + user_id = session['user_id'] + with psycopg2.connect(**database_config) as conn: + print(parent_id, child_id, conv_factor) + parent_item = database.getItemAllByID(conn, site_name, (parent_id, ), convert=True) + child_item = database.getItemAllByID(conn, site_name, (child_id, ), convert=True) + + # i need to transact out ALL locations for child item. + pprint.pprint(child_item) + sum_child_qoh = 0 + for location in child_item['item_locations']: + print(location) + sum_child_qoh += location['quantity_on_hand'] + payload = { + 'item_id': child_item['id'], + 'logistics_info_id': child_item['logistics_info_id'], + 'barcode': child_item['barcode'], + 'item_name': child_item['item_name'], + 'transaction_type': 'Adjust Out', + 'quantity': location['quantity_on_hand'], + 'description': f'Converted to {parent_item['barcode']}', + 'cost': child_item['item_info']['cost'], + 'vendor': 1, + 'expires': False, + 'location_id': location['location_id'] + } + process.postTransaction(conn, site_name, user_id, payload) + + print(sum_child_qoh) + + primary_location = database.selectItemLocationsTuple(conn, site_name, (parent_item['id'], parent_item['logistics_info']['primary_location']['id']), convert=True) + + + payload = { + 'item_id': parent_item['id'], + 'logistics_info_id': parent_item['logistics_info_id'], + 'barcode': parent_item['barcode'], + 'item_name': parent_item['item_name'], + 'transaction_type': 'Adjust In', + 'quantity': (float(sum_child_qoh)*float(conv_factor)), + 'description': f'Converted from {child_item['barcode']}', + 'cost': child_item['item_info']['cost'], + 'vendor': 1, + 'expires': None, + 'location_id': primary_location['location_id'] + } + + pprint.pprint(payload) + result = process.postTransaction(conn, site_name, user_id, payload) + + if result['error']: + return jsonify(result) + + itemLink = MyDataclasses.ItemLinkPayload( + barcode=child_item['barcode'], + link=parent_item['id'], + data=child_item, + conv_factor=conv_factor + ) + + database.insertItemLinksTuple(conn, site_name, itemLink.payload()) + + database.__updateTuple(conn, site_name, f"{site_name}_items", {'id': child_item['id'], 'update': {'row_type': 'link'}}) + + return jsonify({'error': False, 'message': 'Linked Item added!!'}) + return jsonify({'error': True, 'message': 'These was an error with adding to the linked list!'}) + +@items_api.route('/items/addBlankItem', methods=["POST"]) +def addBlankItem(): + if request.method == "POST": + data = { + 'barcode': request.get_json()['barcode'], + 'name': request.get_json()['name'], + 'subtype': request.get_json()['subtype'] + } + pprint.pprint(data) + database_config = config() + site_name = session['selected_site'] + user_id = session['user_id'] + try: + with psycopg2.connect(**database_config) as conn: + process.postNewBlankItem(conn, site_name, user_id, data) + except Exception as error: + conn.rollback() + return jsonify({'error': True, 'message': error}) + return jsonify({'error': False, 'message': 'Item added!!'}) + return jsonify({'error': True, 'message': 'These was an error with adding Item!'}) + +@items_api.route('/items/addSKUPrefix', methods=["POST"]) +def addSKUPrefix(): + if request.method == "POST": + database_config = config() + site_name = session['selected_site'] + try: + with psycopg2.connect(**database_config) as conn: + prefix = postsqldb.SKUPrefixTable.Payload( + request.get_json()['uuid'], + request.get_json()['name'], + request.get_json()['description'] + ) + postsqldb.SKUPrefixTable.insert_tuple(conn, site_name, prefix.payload()) + except Exception as error: + conn.rollback() + return jsonify({'error': True, 'message': error}) + return jsonify({'error': False, 'message': 'Prefix added!!'}) + return jsonify({'error': True, 'message': 'These was an error with adding this Prefix!'}) + +@items_api.route('/item/addConversion', methods=['POST']) +def addConversion(): + if request.method == "POST": + item_id = request.get_json()['parent_id'] + uom_id = request.get_json()['uom_id'] + conv_factor = request.get_json()['conv_factor'] + + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + conversion = postsqldb.ConversionsTable.Payload( + item_id, uom_id, conv_factor + ) + postsqldb.ConversionsTable.insert_tuple(conn, site_name, conversion.payload()) + + return jsonify(error=False, message="Conversion was added successfully") + return jsonify(error=True, message="Unable to save this conversion, ERROR!") + +@items_api.route('/item/deleteConversion', methods=['POST']) +def deleteConversion(): + if request.method == "POST": + conversion_id = request.get_json()['conversion_id'] + print(conversion_id) + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + postsqldb.ConversionsTable.delete_item_tuple(conn, site_name, (conversion_id,)) + + return jsonify(error=False, message="Conversion was deleted successfully") + return jsonify(error=True, message="Unable to delete this conversion, ERROR!") + +@items_api.route('/item/updateConversion', methods=['POST']) +def updateConversion(): + if request.method == "POST": + conversion_id = request.get_json()['conversion_id'] + update_dictionary = request.get_json()['update'] + + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + postsqldb.ConversionsTable.update_item_tuple(conn, site_name, {'id': conversion_id, 'update': update_dictionary}) + return jsonify(error=False, message="Conversion was updated successfully") + return jsonify(error=True, message="Unable to save this conversion, ERROR!") + +@items_api.route('/item/addPrefix', methods=['POST']) +def addPrefix(): + if request.method == "POST": + item_info_id = request.get_json()['parent_id'] + prefix_id = request.get_json()['prefix_id'] + print(item_info_id) + print(prefix_id) + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + prefixes = postsqldb.ItemInfoTable.select_tuple(conn, site_name, (item_info_id,))['prefixes'] + print(prefixes) + prefixes.append(prefix_id) + postsqldb.ItemInfoTable.update_tuple(conn, site_name, {'id': item_info_id, 'update':{'prefixes': prefixes}}) + return jsonify(error=False, message="Prefix was added successfully") + return jsonify(error=True, message="Unable to save this prefix, ERROR!") + +@items_api.route('/item/deletePrefix', methods=['POST']) +def deletePrefix(): + if request.method == "POST": + item_info_id = request.get_json()['item_info_id'] + prefix_id = request.get_json()['prefix_id'] + + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + prefixes = postsqldb.ItemInfoTable.select_tuple(conn, site_name, (item_info_id,))['prefixes'] + prefixes.remove(prefix_id) + postsqldb.ItemInfoTable.update_tuple(conn, site_name, {'id': item_info_id, 'update':{'prefixes': prefixes}}) + return jsonify(error=False, message="Prefix was deleted successfully") + return jsonify(error=True, message="Unable to delete this prefix, ERROR!") + +@items_api.route('/item/refreshSearchString', methods=['POST']) +def refreshSearchString(): + if request.method == "POST": + item_id = request.get_json()['item_id'] + + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + item = postsqldb.ItemTable.getItemAllByID(conn, site_name, (item_id,)) + parameters = [f"id::{item['id']}", f"barcode::{item['barcode']}", f"name::{item['item_name']}", f"brand::{item['brand']['name']}", + f"expires::{item['food_info']['expires']}", f"row_type::{item['row_type']}", f"item_type::{item['item_type']}"] + + for prefix in item['item_info']['prefixes']: + parameters.append(f"prefix::{prefix['name']}") + + search_string = "&&".join(parameters) + postsqldb.ItemTable.update_tuple(conn, site_name, {'id': item_id, 'update':{'search_string': search_string}}) + + return jsonify(error=False, message="Search String was updated successfully") + return jsonify(error=True, message="Unable to update this search string, ERROR!") \ No newline at end of file diff --git a/main.py b/main.py index 7f2edd4..11a866a 100644 --- a/main.py +++ b/main.py @@ -412,6 +412,7 @@ def delete_site(site_name): drop_table(f'sites/{site_name}/sql/drop/receipt_items.sql') drop_table(f'sites/{site_name}/sql/drop/receipts.sql') drop_table(f'sites/{site_name}/sql/drop/recipes.sql') + drop_table(f'sites/{site_name}/sql/drop/shopping_list_items.sql') drop_table(f'sites/{site_name}/sql/drop/shopping_lists.sql') drop_table(f'sites/{site_name}/sql/drop/item_locations.sql') @@ -437,16 +438,17 @@ def create_site(site_name, admin_user: tuple, default_zone, default_primary, def create_table(f'sites/{site_name}/sql/create/receipt_items.sql') create_table(f'sites/{site_name}/sql/create/recipes.sql') create_table(f'sites/{site_name}/sql/create/shopping_lists.sql') + create_table(f'sites/{site_name}/sql/create/shopping_list_items.sql') create_table(f'sites/{site_name}/sql/create/item_locations.sql') add_admin_sql = f"INSERT INTO logins(username, password, email) VALUES(%s, %s, %s) RETURNING id;" add_site_sql = f"INSERT INTO sites(site_name, creation_date, site_owner_id, flags, default_zone, default_auto_issue_location, default_primary_location, site_description) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING id;" add_admin_role = f"INSERT INTO roles(role_name, site_id) VALUES(%s, %s) RETURNING id;" - sql = f"INSERT INTO {site_name}_zones(name) VALUES (%s) RETURNING id;" sqltwo = f"INSERT INTO {site_name}_locations(uuid, name, zone_id, items) VALUES (%s, %s, %s, %s);" sqlthree = f"INSERT INTO {site_name}_vendors(vendor_name, creation_date, created_by) VALUES (%s, %s, %s);" - + sqlfour = f"INSERT INTO {site_name}_brands(name) VALUES (%s);" + database_config = config() with psycopg2.connect(**database_config) as conn: try: @@ -512,6 +514,7 @@ def create_site(site_name, admin_user: tuple, default_zone, default_primary, def uuid = f"{default_zone}@{default_primary}" + #setup loaction try: with conn.cursor() as cur: cur.execute(sqltwo, (uuid, default_primary, zone_id, json.dumps({}))) @@ -520,6 +523,7 @@ def create_site(site_name, admin_user: tuple, default_zone, default_primary, def conn.rollback() return False + #setup vendor try: with conn.cursor() as cur: cur.execute(sqlthree, ("None", str(datetime.datetime.now()), 1)) @@ -527,6 +531,15 @@ def create_site(site_name, admin_user: tuple, default_zone, default_primary, def print(error) conn.rollback() return False + + # setup brand + try: + with conn.cursor() as cur: + cur.execute(sqlfour, ("None", )) + except (Exception, psycopg2.DatabaseError) as error: + print(error) + conn.rollback() + return False conn.commit() @@ -537,6 +550,7 @@ async def create_site_secondary(site_name, user_id, default_zone, default_primar create_table(f"sites/{site_name}/sql/create/roles.sql") create_table(f'sites/{site_name}/sql/create/groups.sql') + create_table(f'sites/{site_name}/sql/create/cost_layers.sql') create_table(f'sites/{site_name}/sql/create/linked_items.sql') create_table(f'sites/{site_name}/sql/create/brands.sql') create_table(f'sites/{site_name}/sql/create/food_info.sql') @@ -551,6 +565,7 @@ async def create_site_secondary(site_name, user_id, default_zone, default_primar create_table(f'sites/{site_name}/sql/create/receipt_items.sql') create_table(f'sites/{site_name}/sql/create/recipes.sql') create_table(f'sites/{site_name}/sql/create/shopping_lists.sql') + create_table(f'sites/{site_name}/sql/create/shopping_list_items.sql') create_table(f'sites/{site_name}/sql/create/item_locations.sql') add_site_sql = f"INSERT INTO sites(site_name, creation_date, site_owner_id, flags, default_zone, default_auto_issue_location, default_primary_location, site_description) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) RETURNING id;" @@ -559,7 +574,9 @@ async def create_site_secondary(site_name, user_id, default_zone, default_primar sql = f"INSERT INTO {site_name}_zones(name) VALUES (%s) RETURNING id;" sqltwo = f"INSERT INTO {site_name}_locations(uuid, name, zone_id, items) VALUES (%s, %s, %s, %s);" sqlthree = f"INSERT INTO {site_name}_vendors(vendor_name, creation_date, created_by) VALUES (%s, %s, %s);" - + sqlfour = f"INSERT INTO {site_name}_brands(name) VALUES (%s);" + + database_config = config() with psycopg2.connect(**database_config) as conn: # set up site in database @@ -628,6 +645,14 @@ async def create_site_secondary(site_name, user_id, default_zone, default_primar print(error) conn.rollback() return False + + try: + with conn.cursor() as cur: + cur.execute(sqlfour, ("Unknown", )) + except (Exception, psycopg2.DatabaseError) as error: + print(error) + conn.rollback() + return False conn.commit() @@ -683,7 +708,6 @@ def get_sites(sites=[]): for each in sites: cur.execute(f"SELECT * FROM sites WHERE id=%s;", (each, )) site_rows.append(cur.fetchone()) - print(site_rows) return site_rows except (Exception, psycopg2.DatabaseError) as error: print(error) diff --git a/postsqldb.py b/postsqldb.py new file mode 100644 index 0000000..62593d2 --- /dev/null +++ b/postsqldb.py @@ -0,0 +1,930 @@ +import datetime +import psycopg2, json +import psycopg2.extras +from dataclasses import dataclass, field +import random +import string + +class DatabaseError(Exception): + def __init__(self, message, payload=[], sql=""): + super().__init__(message) + self.payload = payload + self.message = str(message).replace("\n", "") + self.sql = sql.replace("\n", "") + self.log_error() + + def log_error(self): + with open("database.log", "a+") as file: + file.write("\n") + file.write(f"{datetime.datetime.now()} --- ERROR --- DatabaseError(message='{self.message}',\n") + file.write(f"{" "*41}payload={self.payload},\n") + file.write(f"{" "*41}sql='{self.sql}')") + + def __str__(self): + return f"DatabaseError(message='{self.message}', payload={self.payload}, sql='{self.sql}')" + +def tupleDictionaryFactory(columns, row): + columns = [desc[0] for desc in columns] + return dict(zip(columns, row)) + +def lst2pgarr(alist): + return '{' + ','.join(alist) + '}' + +def updateStringFactory(updated_values: dict): + set_clause = ', '.join([f"{key} = %s" for key in updated_values.keys()]) + values = [] + for value in updated_values.values(): + if isinstance(value, dict): + value = json.dumps(value) + values.append(value) + + return set_clause, values + +def getUUID(n): + random_string = ''.join(random.choices(string.ascii_letters + string.digits, k=n)) + return random_string + +class ConversionsTable: + @dataclass + class Payload: + item_id: int + uom_id: int + conv_factor: float + + def payload(self): + return ( + self.item_id, + self.uom_id, + self.conv_factor + ) + + @classmethod + def create_table(self, conn, site): + with open(f"sql/CREATE/conversions.sql", 'r') as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql) + except Exception as error: + raise DatabaseError(error, sql, "PrefixTable") + + @classmethod + def delete_table(self, conn, site): + with open(f"sql/DROP/conversions.sql", 'r') as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql) + except Exception as error: + raise DatabaseError(error, 'ConversionsTable', sql) + + @classmethod + def insert_tuple(self, conn, site: str, payload: list, convert=True): + """insert into recipes table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (stre): + payload (tuple): (item_id, uom_id, conversion_factor) + convert (bool, optional): Determines if to return tuple as a dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: inserted tuple + """ + record = () + with open(f"sql/INSERT/insertConversionsTuple.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + record = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + record = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return record + + + @classmethod + def delete_item_tuple(self, conn, site_name, payload, convert=True): + """This is a basic funtion to delete a tuple from a table in site with an id. All + tables in this database has id's associated with them. + + Args: + conn (_T_connector@connect): Postgresql Connector + site_name (str): + payload (tuple): (tuple_id,...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: deleted tuple + """ + deleted = () + sql = f"WITH deleted_rows AS (DELETE FROM {site_name}_conversions WHERE id IN ({','.join(['%s'] * len(payload))}) RETURNING *) SELECT * FROM deleted_rows;" + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + deleted = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + deleted = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return deleted + + @classmethod + def update_item_tuple(self, conn, site, payload, convert=False): + """_summary_ + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + table (str): + payload (dict): {'id': row_id, 'update': {... column_to_update: value_to_update_to...}} + convert (bool, optional): determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: updated tuple + """ + updated = () + + set_clause, values = updateStringFactory(payload['update']) + values.append(payload['id']) + sql = f"UPDATE {site}_conversions SET {set_clause} WHERE id=%s RETURNING *;" + try: + with conn.cursor() as cur: + cur.execute(sql, values) + rows = cur.fetchone() + if rows and convert: + updated = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + updated = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return updated + +class ShoppingListsTable: + @dataclass + class Payload: + name: str + description: str + author: int + type: str = "plain" + creation_date: datetime.datetime = field(init=False) + + def __post_init__(self): + self.creation_date = datetime.datetime.now() + + def payload(self): + return ( + self.name, + self.description, + self.author, + self.creation_date, + self.type + ) + + @dataclass + class ItemPayload: + uuid: str + sl_id: int + item_type: str + item_name: str + uom: str + qty: float + item_id: int = None + links: dict = field(default_factory=dict) + + def payload(self): + return ( + self.uuid, + self.sl_id, + self.item_type, + self.item_name, + self.uom, + self.qty, + self.item_id, + json.dumps(self.links) + ) + + @classmethod + def getItem(self, conn, site, payload, convert=True): + """_summary_ + + Args: + conn (_type_): _description_ + site (_type_): _description_ + payload (_type_): (id, ) + convert (bool, optional): _description_. Defaults to True. + + Raises: + DatabaseError: _description_ + + Returns: + _type_: _description_ + """ + record = () + with open('sql/SELECT/selectShoppingListItem.sql', 'r') as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + record = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + record = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return record + +class UnitsTable: + @dataclass + class Payload: + __slots__ = ('plural', 'single', 'fullname', 'description') + + plural: str + single: str + fullname: str + description: str + + def payload(self): + return ( + self.plural, + self.single, + self.fullname, + self.description + ) + + @classmethod + def create_table(self, conn): + with open(f"sql/CREATE/units.sql", 'r') as file: + sql = file.read() + try: + with conn.cursor() as cur: + cur.execute(sql) + except Exception as error: + raise DatabaseError(error, sql, "UnitsTable") + + @classmethod + def delete_table(self, conn): + with open(f"sql/DROP/units.sql", 'r') as file: + sql = file.read() + try: + with conn.cursor() as cur: + cur.execute(sql) + except Exception as error: + raise DatabaseError(error, 'PrefixTable', sql) + + @classmethod + def insert_tuple(self, conn, payload: list, convert=True): + """_summary_ + + Args: + conn (_type_): _description_ + payload (list): (plural, single, fullname, description) + convert (bool, optional): _description_. Defaults to True. + + Raises: + DatabaseError: _description_ + + Returns: + _type_: _description_ + """ + record = () + with open(f"sql/INSERT/insertUnitsTuple.sql", "r+") as file: + sql = file.read() + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + record = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + record = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return record + + @classmethod + def getAll(self, conn, convert=True): + """_summary_ + + Args: + conn (_type_): _description_ + convert (bool, optional): _description_. Defaults to True. + + Raises: + DatabaseError: _description_ + + Returns: + _type_: _description_ + """ + records = () + sql = f"SELECT * FROM units;" + try: + with conn.cursor() as cur: + cur.execute(sql) + rows = cur.fetchall() + if rows and convert: + records = [tupleDictionaryFactory(cur.description, row) for row in rows] + elif rows and not convert: + records = rows + except Exception as error: + raise DatabaseError(error, "", sql) + return records + +class SKUPrefixTable: + @dataclass + class Payload: + __slots__ = ('uuid', 'name', 'description') + + uuid: str + name: str + description: str + + def payload(self): + return ( + self.uuid, + self.name, + self.description + ) + + @classmethod + def create_table(self, conn, site): + with open(f"sql/CREATE/sku_prefix.sql", 'r') as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql) + except Exception as error: + raise DatabaseError(error, sql, "PrefixTable") + + @classmethod + def delete_table(self, conn, site): + with open(f"sql/DROP/sku_prefix.sql", 'r') as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql) + except Exception as error: + raise DatabaseError(error, 'PrefixTable', sql) + + @classmethod + def insert_tuple(self, conn, site: str, payload: list, convert=True): + record = () + with open(f"sql/INSERT/insertSKUPrefixTuple.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + record = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + record = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return record + + @classmethod + def getPrefixes(self, conn, site: str, payload: tuple, convert=True): + """_summary_ + + Args: + conn (_type_): _description_ + site (_type_): _description_ + payload (_type_): (limit, offset) + convert (bool, optional): _description_. Defaults to True. + + Raises: + DatabaseError: _description_ + + Returns: + _type_: _description_ + """ + recordset = [] + count = 0 + with open(f"sql/SELECT/getSkuPrefixes.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchall() + if rows and convert: + recordset = [tupleDictionaryFactory(cur.description, row) for row in rows] + if rows and not convert: + recordset = rows + + cur.execute(f"SELECT COUNT(*) FROM {site}_sku_prefix;") + count = cur.fetchone()[0] + except (Exception, psycopg2.DatabaseError) as error: + raise DatabaseError(error, payload, sql) + return recordset, count + +class RecipesTable: + @dataclass + class Payload: + #__slots__ = ('name', 'author', 'description', 'created_date', 'instructions', 'picture_path') + + name: str + author: int + description: str + created_date: datetime = field(init=False) + instructions: list = field(default_factory=list) + picture_path: str = "" + + def __post_init__(self): + self.created_date = datetime.datetime.now() + + def payload(self): + return ( + self.name, + self.author, + self.description, + self.created_date, + lst2pgarr(self.instructions), + self.picture_path + ) + + @dataclass + class ItemPayload: + uuid: str + rp_id: int + item_type: str + item_name:str + uom: int + qty: float = 0.0 + item_id: int = None + links: dict = field(default_factory=dict) + + def payload(self): + return ( + self.uuid, + self.rp_id, + self.item_type, + self.item_name, + self.uom, + self.qty, + self.item_id, + json.dumps(self.links) + ) + + @classmethod + def create_table(self, conn, site): + with open(f"sql/CREATE/recipes.sql", 'r') as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql) + except Exception as error: + raise DatabaseError(error, sql, "PrefixTable") + + @classmethod + def delete_table(self, conn, site): + with open(f"sql/DROP/recipes.sql", 'r') as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql) + except Exception as error: + raise DatabaseError(error, 'PrefixTable', sql) + + @classmethod + def insert_tuple(self, conn, site: str, payload: list, convert=True): + """insert into recipes table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (stre): + payload (tuple): (name[str], author[int], description[str], creation_date[timestamp], instructions[list], picture_path[str]) + convert (bool, optional): Determines if to return tuple as a dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: inserted tuple + """ + recipe = () + with open(f"sql/INSERT/insertRecipesTuple.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + recipe = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + recipe = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return recipe + + @classmethod + def insert_item_tuple(self, conn, site, payload, convert=True): + """insert into recipe_items table for site + + Args: + conn (_T_connector@connect): Postgresql Connector + site (stre): + payload (tuple): (uuid[str], rp_id[int], item_type[str], item_name[str], uom[str], qty[float], item_id[int], links[jsonb]) + convert (bool, optional): Determines if to return tuple as a dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: inserted tuple + """ + recipe_item = () + with open(f"sql/INSERT/insertRecipeItemsTuple.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + recipe_item = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + recipe_item = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return recipe_item + + @classmethod + def delete_item_tuple(self, conn, site_name, payload, convert=True): + """This is a basic funtion to delete a tuple from a table in site with an id. All + tables in this database has id's associated with them. + + Args: + conn (_T_connector@connect): Postgresql Connector + site_name (str): + payload (tuple): (tuple_id,...) + convert (bool, optional): Determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: deleted tuple + """ + deleted = () + sql = f"WITH deleted_rows AS (DELETE FROM {site_name}_recipe_items WHERE id IN ({','.join(['%s'] * len(payload))}) RETURNING *) SELECT * FROM deleted_rows;" + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + deleted = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + deleted = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return deleted + + @classmethod + def update_item_tuple(self, conn, site, payload, convert=False): + """_summary_ + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + table (str): + payload (dict): {'id': row_id, 'update': {... column_to_update: value_to_update_to...}} + convert (bool, optional): determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: updated tuple + """ + updated = () + + set_clause, values = updateStringFactory(payload['update']) + values.append(payload['id']) + sql = f"UPDATE {site}_recipe_items SET {set_clause} WHERE id=%s RETURNING *;" + try: + with conn.cursor() as cur: + cur.execute(sql, values) + rows = cur.fetchone() + if rows and convert: + updated = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + updated = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return updated + + @classmethod + def getRecipes(self, conn, site: str, payload: tuple, convert=True): + """_summary_ + + Args: + conn (_type_): _description_ + site (_type_): _description_ + payload (_type_): (limit, offset) + convert (bool, optional): _description_. Defaults to True. + + Raises: + DatabaseError: _description_ + + Returns: + _type_: _description_ + """ + recordset = [] + count = 0 + with open(f"sql/SELECT/getRecipes.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchall() + if rows and convert: + recordset = [tupleDictionaryFactory(cur.description, row) for row in rows] + if rows and not convert: + recordset = rows + + cur.execute(f"SELECT COUNT(*) FROM {site}_recipes;") + count = cur.fetchone()[0] + except (Exception, psycopg2.DatabaseError) as error: + raise DatabaseError(error, payload, sql) + return recordset, count + + @classmethod + def getRecipe(self, conn, site: str, payload: tuple, convert=True): + """_summary_ + + Args: + conn (_type_): _description_ + site (_type_): _description_ + payload (_type_): (id, ) + convert (bool, optional): _description_. Defaults to True. + + Raises: + DatabaseError: _description_ + + Returns: + _type_: _description_ + """ + record = () + with open(f"sql/SELECT/getRecipeByID.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + record = tupleDictionaryFactory(cur.description, rows) + if rows and not convert: + record = rows + except (Exception, psycopg2.DatabaseError) as error: + raise DatabaseError(error, payload, sql) + return record + + @classmethod + def updateRecipe(self, conn, site, payload, convert=True): + """_summary_ + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + table (str): + payload (dict): {'id': row_id, 'update': {... column_to_update: value_to_update_to...}} + convert (bool, optional): determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: updated tuple + """ + updated = () + + set_clause, values = updateStringFactory(payload['update']) + values.append(payload['id']) + sql = f"UPDATE {site}_recipes SET {set_clause} WHERE id=%s RETURNING *;" + try: + with conn.cursor() as cur: + cur.execute(sql, values) + rows = cur.fetchone() + if rows and convert: + updated = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + updated = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return updated + + +class ItemInfoTable: + @classmethod + def select_tuple(self, conn, site:str, payload:tuple, convert=True): + """_summary_ + + Args: + conn (_type_): _description_ + site (_type_): _description_ + payload (_type_): (item_info_id,) + convert (bool, optional): _description_. Defaults to True. + + Raises: + DatabaseError: _description_ + + Returns: + _type_: _description_ + """ + selected = () + sql = f"SELECT * FROM {site}_item_info WHERE id=%s;" + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + selected = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + selected = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return selected + + @classmethod + def update_tuple(self, conn, site:str, payload: dict, convert=True): + """_summary_ + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + table (str): + payload (dict): {'id': row_id, 'update': {... column_to_update: value_to_update_to...}} + convert (bool, optional): determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: updated tuple + """ + updated = () + + set_clause, values = updateStringFactory(payload['update']) + values.append(payload['id']) + sql = f"UPDATE {site}_item_info SET {set_clause} WHERE id=%s RETURNING *;" + try: + with conn.cursor() as cur: + cur.execute(sql, values) + rows = cur.fetchone() + if rows and convert: + updated = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + updated = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return updated + + +class ItemTable: + + @classmethod + def getItemAllByID(self, conn, site, payload, convert=True): + """_summary_ + + Args: + conn (_type_): _description_ + site (_type_): _description_ + payload (_type_): (item_id, ) + convert (bool, optional): _description_. Defaults to False. + + Raises: + DatabaseError: _description_ + + Returns: + _type_: _description_ + """ + item = () + with open(f"sql/SELECT/getItemAllByID.sql", "r+") as file: + getItemAllByID_sql = file.read().replace("%%site_name%%", site) + try: + with conn.cursor() as cur: + cur.execute(getItemAllByID_sql, payload) + rows = cur.fetchone() + if rows and convert: + item = tupleDictionaryFactory(cur.description, rows) + if rows and not convert: + item = rows + except (Exception, psycopg2.DatabaseError) as error: + raise DatabaseError(error, payload, getItemAllByID_sql) + return item + + @classmethod + def update_tuple(self, conn, site, payload, convert=True): + """_summary_ + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + table (str): + payload (dict): {'id': row_id, 'update': {... column_to_update: value_to_update_to...}} + convert (bool, optional): determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: updated tuple + """ + updated = () + + set_clause, values = updateStringFactory(payload['update']) + values.append(payload['id']) + sql = f"UPDATE {site}_items SET {set_clause} WHERE id=%s RETURNING *;" + try: + with conn.cursor() as cur: + cur.execute(sql, values) + rows = cur.fetchone() + if rows and convert: + updated = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + updated = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return updated + +class ReceiptTable: + + @classmethod + def update_receipt(self, conn, site:str, payload:dict, convert=True): + """_summary_ + + Args: + conn (_T_connector@connect): Postgresql Connector + site (str): + table (str): + payload (dict): {'id': row_id, 'update': {... column_to_update: value_to_update_to...}} + convert (bool, optional): determines if to return tuple as dictionary. Defaults to False. + + Raises: + DatabaseError: + + Returns: + tuple or dict: updated tuple + """ + updated = () + + set_clause, values = updateStringFactory(payload['update']) + values.append(payload['id']) + sql = f"UPDATE {site}_receipts SET {set_clause} WHERE id=%s RETURNING *;" + try: + with conn.cursor() as cur: + cur.execute(sql, values) + rows = cur.fetchone() + if rows and convert: + updated = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + updated = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return updated + + @classmethod + def select_tuple(self, conn, site:str, payload:tuple, convert=True): + """_summary_ + + Args: + conn (_type_): _description_ + site (_type_): _description_ + payload (_type_): (receipt_id,) + convert (bool, optional): _description_. Defaults to True. + + Raises: + DatabaseError: _description_ + + Returns: + _type_: _description_ + """ + selected = () + sql = f"SELECT * FROM {site}_receipts WHERE id=%s;" + try: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + selected = tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + selected = rows + except Exception as error: + raise DatabaseError(error, payload, sql) + return selected \ No newline at end of file diff --git a/process.log b/process.log new file mode 100644 index 0000000..97904b9 --- /dev/null +++ b/process.log @@ -0,0 +1,421 @@ + +2025-04-07 18:07:48.193728 --- CAUTION --- 0 + {"Plural": "pinches", " Single": " pinch", " Fullname": " Pinch", " Description": " Less than 1/8 teaspoon."} +2025-04-07 18:07:48.198811 --- CAUTION --- 0 + {"Plural": "tsp", " Single": " tsp", " Fullname": " Teaspoon", " Description": " 5 millilitres in Australia New Zealand UK Canada and the US but approximately 4.93 millilitres in the US."} +2025-04-07 18:07:48.202723 --- CAUTION --- 0 + {"Plural": "dsp", " Single": " dsp", " Fullname": " Dessertspoon", " Description": " 10 millilitres in Australia."} +2025-04-07 18:07:48.205733 --- CAUTION --- 0 + {"Plural": "tbsp", " Single": " tbsp", " Fullname": " Tablespoon", " Description": " 20 millilitres in Australia or 15 millilitres in New Zealand the UK Canada and the US."} +2025-04-07 18:07:48.208306 --- CAUTION --- 0 + {"Plural": "fl oz", " Single": " fl oz", " Fullname": " Fluid ounce", " Description": " 28.41 millilitres in the UK or approximately 29.57 millilitres in the US."} +2025-04-07 18:07:48.212832 --- CAUTION --- 0 + {"Plural": "cups", " Single": " cup", " Fullname": " Cup", " Description": " 250 millilitres in Australia and New Zealand or approximately 170.48 millilitres in the UK or approximately 227.31 millilitres in Canada and approximately 236.59 millilitres in the US."} +2025-04-07 18:07:48.215843 --- CAUTION --- 0 + {"Plural": "pt", " Single": " pt", " Fullname": " Pint", " Description": " 570 millilitres in Australia approximately 568.26 millilitres in New Zealand the UK and Canada and approximately 473.18 millilitres in the US."} +2025-04-07 18:07:48.219306 --- CAUTION --- 0 + {"Plural": "qt", " Single": " qt", " Fullname": " Quart", " Description": " Approximately 1136.52 millilitres in Australia New Zealand the UK and Canada and approximately 946.35 millilitres in the US."} +2025-04-07 18:07:48.222204 --- CAUTION --- 0 + {"Plural": "gal", " Single": " gal", " Fullname": " Gallon", " Description": " Approximately 4546.09 millilitres in Australia New Zealand the UK and Canada and approximately 3785.41 millilitres in the US."} +2025-04-07 18:07:48.226717 --- CAUTION --- 0 + {"Plural": "jiggers", " Single": " jigger", " Fullname": " Jigger", " Description": " 1.5 fluid ounces."} +2025-04-07 18:07:48.230038 --- CAUTION --- 0 + {"Plural": "oz", " Single": " oz", " Fullname": " Ounce", " Description": " 1/4 lb for butter which can also be measured as 3 tablespoons."} +2025-04-07 18:07:48.233496 --- CAUTION --- 0 + {"Plural": "L", " Single": " L", " Fullname": " Liter", " Description": " Commonly used for volume measurement in the metric system."} +2025-04-07 18:07:48.236507 --- CAUTION --- 0 + {"Plural": "mL", " Single": " mL", " Fullname": " Milliliter", " Description": " Commonly used for volume measurement in the metric system."} +2025-04-07 18:07:48.240296 --- CAUTION --- 0 + {"Plural": "dm3", " Single": " dm3", " Fullname": " Cubic decimeter", " Description": " Equivalent to 1 liter."} +2025-04-07 18:07:48.242309 --- CAUTION --- 0 + {"Plural": "g", " Single": " g", " Fullname": " Gram", " Description": " Commonly used for weight measurement in the metric system."} +2025-04-07 18:07:48.246896 --- CAUTION --- 0 + {"Plural": "kg", " Single": " kg", " Fullname": " Kilogram", " Description": " Commonly used for weight measurement in the metric system."} +2025-04-07 18:07:48.250308 --- CAUTION --- 0 + {"Plural": "lbs", " Single": " lb", " Fullname": " Pound", " Description": " Used for weight measurement in the US."} +2025-04-07 18:07:48.253557 --- CAUTION --- 0 + {"Plural": "fluid scruples", " Single": " fluid scruple", " Fullname": " Fluid scruple", " Description": " A unit used in the apothecaries' system but not commonly used in cooking."} +2025-04-07 18:07:48.257236 --- CAUTION --- 0 + {"Plural": "cm3", " Single": " cm3", " Fullname": " Cubic centimeter", " Description": " Equivalent to 1 milliliter."} +2025-04-07 18:07:48.261287 --- CAUTION --- 0 + {"Plural": "breakfast cups", " Single": " breakfast cup", " Fullname": " Breakfast cup", " Description": " Similar in size to the US customary cup and the metric cup."} +2025-04-07 18:07:48.263881 --- CAUTION --- 0 + {"Plural": "tumblers", " Single": " tumbler", " Fullname": " Tumblerful", " Description": " A unit used in British cookery books and recipes."} +2025-04-07 18:07:48.266919 --- CAUTION --- 0 + {"Plural": "winefulls", " Single": " winefull", " Fullname": " Wineglassful", " Description": " A unit used in British cookery books and recipes."} +2025-04-07 18:07:48.270307 --- CAUTION --- 0 + {"Plural": "coffee cups", " Single": " coffee cup", " Fullname": " Coffee cup", " Description": " Can vary from 100 to 200 millilitres."} +2025-04-07 18:07:48.273839 --- CAUTION --- 0 + {"Plural": "sticks of butter", " Single": " stick of butter", " Fullname": " Stick of butter", " Description": " 1/4 lb or 3 tablespoons."} +2025-04-07 18:07:48.277370 --- CAUTION --- 0 + {"Plural": "smidgens", " Single": " smidgen", " Fullname": " Smidgen", " Description": " An approximate unit of measure."} +2025-04-07 18:07:48.280470 --- CAUTION --- 0 + {"Plural": "dashes", " Single": " dash", " Fullname": " Dash", " Description": " An approximate unit of measure."} +2025-04-07 18:07:48.283908 --- CAUTION --- 0 + {"Plural": "drops", " Single": " drop", " Fullname": " Drop", " Description": " An approximate unit of measure."} +2025-04-07 18:07:48.286954 --- CAUTION --- 0 + {"Plural": "eaches", " Single": " each", " Fullname": " Each", " Description": " A single unit."} +2025-04-07 18:07:48.290199 --- CAUTION --- 0 + {"Plural": "boxes", " Single": " box", " Fullname": " Box", " Description": " A Single box of a unit."} +2025-04-07 18:07:48.293848 --- CAUTION --- 0 + {"Plural": "crates", " Single": " crate", " Fullname": " Crate", " Description": " a single crate of a unit."} +2025-04-07 18:07:48.297999 --- CAUTION --- 0 + {"Plural": "jars", " Single": " jar", " Fullname": " Jar", " Description": " A single Jar of a unit."} +2025-04-07 18:07:48.301330 --- CAUTION --- 0 + {"Plural": "cans", " Single": " can", " Fullname": " Can", " Description": " A Single Can of a unit."} +2025-04-07 18:07:48.304665 --- CAUTION --- 0 + {"Plural": "bars", " Single": " bar", " Fullname": " Bars", " Description": " A Single bar of a unit."} +2025-04-07 18:07:48.307969 --- CAUTION --- 0 + {"Plural": "loaves", " Single": " loaf", " Fullname": " Loaf", " Description": " A single loaf of a unit."} +2025-04-07 18:07:48.311119 --- CAUTION --- 0 + {"Plural": "packs", " Single": " pack", " Fullname": " Pack", " Description": " A Single Pack of a unit."} +2025-04-07 18:08:49.486023 --- CAUTION --- 0 + {"Plural": "pinches", " Single": " pinch", " Fullname": " Pinch", " Description": " Less than 1/8 teaspoon."} +2025-04-07 18:08:49.492309 --- CAUTION --- 0 + {"Plural": "tsp", " Single": " tsp", " Fullname": " Teaspoon", " Description": " 5 millilitres in Australia New Zealand UK Canada and the US but approximately 4.93 millilitres in the US."} +2025-04-07 18:08:49.496834 --- CAUTION --- 0 + {"Plural": "dsp", " Single": " dsp", " Fullname": " Dessertspoon", " Description": " 10 millilitres in Australia."} +2025-04-07 18:08:49.500191 --- CAUTION --- 0 + {"Plural": "tbsp", " Single": " tbsp", " Fullname": " Tablespoon", " Description": " 20 millilitres in Australia or 15 millilitres in New Zealand the UK Canada and the US."} +2025-04-07 18:08:49.504607 --- CAUTION --- 0 + {"Plural": "fl oz", " Single": " fl oz", " Fullname": " Fluid ounce", " Description": " 28.41 millilitres in the UK or approximately 29.57 millilitres in the US."} +2025-04-07 18:08:49.508006 --- CAUTION --- 0 + {"Plural": "cups", " Single": " cup", " Fullname": " Cup", " Description": " 250 millilitres in Australia and New Zealand or approximately 170.48 millilitres in the UK or approximately 227.31 millilitres in Canada and approximately 236.59 millilitres in the US."} +2025-04-07 18:08:49.512009 --- CAUTION --- 0 + {"Plural": "pt", " Single": " pt", " Fullname": " Pint", " Description": " 570 millilitres in Australia approximately 568.26 millilitres in New Zealand the UK and Canada and approximately 473.18 millilitres in the US."} +2025-04-07 18:08:49.514519 --- CAUTION --- 0 + {"Plural": "qt", " Single": " qt", " Fullname": " Quart", " Description": " Approximately 1136.52 millilitres in Australia New Zealand the UK and Canada and approximately 946.35 millilitres in the US."} +2025-04-07 18:08:49.519512 --- CAUTION --- 0 + {"Plural": "gal", " Single": " gal", " Fullname": " Gallon", " Description": " Approximately 4546.09 millilitres in Australia New Zealand the UK and Canada and approximately 3785.41 millilitres in the US."} +2025-04-07 18:08:49.522787 --- CAUTION --- 0 + {"Plural": "jiggers", " Single": " jigger", " Fullname": " Jigger", " Description": " 1.5 fluid ounces."} +2025-04-07 18:08:49.526796 --- CAUTION --- 0 + {"Plural": "oz", " Single": " oz", " Fullname": " Ounce", " Description": " 1/4 lb for butter which can also be measured as 3 tablespoons."} +2025-04-07 18:08:49.529796 --- CAUTION --- 0 + {"Plural": "L", " Single": " L", " Fullname": " Liter", " Description": " Commonly used for volume measurement in the metric system."} +2025-04-07 18:08:49.533807 --- CAUTION --- 0 + {"Plural": "mL", " Single": " mL", " Fullname": " Milliliter", " Description": " Commonly used for volume measurement in the metric system."} +2025-04-07 18:08:49.537268 --- CAUTION --- 0 + {"Plural": "dm3", " Single": " dm3", " Fullname": " Cubic decimeter", " Description": " Equivalent to 1 liter."} +2025-04-07 18:08:49.541002 --- CAUTION --- 0 + {"Plural": "g", " Single": " g", " Fullname": " Gram", " Description": " Commonly used for weight measurement in the metric system."} +2025-04-07 18:08:49.544953 --- CAUTION --- 0 + {"Plural": "kg", " Single": " kg", " Fullname": " Kilogram", " Description": " Commonly used for weight measurement in the metric system."} +2025-04-07 18:08:49.548961 --- CAUTION --- 0 + {"Plural": "lbs", " Single": " lb", " Fullname": " Pound", " Description": " Used for weight measurement in the US."} +2025-04-07 18:08:49.551999 --- CAUTION --- 0 + {"Plural": "fluid scruples", " Single": " fluid scruple", " Fullname": " Fluid scruple", " Description": " A unit used in the apothecaries' system but not commonly used in cooking."} +2025-04-07 18:08:49.556000 --- CAUTION --- 0 + {"Plural": "cm3", " Single": " cm3", " Fullname": " Cubic centimeter", " Description": " Equivalent to 1 milliliter."} +2025-04-07 18:08:49.560003 --- CAUTION --- 0 + {"Plural": "breakfast cups", " Single": " breakfast cup", " Fullname": " Breakfast cup", " Description": " Similar in size to the US customary cup and the metric cup."} +2025-04-07 18:08:49.564002 --- CAUTION --- 0 + {"Plural": "tumblers", " Single": " tumbler", " Fullname": " Tumblerful", " Description": " A unit used in British cookery books and recipes."} +2025-04-07 18:08:49.567064 --- CAUTION --- 0 + {"Plural": "winefulls", " Single": " winefull", " Fullname": " Wineglassful", " Description": " A unit used in British cookery books and recipes."} +2025-04-07 18:08:49.571455 --- CAUTION --- 0 + {"Plural": "coffee cups", " Single": " coffee cup", " Fullname": " Coffee cup", " Description": " Can vary from 100 to 200 millilitres."} +2025-04-07 18:08:49.574950 --- CAUTION --- 0 + {"Plural": "sticks of butter", " Single": " stick of butter", " Fullname": " Stick of butter", " Description": " 1/4 lb or 3 tablespoons."} +2025-04-07 18:08:49.578958 --- CAUTION --- 0 + {"Plural": "smidgens", " Single": " smidgen", " Fullname": " Smidgen", " Description": " An approximate unit of measure."} +2025-04-07 18:08:49.582103 --- CAUTION --- 0 + {"Plural": "dashes", " Single": " dash", " Fullname": " Dash", " Description": " An approximate unit of measure."} +2025-04-07 18:08:49.584615 --- CAUTION --- 0 + {"Plural": "drops", " Single": " drop", " Fullname": " Drop", " Description": " An approximate unit of measure."} +2025-04-07 18:08:49.589280 --- CAUTION --- 0 + {"Plural": "eaches", " Single": " each", " Fullname": " Each", " Description": " A single unit."} +2025-04-07 18:08:49.592278 --- CAUTION --- 0 + {"Plural": "boxes", " Single": " box", " Fullname": " Box", " Description": " A Single box of a unit."} +2025-04-07 18:08:49.595790 --- CAUTION --- 0 + {"Plural": "crates", " Single": " crate", " Fullname": " Crate", " Description": " a single crate of a unit."} +2025-04-07 18:08:49.599333 --- CAUTION --- 0 + {"Plural": "jars", " Single": " jar", " Fullname": " Jar", " Description": " A single Jar of a unit."} +2025-04-07 18:08:49.603568 --- CAUTION --- 0 + {"Plural": "cans", " Single": " can", " Fullname": " Can", " Description": " A Single Can of a unit."} +2025-04-07 18:08:49.607011 --- CAUTION --- 0 + {"Plural": "bars", " Single": " bar", " Fullname": " Bars", " Description": " A Single bar of a unit."} +2025-04-07 18:08:49.611167 --- CAUTION --- 0 + {"Plural": "loaves", " Single": " loaf", " Fullname": " Loaf", " Description": " A single loaf of a unit."} +2025-04-07 18:08:49.614706 --- CAUTION --- 0 + {"Plural": "packs", " Single": " pack", " Fullname": " Pack", " Description": " A Single Pack of a unit."} +2025-04-07 18:10:43.995134 --- CAUTION --- DatabaseError(message='duplicate key value violates unique constraint "units_plural_key"DETAIL: Key (plural)=(pinches) already exists.', payload=('pinches', ' pinch', ' Pinch', ' Less than 1/8 teaspoon.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["pinches", " pinch", " Pinch", " Less than 1/8 teaspoon."] +2025-04-07 18:10:44.005096 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('tsp', ' tsp', ' Teaspoon', ' 5 millilitres in Australia New Zealand UK Canada and the US but approximately 4.93 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["tsp", " tsp", " Teaspoon", " 5 millilitres in Australia New Zealand UK Canada and the US but approximately 4.93 millilitres in the US."] +2025-04-07 18:10:44.012695 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('dsp', ' dsp', ' Dessertspoon', ' 10 millilitres in Australia.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["dsp", " dsp", " Dessertspoon", " 10 millilitres in Australia."] +2025-04-07 18:10:44.020587 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('tbsp', ' tbsp', ' Tablespoon', ' 20 millilitres in Australia or 15 millilitres in New Zealand the UK Canada and the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["tbsp", " tbsp", " Tablespoon", " 20 millilitres in Australia or 15 millilitres in New Zealand the UK Canada and the US."] +2025-04-07 18:10:44.027752 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('fl oz', ' fl oz', ' Fluid ounce', ' 28.41 millilitres in the UK or approximately 29.57 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["fl oz", " fl oz", " Fluid ounce", " 28.41 millilitres in the UK or approximately 29.57 millilitres in the US."] +2025-04-07 18:10:44.036113 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('cups', ' cup', ' Cup', ' 250 millilitres in Australia and New Zealand or approximately 170.48 millilitres in the UK or approximately 227.31 millilitres in Canada and approximately 236.59 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["cups", " cup", " Cup", " 250 millilitres in Australia and New Zealand or approximately 170.48 millilitres in the UK or approximately 227.31 millilitres in Canada and approximately 236.59 millilitres in the US."] +2025-04-07 18:10:44.043799 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('pt', ' pt', ' Pint', ' 570 millilitres in Australia approximately 568.26 millilitres in New Zealand the UK and Canada and approximately 473.18 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["pt", " pt", " Pint", " 570 millilitres in Australia approximately 568.26 millilitres in New Zealand the UK and Canada and approximately 473.18 millilitres in the US."] +2025-04-07 18:10:44.051856 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('qt', ' qt', ' Quart', ' Approximately 1136.52 millilitres in Australia New Zealand the UK and Canada and approximately 946.35 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["qt", " qt", " Quart", " Approximately 1136.52 millilitres in Australia New Zealand the UK and Canada and approximately 946.35 millilitres in the US."] +2025-04-07 18:10:44.059206 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('gal', ' gal', ' Gallon', ' Approximately 4546.09 millilitres in Australia New Zealand the UK and Canada and approximately 3785.41 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["gal", " gal", " Gallon", " Approximately 4546.09 millilitres in Australia New Zealand the UK and Canada and approximately 3785.41 millilitres in the US."] +2025-04-07 18:10:44.067014 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('jiggers', ' jigger', ' Jigger', ' 1.5 fluid ounces.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["jiggers", " jigger", " Jigger", " 1.5 fluid ounces."] +2025-04-07 18:10:44.074033 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('oz', ' oz', ' Ounce', ' 1/4 lb for butter which can also be measured as 3 tablespoons.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["oz", " oz", " Ounce", " 1/4 lb for butter which can also be measured as 3 tablespoons."] +2025-04-07 18:10:44.081603 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('L', ' L', ' Liter', ' Commonly used for volume measurement in the metric system.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["L", " L", " Liter", " Commonly used for volume measurement in the metric system."] +2025-04-07 18:10:44.089592 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('mL', ' mL', ' Milliliter', ' Commonly used for volume measurement in the metric system.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["mL", " mL", " Milliliter", " Commonly used for volume measurement in the metric system."] +2025-04-07 18:10:44.097342 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('dm3', ' dm3', ' Cubic decimeter', ' Equivalent to 1 liter.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["dm3", " dm3", " Cubic decimeter", " Equivalent to 1 liter."] +2025-04-07 18:10:44.104724 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('g', ' g', ' Gram', ' Commonly used for weight measurement in the metric system.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["g", " g", " Gram", " Commonly used for weight measurement in the metric system."] +2025-04-07 18:10:44.112144 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('kg', ' kg', ' Kilogram', ' Commonly used for weight measurement in the metric system.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["kg", " kg", " Kilogram", " Commonly used for weight measurement in the metric system."] +2025-04-07 18:10:44.120135 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('lbs', ' lb', ' Pound', ' Used for weight measurement in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["lbs", " lb", " Pound", " Used for weight measurement in the US."] +2025-04-07 18:10:44.127804 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('fluid scruples', ' fluid scruple', ' Fluid scruple', " A unit used in the apothecaries' system but not commonly used in cooking."), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["fluid scruples", " fluid scruple", " Fluid scruple", " A unit used in the apothecaries' system but not commonly used in cooking."] +2025-04-07 18:10:44.135113 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('cm3', ' cm3', ' Cubic centimeter', ' Equivalent to 1 milliliter.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["cm3", " cm3", " Cubic centimeter", " Equivalent to 1 milliliter."] +2025-04-07 18:10:44.142675 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('breakfast cups', ' breakfast cup', ' Breakfast cup', ' Similar in size to the US customary cup and the metric cup.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["breakfast cups", " breakfast cup", " Breakfast cup", " Similar in size to the US customary cup and the metric cup."] +2025-04-07 18:10:44.151374 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('tumblers', ' tumbler', ' Tumblerful', ' A unit used in British cookery books and recipes.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["tumblers", " tumbler", " Tumblerful", " A unit used in British cookery books and recipes."] +2025-04-07 18:10:44.158807 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('winefulls', ' winefull', ' Wineglassful', ' A unit used in British cookery books and recipes.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["winefulls", " winefull", " Wineglassful", " A unit used in British cookery books and recipes."] +2025-04-07 18:10:44.167004 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('coffee cups', ' coffee cup', ' Coffee cup', ' Can vary from 100 to 200 millilitres.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["coffee cups", " coffee cup", " Coffee cup", " Can vary from 100 to 200 millilitres."] +2025-04-07 18:10:44.174449 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('sticks of butter', ' stick of butter', ' Stick of butter', ' 1/4 lb or 3 tablespoons.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["sticks of butter", " stick of butter", " Stick of butter", " 1/4 lb or 3 tablespoons."] +2025-04-07 18:10:44.183729 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('smidgens', ' smidgen', ' Smidgen', ' An approximate unit of measure.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["smidgens", " smidgen", " Smidgen", " An approximate unit of measure."] +2025-04-07 18:10:44.191339 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('dashes', ' dash', ' Dash', ' An approximate unit of measure.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["dashes", " dash", " Dash", " An approximate unit of measure."] +2025-04-07 18:10:44.198886 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('drops', ' drop', ' Drop', ' An approximate unit of measure.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["drops", " drop", " Drop", " An approximate unit of measure."] +2025-04-07 18:10:44.206287 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('eaches', ' each', ' Each', ' A single unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["eaches", " each", " Each", " A single unit."] +2025-04-07 18:10:44.213758 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('boxes', ' box', ' Box', ' A Single box of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["boxes", " box", " Box", " A Single box of a unit."] +2025-04-07 18:10:44.221833 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('crates', ' crate', ' Crate', ' a single crate of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["crates", " crate", " Crate", " a single crate of a unit."] +2025-04-07 18:10:44.229839 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('jars', ' jar', ' Jar', ' A single Jar of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["jars", " jar", " Jar", " A single Jar of a unit."] +2025-04-07 18:10:44.237064 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('cans', ' can', ' Can', ' A Single Can of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["cans", " can", " Can", " A Single Can of a unit."] +2025-04-07 18:10:44.244118 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('bars', ' bar', ' Bars', ' A Single bar of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["bars", " bar", " Bars", " A Single bar of a unit."] +2025-04-07 18:10:44.252959 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('loaves', ' loaf', ' Loaf', ' A single loaf of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["loaves", " loaf", " Loaf", " A single loaf of a unit."] +2025-04-07 18:10:44.260249 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('packs', ' pack', ' Pack', ' A Single Pack of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["packs", " pack", " Pack", " A Single Pack of a unit."] +2025-04-07 18:11:11.901876 --- CAUTION --- DatabaseError(message='duplicate key value violates unique constraint "units_plural_key"DETAIL: Key (plural)=(pinches) already exists.', payload=('pinches', ' pinch', ' Pinch', ' Less than 1/8 teaspoon.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["pinches", " pinch", " Pinch", " Less than 1/8 teaspoon."] +2025-04-07 18:11:11.913095 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('tsp', ' tsp', ' Teaspoon', ' 5 millilitres in Australia New Zealand UK Canada and the US but approximately 4.93 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["tsp", " tsp", " Teaspoon", " 5 millilitres in Australia New Zealand UK Canada and the US but approximately 4.93 millilitres in the US."] +2025-04-07 18:11:11.920834 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('dsp', ' dsp', ' Dessertspoon', ' 10 millilitres in Australia.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["dsp", " dsp", " Dessertspoon", " 10 millilitres in Australia."] +2025-04-07 18:11:11.928118 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('tbsp', ' tbsp', ' Tablespoon', ' 20 millilitres in Australia or 15 millilitres in New Zealand the UK Canada and the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["tbsp", " tbsp", " Tablespoon", " 20 millilitres in Australia or 15 millilitres in New Zealand the UK Canada and the US."] +2025-04-07 18:11:11.935834 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('fl oz', ' fl oz', ' Fluid ounce', ' 28.41 millilitres in the UK or approximately 29.57 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["fl oz", " fl oz", " Fluid ounce", " 28.41 millilitres in the UK or approximately 29.57 millilitres in the US."] +2025-04-07 18:11:11.943995 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('cups', ' cup', ' Cup', ' 250 millilitres in Australia and New Zealand or approximately 170.48 millilitres in the UK or approximately 227.31 millilitres in Canada and approximately 236.59 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["cups", " cup", " Cup", " 250 millilitres in Australia and New Zealand or approximately 170.48 millilitres in the UK or approximately 227.31 millilitres in Canada and approximately 236.59 millilitres in the US."] +2025-04-07 18:11:11.951271 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('pt', ' pt', ' Pint', ' 570 millilitres in Australia approximately 568.26 millilitres in New Zealand the UK and Canada and approximately 473.18 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["pt", " pt", " Pint", " 570 millilitres in Australia approximately 568.26 millilitres in New Zealand the UK and Canada and approximately 473.18 millilitres in the US."] +2025-04-07 18:11:11.958833 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('qt', ' qt', ' Quart', ' Approximately 1136.52 millilitres in Australia New Zealand the UK and Canada and approximately 946.35 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["qt", " qt", " Quart", " Approximately 1136.52 millilitres in Australia New Zealand the UK and Canada and approximately 946.35 millilitres in the US."] +2025-04-07 18:11:11.966926 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('gal', ' gal', ' Gallon', ' Approximately 4546.09 millilitres in Australia New Zealand the UK and Canada and approximately 3785.41 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["gal", " gal", " Gallon", " Approximately 4546.09 millilitres in Australia New Zealand the UK and Canada and approximately 3785.41 millilitres in the US."] +2025-04-07 18:11:11.974434 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('jiggers', ' jigger', ' Jigger', ' 1.5 fluid ounces.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["jiggers", " jigger", " Jigger", " 1.5 fluid ounces."] +2025-04-07 18:11:11.982214 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('oz', ' oz', ' Ounce', ' 1/4 lb for butter which can also be measured as 3 tablespoons.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["oz", " oz", " Ounce", " 1/4 lb for butter which can also be measured as 3 tablespoons."] +2025-04-07 18:11:11.989518 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('L', ' L', ' Liter', ' Commonly used for volume measurement in the metric system.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["L", " L", " Liter", " Commonly used for volume measurement in the metric system."] +2025-04-07 18:11:11.997321 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('mL', ' mL', ' Milliliter', ' Commonly used for volume measurement in the metric system.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["mL", " mL", " Milliliter", " Commonly used for volume measurement in the metric system."] +2025-04-07 18:11:12.005157 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('dm3', ' dm3', ' Cubic decimeter', ' Equivalent to 1 liter.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["dm3", " dm3", " Cubic decimeter", " Equivalent to 1 liter."] +2025-04-07 18:11:12.012662 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('g', ' g', ' Gram', ' Commonly used for weight measurement in the metric system.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["g", " g", " Gram", " Commonly used for weight measurement in the metric system."] +2025-04-07 18:11:12.020544 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('kg', ' kg', ' Kilogram', ' Commonly used for weight measurement in the metric system.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["kg", " kg", " Kilogram", " Commonly used for weight measurement in the metric system."] +2025-04-07 18:11:12.028832 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('lbs', ' lb', ' Pound', ' Used for weight measurement in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["lbs", " lb", " Pound", " Used for weight measurement in the US."] +2025-04-07 18:11:12.035928 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('fluid scruples', ' fluid scruple', ' Fluid scruple', " A unit used in the apothecaries' system but not commonly used in cooking."), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["fluid scruples", " fluid scruple", " Fluid scruple", " A unit used in the apothecaries' system but not commonly used in cooking."] +2025-04-07 18:11:12.044169 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('cm3', ' cm3', ' Cubic centimeter', ' Equivalent to 1 milliliter.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["cm3", " cm3", " Cubic centimeter", " Equivalent to 1 milliliter."] +2025-04-07 18:11:12.051848 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('breakfast cups', ' breakfast cup', ' Breakfast cup', ' Similar in size to the US customary cup and the metric cup.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["breakfast cups", " breakfast cup", " Breakfast cup", " Similar in size to the US customary cup and the metric cup."] +2025-04-07 18:11:12.059081 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('tumblers', ' tumbler', ' Tumblerful', ' A unit used in British cookery books and recipes.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["tumblers", " tumbler", " Tumblerful", " A unit used in British cookery books and recipes."] +2025-04-07 18:11:12.067370 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('winefulls', ' winefull', ' Wineglassful', ' A unit used in British cookery books and recipes.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["winefulls", " winefull", " Wineglassful", " A unit used in British cookery books and recipes."] +2025-04-07 18:11:12.074897 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('coffee cups', ' coffee cup', ' Coffee cup', ' Can vary from 100 to 200 millilitres.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["coffee cups", " coffee cup", " Coffee cup", " Can vary from 100 to 200 millilitres."] +2025-04-07 18:11:12.082570 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('sticks of butter', ' stick of butter', ' Stick of butter', ' 1/4 lb or 3 tablespoons.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["sticks of butter", " stick of butter", " Stick of butter", " 1/4 lb or 3 tablespoons."] +2025-04-07 18:11:12.090585 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('smidgens', ' smidgen', ' Smidgen', ' An approximate unit of measure.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["smidgens", " smidgen", " Smidgen", " An approximate unit of measure."] +2025-04-07 18:11:12.099307 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('dashes', ' dash', ' Dash', ' An approximate unit of measure.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["dashes", " dash", " Dash", " An approximate unit of measure."] +2025-04-07 18:11:12.106924 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('drops', ' drop', ' Drop', ' An approximate unit of measure.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["drops", " drop", " Drop", " An approximate unit of measure."] +2025-04-07 18:11:12.114986 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('eaches', ' each', ' Each', ' A single unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["eaches", " each", " Each", " A single unit."] +2025-04-07 18:11:12.123785 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('boxes', ' box', ' Box', ' A Single box of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["boxes", " box", " Box", " A Single box of a unit."] +2025-04-07 18:11:12.132171 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('crates', ' crate', ' Crate', ' a single crate of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["crates", " crate", " Crate", " a single crate of a unit."] +2025-04-07 18:11:12.140032 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('jars', ' jar', ' Jar', ' A single Jar of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["jars", " jar", " Jar", " A single Jar of a unit."] +2025-04-07 18:11:12.148143 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('cans', ' can', ' Can', ' A Single Can of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["cans", " can", " Can", " A Single Can of a unit."] +2025-04-07 18:11:12.157037 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('bars', ' bar', ' Bars', ' A Single bar of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["bars", " bar", " Bars", " A Single bar of a unit."] +2025-04-07 18:11:12.165175 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('loaves', ' loaf', ' Loaf', ' A single loaf of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["loaves", " loaf", " Loaf", " A single loaf of a unit."] +2025-04-07 18:11:12.172983 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('packs', ' pack', ' Pack', ' A Single Pack of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["packs", " pack", " Pack", " A Single Pack of a unit."] +2025-04-07 18:12:49.005060 --- CAUTION --- DatabaseError(message='duplicate key value violates unique constraint "units_plural_key"DETAIL: Key (plural)=(Plural) already exists.', payload=('Plural', ' Single', ' Fullname', ' Description'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["Plural", " Single", " Fullname", " Description"] +2025-04-07 18:12:49.018692 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('tsp', ' tsp', ' Teaspoon', ' 5 millilitres in Australia New Zealand UK Canada and the US but approximately 4.93 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["tsp", " tsp", " Teaspoon", " 5 millilitres in Australia New Zealand UK Canada and the US but approximately 4.93 millilitres in the US."] +2025-04-07 18:12:49.026767 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('dsp', ' dsp', ' Dessertspoon', ' 10 millilitres in Australia.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["dsp", " dsp", " Dessertspoon", " 10 millilitres in Australia."] +2025-04-07 18:12:49.035142 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('tbsp', ' tbsp', ' Tablespoon', ' 20 millilitres in Australia or 15 millilitres in New Zealand the UK Canada and the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["tbsp", " tbsp", " Tablespoon", " 20 millilitres in Australia or 15 millilitres in New Zealand the UK Canada and the US."] +2025-04-07 18:12:49.043176 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('fl oz', ' fl oz', ' Fluid ounce', ' 28.41 millilitres in the UK or approximately 29.57 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["fl oz", " fl oz", " Fluid ounce", " 28.41 millilitres in the UK or approximately 29.57 millilitres in the US."] +2025-04-07 18:12:49.052311 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('cups', ' cup', ' Cup', ' 250 millilitres in Australia and New Zealand or approximately 170.48 millilitres in the UK or approximately 227.31 millilitres in Canada and approximately 236.59 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["cups", " cup", " Cup", " 250 millilitres in Australia and New Zealand or approximately 170.48 millilitres in the UK or approximately 227.31 millilitres in Canada and approximately 236.59 millilitres in the US."] +2025-04-07 18:12:49.060527 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('pt', ' pt', ' Pint', ' 570 millilitres in Australia approximately 568.26 millilitres in New Zealand the UK and Canada and approximately 473.18 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["pt", " pt", " Pint", " 570 millilitres in Australia approximately 568.26 millilitres in New Zealand the UK and Canada and approximately 473.18 millilitres in the US."] +2025-04-07 18:12:49.068511 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('qt', ' qt', ' Quart', ' Approximately 1136.52 millilitres in Australia New Zealand the UK and Canada and approximately 946.35 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["qt", " qt", " Quart", " Approximately 1136.52 millilitres in Australia New Zealand the UK and Canada and approximately 946.35 millilitres in the US."] +2025-04-07 18:12:49.076951 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('gal', ' gal', ' Gallon', ' Approximately 4546.09 millilitres in Australia New Zealand the UK and Canada and approximately 3785.41 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["gal", " gal", " Gallon", " Approximately 4546.09 millilitres in Australia New Zealand the UK and Canada and approximately 3785.41 millilitres in the US."] +2025-04-07 18:12:49.086062 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('jiggers', ' jigger', ' Jigger', ' 1.5 fluid ounces.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["jiggers", " jigger", " Jigger", " 1.5 fluid ounces."] +2025-04-07 18:12:49.095057 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('oz', ' oz', ' Ounce', ' 1/4 lb for butter which can also be measured as 3 tablespoons.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["oz", " oz", " Ounce", " 1/4 lb for butter which can also be measured as 3 tablespoons."] +2025-04-07 18:12:49.102906 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('L', ' L', ' Liter', ' Commonly used for volume measurement in the metric system.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["L", " L", " Liter", " Commonly used for volume measurement in the metric system."] +2025-04-07 18:12:49.111927 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('mL', ' mL', ' Milliliter', ' Commonly used for volume measurement in the metric system.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["mL", " mL", " Milliliter", " Commonly used for volume measurement in the metric system."] +2025-04-07 18:12:49.119508 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('dm3', ' dm3', ' Cubic decimeter', ' Equivalent to 1 liter.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["dm3", " dm3", " Cubic decimeter", " Equivalent to 1 liter."] +2025-04-07 18:12:49.128094 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('g', ' g', ' Gram', ' Commonly used for weight measurement in the metric system.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["g", " g", " Gram", " Commonly used for weight measurement in the metric system."] +2025-04-07 18:12:49.136293 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('kg', ' kg', ' Kilogram', ' Commonly used for weight measurement in the metric system.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["kg", " kg", " Kilogram", " Commonly used for weight measurement in the metric system."] +2025-04-07 18:12:49.144897 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('lbs', ' lb', ' Pound', ' Used for weight measurement in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["lbs", " lb", " Pound", " Used for weight measurement in the US."] +2025-04-07 18:12:49.153354 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('fluid scruples', ' fluid scruple', ' Fluid scruple', " A unit used in the apothecaries' system but not commonly used in cooking."), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["fluid scruples", " fluid scruple", " Fluid scruple", " A unit used in the apothecaries' system but not commonly used in cooking."] +2025-04-07 18:12:49.162476 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('cm3', ' cm3', ' Cubic centimeter', ' Equivalent to 1 milliliter.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["cm3", " cm3", " Cubic centimeter", " Equivalent to 1 milliliter."] +2025-04-07 18:12:49.170611 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('breakfast cups', ' breakfast cup', ' Breakfast cup', ' Similar in size to the US customary cup and the metric cup.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["breakfast cups", " breakfast cup", " Breakfast cup", " Similar in size to the US customary cup and the metric cup."] +2025-04-07 18:12:49.178357 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('tumblers', ' tumbler', ' Tumblerful', ' A unit used in British cookery books and recipes.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["tumblers", " tumbler", " Tumblerful", " A unit used in British cookery books and recipes."] +2025-04-07 18:12:49.186429 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('winefulls', ' winefull', ' Wineglassful', ' A unit used in British cookery books and recipes.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["winefulls", " winefull", " Wineglassful", " A unit used in British cookery books and recipes."] +2025-04-07 18:12:49.195941 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('coffee cups', ' coffee cup', ' Coffee cup', ' Can vary from 100 to 200 millilitres.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["coffee cups", " coffee cup", " Coffee cup", " Can vary from 100 to 200 millilitres."] +2025-04-07 18:12:49.205197 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('sticks of butter', ' stick of butter', ' Stick of butter', ' 1/4 lb or 3 tablespoons.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["sticks of butter", " stick of butter", " Stick of butter", " 1/4 lb or 3 tablespoons."] +2025-04-07 18:12:49.212492 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('smidgens', ' smidgen', ' Smidgen', ' An approximate unit of measure.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["smidgens", " smidgen", " Smidgen", " An approximate unit of measure."] +2025-04-07 18:12:49.221728 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('dashes', ' dash', ' Dash', ' An approximate unit of measure.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["dashes", " dash", " Dash", " An approximate unit of measure."] +2025-04-07 18:12:49.231128 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('drops', ' drop', ' Drop', ' An approximate unit of measure.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["drops", " drop", " Drop", " An approximate unit of measure."] +2025-04-07 18:12:49.239584 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('eaches', ' each', ' Each', ' A single unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["eaches", " each", " Each", " A single unit."] +2025-04-07 18:12:49.248671 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('boxes', ' box', ' Box', ' A Single box of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["boxes", " box", " Box", " A Single box of a unit."] +2025-04-07 18:12:49.257268 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('crates', ' crate', ' Crate', ' a single crate of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["crates", " crate", " Crate", " a single crate of a unit."] +2025-04-07 18:12:49.266294 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('jars', ' jar', ' Jar', ' A single Jar of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["jars", " jar", " Jar", " A single Jar of a unit."] +2025-04-07 18:12:49.275199 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('cans', ' can', ' Can', ' A Single Can of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["cans", " can", " Can", " A Single Can of a unit."] +2025-04-07 18:12:49.282805 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('bars', ' bar', ' Bars', ' A Single bar of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["bars", " bar", " Bars", " A Single bar of a unit."] +2025-04-07 18:12:49.291482 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('loaves', ' loaf', ' Loaf', ' A single loaf of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["loaves", " loaf", " Loaf", " A single loaf of a unit."] +2025-04-07 18:12:49.301205 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('packs', ' pack', ' Pack', ' A Single Pack of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["packs", " pack", " Pack", " A Single Pack of a unit."] +2025-04-07 18:13:10.286385 --- CAUTION --- DatabaseError(message='duplicate key value violates unique constraint "units_plural_key"DETAIL: Key (plural)=(Plural) already exists.', payload=('Plural', ' Single', ' Fullname', ' Description'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["Plural", " Single", " Fullname", " Description"] +2025-04-07 18:13:10.298389 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('tsp', ' tsp', ' Teaspoon', ' 5 millilitres in Australia New Zealand UK Canada and the US but approximately 4.93 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["tsp", " tsp", " Teaspoon", " 5 millilitres in Australia New Zealand UK Canada and the US but approximately 4.93 millilitres in the US."] +2025-04-07 18:13:10.307226 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('dsp', ' dsp', ' Dessertspoon', ' 10 millilitres in Australia.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["dsp", " dsp", " Dessertspoon", " 10 millilitres in Australia."] +2025-04-07 18:13:10.316278 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('tbsp', ' tbsp', ' Tablespoon', ' 20 millilitres in Australia or 15 millilitres in New Zealand the UK Canada and the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["tbsp", " tbsp", " Tablespoon", " 20 millilitres in Australia or 15 millilitres in New Zealand the UK Canada and the US."] +2025-04-07 18:13:10.324427 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('fl oz', ' fl oz', ' Fluid ounce', ' 28.41 millilitres in the UK or approximately 29.57 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["fl oz", " fl oz", " Fluid ounce", " 28.41 millilitres in the UK or approximately 29.57 millilitres in the US."] +2025-04-07 18:13:10.333981 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('cups', ' cup', ' Cup', ' 250 millilitres in Australia and New Zealand or approximately 170.48 millilitres in the UK or approximately 227.31 millilitres in Canada and approximately 236.59 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["cups", " cup", " Cup", " 250 millilitres in Australia and New Zealand or approximately 170.48 millilitres in the UK or approximately 227.31 millilitres in Canada and approximately 236.59 millilitres in the US."] +2025-04-07 18:13:10.343232 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('pt', ' pt', ' Pint', ' 570 millilitres in Australia approximately 568.26 millilitres in New Zealand the UK and Canada and approximately 473.18 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["pt", " pt", " Pint", " 570 millilitres in Australia approximately 568.26 millilitres in New Zealand the UK and Canada and approximately 473.18 millilitres in the US."] +2025-04-07 18:13:10.350877 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('qt', ' qt', ' Quart', ' Approximately 1136.52 millilitres in Australia New Zealand the UK and Canada and approximately 946.35 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["qt", " qt", " Quart", " Approximately 1136.52 millilitres in Australia New Zealand the UK and Canada and approximately 946.35 millilitres in the US."] +2025-04-07 18:13:10.359701 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('gal', ' gal', ' Gallon', ' Approximately 4546.09 millilitres in Australia New Zealand the UK and Canada and approximately 3785.41 millilitres in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["gal", " gal", " Gallon", " Approximately 4546.09 millilitres in Australia New Zealand the UK and Canada and approximately 3785.41 millilitres in the US."] +2025-04-07 18:13:10.367839 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('jiggers', ' jigger', ' Jigger', ' 1.5 fluid ounces.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["jiggers", " jigger", " Jigger", " 1.5 fluid ounces."] +2025-04-07 18:13:10.376504 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('oz', ' oz', ' Ounce', ' 1/4 lb for butter which can also be measured as 3 tablespoons.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["oz", " oz", " Ounce", " 1/4 lb for butter which can also be measured as 3 tablespoons."] +2025-04-07 18:13:10.384509 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('L', ' L', ' Liter', ' Commonly used for volume measurement in the metric system.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["L", " L", " Liter", " Commonly used for volume measurement in the metric system."] +2025-04-07 18:13:10.392478 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('mL', ' mL', ' Milliliter', ' Commonly used for volume measurement in the metric system.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["mL", " mL", " Milliliter", " Commonly used for volume measurement in the metric system."] +2025-04-07 18:13:10.401408 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('dm3', ' dm3', ' Cubic decimeter', ' Equivalent to 1 liter.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["dm3", " dm3", " Cubic decimeter", " Equivalent to 1 liter."] +2025-04-07 18:13:10.410222 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('g', ' g', ' Gram', ' Commonly used for weight measurement in the metric system.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["g", " g", " Gram", " Commonly used for weight measurement in the metric system."] +2025-04-07 18:13:10.418352 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('kg', ' kg', ' Kilogram', ' Commonly used for weight measurement in the metric system.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["kg", " kg", " Kilogram", " Commonly used for weight measurement in the metric system."] +2025-04-07 18:13:10.426544 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('lbs', ' lb', ' Pound', ' Used for weight measurement in the US.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["lbs", " lb", " Pound", " Used for weight measurement in the US."] +2025-04-07 18:13:10.435351 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('fluid scruples', ' fluid scruple', ' Fluid scruple', " A unit used in the apothecaries' system but not commonly used in cooking."), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["fluid scruples", " fluid scruple", " Fluid scruple", " A unit used in the apothecaries' system but not commonly used in cooking."] +2025-04-07 18:13:10.444346 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('cm3', ' cm3', ' Cubic centimeter', ' Equivalent to 1 milliliter.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["cm3", " cm3", " Cubic centimeter", " Equivalent to 1 milliliter."] +2025-04-07 18:13:10.452199 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('breakfast cups', ' breakfast cup', ' Breakfast cup', ' Similar in size to the US customary cup and the metric cup.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["breakfast cups", " breakfast cup", " Breakfast cup", " Similar in size to the US customary cup and the metric cup."] +2025-04-07 18:13:10.461058 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('tumblers', ' tumbler', ' Tumblerful', ' A unit used in British cookery books and recipes.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["tumblers", " tumbler", " Tumblerful", " A unit used in British cookery books and recipes."] +2025-04-07 18:13:10.469292 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('winefulls', ' winefull', ' Wineglassful', ' A unit used in British cookery books and recipes.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["winefulls", " winefull", " Wineglassful", " A unit used in British cookery books and recipes."] +2025-04-07 18:13:10.478094 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('coffee cups', ' coffee cup', ' Coffee cup', ' Can vary from 100 to 200 millilitres.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["coffee cups", " coffee cup", " Coffee cup", " Can vary from 100 to 200 millilitres."] +2025-04-07 18:13:10.486368 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('sticks of butter', ' stick of butter', ' Stick of butter', ' 1/4 lb or 3 tablespoons.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["sticks of butter", " stick of butter", " Stick of butter", " 1/4 lb or 3 tablespoons."] +2025-04-07 18:13:10.494021 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('smidgens', ' smidgen', ' Smidgen', ' An approximate unit of measure.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["smidgens", " smidgen", " Smidgen", " An approximate unit of measure."] +2025-04-07 18:13:10.502494 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('dashes', ' dash', ' Dash', ' An approximate unit of measure.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["dashes", " dash", " Dash", " An approximate unit of measure."] +2025-04-07 18:13:10.510827 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('drops', ' drop', ' Drop', ' An approximate unit of measure.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["drops", " drop", " Drop", " An approximate unit of measure."] +2025-04-07 18:13:10.519133 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('eaches', ' each', ' Each', ' A single unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["eaches", " each", " Each", " A single unit."] +2025-04-07 18:13:10.528226 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('boxes', ' box', ' Box', ' A Single box of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["boxes", " box", " Box", " A Single box of a unit."] +2025-04-07 18:13:10.537276 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('crates', ' crate', ' Crate', ' a single crate of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["crates", " crate", " Crate", " a single crate of a unit."] +2025-04-07 18:13:10.544973 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('jars', ' jar', ' Jar', ' A single Jar of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["jars", " jar", " Jar", " A single Jar of a unit."] +2025-04-07 18:13:10.554072 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('cans', ' can', ' Can', ' A Single Can of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["cans", " can", " Can", " A Single Can of a unit."] +2025-04-07 18:13:10.561977 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('bars', ' bar', ' Bars', ' A Single bar of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["bars", " bar", " Bars", " A Single bar of a unit."] +2025-04-07 18:13:10.570396 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('loaves', ' loaf', ' Loaf', ' A single loaf of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["loaves", " loaf", " Loaf", " A single loaf of a unit."] +2025-04-07 18:13:10.579705 --- CAUTION --- DatabaseError(message='current transaction is aborted, commands ignored until end of transaction block', payload=('packs', ' pack', ' Pack', ' A Single Pack of a unit.'), sql='INSERT INTO units(plural, single, fullname, description) VALUES (%s, %s, %s, %s) RETURNING *;') + ["packs", " pack", " Pack", " A Single Pack of a unit."] \ No newline at end of file diff --git a/process.py b/process.py new file mode 100644 index 0000000..c691758 --- /dev/null +++ b/process.py @@ -0,0 +1,298 @@ +import database, MyDataclasses, psycopg2, datetime,json +from config import config + +def dropSiteTables(conn, site_manager: MyDataclasses.SiteManager): + try: + for table in site_manager.drop_order: + database.__dropTable(conn, site_manager.site_name, table) + with open("process.log", "a+") as file: + file.write(f"{datetime.datetime.now()} --- INFO --- {table} DROPPED!\n") + except Exception as error: + raise error + +def setupSiteTables(conn, site_manager: MyDataclasses.SiteManager): + try: + for table in site_manager.create_order: + database.__createTable(conn, site_manager.site_name, table) + with open("process.log", "a+") as file: + file.write(f"{datetime.datetime.now()} --- INFO --- {table} Created!\n") + except Exception as error: + raise error + +def addAdminUser(conn, site_manager: MyDataclasses.SiteManager, convert=True): + admin_user = () + try: + sql = f"INSERT INTO logins (username, password, email, row_type) VALUES (%s, %s, %s, %s) ON CONFLICT (username) DO UPDATE SET username = excluded.username RETURNING *;" + with conn.cursor() as cur: + cur.execute(sql, site_manager.admin_user) + rows = cur.fetchone() + if rows and convert: + admin_user = database.tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + admin_user = rows + with open("process.log", "a+") as file: + file.write(f"{datetime.datetime.now()} --- INFO --- Admin User Created!\n") + except Exception as error: + raise error + return admin_user + +def deleteSite(site_manager: MyDataclasses.SiteManager): + """Uses a Site Manager to delete a site from the system. + + Args: + site_manager (MyDataclasses.SiteManager): + + Raises: + Exception: + """ + database_config = config() + print(site_manager) + try: + with psycopg2.connect(**database_config) as conn: + print("before site") + site = database.selectSiteTuple(conn, (site_manager.site_name,), convert=True) + print("before user") + user = database.getUser(conn, site_manager.admin_user, convert=True) + print("after user: ", user) + if user['id'] != site['site_owner_id']: + raise Exception("The credentials passed do not match site owner") + + print("before roles") + roles = database.selectRolesTuple(conn, (site['id'],), convert=True) + database.deleteRolesTuple(conn, site['site_name'], [role['id'] for role in roles]) + + print("dropping site") + dropSiteTables(conn, site_manager) + + print("updating roles and sites") + for role in roles: + database.updateUsersRoles(conn, role['id']) + database.updateUsersSites(conn, site['id']) + + site = database.deleteSitesTuple(conn, site_manager.site_name, (site['id'], ), convert=True) + + except Exception as error: + with open("process.log", "a+") as file: + file.write(f"{datetime.datetime.now()} --- ERROR --- {error}\n") + print(error) + conn.rollback() + +def addSite(site_manager: MyDataclasses.SiteManager): + """uses a Site Manager to add a site to the system + + Args: + site_manager (MyDataclasses.SiteManager): + """ + database_config = config() + try: + with psycopg2.connect(**database_config) as conn: + setupSiteTables(conn, site_manager) + + admin_user = addAdminUser(conn, site_manager) + + site = MyDataclasses.SitePayload( + site_name=site_manager.site_name, + site_description=site_manager.description, + site_owner_id=admin_user['id'] + ) + site = database.insertSitesTuple(conn, site.payload(), convert=True) + + role = MyDataclasses.RolePayload("Admin", f"Admin for {site['site_name']}", site['id']) + role = database.insertRolesTuple(conn, role.payload(), convert=True) + + admin_user = database.updateAddLoginSitesRoles(conn, (site["id"], role["id"], admin_user["id"]), convert=True) + + default_zone = MyDataclasses.ZonePayload(site_manager.default_zone, site['id']) + default_zone = database.insertZonesTuple(conn, site["site_name"], default_zone.payload(), convert=True) + + uuid = f"{site_manager.default_zone}@{site_manager.default_location}" + default_location = MyDataclasses.LocationPayload(uuid, site_manager.default_location, default_zone['id']) + default_location = database.insertLocationsTuple(conn, site['site_name'], default_location.payload(), convert=True) + + # need to update the default zones/locations for site. + payload = { + 'id': site['id'], + 'update': {'default_zone': default_zone['id'], + 'default_auto_issue_location': default_location['id'], + 'default_primary_location': default_location['id']} + } + database.__updateTuple(conn, site_manager.site_name, f"sites", payload) + + + blank_vendor = MyDataclasses.VendorPayload("None", admin_user['id']) + blank_brand = MyDataclasses.BrandsPayload("None") + + blank_vendor = database.insertVendorsTuple(conn, site['site_name'], blank_vendor.payload(), convert=True) + blank_brand = database.insertBrandsTuple(conn, site['site_name'], blank_brand.payload(), convert=True) + + + conn.commit() + except Exception as error: + with open("process.log", "a+") as file: + file.write(f"{datetime.datetime.now()} --- ERROR --- {error}\n") + conn.rollback() + +def postNewBlankItem(conn, site_name: str, user_id: int, data: dict): + site = database.selectSiteTuple(conn, (site_name,), convert=True) + default_zone = database.__selectTuple(conn, site_name, f"{site_name}_zones", (site['default_zone'], ), convert=True) + default_location = database.__selectTuple(conn, site_name, f"{site_name}_locations", (site['default_primary_location'],), convert=True) + uuid = f"{default_zone['name']}@{default_location['name']}" + + # create logistics info + logistics_info = MyDataclasses.LogisticsInfoPayload( + barcode=data['barcode'], + primary_location=site['default_primary_location'], + primary_zone=site['default_zone'], + auto_issue_location=site['default_auto_issue_location'], + auto_issue_zone=site['default_zone'] + ) + + # create item info + item_info = MyDataclasses.ItemInfoPayload(data['barcode']) + + # create Food Info + food_info = MyDataclasses.FoodInfoPayload() + + logistics_info_id = 0 + item_info_id = 0 + food_info_id = 0 + brand_id = 1 + + + logistics_info = database.insertLogisticsInfoTuple(conn, site_name, logistics_info.payload(), convert=True) + item_info = database.insertItemInfoTuple(conn, site_name, item_info.payload(), convert=True) + food_info = database.insertFoodInfoTuple(conn, site_name, food_info.payload(), convert=True) + + name = data['name'] + name = name.replace("'", "@&apostraphe&") + description = "" + tags = database.lst2pgarr([]) + links = json.dumps({}) + search_string = f"&&{data['barcode']}&&{name}&&" + + + item = MyDataclasses.ItemsPayload( + data['barcode'], + data['name'], + item_info['id'], + logistics_info['id'], + food_info['id'], + brand=brand_id, + row_type="single", + item_type=data['subtype'], + search_string=search_string + ) + + item = database.insertItemTuple(conn, site_name, item.payload(), convert=True) + + with conn.cursor() as cur: + cur.execute(f"SELECT id FROM {site_name}_locations WHERE uuid=%s;", (uuid, )) + location_id = cur.fetchone()[0] + + + item_location = MyDataclasses.ItemLocationPayload(item['id'], location_id) + database.insertItemLocationsTuple(conn, site_name, item_location.payload()) + + + creation_tuple = MyDataclasses.TransactionPayload( + datetime.datetime.now(), + logistics_info['id'], + item['barcode'], + item['item_name'], + "SYSTEM", + 0.0, + "Item added to the System!", + user_id, + {'location': uuid} + ) + + database.insertTransactionsTuple(conn, site_name, creation_tuple.payload()) + + +def postTransaction(conn, site_name, user_id, data: dict): + #dict_keys(['item_id', 'logistics_info_id', 'barcode', 'item_name', 'transaction_type', + # 'quantity', 'description', 'cost', 'vendor', 'expires', 'location_id']) + def quantityFactory(quantity_on_hand:float, quantity:float, transaction_type:str): + if transaction_type == "Adjust In": + quantity_on_hand += quantity + return quantity_on_hand + if transaction_type == "Adjust Out": + quantity_on_hand -= quantity + return quantity_on_hand + raise Exception("The transaction type is wrong!") + + transaction_time = datetime.datetime.now() + + cost_layer = MyDataclasses.CostLayerPayload( + aquisition_date=transaction_time, + quantity=float(data['quantity']), + cost=float(data['cost']), + currency_type="USD", + vendor=int(data['vendor']), + expires=data['expires'] + ) + transaction = MyDataclasses.TransactionPayload( + timestamp=transaction_time, + logistics_info_id=int(data['logistics_info_id']), + barcode=data['barcode'], + name=data['item_name'], + transaction_type=data['transaction_type'], + quantity=float(data['quantity']), + description=data['description'], + user_id=user_id, + ) + + location = database.selectItemLocationsTuple(conn, site_name, payload=(data['item_id'], data['location_id']), convert=True) + cost_layers: list = location['cost_layers'] + if data['transaction_type'] == "Adjust In": + cost_layer = database.insertCostLayersTuple(conn, site_name, cost_layer.payload(), convert=True) + cost_layers.append(cost_layer['id']) + + if data['transaction_type'] == "Adjust Out": + if float(location['quantity_on_hand']) < float(data['quantity']): + return {"error":True, "message":f"The quantity on hand in the chosen location is not enough to satisfy your transaction!"} + cost_layers = database.selectCostLayersTuple(conn, site_name, (location['id'], ), convert=True) + + new_cost_layers = [] + qty = float(data['quantity']) + for layer in cost_layers: + if qty == 0.0: + new_cost_layers.append(layer['id']) + elif qty >= float(layer['quantity']): + qty -= float(layer['quantity']) + layer['quantity'] = 0.0 + else: + layer['quantity'] -= qty + new_cost_layers.append(layer['id']) + database.__updateTuple(conn, site_name, f"{site_name}_cost_layers", {'id': layer['id'], 'update': {'quantity': layer['quantity']}}) + qty = 0.0 + + if layer['quantity'] == 0.0: + database.deleteCostLayersTuple(conn, site_name, (layer['id'], )) + + cost_layers = new_cost_layers + + quantity_on_hand = quantityFactory(float(location['quantity_on_hand']), data['quantity'], data['transaction_type']) + + updated_item_location_payload = (cost_layers, quantity_on_hand, data['item_id'], data['location_id']) + database.updateItemLocation(conn, site_name, updated_item_location_payload) + + site_location = database.__selectTuple(conn, site_name, f"{site_name}_locations", (location['location_id'], ), convert=True) + + transaction.data = {'location': site_location['uuid']} + + database.insertTransactionsTuple(conn, site_name, transaction.payload()) + return {"error": False, "message":f"Transaction Successful!"} + + + +site_manager = MyDataclasses.SiteManager( + site_name="test", + admin_user=("jadowyne", "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08", "jadowyne.ulve@outlook.com", 'user'), + default_zone="DEFAULT", + default_location="ALL", + description="This is my test site" +) + +#addSite(site_manager) +#deleteSite(site_manager) diff --git a/receipts_API.py b/receipts_API.py new file mode 100644 index 0000000..e426a5d --- /dev/null +++ b/receipts_API.py @@ -0,0 +1,324 @@ +from flask import Blueprint, request, render_template, redirect, session, url_for, send_file, jsonify, Response, current_app, send_from_directory +import psycopg2, math, json, datetime, main, copy, requests, process, database, pprint, MyDataclasses +from config import config, sites_config +from user_api import login_required +import openfoodfacts +import postsqldb +import mimetypes, os +import pymupdf, PIL + + +def create_pdf_preview(pdf_path, output_path, size=(600, 400)): + pdf = pymupdf.open(pdf_path) + page = pdf[0] + file_name = os.path.basename(pdf_path).replace('.pdf', "") + pix = page.get_pixmap() + img = PIL.Image.frombytes("RGB", (pix.width, pix.height), pix.samples) + output_path = output_path + file_name + '.jpg' + img.thumbnail(size) + img.save(output_path) + return file_name + '.jpg' + + +receipt_api = Blueprint('receipt_api', __name__) + +@receipt_api.route("/receipt/") +@login_required +def receipt(id): + sites = [site[1] for site in main.get_sites(session['user']['sites'])] + database_config = config() + with psycopg2.connect(**database_config) as conn: + units = postsqldb.UnitsTable.getAll(conn) + return render_template("receipts/receipt.html", id=id, current_site=session['selected_site'], sites=sites, units=units) + +@receipt_api.route("/receipts") +@login_required +def receipts(): + sites = [site[1] for site in main.get_sites(session['user']['sites'])] + return render_template("receipts/index.html", current_site=session['selected_site'], sites=sites) + +@receipt_api.route('/receipts/getItems', methods=["GET"]) +def getItems(): + recordset = [] + count = {'count': 0} + if request.method == "GET": + page = int(request.args.get('page', 1)) + limit = int(request.args.get('limit', 10)) + site_name = session['selected_site'] + offset = (page - 1) * limit + database_config = config() + with psycopg2.connect(**database_config) as conn: + payload = ("%%", limit, offset) + recordset, count = database.getItemsWithQOH(conn, site_name, payload, convert=True) + return jsonify({"items":recordset, "end":math.ceil(count['count']/limit), "error":False, "message":"items fetched succesfully!"}) + return jsonify({"items":recordset, "end":math.ceil(count['count']/limit), "error":True, "message":"There was an error with this GET statement"}) + +@receipt_api.route('/receipts/getReceipts', methods=["GET"]) +def getReceipts(): + recordset = [] + if request.method == "GET": + page = int(request.args.get('page', 1)) + limit = int(request.args.get('limit', 50)) + offset = (page - 1) * limit + site_name = session['selected_site'] + database_config = config() + with psycopg2.connect(**database_config) as conn: + recordset, count = database.getReceipts(conn, site_name, payload=(limit, offset), convert=True) + return jsonify({'receipts':recordset, "end": math.ceil(count/limit), 'error': False, "message": "Get Receipts Successful!"}) + return jsonify({'receipts': recordset, "end": math.ceil(count/limit), 'error': True, "message": "Something went wrong while getting receipts!"}) + +@receipt_api.route('/receipts/getReceipt', methods=["GET"]) +def getReceipt(): + record = [] + if request.method == "GET": + receipt_id = int(request.args.get('id', 1)) + site_name = session['selected_site'] + database_config = config() + with psycopg2.connect(**database_config) as conn: + record = database.getReceiptByID(conn, site_name, payload=(receipt_id, ), convert=True) + return jsonify({'receipt': record, 'error': False, "message": "Get Receipts Successful!"}) + return jsonify({'receipt': record, 'error': True, "message": "Something went wrong while getting receipts!"}) + +@receipt_api.route('/receipts/addReceipt', methods=["POST", "GET"]) +def addReceipt(): + if request.method == "GET": + user_id = session['user_id'] + site_name = session['selected_site'] + database_config = config() + with psycopg2.connect(**database_config) as conn: + receipt = MyDataclasses.ReceiptPayload( + receipt_id=f"PR-{database.request_receipt_id(conn, site_name)}", + submitted_by=user_id + ) + database.insertReceiptsTuple(conn, site_name, receipt.payload()) + return jsonify({'error': False, "message": "Receipt Added Successful!"}) + return jsonify({'error': True, "message": "Something went wrong while adding receipt!"}) + +@receipt_api.route('/receipts/addSKULine', methods=["POST"]) +def addSKULine(): + if request.method == "POST": + item_id = int(request.get_json()['item_id']) + receipt_id = int(request.get_json()['receipt_id']) + + site_name = session['selected_site'] + database_config = config() + with psycopg2.connect(**database_config) as conn: + item = database.getItemAllByID(conn, site_name, (item_id, ), convert=True) + data = { + 'cost': item['item_info']['cost'], + 'expires': item['food_info']['expires'] + } + receipt_item = MyDataclasses.ReceiptItemPayload( + type="sku", + receipt_id=receipt_id, + barcode=item['barcode'], + name=item['item_name'], + qty=item['item_info']['uom_quantity'], + uom=item['item_info']['uom'], + data=data + ) + database.insertReceiptItemsTuple(conn, site_name, receipt_item.payload()) + return jsonify({'error': False, "message": "Line added Succesfully"}) + return jsonify({'error': True, "message": "Something went wrong while add SKU line!"}) + +@receipt_api.route('/receipts/deleteLine', methods=["POST"]) +def deleteLine(): + if request.method == "POST": + line_id = int(request.get_json()['line_id']) + site_name = session['selected_site'] + database_config = config() + with psycopg2.connect(**database_config) as conn: + database.deleteReceiptItemsTuple(conn, site_name, (line_id, )) + + return jsonify({'error': False, "message": "Line Deleted Succesfully"}) + return jsonify({'error': True, "message": "Something went wrong while deleting line!"}) + +@receipt_api.route('/receipts/denyLine', methods=["POST"]) +def denyLine(): + if request.method == "POST": + line_id = int(request.get_json()['line_id']) + site_name = session['selected_site'] + database_config = config() + with psycopg2.connect(**database_config) as conn: + database.__updateTuple(conn, site_name, f"{site_name}_receipt_items", {'id': line_id, 'update': {'status': 'Denied'}}) + return jsonify({'error': False, "message": "Line Denied Succesfully"}) + return jsonify({'error': True, "message": "Something went wrong while denying line!"}) + +@receipt_api.route('/receipts/saveLine', methods=["POST"]) +def saveLine(): + if request.method == "POST": + line_id = int(request.get_json()['line_id']) + payload = request.get_json()['payload'] + site_name = session['selected_site'] + database_config = config() + with psycopg2.connect(**database_config) as conn: + receipt_item = database.__selectTuple(conn, site_name, f"{site_name}_receipt_items", (line_id, ), convert=True) + if 'api_data' in receipt_item['data'].keys(): + payload['data']['api_data'] = receipt_item['data']['api_data'] + database.__updateTuple(conn, site_name, f"{site_name}_receipt_items", {'id': line_id, 'update': payload}) + return jsonify({'error': False, "message": "Line Saved Succesfully"}) + return jsonify({'error': True, "message": "Something went wrong while saving line!"}) + + +@receipt_api.route('/receipts/resolveLine', methods=["POST"]) +def resolveLine(): + if request.method == "POST": + line_id = int(request.get_json()['line_id']) + site_name = session['selected_site'] + user_id = session['user_id'] + database_config = config() + with psycopg2.connect(**database_config) as conn: + transaction_time = datetime.datetime.now() + receipt_item = database.__selectTuple(conn, site_name, f"{site_name}_receipt_items", (line_id, ), convert=True) + receipt = database.getReceiptByID(conn, site_name, (receipt_item['receipt_id'], ), convert=True) + conv_factor = 1.0 + if receipt_item['data']['expires'] is not False: + print(receipt_item['data']['expires']) + expiration = datetime.datetime.strptime(receipt_item['data']['expires'], "%Y-%m-%d") + else: + expiration = None + + if receipt_item['type'] == 'sku': + linked_item = database.getLinkedItemByBarcode(conn, site_name, (receipt_item['barcode'], )) + if len(linked_item) > 1: + conv_factor = linked_item['conv_factor'] + receipt_item['data']['linked_child'] = linked_item['barcode'] + + if receipt_item['type'] == 'api': + + data = { + 'barcode': receipt_item['barcode'], + 'name': receipt_item['name'], + 'subtype': 'FOOD' + } + process.postNewBlankItem(conn, site_name, user_id, data) + + if receipt_item['type'] == "new sku": + data = { + 'barcode': receipt_item['barcode'], + 'name': receipt_item['name'], + 'subtype': 'FOOD' + } + process.postNewBlankItem(conn, site_name, user_id, data) + + item = database.getItemAllByBarcode(conn, site_name, (receipt_item['barcode'], ), convert=True) + location = database.selectItemLocationsTuple(conn, site_name, (item['id'], item['logistics_info']['primary_location']['id']), convert=True) + cost_layers: list = location['cost_layers'] + + receipt_item['data']['location'] = item['logistics_info']['primary_location']['uuid'] + + transaction = MyDataclasses.TransactionPayload( + timestamp=transaction_time, + logistics_info_id=item['logistics_info_id'], + barcode=item['barcode'], + name=item['item_name'], + transaction_type="Adjust In", + quantity=(float(receipt_item['qty'])*conv_factor), + description=f"{receipt['receipt_id']}", + user_id=session['user_id'], + data=receipt_item['data'] + ) + + cost_layer = MyDataclasses.CostLayerPayload( + aquisition_date=transaction_time, + quantity=float(receipt_item['qty']), + cost=float(receipt_item['data']['cost']), + currency_type="USD", + vendor=receipt['vendor_id'], + expires=expiration + ) + + cost_layer = database.insertCostLayersTuple(conn, site_name, cost_layer.payload(), convert=True) + cost_layers.append(cost_layer['id']) + + quantity_on_hand = float(location['quantity_on_hand']) + float(receipt_item['qty']) + + updated_item_location_payload = (cost_layers, quantity_on_hand, item['id'], item['logistics_info']['primary_location']['id']) + database.updateItemLocation(conn, site_name, updated_item_location_payload) + + site_location = database.__selectTuple(conn, site_name, f"{site_name}_locations", (location['location_id'], ), convert=True) + + receipt_item['data']['location'] = site_location['uuid'] + + database.insertTransactionsTuple(conn, site_name, transaction.payload()) + + database.__updateTuple(conn, site_name, f"{site_name}_receipt_items", {'id': receipt_item['id'], 'update': {'status': "Resolved"}}) + + + return jsonify({'error': False, "message": "Line Saved Succesfully"}) + return jsonify({'error': True, "message": "Something went wrong while saving line!"}) + +@receipt_api.route('/receipts/resolveReceipt', methods=["POST"]) +def resolveReceipt(): + if request.method == "POST": + receipt_id = int(request.get_json()['receipt_id']) + site_name = session['selected_site'] + database_config = config() + with psycopg2.connect(**database_config) as conn: + postsqldb.ReceiptTable.update_receipt(conn, site_name, {'id': receipt_id, 'update': {'receipt_status': 'Resolved'}}) + return jsonify({'error': False, "message": "Line Saved Succesfully"}) + return jsonify({'error': True, "message": "Something went wrong while saving line!"}) + +@receipt_api.route('/receipt/uploadfile/', methods=["POST"]) +def uploadFile(receipt_id): + file = request.files['file'] + file_path = current_app.config['FILES_FOLDER'] + f"/receipts/{file.filename.replace(" ", "_")}" + file.save(file_path) + file_type, _ = mimetypes.guess_type(file.filename) + preview_image = "" + if file_type == "application/pdf": + output_path = "static/files/receipts/previews/" + preview_image = create_pdf_preview(file_path, output_path) + + file_size = os.path.getsize(file_path) + database_config = config() + site_name = session['selected_site'] + username = session['user']['username'] + with psycopg2.connect(**database_config) as conn: + files = postsqldb.ReceiptTable.select_tuple(conn, site_name, (receipt_id, ))['files'] + files[file.filename.replace(" ", "_")] = {'file_path': file.filename.replace(" ", "_"), 'file_type': file_type, 'file_size': file_size, 'uploaded_by': username, 'preview_image': preview_image} + postsqldb.ReceiptTable.update_receipt(conn, site_name, {'id': receipt_id, 'update': {'files': files}}) + + return jsonify({}) + +@receipt_api.route('/receipt/getFile/') +def getFile(file_name): + return send_from_directory('static/files/receipts', file_name) + +@receipt_api.route('/receipts/checkAPI', methods=["POST"]) +def checkAPI(): + if request.method == "POST": + line_id = int(request.get_json()['line_id']) + barcode = request.get_json()['barcode'] + site_name = session['selected_site'] + database_config = config() + with psycopg2.connect(**database_config) as conn: + print(barcode, line_id) + api_response, api_data = get_open_facts(barcode) + if api_response: + receipt_item = database.__selectTuple(conn, site_name, f"{site_name}_receipt_items", (line_id, ), convert=True) + item_data = receipt_item['data'] + item_data['api_data'] = api_data + database.__updateTuple(conn, site_name, f"{site_name}_receipt_items", + {'id': line_id, 'update': { + 'type': 'api', + 'data': item_data, + 'name': api_data['product_name'] + }}) + return jsonify({'error': False, "message": "Line updated for API, Succesfully"}) + else: + return jsonify({'error': True, "message": "Item not in WorldFoodFacts!"}) + return jsonify({'error': False, "message": "Line Saved Succesfully"}) + return jsonify({'error': True, "message": "Something went wrong while saving line!"}) + +open_food_api = openfoodfacts.API(user_agent="MyAwesomeApp/1.0") + +open_food_enabled = True + +def get_open_facts(barcode): + if open_food_enabled: + barcode: str = barcode.replace('%', "") + data = open_food_api.product.get(barcode) + if data != None: + return True, data + return False, {} \ No newline at end of file diff --git a/recipes_api.py b/recipes_api.py new file mode 100644 index 0000000..b6b90e9 --- /dev/null +++ b/recipes_api.py @@ -0,0 +1,201 @@ +from flask import Blueprint, request, render_template, redirect, session, url_for, send_file, jsonify, Response, current_app, send_from_directory +import psycopg2, math, json, datetime, main, copy, requests, process, database, pprint, MyDataclasses +from config import config, sites_config +from main import unfoldCostLayers +from user_api import login_required +import os +import postsqldb + +recipes_api = Blueprint('recipes_api', __name__) + +@recipes_api.route("/recipes") +@login_required +def recipes(): + sites = [site[1] for site in main.get_sites(session['user']['sites'])] + return render_template("recipes/index.html", + current_site=session['selected_site'], + sites=sites) + +@recipes_api.route("/recipe//") +@login_required +def recipe(mode, id): + + database_config = config() + with psycopg2.connect(**database_config) as conn: + units = postsqldb.UnitsTable.getAll(conn) + + if mode == "edit": + return render_template("recipes/recipe_edit.html", recipe_id=id, current_site=session['selected_site'], units=units) + if mode == "view": + return render_template("recipes/recipe_view.html", recipe_id=id, current_site=session['selected_site']) + + +@recipes_api.route('/recipes/getRecipes', methods=["GET"]) +def getRecipes(): + recipes = [] + if request.method == "GET": + page = int(request.args.get('page', 1)) + limit = int(request.args.get('limit', 1)) + offset = (page-1)*limit + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + recipes, count = postsqldb.RecipesTable.getRecipes(conn, site_name, (limit, offset), convert=True) + return jsonify({'recipes': recipes, 'end': math.ceil(count/limit), 'error': False, 'message': 'bleh'}) + +@recipes_api.route('/recipe/getRecipe', methods=["GET"]) +def getRecipe(): + recipe = {} + if request.method == "GET": + id = int(request.args.get('id', 1)) + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + recipe = postsqldb.RecipesTable.getRecipe(conn, site_name, (id,), convert=True) + return jsonify({'recipe': recipe, 'error': False, 'message': 'bleh'}) + +@recipes_api.route('/recipes/addRecipe', methods=["POST"]) +def addRecipe(): + if request.method == "POST": + recipe_name = request.get_json()['recipe_name'] + recipe_description = request.get_json()['recipe_description'] + database_config = config() + site_name = session['selected_site'] + user_id = session['user_id'] + with psycopg2.connect(**database_config) as conn: + recipe = postsqldb.RecipesTable.Payload( + name=recipe_name, + author=user_id, + description=recipe_description + ) + postsqldb.RecipesTable.insert_tuple(conn, site_name, recipe.payload()) + return jsonify({'recipe': recipe, 'error': False, 'message': 'Add Recipe successful!'}) + return jsonify({'recipe': recipe, 'error': True, 'message': 'Add Recipe unsuccessful!'}) + +@recipes_api.route('/recipe/getItems', methods=["GET"]) +def getItems(): + recordset = [] + count = {'count': 0} + if request.method == "GET": + page = int(request.args.get('page', 1)) + limit = int(request.args.get('limit', 10)) + search_string = request.args.get('search_string', 10) + site_name = session['selected_site'] + offset = (page - 1) * limit + database_config = config() + with psycopg2.connect(**database_config) as conn: + payload = (search_string, limit, offset) + recordset, count = database.getItemsWithQOH(conn, site_name, payload, convert=True) + return jsonify({"items":recordset, "end":math.ceil(count['count']/limit), "error":False, "message":"items fetched succesfully!"}) + return jsonify({"items":recordset, "end":math.ceil(count['count']/limit), "error":True, "message":"There was an error with this GET statement"}) + + +@recipes_api.route('/recipe/postUpdate', methods=["POST"]) +def postUpdate(): + recipe = {} + if request.method == "POST": + recipe_id = int(request.get_json()['recipe_id']) + update = request.get_json()['update'] + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + recipe = postsqldb.RecipesTable.updateRecipe(conn, site_name, {'id': recipe_id, 'update': update}, convert=True) + return jsonify({'recipe': recipe, 'error': False, 'message': 'Update of Recipe successful!'}) + return jsonify({'recipe': recipe, 'error': True, 'message': 'Update of Recipe unsuccessful!'}) + +@recipes_api.route('/recipe/postCustomItem', methods=["POST"]) +def postCustomItem(): + recipe = {} + if request.method == "POST": + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + recipe_item = postsqldb.RecipesTable.ItemPayload( + uuid=f"%{int(request.get_json()['rp_id'])}{database.getUUID(6)}%", + rp_id=int(request.get_json()['rp_id']), + item_type=request.get_json()['item_type'], + item_name=request.get_json()['item_name'], + uom=request.get_json()['uom'], + qty=float(request.get_json()['qty']), + links=request.get_json()['links'] + ) + postsqldb.RecipesTable.insert_item_tuple(conn, site_name, recipe_item.payload(), convert=True) + recipe = postsqldb.RecipesTable.getRecipe(conn, site_name, (int(request.get_json()['rp_id']), ), convert=True) + return jsonify({'recipe': recipe, 'error': False, 'message': 'Recipe Item was added successful!'}) + return jsonify({'recipe': recipe, 'error': True, 'message': 'Recipe Item was not added unsuccessful!'}) + +@recipes_api.route('/recipe/postSKUItem', methods=["POST"]) +def postSKUItem(): + recipe = {} + if request.method == "POST": + recipe_id = int(request.get_json()['recipe_id']) + item_id = int(request.get_json()['item_id']) + + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + item = database.getItemAllByID(conn, site_name, (item_id, ), convert=True) + recipe_item = postsqldb.RecipesTable.ItemPayload( + uuid=item['barcode'], + rp_id=recipe_id, + item_type='sku', + item_name=item['item_name'], + uom=item['item_info']['uom']['id'], + qty=float(item['item_info']['uom_quantity']), + item_id=item['id'], + links=item['links'] + ) + postsqldb.RecipesTable.insert_item_tuple(conn, site_name, recipe_item.payload(), convert=True) + recipe = postsqldb.RecipesTable.getRecipe(conn, site_name, (recipe_id, ), convert=True) + return jsonify({'recipe': recipe, 'error': False, 'message': 'Recipe Item was added successful!'}) + return jsonify({'recipe': recipe, 'error': True, 'message': 'Recipe Item was not added unsuccessful!'}) + +@recipes_api.route('/recipe/postImage/', methods=["POST"]) +def uploadImage(recipe_id): + file = request.files['file'] + file_path = current_app.config['UPLOAD_FOLDER'] + f"/recipes/{file.filename.replace(" ", "_")}" + file.save(file_path) + + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + postsqldb.RecipesTable.updateRecipe(conn, site_name, {'id': recipe_id, 'update': {'picture_path': file.filename.replace(" ", "_")}}) + + return jsonify({}) + +@recipes_api.route('/recipe/getImage/') +def get_image(recipe_id): + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + with conn.cursor() as cur: + cur.execute(f"SELECT picture_path FROM {site_name}_recipes WHERE id=%s;", (recipe_id,)) + rows = cur.fetchone()[0] + return send_from_directory('static/pictures/recipes', rows) + +@recipes_api.route('/recipe/deleteRecipeItem', methods=["POST"]) +def deleteRecipeItem(): + recipe = {} + if request.method == "POST": + id = int(request.get_json()['id']) + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + deleted_item = postsqldb.RecipesTable.delete_item_tuple(conn, site_name, (id, ), convert=True) + recipe = postsqldb.RecipesTable.getRecipe(conn, site_name, (int(deleted_item['rp_id']), ), convert=True) + return jsonify({'recipe': recipe, 'error': False, 'message': f'Recipe Item {deleted_item['item_name']} was deleted successful!'}) + return jsonify({'recipe': recipe, 'error': True, 'message': 'Recipe Item was not deleted unsuccessful!'}) + +@recipes_api.route('/recipe/saveRecipeItem', methods=["POST"]) +def saveRecipeItem(): + recipe = {} + if request.method == "POST": + id = int(request.get_json()['id']) + update = request.get_json()['update'] + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + updated_line = postsqldb.RecipesTable.update_item_tuple(conn, site_name, {'id': id, 'update': update}, convert=True) + recipe = postsqldb.RecipesTable.getRecipe(conn, site_name, (int(updated_line['rp_id']), ), convert=True) + return jsonify({'recipe': recipe, 'error': False, 'message': f'Recipe Item {updated_line['item_name']} was updated successful!'}) + return jsonify({'recipe': recipe, 'error': True, 'message': 'Recipe Item was not updated unsuccessful!'}) \ No newline at end of file diff --git a/scratch.py b/scratch.py index ed562c1..8ed4f3f 100644 --- a/scratch.py +++ b/scratch.py @@ -1,250 +1,235 @@ from config import config -import psycopg2, requests, database +import psycopg2, requests, database, MyDataclasses import main, datetime, json, csv from main import lst2pgarr +import process -headers = [] -test = [] -with open("2024-10-02-Pantry.csv", "r+", encoding="utf-8") as file: - csv_reader = csv.DictReader(file) - for row in csv_reader: +def importItemFromCSV(test, site_name, uuid, site): + logistics_info = MyDataclasses.LogisticsInfoPayload( + barcode=test['barcode'], + primary_location=site['default_primary_location'], + primary_zone=site['default_zone'], + auto_issue_location=site['default_auto_issue_location'], + auto_issue_zone=site['default_zone']) + + item_info = MyDataclasses.ItemInfoPayload(test['barcode']) + + + # Food Info + t = ['serving', 'serving_unit', 'calories', 'calories_unit', 'proteins', + 'proteins_unit', 'fats', 'fats_unit', 'carbohydrates', 'carbohydrates_unit', 'sugars', 'sugars_unit', 'sodium', 'sodium_unit', + 'fibers', 'fibers_unit'] + + other_tags = [ + 'serving', + 'serving_unit', + 'calories', + 'calories_unit', + 'proteins_serving', + 'proteins_unit', + 'fat_serving', + 'fat_unit', + 'carbohydrates_serving', + 'carbohydrates_unit', + 'sugars_serving', + 'sugars_unit', + 'sodium_serving', + 'sodium_unit', + 'fiber_serving', + 'fiber_unit', + ] + + nutriments = test['nutriments'].replace("'", '"') + nutriments = nutriments.replace("{", "").replace("}", "") + key_values = nutriments.split(", ") + nutriments = {} + + if key_values != ['']: + for s in key_values: + s= s.split(": ") + k = s[0].replace('"', "") + v = s[1].replace('"', "") + nutriments[k] = v + + nutrients = {} + for i in range(len(other_tags)): + if other_tags[i] in nutriments.keys(): + nutrients[t[i]] = nutriments[other_tags[i]] + else: + nutrients[t[i]] = '' + + food_groups = test['food_groups_tags'] + food_groups = food_groups.replace('[', "").replace("]", "") + food_groups = food_groups.replace("'", "") + food_groups = food_groups.split(", ") + + ingrediants = test['ingredients_hierarchy'] + ingrediants = ingrediants.replace('[', "").replace("]", "") + ingrediants = ingrediants.replace("'", "") + ingrediants = ingrediants.split(", ") + + + food_info = MyDataclasses.FoodInfoPayload(food_groups, ingrediants, nutrients) + + if test['brands'] != "": + brand = MyDataclasses.BrandsPayload(test['brands']) + + logistics_info_id = 0 + item_info_id = 0 + food_info_id = 0 + brand_id = 1 + + database_config = config() try: - if row['id'] == "430": - test = row - except: - pass + with psycopg2.connect(**database_config) as conn: + logistics_info = database.insertLogisticsInfoTuple(conn, site_name, logistics_info.payload()) + item_info = database.insertItemInfoTuple(conn, site_name, item_info.payload()) + food_info = database.insertFoodInfoTuple(conn, site_name, food_info.payload()) + if test['brands'] != "": + brand = database.insertBrandsTuple(conn, site_name, brand.payload()) + brand_id = brand[0] + + print("Logistics:", logistics_info) + print("item_info:", item_info) + print("food_info:", food_info) + print("brand:", brand_id) + + name = test['name'] + name = name.replace("'", "@&apostraphe&") + description = "" + tags = lst2pgarr([]) + links = json.dumps({}) + search_string = f"&&{test['barcode']}&&{name}&&" -# print(test) + item = MyDataclasses.ItemsPayload(test['barcode'], test['name'], item_info[0], + logistics_info[0], food_info[0], brand=brand_id, + row_type="single", item_type=test["sub_type"], search_string=search_string) -# order_of_operations -# create_logistics -# create_item_info -# create_food_info -# create_brand_info -# return id of each and save, check to make sure you have id for each else drop out and do not commit -site_name = "main" -defaults = config(filename=f"sites/{site_name}/site.ini", section="defaults") -uuid = f"{defaults["default_zone"]}@{defaults["default_primary_location"]}" - -logistics_info_payload = [ - test['barcode'], - uuid, - uuid, - json.dumps({}), # dynamic_locations - json.dumps({}), # location_data - 0.0 # quantity_on_hand -] - -item_info_payload = [ - test['barcode'], - lst2pgarr([]), # linked_items - lst2pgarr([]), # shopping_lists - lst2pgarr([]), # recipes - lst2pgarr([]), # groups - test['packaging'], # packaging - test['product_quantity_unit'], # uom - test['cost'], # cost - test['safety_stock'], # safety_stock - test['lead_time'], # lead_time_days - False # ai_pick -] - -# Food Info -t = ['serving', 'serving_unit', 'calories', 'calories_unit', 'proteins', - 'proteins_unit', 'fats', 'fats_unit', 'carbohydrates', 'carbohydrates_unit', 'sugars', 'sugars_unit', 'sodium', 'sodium_unit', - 'fibers', 'fibers_unit'] - -other_tags = [ -'serving', -'serving_unit', -'calories', -'calories_unit', -'proteins_serving', -'proteins_unit', -'fat_serving', -'fat_unit', -'carbohydrates_serving', -'carbohydrates_unit', -'sugars_serving', -'sugars_unit', -'sodium_serving', -'sodium_unit', -'fiber_serving', -'fiber_unit', -] - -nutriments = test['nutriments'].replace("'", '"') -nutriments = nutriments.replace("{", "").replace("}", "") -key_values = nutriments.split(", ") -nutriments = {} - -if key_values != ['']: - for s in key_values: - s= s.split(": ") - k = s[0].replace('"', "") - v = s[1].replace('"', "") - nutriments[k] = v - -nutrients = {} -for i in range(len(other_tags)): - if other_tags[i] in nutriments.keys(): - nutrients[t[i]] = nutriments[other_tags[i]] - else: - nutrients[t[i]] = '' - -food_groups = test['food_groups_tags'] -food_groups = food_groups.replace('[', "").replace("]", "") -food_groups = food_groups.replace("'", "") -food_groups = food_groups.split(", ") - -ingrediants = test['ingredients_hierarchy'] -ingrediants = ingrediants.replace('[', "").replace("]", "") -ingrediants = ingrediants.replace("'", "") -ingrediants = ingrediants.split(", ") - -food_info_payload = [ - lst2pgarr(food_groups), # food_groups - lst2pgarr(ingrediants), # ingrediants - json.dumps(nutrients), - False # expires -] - -brand_payload = [test['brands'],] + item = database.insertItemTuple(conn, site_name, item.payload(), convert=True) + item = database.getItemAllByID(conn, site_name, (item['id'], ), convert=True) + print("Item:", item) + with conn.cursor() as cur: + cur.execute(f"SELECT id FROM {site_name}_locations WHERE uuid=%s;", (uuid, )) + location_id = cur.fetchone()[0] -logistics_info_id = 0 -item_info_id = 0 -food_info_id = 0 -brand_id = 0 + print("Location ID:", location_id) + item_location = MyDataclasses.ItemLocationPayload(item['id'], location_id) + location = database.insertItemLocationsTuple(conn, site_name, item_location.payload(), convert=True) -database_config = config() -with psycopg2.connect(**database_config) as conn: - logistics_info = database.insertLogisticsInfoTuple(conn, "main", logistics_info_payload) - item_info = database.insertItemInfoTuple(conn, "main", item_info_payload) - food_info = database.insertFoodInfoTuple(conn, "main", food_info_payload) - brand = database.insertBrandsTuple(conn, "main", brand_payload) + print("Item location:", location) - print("Logistics:", logistics_info) - print("item_info:", item_info) - print("food_info:", food_info) - print("brand:", brand) - - name = test['name'] - name = name.replace("'", "@&apostraphe&") - description = "" - tags = lst2pgarr([]) - links = json.dumps({}) - search_string = f"{test['barcode']}&{name}" - - item_payload = [ - test['barcode'], - test['name'], - brand[0], - description, - tags, - links, - item_info[0], - logistics_info[0], - food_info[0], - "single", - test["sub_type"], - search_string - ] - - print("Item:", item_payload) - - item = database.insertItemTuple(conn, "main", item_payload) - print(item) - with conn.cursor() as cur: - cur.execute(f"SELECT id FROM {site_name}_locations WHERE uuid=%s;", (uuid, )) - location_id = cur.fetchone()[0] + creation_tuple = MyDataclasses.TransactionPayload( + datetime.datetime.now(), + logistics_info[0], + item['barcode'], + item['item_name'], + "SYSTEM", + 0.0, + "Item added to the System!", + 1, + {'location': uuid} + ) - print("Location ID:", location_id) + database.insertTransactionsTuple(conn, site_name, creation_tuple.payload()) - item_location_payload = [ - item[0], - location_id, - 0.0, - main.lst2pgarr([]) - ] + qoh = float(test['qty_on_hand']) + print(qoh, type(qoh)) + trans_type = "Adjust In" + if qoh != 0.0: + if qoh >= 0.0: + trans_type = "Adjust In" + else: + trans_type = "Adjust Out" - location = database.insertItemLocationsTuple(conn, site_name, item_location_payload) + payload = { + 'item_id': item['id'], + 'logistics_info_id': item['logistics_info_id'], + 'barcode': item['barcode'], + 'item_name': item['item_name'], + 'transaction_type': trans_type, + 'quantity': float(qoh), + 'description': f'creation quantity', + 'cost': item['item_info']['cost'], + 'vendor': 1, + 'expires': None, + 'location_id': location_id + } - print("Item location:", location) - - creation_payload = [ - datetime.datetime.now(), - logistics_info[0], - test['barcode'], - name, - "SYSTEM", - 0.0, - "Item Added to System!", - 1, - json.dumps({'location': uuid}) - ] + process.postTransaction(conn, site_name, 1, payload) + conn.commit() + except Exception as error: + print(error, item_info) - transaction = database.insertTransactionsTuple(conn, site_name, creation_payload) - - print("transaction:", transaction) - - qoh = float(test['qty_on_hand']) - print(qoh, type(qoh)) - if qoh != 0.0: - if qoh >= 0.0: - trans_type = "Adjust In" - else: - trans_type = "Adjust Out" - - adjustment_payload = [ - datetime.datetime.now(), - logistics_info[0], - test['barcode'], - name, - trans_type, - qoh, - "", - 1, - json.dumps({'location': uuid, 'cost': item_info[8]}) - ] - - transaction = database.insertTransactionsTuple(conn, site_name, adjustment_payload) - print("transaction:", transaction) - - cost_layer_payload = [ - datetime.datetime.now(), - float(qoh), - float(test['cost']), - 'USD', - None, - 0 - ] - print(cost_layer_payload) - cost_layer = database.insertCostLayersTuple(conn, site_name, cost_layer_payload) - print("cost_layer:", cost_layer) - - layer_payload = [ - cost_layer[0], - float(location[3]) + float(qoh), - location_id, # location_id - item[0] # part_id - ] - - print(layer_payload) - location = database.updateItemLocation(conn, site_name, layer_payload) - print(location) - - print("\n") - conn.commit() - -# need to insert into Item_Locations, part_id and location id +def importCSV(path, site_name): + database_config = config() + with psycopg2.connect(**database_config) as conn: + site = database.selectSiteTuple(conn, (site_name,), convert=True) + default_zone = database.__selectTuple(conn, site_name, f"{site_name}_zones", (site['default_zone'], ), convert=True) + default_location = database.__selectTuple(conn, site_name, f"{site_name}_locations", (site['default_primary_location'],), convert=True) + uuid = f"{default_zone['name']}@{default_location['name']}" + print(uuid) + with open(path, "r+", encoding="utf-8") as file: + csv_reader = csv.DictReader(file) + for row in csv_reader: + try: + importItemFromCSV(row, site_name, uuid, site) + except Exception as error: + with open("process.log", "a+") as file: + file.write("\n") + file.write(f"{datetime.datetime.now()} --- CAUTION --- {error}\n") + file.write(f"{" "*41}{json.dumps(row)}") -qoh = float(test['qty_on_hand']) +#importCSV("2025-03-19-Pantry (1).csv", "main") -# transact qoh into the system \ No newline at end of file +def importLinkFromCSV(row, site_name, conn): + barcode = row['barcode'] + link_barcode=row['link_barcode'] + item_data=json.loads(row['data'].replace('\\j*s*o*n\\', "")) + conv_factor=row['conv_factor'] + + link_item = database.getItemAllByBarcode(conn, site_name, (link_barcode, ), convert=True) + + link = MyDataclasses.ItemLinkPayload( + barcode=barcode, + link=link_item['id'], + data=item_data, + conv_factor=conv_factor + ) + + newitem = { + 'barcode': barcode, + 'name': item_data['name'], + 'subtype': '' + } + + try: + process.postNewBlankItem(conn, site_name, 1, newitem) + except Exception as error: + print(error) + pass + + lin = database.insertItemLinksTuple(conn, site_name, link.payload()) + print(lin) + +def importLinksFromCSV(path, site_name): + database_config = config() + with psycopg2.connect(**database_config) as conn: + with open(path, "r+", encoding="utf-8") as file: + csv_reader = csv.DictReader(file) + for row in csv_reader: + try: + importLinkFromCSV(row, site_name, conn) + except Exception as error: + with open("process.log", "a+") as file: + file.write("\n") + file.write(f"{datetime.datetime.now()} --- CAUTION --- {error}\n") + file.write(f"{" "*41}{json.dumps(row)}") + +importLinksFromCSV("test.csv", 'test') \ No newline at end of file diff --git a/shopping_list_API.py b/shopping_list_API.py new file mode 100644 index 0000000..5becc3e --- /dev/null +++ b/shopping_list_API.py @@ -0,0 +1,186 @@ +from flask import Blueprint, request, render_template, redirect, session, url_for, send_file, jsonify, Response +import psycopg2, math, json, datetime, main, copy, requests, process, database, pprint, MyDataclasses +from config import config, sites_config +from main import unfoldCostLayers +from user_api import login_required +import postsqldb + +shopping_list_api = Blueprint('shopping_list_API', __name__) + +@shopping_list_api.route("/shopping-lists") +@login_required +def shopping_lists(): + sites = [site[1] for site in main.get_sites(session['user']['sites'])] + return render_template("shopping-lists/index.html", current_site=session['selected_site'], sites=sites) + +@shopping_list_api.route("/shopping-list//") +@login_required +def shopping_list(mode, id): + sites = [site[1] for site in main.get_sites(session['user']['sites'])] + if mode == "view": + return render_template("shopping-lists/view.html", id=id, current_site=session['selected_site'], sites=sites) + if mode == "edit": + return render_template("shopping-lists/edit.html", id=id, current_site=session['selected_site'], sites=sites) + return redirect("/") + +@shopping_list_api.route('/shopping-lists/addList', methods=["POST"]) +def addList(): + if request.method == "POST": + list_name = request.get_json()['list_name'] + list_description = request.get_json()['list_description'] + list_type = request.get_json()['list_type'] + database_config = config() + site_name = session['selected_site'] + user_id = session['user_id'] + with psycopg2.connect(**database_config) as conn: + shopping_list = MyDataclasses.ShoppingListPayload( + name=list_name, + description=list_description, + author=user_id, + type=list_type + ) + database.insertShoppingListsTuple(conn, site_name, shopping_list.payload()) + return jsonify({'error': False, 'message': 'List added!!'}) + return jsonify({'error': True, 'message': 'These was an error with adding the list!'}) + +@shopping_list_api.route('/shopping-lists/getLists', methods=["GET"]) +def getShoppingLists(): + lists = [] + if request.method == "GET": + page = int(request.args.get('page', 1)) + limit = int(request.args.get('limit', 1)) + offset = (page-1)*limit + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + lists, count = database.getShoppingLists(conn, site_name, (limit, offset), convert=True) + + for list in lists: + + if list['type'] == 'calculated': + items = [] + not_items = database.getItemsSafetyStock(conn, site_name, convert=True) + for item in not_items: + new_item = { + 'id': item['id'], + 'uuid': item['barcode'], + 'sl_id': 0, + 'item_type': 'sku', + 'item_name': item['item_name'], + 'uom': item['uom'], + 'qty': float(float(item['safety_stock']) - float(item['total_sum'])), + 'item_id': item['id'], + 'links': item['links'] + } + items.append(new_item) + list['sl_items'] = items + + return jsonify({'shopping_lists': lists, 'end':math.ceil(count/limit), 'error': False, 'message': 'Lists queried successfully!'}) + +@shopping_list_api.route('/shopping-lists/getList', methods=["GET"]) +def getShoppingList(): + if request.method == "GET": + sl_id = int(request.args.get('id', 1)) + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + lists = database.getShoppingList(conn, site_name, (sl_id, ), convert=True) + return jsonify({'shopping_list': lists, 'error': False, 'message': 'Lists queried successfully!'}) + +@shopping_list_api.route('/shopping-lists/getListItem', methods=["GET"]) +def getShoppingListItem(): + list_item = {} + if request.method == "GET": + sli_id = int(request.args.get('sli_id', 1)) + database_config = config() + site_name = session['selected_site'] + with psycopg2.connect(**database_config) as conn: + list_item = postsqldb.ShoppingListsTable.getItem(conn, site_name, (sli_id, )) + return jsonify({'list_item': list_item, 'error': False, 'message': 'Lists Items queried successfully!'}) + return jsonify({'list_item': list_item, 'error': True, 'message': 'List Items queried unsuccessfully!'}) + +@shopping_list_api.route('/shopping-lists/getItems', methods=["GET"]) +def getItems(): + recordset = [] + count = {'count': 0} + if request.method == "GET": + page = int(request.args.get('page', 1)) + limit = int(request.args.get('limit', 10)) + search_string = request.args.get('search_string', 10) + site_name = session['selected_site'] + offset = (page - 1) * limit + database_config = config() + with psycopg2.connect(**database_config) as conn: + payload = (search_string, limit, offset) + recordset, count = database.getItemsWithQOH(conn, site_name, payload, convert=True) + return jsonify({"items":recordset, "end":math.ceil(count['count']/limit), "error":False, "message":"items fetched succesfully!"}) + return jsonify({"items":recordset, "end":math.ceil(count['count']/limit), "error":True, "message":"There was an error with this GET statement"}) + +@shopping_list_api.route('/shopping-lists/postListItem', methods=["POST"]) +def postListItem(): + if request.method == "POST": + data = request.get_json()['data'] + site_name = session['selected_site'] + database_config = config() + with psycopg2.connect(**database_config) as conn: + sl_item = MyDataclasses.ShoppingListItemPayload( + uuid = data['uuid'], + sl_id = data['sl_id'], + item_type=data['item_type'], + item_name=data['item_name'], + uom=data['uom'], + qty=data['qty'], + item_id=data['item_id'], + links=data['links'] + ) + database.insertShoppingListItemsTuple(conn, site_name, sl_item.payload()) + return jsonify({"error":False, "message":"items fetched succesfully!"}) + return jsonify({"error":True, "message":"There was an error with this GET statement"}) + +@shopping_list_api.route('/shopping-lists/deleteListItem', methods=["POST"]) +def deleteListItem(): + if request.method == "POST": + sli_id = request.get_json()['sli_id'] + site_name = session['selected_site'] + database_config = config() + with psycopg2.connect(**database_config) as conn: + database.deleteShoppingListItemsTuple(conn, site_name, (sli_id, )) + return jsonify({"error":False, "message":"item deleted succesfully!"}) + return jsonify({"error":True, "message":"There was an error with this POST statement"}) + +@shopping_list_api.route('/shopping-lists/saveListItem', methods=["POST"]) +def saveListItem(): + if request.method == "POST": + sli_id = request.get_json()['sli_id'] + update = request.get_json()['update'] + site_name = session['selected_site'] + database_config = config() + with psycopg2.connect(**database_config) as conn: + database.__updateTuple(conn, site_name, f"{site_name}_shopping_list_items", {'id': sli_id, 'update': update}) + return jsonify({"error":False, "message":"items fetched succesfully!"}) + return jsonify({"error":True, "message":"There was an error with this GET statement"}) + +@shopping_list_api.route('/shopping-lists/getSKUItemsFull', methods=["GET"]) +def getSKUItemsFull(): + items = [] + count = {'count': 0} + if request.method == "GET": + site_name = session['selected_site'] + database_config = config() + with psycopg2.connect(**database_config) as conn: + not_items = database.getItemsSafetyStock(conn, site_name, convert=True) + for item in not_items: + new_item = { + 'id': item['id'], + 'uuid': item['barcode'], + 'sl_id': 0, + 'item_type': 'sku', + 'item_name': item['item_name'], + 'uom': item['uom'], + 'qty': float(float(item['safety_stock']) - float(item['total_sum'])), + 'item_id': item['id'], + 'links': item['links'] + } + items.append(new_item) + return jsonify({"list_items":items, "error":False, "message":"items fetched succesfully!"}) + return jsonify({"list_items":items, "error":True, "message":"There was an error with this GET statement"}) diff --git a/sites/default/sql/create/item.sql b/sites/default/sql/create/item.sql index 9c3ab71..7dac3c2 100644 --- a/sites/default/sql/create/item.sql +++ b/sites/default/sql/create/item.sql @@ -23,8 +23,7 @@ CREATE TABLE IF NOT EXISTS %sitename%_items( ON DELETE CASCADE, CONSTRAINT fk_brand FOREIGN KEY(brand) - REFERENCES %sitename%_brands(id) - ON DELETE CASCADE, + REFERENCES %sitename%_brands(id), CONSTRAINT fk_logistics_info FOREIGN KEY(logistics_info_id) REFERENCES %sitename%_logistics_info(id) diff --git a/sites/default/sql/create/item_locations.sql b/sites/default/sql/create/item_locations.sql index ab419dc..e76941b 100644 --- a/sites/default/sql/create/item_locations.sql +++ b/sites/default/sql/create/item_locations.sql @@ -7,10 +7,8 @@ CREATE TABLE IF NOT EXISTS %sitename%_item_locations( UNIQUE(part_id, location_id), CONSTRAINT fk_part_id FOREIGN KEY(part_id) - REFERENCES %sitename%_items(id) - ON DELETE CASCADE, + REFERENCES %sitename%_items(id), CONSTRAINT fk_location_id FOREIGN KEY(location_id) REFERENCES %sitename%_locations(id) - ON DELETE CASCADE ); \ No newline at end of file diff --git a/sites/default/sql/create/receipt_items.sql b/sites/default/sql/create/receipt_items.sql index 42a06ea..0cf5ae4 100644 --- a/sites/default/sql/create/receipt_items.sql +++ b/sites/default/sql/create/receipt_items.sql @@ -10,4 +10,5 @@ CREATE TABLE IF NOT EXISTS %sitename%_receipt_items ( CONSTRAINT fk_receipt FOREIGN KEY(receipt_id) REFERENCES %sitename%_receipts(id) + ON DELETE CASCADE ); \ No newline at end of file diff --git a/sites/default/sql/create/shopping_list_items.sql b/sites/default/sql/create/shopping_list_items.sql new file mode 100644 index 0000000..12f0de3 --- /dev/null +++ b/sites/default/sql/create/shopping_list_items.sql @@ -0,0 +1,20 @@ +CREATE TABLE IF NOT EXISTS %sitename%_shopping_list_items ( + id SERIAL PRIMARY KEY, + uuid VARCHAR(32) NOT NULL, + sl_id INTEGER NOT NULL, + item_type VARCHAR(32) NOT NULL, + item_name TEXT NOT NULL, + uom VARCHAR(32) NOT NULL, + qty FLOAT8 NOT NULL, + item_id INTEGER DEFAULT NULL, + links JSONB DEFAULT '{"main": ""}', + UNIQUE(uuid), + CONSTRAINT fk_sl_id + FOREIGN KEY(sl_id) + REFERENCES %sitename%_shopping_lists(id) + ON DELETE CASCADE, + CONSTRAINT fk_item_id + FOREIGN KEY(item_id) + REFERENCES %sitename%_items(id) + ON DELETE CASCADE +); \ No newline at end of file diff --git a/sites/default/sql/create/shopping_lists.sql b/sites/default/sql/create/shopping_lists.sql index 3496d8d..007c1b7 100644 --- a/sites/default/sql/create/shopping_lists.sql +++ b/sites/default/sql/create/shopping_lists.sql @@ -1,12 +1,7 @@ CREATE TABLE IF NOT EXISTS %sitename%_shopping_lists ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, - description TEXT, - pantry_items INTEGER [], - custom_items JSONB, - recipes INTEGER [], - groups INTEGER [], - quantities JSONB, + description TEXT, author INTEGER, creation_date TIMESTAMP, type VARCHAR(64), diff --git a/sites/default/sql/drop/brands.sql b/sites/default/sql/drop/brands.sql index f849ca8..c3ab4cf 100644 --- a/sites/default/sql/drop/brands.sql +++ b/sites/default/sql/drop/brands.sql @@ -1 +1 @@ -DROP TABLE %sitename%_brands CASCADE; \ No newline at end of file +DROP TABLE %%site_name%%_brands CASCADE; \ No newline at end of file diff --git a/sites/default/sql/drop/shopping_list_items.sql b/sites/default/sql/drop/shopping_list_items.sql new file mode 100644 index 0000000..ac22e23 --- /dev/null +++ b/sites/default/sql/drop/shopping_list_items.sql @@ -0,0 +1 @@ +DROP TABLE %sitename%_shopping_list_items CASCADE; \ No newline at end of file diff --git a/sites/main/sql/create/item.sql b/sites/main/sql/create/item.sql index 5734a61..e68152b 100644 --- a/sites/main/sql/create/item.sql +++ b/sites/main/sql/create/item.sql @@ -23,8 +23,7 @@ CREATE TABLE IF NOT EXISTS main_items( ON DELETE CASCADE, CONSTRAINT fk_brand FOREIGN KEY(brand) - REFERENCES main_brands(id) - ON DELETE CASCADE, + REFERENCES main_brands(id), CONSTRAINT fk_logistics_info FOREIGN KEY(logistics_info_id) REFERENCES main_logistics_info(id) diff --git a/sites/main/sql/create/item_locations.sql b/sites/main/sql/create/item_locations.sql index 236cdae..1efb73c 100644 --- a/sites/main/sql/create/item_locations.sql +++ b/sites/main/sql/create/item_locations.sql @@ -7,10 +7,8 @@ CREATE TABLE IF NOT EXISTS main_item_locations( UNIQUE(part_id, location_id), CONSTRAINT fk_part_id FOREIGN KEY(part_id) - REFERENCES main_items(id) - ON DELETE CASCADE, + REFERENCES main_items(id), CONSTRAINT fk_location_id FOREIGN KEY(location_id) REFERENCES main_locations(id) - ON DELETE CASCADE ); \ No newline at end of file diff --git a/sites/main/sql/create/receipt_items.sql b/sites/main/sql/create/receipt_items.sql index e9353ee..41319ca 100644 --- a/sites/main/sql/create/receipt_items.sql +++ b/sites/main/sql/create/receipt_items.sql @@ -10,4 +10,5 @@ CREATE TABLE IF NOT EXISTS main_receipt_items ( CONSTRAINT fk_receipt FOREIGN KEY(receipt_id) REFERENCES main_receipts(id) + ON DELETE CASCADE ); \ No newline at end of file diff --git a/sites/main/sql/create/shopping_list_items.sql b/sites/main/sql/create/shopping_list_items.sql new file mode 100644 index 0000000..0f9b4fd --- /dev/null +++ b/sites/main/sql/create/shopping_list_items.sql @@ -0,0 +1,20 @@ +CREATE TABLE IF NOT EXISTS main_shopping_list_items ( + id SERIAL PRIMARY KEY, + uuid VARCHAR(32) NOT NULL, + sl_id INTEGER NOT NULL, + item_type VARCHAR(32) NOT NULL, + item_name TEXT NOT NULL, + uom VARCHAR(32) NOT NULL, + qty FLOAT8 NOT NULL, + item_id INTEGER DEFAULT NULL, + links JSONB DEFAULT '{"main": ""}', + UNIQUE(uuid), + CONSTRAINT fk_sl_id + FOREIGN KEY(sl_id) + REFERENCES main_shopping_lists(id) + ON DELETE CASCADE, + CONSTRAINT fk_item_id + FOREIGN KEY(item_id) + REFERENCES main_items(id) + ON DELETE CASCADE +); \ No newline at end of file diff --git a/sites/main/sql/create/shopping_lists.sql b/sites/main/sql/create/shopping_lists.sql index cfd9945..581137c 100644 --- a/sites/main/sql/create/shopping_lists.sql +++ b/sites/main/sql/create/shopping_lists.sql @@ -1,12 +1,7 @@ CREATE TABLE IF NOT EXISTS main_shopping_lists ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, - description TEXT, - pantry_items INTEGER [], - custom_items JSONB, - recipes INTEGER [], - groups INTEGER [], - quantities JSONB, + description TEXT, author INTEGER, creation_date TIMESTAMP, type VARCHAR(64), diff --git a/sites/main/sql/drop/brands.sql b/sites/main/sql/drop/brands.sql index 62263a0..c3ab4cf 100644 --- a/sites/main/sql/drop/brands.sql +++ b/sites/main/sql/drop/brands.sql @@ -1 +1 @@ -DROP TABLE main_brands CASCADE; \ No newline at end of file +DROP TABLE %%site_name%%_brands CASCADE; \ No newline at end of file diff --git a/sites/main/sql/drop/shopping_list_items.sql b/sites/main/sql/drop/shopping_list_items.sql new file mode 100644 index 0000000..a92f3f0 --- /dev/null +++ b/sites/main/sql/drop/shopping_list_items.sql @@ -0,0 +1 @@ +DROP TABLE main_shopping_list_items CASCADE; \ No newline at end of file diff --git a/sql/CREATE/brands.sql b/sql/CREATE/brands.sql new file mode 100644 index 0000000..371e12a --- /dev/null +++ b/sql/CREATE/brands.sql @@ -0,0 +1,4 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_brands ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) +); \ No newline at end of file diff --git a/sql/CREATE/conversions.sql b/sql/CREATE/conversions.sql new file mode 100644 index 0000000..69d6747 --- /dev/null +++ b/sql/CREATE/conversions.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_conversions ( + id SERIAL PRIMARY KEY, + item_id INTEGER NOT NULL, + uom_id INTEGER NOT NULL, + conv_factor FLOAT8 NOT NULL, + UNIQUE(item_id, uom_id) +); \ No newline at end of file diff --git a/sql/CREATE/cost_layers.sql b/sql/CREATE/cost_layers.sql new file mode 100644 index 0000000..3c4ca5a --- /dev/null +++ b/sql/CREATE/cost_layers.sql @@ -0,0 +1,9 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_cost_layers ( + id SERIAL PRIMARY KEY, + aquisition_date TIMESTAMP NOT NULL, + quantity FLOAT8 NOT NULL, + cost FLOAT8 NOT NULL, + currency_type VARCHAR(16) NOT NULL, + expires TIMESTAMP, + vendor INTEGER DEFAULT 0 +); \ No newline at end of file diff --git a/sql/CREATE/food_info.sql b/sql/CREATE/food_info.sql new file mode 100644 index 0000000..18a0e92 --- /dev/null +++ b/sql/CREATE/food_info.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_food_info ( + id SERIAL PRIMARY KEY, + food_groups TEXT [], + ingrediants TEXT [], + nutrients JSONB, + expires BOOLEAN, + default_expiration FLOAT8 +); \ No newline at end of file diff --git a/sql/CREATE/group_items.sql b/sql/CREATE/group_items.sql new file mode 100644 index 0000000..561afb8 --- /dev/null +++ b/sql/CREATE/group_items.sql @@ -0,0 +1,20 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_group_items( + id SERIAL PRIMARY KEY, + uuid VARCHAR(32) NOT NULL, + gr_id INTEGER NOT NULL, + item_type VARCHAR(32) NOT NULL, + item_name TEXT NOT NULL, + uom INTEGER NOT NULL, + qty FLOAT8 NOT NULL, + item_id INTEGER DEFAULT NULL, + links JSONB DEFAULT '{"main": ""}', + UNIQUE(uuid), + CONSTRAINT fk_gr_id + FOREIGN KEY(gr_id) + REFERENCES %%site_name%%_groups(id) + ON DELETE CASCADE, + CONSTRAINT fk_item_id + FOREIGN KEY(item_id) + REFERENCES %%site_name%%_items(id) + ON DELETE CASCADE +); \ No newline at end of file diff --git a/sql/CREATE/groups.sql b/sql/CREATE/groups.sql new file mode 100644 index 0000000..bc3d5d9 --- /dev/null +++ b/sql/CREATE/groups.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_groups( + id SERIAL PRIMARY KEY, + name VARCHAR(255) NOT NULL, + description TEXT, + group_type VARCHAR(255), + UNIQUE (name) +); \ No newline at end of file diff --git a/sql/CREATE/item.sql b/sql/CREATE/item.sql new file mode 100644 index 0000000..0384621 --- /dev/null +++ b/sql/CREATE/item.sql @@ -0,0 +1,31 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_items( + id SERIAL PRIMARY KEY, + barcode VARCHAR(255) NOT NULL, + item_name VARCHAR(255) NOT NULL, + brand INTEGER, + description TEXT, + tags TEXT [], + links JSONB, + item_info_id INTEGER NOT NULL, + logistics_info_id INTEGER NOT NULL, + food_info_id INTEGER, + row_type VARCHAR(255) NOT NULL, + item_type VARCHAR(255) NOT NULL, + search_string TEXT NOT NULL, + UNIQUE(barcode, item_info_id), + CONSTRAINT fk_item_info + FOREIGN KEY(item_info_id) + REFERENCES %%site_name%%_item_info(id) + ON DELETE CASCADE, + CONSTRAINT fk_food_info + FOREIGN KEY(food_info_id) + REFERENCES %%site_name%%_food_info(id) + ON DELETE CASCADE, + CONSTRAINT fk_brand + FOREIGN KEY(brand) + REFERENCES %%site_name%%_brands(id), + CONSTRAINT fk_logistics_info + FOREIGN KEY(logistics_info_id) + REFERENCES %%site_name%%_logistics_info(id) + ON DELETE CASCADE +); diff --git a/sql/CREATE/item_info.sql b/sql/CREATE/item_info.sql new file mode 100644 index 0000000..0dd1d93 --- /dev/null +++ b/sql/CREATE/item_info.sql @@ -0,0 +1,13 @@ +CREATE TABLE IF NOt EXISTS %%site_name%%_item_info ( + id SERIAL PRIMARY KEY, + barcode VARCHAR(255) NOT NULL, + packaging VARCHAR(255), + uom_quantity FLOAT8, + uom INTEGER, + cost FLOAT8, + safety_stock FLOAT8, + lead_time_days FLOAT8, + ai_pick BOOLEAN, + prefixes INTEGER [], + UNIQUE(barcode) +); \ No newline at end of file diff --git a/sql/CREATE/item_locations.sql b/sql/CREATE/item_locations.sql new file mode 100644 index 0000000..f13338c --- /dev/null +++ b/sql/CREATE/item_locations.sql @@ -0,0 +1,16 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_item_locations( + id SERIAL PRIMARY KEY, + part_id INTEGER NOT NULL, + location_id INTEGER NOT NULL, + quantity_on_hand FLOAT8 NOT NULL, + cost_layers INTEGER[] DEFAULT '{}', + UNIQUE(part_id, location_id), + CONSTRAINT fk_part_id + FOREIGN KEY(part_id) + REFERENCES %%site_name%%_items(id) + ON DELETE CASCADE, + CONSTRAINT fk_location_id + FOREIGN KEY(location_id) + REFERENCES %%site_name%%_locations(id) + ON DELETE CASCADE +); \ No newline at end of file diff --git a/sql/CREATE/linked_items.sql b/sql/CREATE/linked_items.sql new file mode 100644 index 0000000..b3a4646 --- /dev/null +++ b/sql/CREATE/linked_items.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_itemlinks ( + id SERIAL PRIMARY KEY, + barcode VARCHAR(255) NOt NULL, + link INTEGER NOT NULL, + data JSONB NOT NULL, + conv_factor FLOAT8 NOt NULL, + UNIQUE(barcode) +); \ No newline at end of file diff --git a/sql/CREATE/locations.sql b/sql/CREATE/locations.sql new file mode 100644 index 0000000..a3896e2 --- /dev/null +++ b/sql/CREATE/locations.sql @@ -0,0 +1,10 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_locations( + id SERIAL PRIMARY KEY, + uuid VARCHAR(255) NOT NULL, + name VARCHAR(32) NOT NULL, + zone_id INTEGER NOT NULL, + UNIQUE(uuid), + CONSTRAINT fk_zone + FOREIGN KEY(zone_id) + REFERENCES %%site_name%%_zones(id) +); \ No newline at end of file diff --git a/sql/CREATE/logins.sql b/sql/CREATE/logins.sql new file mode 100644 index 0000000..908fa04 --- /dev/null +++ b/sql/CREATE/logins.sql @@ -0,0 +1,23 @@ +CREATE TABLE IF NOT EXISTS logins( + id SERIAL PRIMARY KEY, + username VARCHAR(255), + password VARCHAR(255), + email VARCHAR(255) UNIQUE NOT NULL, + favorites JSONB DEFAULT '{}', + unseen_pantry_items INTEGER [] DEFAULT '{}', + unseen_groups INTEGER [] DEFAULT '{}', + unseen_shopping_lists INTEGER [] DEFAULT '{}', + unseen_recipes INTEGER [] DEFAULT '{}', + seen_pantry_items INTEGER [] DEFAULT '{}', + seen_groups INTEGER[] DEFAULT '{}', + seen_shopping_lists INTEGER [] DEFAULT '{}', + seen_recipes INTEGER [] DEFAULT '{}', + sites INTEGER [] DEFAULT '{}', + site_roles INTEGER [] DEFAULT '{}', + system_admin BOOLEAN DEFAULT FALSE, + flags JSONB DEFAULT '{}', + row_type VARCHAR(50), + UNIQUE(username), + CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$') +); + diff --git a/sql/CREATE/logistics_info.sql b/sql/CREATE/logistics_info.sql new file mode 100644 index 0000000..dbf9f6e --- /dev/null +++ b/sql/CREATE/logistics_info.sql @@ -0,0 +1,21 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_logistics_info( + id SERIAL PRIMARY KEY, + barcode VARCHAR(255) NOT NULL, + primary_location INTEGER NOT NULL, + primary_zone INTEGER NOT NULL, + auto_issue_location INTEGER NOT NULL, + auto_issue_zone INTEGER NOT NULL, + UNIQUE(barcode), + CONSTRAINT fk_primary_location + FOREIGN KEY(primary_location) + REFERENCES %%site_name%%_locations(id), + CONSTRAINT fk_primary_zone + FOREIGN KEY(primary_zone) + REFERENCES %%site_name%%_zones(id), + CONSTRAINT fk_auto_issue_location + FOREIGN KEY(auto_issue_location) + REFERENCES %%site_name%%_locations(id), + CONSTRAINT fk_auto_issue_zone + FOREIGN KEY(auto_issue_zone) + REFERENCES %%site_name%%_zones(id) +); \ No newline at end of file diff --git a/sql/CREATE/receipt_items.sql b/sql/CREATE/receipt_items.sql new file mode 100644 index 0000000..cfb9eb6 --- /dev/null +++ b/sql/CREATE/receipt_items.sql @@ -0,0 +1,15 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_receipt_items ( + id SERIAL PRIMARY KEY, + type VARCHAR(255) NOT NULL, + receipt_id INTEGER NOT NULL, + barcode VARCHAR(255) NOT NULL, + name VARCHAR(255) NOT NULL, + qty FLOAT8 NOT NULL, + uom VARCHAR(32) NOT NULL, + data JSONB, + status VARCHAR (64), + CONSTRAINT fk_receipt + FOREIGN KEY(receipt_id) + REFERENCES %%site_name%%_receipts(id) + ON DELETE CASCADE +); \ No newline at end of file diff --git a/sql/CREATE/receipts.sql b/sql/CREATE/receipts.sql new file mode 100644 index 0000000..a5667bc --- /dev/null +++ b/sql/CREATE/receipts.sql @@ -0,0 +1,13 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_receipts ( + id SERIAL PRIMARY KEY, + receipt_id VARCHAR (32) NOT NULL, + receipt_status VARCHAR (64) NOT NULL, + date_submitted TIMESTAMP NOT NULL, + submitted_by INTEGER NOT NULL, + vendor_id INTEGER, + files JSONB, + UNIQUE(receipt_id), + CONSTRAINT fk_vendor + FOREIGN KEY(vendor_id) + REFERENCES %%site_name%%_vendors(id) +); \ No newline at end of file diff --git a/sql/CREATE/recipe_items.sql b/sql/CREATE/recipe_items.sql new file mode 100644 index 0000000..1a5f49d --- /dev/null +++ b/sql/CREATE/recipe_items.sql @@ -0,0 +1,20 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_recipe_items ( + id SERIAL PRIMARY KEY, + uuid VARCHAR(32) NOT NULL, + rp_id INTEGER NOT NULL, + item_type VARCHAR(32) NOT NULL, + item_name TEXT NOT NULL, + uom INTEGER NOT NULL, + qty FLOAT8 NOT NULL, + item_id INTEGER DEFAULT NULL, + links JSONB DEFAULT '{"main": ""}', + UNIQUE(uuid), + CONSTRAINT fk_rp_id + FOREIGN KEY(rp_id) + REFERENCES %%site_name%%_recipes(id) + ON DELETE CASCADE, + CONSTRAINT fk_item_id + FOREIGN KEY(item_id) + REFERENCES %%site_name%%_items(id) + ON DELETE CASCADE +); \ No newline at end of file diff --git a/sql/CREATE/recipes.sql b/sql/CREATE/recipes.sql new file mode 100644 index 0000000..5611abb --- /dev/null +++ b/sql/CREATE/recipes.sql @@ -0,0 +1,9 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_recipes ( + id SERIAL PRIMARY KEY, + name VARCHAR, + author INTEGER, + description TEXT, + creation_date TIMESTAMP, + instructions TEXT [], + picture_path TEXT +); \ No newline at end of file diff --git a/sql/CREATE/roles.sql b/sql/CREATE/roles.sql new file mode 100644 index 0000000..802584f --- /dev/null +++ b/sql/CREATE/roles.sql @@ -0,0 +1,11 @@ +CREATE TABLE IF NOT EXISTS roles( + id SERIAL PRIMARY KEY, + role_name VARCHAR(255) NOT NULL, + role_description TEXT, + site_id INTEGER NOT NULL, + flags JSONB DEFAULT '{}', + UNIQUE(role_name, site_id), + CONSTRAINT fk_site + FOREIGN KEY(site_id) + REFERENCES sites(id) +); \ No newline at end of file diff --git a/sql/CREATE/shopping_list_items.sql b/sql/CREATE/shopping_list_items.sql new file mode 100644 index 0000000..7dd074d --- /dev/null +++ b/sql/CREATE/shopping_list_items.sql @@ -0,0 +1,20 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_shopping_list_items ( + id SERIAL PRIMARY KEY, + uuid VARCHAR(32) NOT NULL, + sl_id INTEGER NOT NULL, + item_type VARCHAR(32) NOT NULL, + item_name TEXT NOT NULL, + uom INTEGER NOT NULL, + qty FLOAT8 NOT NULL, + item_id INTEGER DEFAULT NULL, + links JSONB DEFAULT '{"main": ""}', + UNIQUE(uuid, sl_id), + CONSTRAINT fk_sl_id + FOREIGN KEY(sl_id) + REFERENCES %%site_name%%_shopping_lists(id) + ON DELETE CASCADE, + CONSTRAINT fk_item_id + FOREIGN KEY(item_id) + REFERENCES %%site_name%%_items(id) + ON DELETE CASCADE +); \ No newline at end of file diff --git a/sql/CREATE/shopping_lists.sql b/sql/CREATE/shopping_lists.sql new file mode 100644 index 0000000..c88abb0 --- /dev/null +++ b/sql/CREATE/shopping_lists.sql @@ -0,0 +1,9 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_shopping_lists ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) NOT NULL, + description TEXT, + author INTEGER, + creation_date TIMESTAMP, + type VARCHAR(64), + UNIQUE(name) +); \ No newline at end of file diff --git a/sql/CREATE/sites.sql b/sql/CREATE/sites.sql new file mode 100644 index 0000000..ace8adb --- /dev/null +++ b/sql/CREATE/sites.sql @@ -0,0 +1,12 @@ +CREATE TABLE IF NOT EXISTS sites ( + id SERIAL PRIMARY KEY, + site_name VARCHAR(120), + site_description TEXT, + creation_date TIMESTAMP, + site_owner_id INTEGER NOT NULL, + flags JSONB, + default_zone INTEGER DEFAULT NULL, + default_auto_issue_location INTEGER DEFAULT NULL, + default_primary_location INTEGER DEFAULT NULL, + UNIQUE(site_name) +); \ No newline at end of file diff --git a/sql/CREATE/sku_prefix.sql b/sql/CREATE/sku_prefix.sql new file mode 100644 index 0000000..2ac29d0 --- /dev/null +++ b/sql/CREATE/sku_prefix.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_sku_prefix( + id SERIAL PRIMARY KEY, + uuid VARCHAR(16) NOT NULL, + name VARCHAR(255) NOT NULL, + description TEXT, + UNIQUE (name, uuid) +); \ No newline at end of file diff --git a/sql/CREATE/transactions.sql b/sql/CREATE/transactions.sql new file mode 100644 index 0000000..0ddefd6 --- /dev/null +++ b/sql/CREATE/transactions.sql @@ -0,0 +1,16 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_Transactions ( + id SERIAL PRIMARY KEY, + timestamp TIMESTAMP, + logistics_info_id INTEGER NOT NULL, + barcode VARCHAR(255) NOT NULL, + name VARCHAR(255), + transaction_type VARCHAR(255) NOT NULL, + quantity FLOAT8 NOT NULL, + description TEXT, + user_id INTEGER NOT NULL, + data JSONB, + CONSTRAINT fk_logistics_info + FOREIGN KEY(logistics_info_id) + REFERENCES %%site_name%%_logistics_info(id) + ON DELETE CASCADE +); \ No newline at end of file diff --git a/sql/CREATE/units.sql b/sql/CREATE/units.sql new file mode 100644 index 0000000..bb28637 --- /dev/null +++ b/sql/CREATE/units.sql @@ -0,0 +1,10 @@ +CREATE TABLE IF NOT EXISTS units ( + id SERIAL PRIMARY KEY, + plural VARCHAR(32), + single VARCHAR(32), + fullname VARCHAR(255), + description TEXT, + unique(plural), + unique(single), + unique(fullname) +); \ No newline at end of file diff --git a/sql/CREATE/vendors.sql b/sql/CREATE/vendors.sql new file mode 100644 index 0000000..2ffb408 --- /dev/null +++ b/sql/CREATE/vendors.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_vendors ( + id SERIAL PRIMARY KEY, + vendor_name VARCHAR(255) NOT NULL, + vendor_address VARCHAR(255), + creation_date TIMESTAMP NOT NULL, + created_by INTEGER NOT NULL, + phone_number VARCHAR(32) +); \ No newline at end of file diff --git a/sql/CREATE/zones.sql b/sql/CREATE/zones.sql new file mode 100644 index 0000000..03f49c2 --- /dev/null +++ b/sql/CREATE/zones.sql @@ -0,0 +1,9 @@ +CREATE TABLE IF NOT EXISTS %%site_name%%_zones( + id SERIAL PRIMARY KEY, + name VARCHAR(32) NOT NULL, + site_id INTEGER NOT NULL, + UNIQUE(name), + CONSTRAINT fk_site + FOREIGN KEY(site_id) + REFERENCES sites(id) +); diff --git a/sql/DROP/brands.sql b/sql/DROP/brands.sql new file mode 100644 index 0000000..c3ab4cf --- /dev/null +++ b/sql/DROP/brands.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_brands CASCADE; \ No newline at end of file diff --git a/sql/DROP/conversions.sql b/sql/DROP/conversions.sql new file mode 100644 index 0000000..030c936 --- /dev/null +++ b/sql/DROP/conversions.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_conversions CASCADE; \ No newline at end of file diff --git a/sql/DROP/cost_layers.sql b/sql/DROP/cost_layers.sql new file mode 100644 index 0000000..366d26f --- /dev/null +++ b/sql/DROP/cost_layers.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_cost_layers CASCADE; \ No newline at end of file diff --git a/sql/DROP/food_info.sql b/sql/DROP/food_info.sql new file mode 100644 index 0000000..95d461a --- /dev/null +++ b/sql/DROP/food_info.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_food_info CASCADE; \ No newline at end of file diff --git a/sql/DROP/group_items.sql b/sql/DROP/group_items.sql new file mode 100644 index 0000000..a15a69a --- /dev/null +++ b/sql/DROP/group_items.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_group_items CASCADE; \ No newline at end of file diff --git a/sql/DROP/groups.sql b/sql/DROP/groups.sql new file mode 100644 index 0000000..be41091 --- /dev/null +++ b/sql/DROP/groups.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_groups CASCADE; \ No newline at end of file diff --git a/sql/DROP/item_info.sql b/sql/DROP/item_info.sql new file mode 100644 index 0000000..d962ebd --- /dev/null +++ b/sql/DROP/item_info.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_item_info CASCADE; \ No newline at end of file diff --git a/sql/DROP/item_locations.sql b/sql/DROP/item_locations.sql new file mode 100644 index 0000000..d775626 --- /dev/null +++ b/sql/DROP/item_locations.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_item_locations CASCADE; diff --git a/sql/DROP/items.sql b/sql/DROP/items.sql new file mode 100644 index 0000000..8ae4f73 --- /dev/null +++ b/sql/DROP/items.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_items CASCADE; \ No newline at end of file diff --git a/sql/DROP/linked_items.sql b/sql/DROP/linked_items.sql new file mode 100644 index 0000000..793ba3c --- /dev/null +++ b/sql/DROP/linked_items.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_itemlinks CASCADE; \ No newline at end of file diff --git a/sql/DROP/locations.sql b/sql/DROP/locations.sql new file mode 100644 index 0000000..ed8cf16 --- /dev/null +++ b/sql/DROP/locations.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_locations CASCADE; \ No newline at end of file diff --git a/sql/DROP/logistics_info.sql b/sql/DROP/logistics_info.sql new file mode 100644 index 0000000..e22f275 --- /dev/null +++ b/sql/DROP/logistics_info.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_logistics_info CASCADE; \ No newline at end of file diff --git a/sql/DROP/receipt_items.sql b/sql/DROP/receipt_items.sql new file mode 100644 index 0000000..91b7156 --- /dev/null +++ b/sql/DROP/receipt_items.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_receipt_items CASCADE; \ No newline at end of file diff --git a/sql/DROP/receipts.sql b/sql/DROP/receipts.sql new file mode 100644 index 0000000..de97bb8 --- /dev/null +++ b/sql/DROP/receipts.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_receipts CASCADE; \ No newline at end of file diff --git a/sql/DROP/recipe_items.sql b/sql/DROP/recipe_items.sql new file mode 100644 index 0000000..2f2300b --- /dev/null +++ b/sql/DROP/recipe_items.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_recipe_items CASCADE; \ No newline at end of file diff --git a/sql/DROP/recipes.sql b/sql/DROP/recipes.sql new file mode 100644 index 0000000..dfc421d --- /dev/null +++ b/sql/DROP/recipes.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_recipes CASCADE; \ No newline at end of file diff --git a/sql/DROP/shopping_list_items.sql b/sql/DROP/shopping_list_items.sql new file mode 100644 index 0000000..d8f8055 --- /dev/null +++ b/sql/DROP/shopping_list_items.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_shopping_list_items CASCADE; \ No newline at end of file diff --git a/sql/DROP/shopping_lists.sql b/sql/DROP/shopping_lists.sql new file mode 100644 index 0000000..a66fbf6 --- /dev/null +++ b/sql/DROP/shopping_lists.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_shopping_lists CASCADE; \ No newline at end of file diff --git a/sql/DROP/sku_prefix.sql b/sql/DROP/sku_prefix.sql new file mode 100644 index 0000000..8266dc8 --- /dev/null +++ b/sql/DROP/sku_prefix.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_sku_prefix CASCADE; \ No newline at end of file diff --git a/sql/DROP/transactions.sql b/sql/DROP/transactions.sql new file mode 100644 index 0000000..5ef5a56 --- /dev/null +++ b/sql/DROP/transactions.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_transactions CASCADE; \ No newline at end of file diff --git a/sql/DROP/units.sql b/sql/DROP/units.sql new file mode 100644 index 0000000..13e5997 --- /dev/null +++ b/sql/DROP/units.sql @@ -0,0 +1 @@ +DROP TABLE units CASCADE; \ No newline at end of file diff --git a/sql/DROP/vendors.sql b/sql/DROP/vendors.sql new file mode 100644 index 0000000..14c5e96 --- /dev/null +++ b/sql/DROP/vendors.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_vendors CASCADE; \ No newline at end of file diff --git a/sql/DROP/zones.sql b/sql/DROP/zones.sql new file mode 100644 index 0000000..81b784b --- /dev/null +++ b/sql/DROP/zones.sql @@ -0,0 +1 @@ +DROP TABLE %%site_name%%_zones CASCADE; \ No newline at end of file diff --git a/sql/INSERT/insertConversionsTuple.sql b/sql/INSERT/insertConversionsTuple.sql new file mode 100644 index 0000000..2b0ee99 --- /dev/null +++ b/sql/INSERT/insertConversionsTuple.sql @@ -0,0 +1,4 @@ +INSERT INTO %%site_name%%_conversions +(item_id, uom_id, conv_factor) +VALUES (%s, %s, %s) +RETURNING *; \ No newline at end of file diff --git a/sql/INSERT/insertFoodInfoTuple.sql b/sql/INSERT/insertFoodInfoTuple.sql index 8560fd0..08afdf2 100644 --- a/sql/INSERT/insertFoodInfoTuple.sql +++ b/sql/INSERT/insertFoodInfoTuple.sql @@ -1,4 +1,4 @@ INSERT INTO %%site_name%%_food_info -(ingrediants, food_groups, nutrients, expires) -VALUES (%s, %s, %s, %s) +(ingrediants, food_groups, nutrients, expires, default_expiration) +VALUES (%s, %s, %s, %s, %s) RETURNING *; \ No newline at end of file diff --git a/sql/INSERT/insertGroupItemsTuple.sql b/sql/INSERT/insertGroupItemsTuple.sql new file mode 100644 index 0000000..552e6b8 --- /dev/null +++ b/sql/INSERT/insertGroupItemsTuple.sql @@ -0,0 +1,4 @@ +INSERT INTO %%site_name%%_group_items +(uuid, gr_id, item_type, item_name, uom, qty, item_id, links) +VALUES (%s, %s, %s, %s, %s, %s, %s, %s) +RETURNING *; \ No newline at end of file diff --git a/sql/INSERT/insertGroupsTuple.sql b/sql/INSERT/insertGroupsTuple.sql index c62c1a0..1715d0e 100644 --- a/sql/INSERT/insertGroupsTuple.sql +++ b/sql/INSERT/insertGroupsTuple.sql @@ -1,4 +1,4 @@ INSERT INTO %%site_name%%_groups -(name, description, included_items, group_type) -VALUES (%s, %s, %s, %s) +(name, description, group_type) +VALUES (%s, %s, %s) RETURNING *; \ No newline at end of file diff --git a/sql/INSERT/insertItemInfoTuple.sql b/sql/INSERT/insertItemInfoTuple.sql index 72d22ed..154e9d3 100644 --- a/sql/INSERT/insertItemInfoTuple.sql +++ b/sql/INSERT/insertItemInfoTuple.sql @@ -1,5 +1,4 @@ INSERT INTO %%site_name%%_item_info -(barcode, linked_items, shopping_lists, recipes, groups, -packaging, uom, cost, safety_stock, lead_time_days, ai_pick) -VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) +(barcode, packaging, uom_quantity, uom, cost, safety_stock, lead_time_days, ai_pick, prefixes) +VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) RETURNING *; \ No newline at end of file diff --git a/sql/INSERT/insertItemLinksTuple.sql b/sql/INSERT/insertItemLinksTuple.sql new file mode 100644 index 0000000..81fb2c6 --- /dev/null +++ b/sql/INSERT/insertItemLinksTuple.sql @@ -0,0 +1,4 @@ +INSERT INTO %%site_name%%_itemlinks +(barcode, link, data, conv_factor) +VALUES (%s, %s, %s, %s) +RETURNING *; \ No newline at end of file diff --git a/sql/INSERT/insertLocationsTuple.sql b/sql/INSERT/insertLocationsTuple.sql new file mode 100644 index 0000000..06f1f58 --- /dev/null +++ b/sql/INSERT/insertLocationsTuple.sql @@ -0,0 +1,4 @@ +INSERT INTO %%site_name%%_locations +(uuid, name, zone_id) +VALUES (%s, %s, %s) +RETURNING *; \ No newline at end of file diff --git a/sql/INSERT/insertLoginsTuple.sql b/sql/INSERT/insertLoginsTuple.sql index ed17452..6d115cb 100644 --- a/sql/INSERT/insertLoginsTuple.sql +++ b/sql/INSERT/insertLoginsTuple.sql @@ -1,4 +1,4 @@ INSERT INTO logins -(username, password, email) -VALUES (%s, %s, %s) +(username, password, email, row_type) +VALUES (%s, %s, %s, %s) RETURNING *; \ No newline at end of file diff --git a/sql/INSERT/insertLogisticsInfoTuple.sql b/sql/INSERT/insertLogisticsInfoTuple.sql index 9bcf8ec..312ee1c 100644 --- a/sql/INSERT/insertLogisticsInfoTuple.sql +++ b/sql/INSERT/insertLogisticsInfoTuple.sql @@ -1,5 +1,4 @@ INSERT INTO %%site_name%%_logistics_info -(barcode, primary_location, auto_issue_location, dynamic_locations, -location_data, quantity_on_hand) -VALUES (%s, %s, %s, %s, %s, %s) +(barcode, primary_location, primary_zone, auto_issue_location, auto_issue_zone) +VALUES (%s, %s, %s, %s, %s) RETURNING *; \ No newline at end of file diff --git a/sql/INSERT/insertReceiptItemsTuple.sql b/sql/INSERT/insertReceiptItemsTuple.sql new file mode 100644 index 0000000..6aeb85f --- /dev/null +++ b/sql/INSERT/insertReceiptItemsTuple.sql @@ -0,0 +1,4 @@ +INSERT INTO %%site_name%%_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 diff --git a/sql/INSERT/insertReceiptsTuple.sql b/sql/INSERT/insertReceiptsTuple.sql new file mode 100644 index 0000000..8ddaf60 --- /dev/null +++ b/sql/INSERT/insertReceiptsTuple.sql @@ -0,0 +1,4 @@ +INSERT INTO %%site_name%%_receipts +(receipt_id, receipt_status, date_submitted, submitted_by, vendor_id, files) +VALUES (%s, %s, %s, %s, %s, %s) +RETURNING *; \ No newline at end of file diff --git a/sql/INSERT/insertRecipeItemsTuple.sql b/sql/INSERT/insertRecipeItemsTuple.sql new file mode 100644 index 0000000..1d9d919 --- /dev/null +++ b/sql/INSERT/insertRecipeItemsTuple.sql @@ -0,0 +1,4 @@ +INSERT INTO %%site_name%%_recipe_items +(uuid, rp_id, item_type, item_name, uom, qty, item_id, links) +VALUES (%s, %s, %s, %s, %s, %s, %s, %s) +RETURNING *; \ No newline at end of file diff --git a/sql/INSERT/insertRecipesTuple.sql b/sql/INSERT/insertRecipesTuple.sql new file mode 100644 index 0000000..29d5b61 --- /dev/null +++ b/sql/INSERT/insertRecipesTuple.sql @@ -0,0 +1,4 @@ +INSERT INTO %%site_name%%_recipes +(name, author, description, creation_date, instructions, picture_path) +VALUES (%s, %s, %s, %s, %s, %s) +RETURNING *; \ No newline at end of file diff --git a/sql/INSERT/insertRolesTuple.sql b/sql/INSERT/insertRolesTuple.sql new file mode 100644 index 0000000..fce3d67 --- /dev/null +++ b/sql/INSERT/insertRolesTuple.sql @@ -0,0 +1,4 @@ +INSERT INTO roles +(role_name, role_description, site_id, flags) +VALUES (%s, %s, %s, %s) +RETURNING *; \ No newline at end of file diff --git a/sql/INSERT/insertSKUPrefixTuple.sql b/sql/INSERT/insertSKUPrefixTuple.sql new file mode 100644 index 0000000..555146f --- /dev/null +++ b/sql/INSERT/insertSKUPrefixTuple.sql @@ -0,0 +1,4 @@ +INSERT INTO %%site_name%%_sku_prefix +(uuid, name, description) +VALUES (%s, %s, %s) +RETURNING *; \ No newline at end of file diff --git a/sql/INSERT/insertShoppingListItemsTuple.sql b/sql/INSERT/insertShoppingListItemsTuple.sql new file mode 100644 index 0000000..0e45d8c --- /dev/null +++ b/sql/INSERT/insertShoppingListItemsTuple.sql @@ -0,0 +1,4 @@ +INSERT INTO %%site_name%%_shopping_list_items +(uuid, sl_id, item_type, item_name, uom, qty, item_id, links) +VALUES (%s, %s, %s, %s, %s, %s, %s, %s) +RETURNING *; \ No newline at end of file diff --git a/sql/INSERT/insertShoppingListsTuple.sql b/sql/INSERT/insertShoppingListsTuple.sql new file mode 100644 index 0000000..6816ef5 --- /dev/null +++ b/sql/INSERT/insertShoppingListsTuple.sql @@ -0,0 +1,4 @@ +INSERT INTO %%site_name%%_shopping_lists +(name, description, author, creation_date, type) +VALUES (%s, %s, %s, %s, %s) +RETURNING *; \ No newline at end of file diff --git a/sql/INSERT/insertSitesTuple.sql b/sql/INSERT/insertSitesTuple.sql new file mode 100644 index 0000000..4cc0eb0 --- /dev/null +++ b/sql/INSERT/insertSitesTuple.sql @@ -0,0 +1,5 @@ +INSERT INTO sites +(site_name, site_description, creation_date, site_owner_id, flags, default_zone, +default_auto_issue_location, default_primary_location) +VALUES (%s, %s, %s, %s, %s, %s, %s, %s) +RETURNING *; \ No newline at end of file diff --git a/sql/INSERT/insertTransactionsTuple.sql b/sql/INSERT/insertTransactionsTuple.sql index a977bf8..d8ee48d 100644 --- a/sql/INSERT/insertTransactionsTuple.sql +++ b/sql/INSERT/insertTransactionsTuple.sql @@ -1,4 +1,4 @@ -INSERT INTO main_transactions +INSERT INTO %%site_name%%_transactions (timestamp, logistics_info_id, barcode, name, transaction_type, quantity, description, user_id, data) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) diff --git a/sql/INSERT/insertUnitsTuple.sql b/sql/INSERT/insertUnitsTuple.sql new file mode 100644 index 0000000..06edb40 --- /dev/null +++ b/sql/INSERT/insertUnitsTuple.sql @@ -0,0 +1,4 @@ +INSERT INTO units +(plural, single, fullname, description) +VALUES (%s, %s, %s, %s) +RETURNING *; \ No newline at end of file diff --git a/sql/INSERT/insertVendorsTuple.sql b/sql/INSERT/insertVendorsTuple.sql new file mode 100644 index 0000000..83ad762 --- /dev/null +++ b/sql/INSERT/insertVendorsTuple.sql @@ -0,0 +1,4 @@ +INSERT INTO %%site_name%%_vendors +(vendor_name, vendor_address, creation_date, created_by, phone_number) +VALUES (%s, %s, %s, %s, %s) +RETURNING *; \ No newline at end of file diff --git a/sql/INSERT/insertZonesTuple.sql b/sql/INSERT/insertZonesTuple.sql new file mode 100644 index 0000000..b551143 --- /dev/null +++ b/sql/INSERT/insertZonesTuple.sql @@ -0,0 +1,4 @@ +INSERT INTO %%site_name%%_zones +(name, site_id) +VALUES (%s, %s) +RETURNING *; \ No newline at end of file diff --git a/sql/SELECT/countZones.sql b/sql/SELECT/countZones.sql new file mode 100644 index 0000000..12a5cc7 --- /dev/null +++ b/sql/SELECT/countZones.sql @@ -0,0 +1,7 @@ +SELECT COUNT(*) +FROM +(SELECT zones.id +FROM %%site_name%%_zones zones +LEFT JOIN %%site_name%%_locations locations ON zones.id = locations.zone_id +GROUP BY zones.id +HAVING COUNT(locations.id) > 0) AS subquery; \ No newline at end of file diff --git a/sql/SELECT/getGroups.sql b/sql/SELECT/getGroups.sql new file mode 100644 index 0000000..8074baa --- /dev/null +++ b/sql/SELECT/getGroups.sql @@ -0,0 +1,3 @@ +SELECT *, + (SELECT COALESCE(array_agg(row_to_json(g)), '{}') FROM %%site_name%%_group_items g WHERE gr_id = %%site_name%%_groups.id) AS gr_items + FROM %%site_name%%_groups LIMIT %s OFFSET %s; \ No newline at end of file diff --git a/sql/SELECT/getItemAllByBarcode.sql b/sql/SELECT/getItemAllByBarcode.sql new file mode 100644 index 0000000..b2c4b8d --- /dev/null +++ b/sql/SELECT/getItemAllByBarcode.sql @@ -0,0 +1,75 @@ +WITH passed_id AS (SELECT id AS passed_id FROM %%site_name%%_items WHERE barcode=%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/sql/SELECT/getItemAllByID.sql b/sql/SELECT/getItemAllByID.sql new file mode 100644 index 0000000..8b5ca81 --- /dev/null +++ b/sql/SELECT/getItemAllByID.sql @@ -0,0 +1,86 @@ +WITH passed_id AS (SELECT %s AS passed_id), + 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_conversions AS ( + SELECT + %%site_name%%_conversions.id as conv_id, + %%site_name%%_conversions.conv_factor as conv_factor, + units.* as uom + FROM %%site_name%%_conversions + LEFT JOIN units ON %%site_name%%_conversions.uom_id = units.id + WHERE %%site_name%%_conversions.item_id = (SELECT passed_id FROM passed_id) + ), + cte_item_info AS ( + SELECT + %%site_name%%_item_info.*, + row_to_json(units.*) as uom, + COALESCE((SELECT json_agg(convs) FROM cte_conversions convs), '[]'::json) AS conversions, + COALESCE((SELECT json_agg(p.*) FROM %%site_name%%_sku_prefix as p WHERE p.id = ANY(%%site_name%%_item_info.prefixes)), '[]'::json) as prefixes + 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/sql/SELECT/getItemLocations.sql b/sql/SELECT/getItemLocations.sql new file mode 100644 index 0000000..59e72cf --- /dev/null +++ b/sql/SELECT/getItemLocations.sql @@ -0,0 +1,5 @@ +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 = %s +LIMIT %s +OFFSET %s; \ No newline at end of file diff --git a/sql/SELECT/getItemsForModals.sql b/sql/SELECT/getItemsForModals.sql new file mode 100644 index 0000000..39d7a36 --- /dev/null +++ b/sql/SELECT/getItemsForModals.sql @@ -0,0 +1,9 @@ +SELECT %%site_name%%_items.*, + row_to_json(%%site_name%%_item_info.*) as item_info +FROM %%site_name%%_items +LEFT JOIN %%site_name%%_item_info ON %%site_name%%_items.item_info_id = %%site_name%%_item_info.id +WHERE %%site_name%%_items.search_string LIKE '%%' || %s || '%%' +AND %%site_name%%_items.row_type <> 'link' +ORDER BY %%site_name%%_items.id ASC +LIMIT %s OFFSET %s; + diff --git a/sql/SELECT/getItemsSafetyStock.sql b/sql/SELECT/getItemsSafetyStock.sql new file mode 100644 index 0000000..de6a42f --- /dev/null +++ b/sql/SELECT/getItemsSafetyStock.sql @@ -0,0 +1,11 @@ +WITH sum_cte AS ( + SELECT mi.id, SUM(mil.quantity_on_hand) AS total_sum + FROM %%site_name%%_item_locations mil + JOIN %%site_name%%_items mi ON mil.part_id = mi.id + GROUP BY mi.id +) +SELECT * +FROM %%site_name%%_items +LEFT JOIN %%site_name%%_item_info ON %%site_name%%_items.item_info_id = %%site_name%%_item_info.id +LEFT JOIN sum_cte ON %%site_name%%_items.id = sum_cte.id +WHERE %%site_name%%_item_info.safety_stock > COALESCE(sum_cte.total_sum, 0); diff --git a/sql/SELECT/getItemsWithQOH.sql b/sql/SELECT/getItemsWithQOH.sql new file mode 100644 index 0000000..a1391d7 --- /dev/null +++ b/sql/SELECT/getItemsWithQOH.sql @@ -0,0 +1,18 @@ +WITH sum_cte AS ( + SELECT mi.id, SUM(mil.quantity_on_hand)::FLOAT8 AS total_sum + FROM %%site_name%%_item_locations mil + JOIN %%site_name%%_items mi ON mil.part_id = mi.id + GROUP BY mi.id + ) + +SELECT %%site_name%%_items.*, + row_to_json(%%site_name%%_item_info.*) as item_info, + sum_cte.total_sum as total_qoh, + (SELECT COALESCE(row_to_json(u), '{}') FROM units as u WHERE u.id=%%site_name%%_item_info.uom) as uom +FROM %%site_name%%_items +LEFT JOIN sum_cte ON %%site_name%%_items.id = sum_cte.id +LEFT JOIN %%site_name%%_item_info ON %%site_name%%_items.item_info_id = %%site_name%%_item_info.id +WHERE %%site_name%%_items.search_string LIKE '%%' || %s || '%%' +ORDER BY %%site_name%%_items.item_name ASC +LIMIT %s OFFSET %s; + diff --git a/sql/SELECT/getReceiptByID.sql b/sql/SELECT/getReceiptByID.sql new file mode 100644 index 0000000..029c4c6 --- /dev/null +++ b/sql/SELECT/getReceiptByID.sql @@ -0,0 +1,17 @@ +WITH passed_id AS (SELECT %s AS passed_id), + cte_receipt_items AS ( + SELECT items.* , + (SELECT COALESCE(row_to_json(un), '{}') FROM units un WHERE un.id = items.uom LIMIT 1) AS uom + FROM %%site_name%%_receipt_items items + WHERE items.receipt_id = (SELECT passed_id FROM passed_id) + ) + +SELECT (SELECT passed_id FROM passed_id) AS passed_id, + %%site_name%%_receipts.*, + logins.username as submitted_by, + (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_receipt_items ris) AS receipt_items, + row_to_json(%%site_name%%_vendors.*) as vendor +FROM %%site_name%%_receipts +JOIN logins ON %%site_name%%_receipts.submitted_by = logins.id +LEFT JOIN %%site_name%%_vendors ON %%site_name%%_receipts.vendor_id = %%site_name%%_vendors.id +WHERE %%site_name%%_receipts.id=(SELECT passed_id FROM passed_id) \ No newline at end of file diff --git a/sql/SELECT/getReceipts.sql b/sql/SELECT/getReceipts.sql new file mode 100644 index 0000000..59d4c82 --- /dev/null +++ b/sql/SELECT/getReceipts.sql @@ -0,0 +1,7 @@ +SELECT %%site_name%%_receipts.*, + logins.username as submitted_by +FROM %%site_name%%_receipts +JOIN logins ON %%site_name%%_receipts.submitted_by = logins.id +ORDER BY %%site_name%%_receipts.id DESC +LIMIT %s +OFFSET %s; \ No newline at end of file diff --git a/sql/SELECT/getRecipeByID.sql b/sql/SELECT/getRecipeByID.sql new file mode 100644 index 0000000..88982b8 --- /dev/null +++ b/sql/SELECT/getRecipeByID.sql @@ -0,0 +1,27 @@ +WITH passed_id AS (SELECT %s AS passed_id), + cte_recipe_items AS ( + SELECT items.*, + COALESCE(%%site_name%%_items.barcode, items.uuid) AS uuid, + (SELECT COALESCE(row_to_json(units.*), '{}') FROM units WHERE units.id=%%site_name%%_item_info.uom) AS item_uom, + COALESCE(%%site_name%%_items.item_name, items.item_name) AS item_name, + COALESCE(%%site_name%%_items.links, items.links) AS links, + row_to_json(units.*) as uom, + (SELECT COALESCE(array_agg(jsonb_build_object('conversion', conv, 'unit', units)), '{}') + FROM %%site_name%%_conversions conv + LEFT JOIN units ON conv.uom_id = units.id + WHERE conv.item_id = %%site_name%%_items.id) AS conversions + FROM %%site_name%%_recipe_items items + LEFT JOIN %%site_name%%_items ON items.item_id = %%site_name%%_items.id + LEFT JOIN %%site_name%%_item_info ON %%site_name%%_items.item_info_id = %%site_name%%_item_info.id + LEFT JOIN units ON units.id = items.uom + WHERE items.rp_id = (SELECT passed_id FROM passed_id) + ORDER BY items.item_name ASC + ) + +SELECT (SELECT passed_id FROM passed_id) AS passed_id, + %%site_name%%_recipes.*, + logins.username as author, + (SELECT COALESCE(array_agg(row_to_json(ris)), '{}') FROM cte_recipe_items ris) AS recipe_items +FROM %%site_name%%_recipes +JOIN logins ON %%site_name%%_recipes.author = logins.id +WHERE %%site_name%%_recipes.id=(SELECT passed_id FROM passed_id) \ No newline at end of file diff --git a/sql/SELECT/getRecipes.sql b/sql/SELECT/getRecipes.sql new file mode 100644 index 0000000..1703d1e --- /dev/null +++ b/sql/SELECT/getRecipes.sql @@ -0,0 +1,3 @@ +SELECT *, + (SELECT COALESCE(array_agg(row_to_json(g)), '{}') FROM %%site_name%%_recipe_items g WHERE rp_id = %%site_name%%_recipes.id) AS rp_items + FROM %%site_name%%_recipes LIMIT %s OFFSET %s; \ No newline at end of file diff --git a/sql/SELECT/getShoppingListByID.sql b/sql/SELECT/getShoppingListByID.sql new file mode 100644 index 0000000..de06f2e --- /dev/null +++ b/sql/SELECT/getShoppingListByID.sql @@ -0,0 +1,15 @@ +WITH passed_id AS (SELECT %s AS passed_id), + cte_sl_items AS ( + SELECT items.*, + (SELECT COALESCE(row_to_json(un), '{}') FROM units un WHERE un.id = items.uom LIMIT 1) AS uom + FROM %%site_name%%_shopping_list_items items + WHERE items.sl_id = (SELECT passed_id FROM passed_id) + ) + +SELECT (SELECT passed_id FROM passed_id) AS passed_id, + %%site_name%%_shopping_lists.*, + logins.username as author, + (SELECT COALESCE(array_agg(row_to_json(slis)), '{}') FROM cte_sl_items slis) AS sl_items +FROM %%site_name%%_shopping_lists +JOIN logins ON %%site_name%%_shopping_lists.author = logins.id +WHERE %%site_name%%_shopping_lists.id=(SELECT passed_id FROM passed_id) \ No newline at end of file diff --git a/sql/SELECT/getShoppingLists.sql b/sql/SELECT/getShoppingLists.sql new file mode 100644 index 0000000..acccf96 --- /dev/null +++ b/sql/SELECT/getShoppingLists.sql @@ -0,0 +1,3 @@ +SELECT *, + (SELECT COALESCE(array_agg(row_to_json(g)), '{}') FROM %%site_name%%_shopping_list_items g WHERE sl_id = %%site_name%%_shopping_lists.id) AS sl_items + FROM %%site_name%%_shopping_lists LIMIT %s OFFSET %s; \ No newline at end of file diff --git a/sql/SELECT/getSkuPrefixes.sql b/sql/SELECT/getSkuPrefixes.sql new file mode 100644 index 0000000..726501b --- /dev/null +++ b/sql/SELECT/getSkuPrefixes.sql @@ -0,0 +1 @@ +SELECT * FROM %%site_name%%_sku_prefix LIMIT %s OFFSET %s; \ No newline at end of file diff --git a/sql/SELECT/getZonesWithCount.sql b/sql/SELECT/getZonesWithCount.sql new file mode 100644 index 0000000..65a15c5 --- /dev/null +++ b/sql/SELECT/getZonesWithCount.sql @@ -0,0 +1,7 @@ +SELECT zones.* +FROM %%site_name%%_zones zones +LEFT JOIN %%site_name%%_locations locations ON zones.id = locations.zone_id +GROUP BY zones.id +HAVING COUNT(locations.id) > 0 +LIMIT %s +OFFSET %s; \ No newline at end of file diff --git a/sql/SELECT/selectShoppingListItem.sql b/sql/SELECT/selectShoppingListItem.sql new file mode 100644 index 0000000..64a029f --- /dev/null +++ b/sql/SELECT/selectShoppingListItem.sql @@ -0,0 +1,4 @@ +SELECT items.*, + (SELECT COALESCE(row_to_json(un), '{}') FROM units un WHERE un.id = items.uom LIMIT 1) AS uom +FROM %%site_name%%_shopping_list_items items +WHERE items.id = %s; \ No newline at end of file diff --git a/sql/updateItemLocation.sql b/sql/updateItemLocation.sql index fdcd6d4..7316d94 100644 --- a/sql/updateItemLocation.sql +++ b/sql/updateItemLocation.sql @@ -1,4 +1,4 @@ UPDATE %%site_name%%_item_locations -SET cost_layers = array_append(cost_layers, %s), quantity_on_hand = %s -WHERE location_id=%s AND part_id=%s +SET cost_layers = %s, quantity_on_hand = %s +WHERE part_id=%s AND location_id=%s RETURNING *; \ No newline at end of file diff --git a/static/.webassets-cache/230c2b05ff18323c515e21cf9fb81093 b/static/.webassets-cache/230c2b05ff18323c515e21cf9fb81093 new file mode 100644 index 0000000000000000000000000000000000000000..9c21c93c81bb653b898b7cd515bea3817ce6de03 GIT binary patch literal 47 xcmZo*nX1A70X+&9rk2TOre+3)rb$VrNy(O}X^9pV#>SSWi58|wh6X89^Z@T73rGL} literal 0 HcmV?d00001 diff --git a/static/.webassets-cache/9db6a7b996bcd7e801a856245be5f1d2 b/static/.webassets-cache/9db6a7b996bcd7e801a856245be5f1d2 new file mode 100644 index 0000000000000000000000000000000000000000..063c4aa409c3cf68ba2e60bfdcd118e10e5f2fdd GIT binary patch literal 23 ZcmZo*naaZe0X-ZkDJJI0NoI*t^Z+s%1q%QG literal 0 HcmV?d00001 diff --git a/static/css/dark-mode.css b/static/css/dark-mode.css new file mode 100644 index 0000000..bf639f7 --- /dev/null +++ b/static/css/dark-mode.css @@ -0,0 +1,222 @@ +:root { + --background: #121212; + --background-text: #ffffff; + + --surface: #121212; + --surface-text: #ffffff; + + --error: #CF6679; + --error-text: #000000; + + --primary-color: #BB86FC; + --primary-text: #000000; + + --secondary-color: #03DAC6; + --secondary-text: #000000; + + --elevation-low: 0 1px 3px rgba(0, 0, 0, 0.2); + --elevation-medium: 0 3px 6px rgba(0, 0, 0, 0.3); + --elevation-high: 0 10px 20px rgba(0, 0, 0, 0.4); + + --radius: 10px; + + } + +body, html { + background-color: var(--background); + color: var(--background-text); + border-color: var(--border-color); +} + +select, option { + background-color: var(--surface); + color: var(--surface-text); + box-shadow: var(--elevation-low); +} + +#navbar { + background: var(--surface); + color: var(--surface-text); + box-shadow: var(--elevation-medium); + +} + +#navbar::before { + content: ''; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: rgba(255, 255, 255, 0.08); + pointer-events: none; +} + + +.uk-input.uk-disabled { + background-color: var(--background-secondary); +} + +.uk-input { + border-color: var(--border-color); + box-shadow: var(--elevation-low); +} + +.uk-button.uk-disabled { + background-color: var(--background-secondary); +} + +.uk-label.uk-disabled { + background-color: var(--background-secondary); +} + +.uk-modal-dialog{ + background-color: var(--surface); + color: var(--surface-text); + box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12);; + z-index: 0; + border-radius: var(--radius); +} + +.uk-modal-body{ + background-color: var(--surface); + color: var(--surface-text) +} + +.uk-modal-header{ + background-color: var(--surface); + color: var(--surface-text) +} + +.uk-modal-footer{ + background-color: var(--surface); + color: var(--surface-text) +} + +.uk-modal-dialog::before { + content: ''; + position: absolute; + border-radius: var(--radius); + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: rgba(255, 255, 255, 0.09); + pointer-events: none; +} + +.uk-card.uk-card-hover:hover { + background-color: rgba(255, 255, 255, 0.03); + box-shadow: var(--elevation-high); +} + +.uk-card.uk-card-default { + background: var(--surface); + color: var(--surface-text); + box-shadow: var(--elevation-low); + border-radius: var(--radius); +} + +.uk-card.uk-card-default::before { + content: ''; + position: absolute; + border-radius: var(--radius); + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: rgba(255, 255, 255, 0.05); + pointer-events: none; +} + +.my-card.uk-card-title { + color: var(--surface-text); +} + +.uk-dropdown { + background-color: var(--surface); + color: var(--surface-text); + box-shadow: var(--elevation-low); +} + +.uk-dropdown::before { + content: ''; + position: absolute; + border-radius: var(--radius); + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: rgba(255, 255, 255, 0.05); + pointer-events: none; +} + +.uk-offcanvas-bar { + background-color: var(--surface); + color: var(--surface-text); +} + +.uk-offcanvas-bar::content { + content: ''; + position: absolute; + height: 100%; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: rgba(255, 255, 255, 0.16); + pointer-events: none; +} + +.uk-tile.uk-tile-default{ + background-color: var(--surface); + color: var(--surface-text) +} + +.uk-tile.uk-tile-default::before { + content: ''; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: rgba(255, 255, 255, 0.09); + pointer-events: none; +} + +.instruction-card{ + background: var(--surface); + margin: 10px 0; + padding: 10px; + border-radius: 5px; + position: relative; +} + +.instruction-card::before { + content: ''; + position: absolute; + border-radius: var(--radius); + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: rgba(255, 255, 255, 0.09); + pointer-events: none; +} + +.instruction-button{ + background: none; + border: none; + color: red; + font-size: 1.2em; + position: absolute; + right: 10px; + top: 50%; + transform: translateY(-50%); + cursor: pointer; +} + +.instruction-list{ + list-style-type: none; + padding: 0; +} \ No newline at end of file diff --git a/static/css/pantry.css b/static/css/pantry.css new file mode 100644 index 0000000..3fc0d29 --- /dev/null +++ b/static/css/pantry.css @@ -0,0 +1,86 @@ +@keyframes shake { + 0%, 100% { transform: translateX(0); } + 25% { transform: translateX(-5px); } + 50% { transform: translateX(5px); } + 75% { transform: translateX(-5px); } + } + +.chip.uk-label { + background-color: grey; + transition: background-color 0.3s, transform 0.3s; + user-select: none; + text-transform: none !important; +} + +.chip:hover { + background-color:rgb(212, 78, 78); + animation: shake 0.5s; + cursor: pointer; +} +.tag-zone { + border: 1px solid #ccc; + border-color: lightgray; + border-radius: 10px; + padding: 10px; + display: flex; + gap: 5px; + flex-wrap: wrap; + } + +.floating-button { + position: fixed; + bottom: 20px; + right: 20px; + z-index: 1000; + height: 40px; + } + +.dark-mode-body { + background-color: #121212; + min-height: 100vh; +} + +.dark-mode-element { + background-color: #323232; +} + +.dark-mode-nav { + background-color: #222222; +} + +.dark-mode-primary { + background-color: rgb(199, 165, 199); +} + +.selectableRow :hover { + cursor: pointer; +} + +.pantry-row-error { + background-color: darkred; +} + +.instruction-card{ + background: #f0f0f0; + margin: 10px 0; + padding: 10px; + border-radius: 5px; + position: relative; +} + +.instruction-button{ + background: none; + border: none; + color: red; + font-size: 1.2em; + position: absolute; + right: 10px; + top: 50%; + transform: translateY(-50%); + cursor: pointer; +} + +.instruction-list{ + list-style-type: none; + padding: 0; +} \ No newline at end of file diff --git a/static/css/solarized.css b/static/css/solarized.css new file mode 100644 index 0000000..e29e325 --- /dev/null +++ b/static/css/solarized.css @@ -0,0 +1,128 @@ +:root { + --base03: #fdf6e3; + --base02: #eee8d5; + --base01: #93a1a1; + --base00: #839496; + --base0: #657b83; + --base1: #586e75; + --base2: #073642; + --base3: #002b36; + --yellow: #b58900; + --orange: #cb4b16; + --red: #dc322f; + --magenta: #d33682; + --violet: #6c71c4; + --blue: #268bd2; + --cyan: #2aa198; + --green: #859900; + } + + /* Applying to body */ + body { + background-color: var(--base3); + color: var(--base0); + font-family: 'Ubuntu Mono'; + } + #navbar{ + background-color: var(--base2); + color: var(--base0); + } + + .uk-modal-title{ + color: var(--base01) + } + .uk-modal-dialog{ + background-color: var(--base2); + color: var(--base00) + } + + .uk-button-default{ + background-color: var(--base03); + color: var(--base00) + } + .uk-button-default:hover{ + background-color: var(--base02); + } + + + .uk-table-striped tbody tr:nth-child(odd) { + background-color: var(--base2); + } + + .uk-table-striped tbody tr:nth-child(odd):hover { + background-color: var(--base02); + cursor: pointer; + } + + .uk-table-striped tbody tr:nth-child(even) { + background-color: var(--base3); + } + + .uk-table-striped tbody tr:nth-child(even):hover { + background-color: var(--base03); + cursor: pointer; + } + + .uk-button.delete_button{ + background-color: var(--red); + color: var(--base3); + border-radius: 30px; + height: 30px; + } + + #saveButton{ + background-color: var(--yellow); + } + + .uk-heading-medium{ + color: var(--base01); + font-weight: bold; + } + .uk-text-meta{ + color: var(--base0) + } + + .uk-form-label{ + color: var(--base00); + } + + .uk-input{ + background-color: var(--base02); + color: var(--base00); + border-color: var(--base02); + } + .uk-input:focus{ + background-color: var(--base02); + color: var(--base00); + border-color: var(--base02); + } + + .uk-select{ + background-color: var(--base02); + color: var(--base00); + border-color: var(--base02); + } + .uk-select:focus{ + background-color: var(--base02); + color: var(--base00); + border-color: var(--base02); + } + + .uk-form-blank { + /* Styles for unselected */ + background-color: var(--base3); + border-color: var(--base3); + } + + .uk-form-blank:focus { + /* Styles for selected */ + background-color: var(--base02); + border-color: var(--base02); + } + .uk-offcanvas-bar{ + background-color: var(--base2); + color: var(--base00); + } + .uk-nav-secondary{ + color:var(--base00) + } \ No newline at end of file diff --git a/static/handlers/ItemListHandler.js b/static/handlers/ItemListHandler.js new file mode 100644 index 0000000..cb65828 --- /dev/null +++ b/static/handlers/ItemListHandler.js @@ -0,0 +1,396 @@ +var current_page = 1; +var limit = 50; +var searchText = ""; +var sort_order = ""; +var view = ""; +var items; +var end_page = 10 +var settingsState = false; + +var item_subtypes = [['Food', 'FOOD'], ['Food PLU', 'FOOD_PLU'], ['Other', 'OTHER'], ['Medicinal', 'MEDICINE'], ['Hygenic', 'HYGENIC']]; + +var mode = false +async function toggleDarkMode() { + let darkMode = document.getElementById("dark-mode"); + darkMode.disabled = !darkMode.disabled; + mode = !mode; + if(mode){ + document.getElementById('modeToggle').innerHTML = "light_mode" + document.getElementById('main_html').classList.add('uk-light') + } else { + document.getElementById('modeToggle').innerHTML = "dark_mode" + document.getElementById('main_html').classList.remove('uk-light') + } +} + +if(session.user.flags.darkmode){ + toggleDarkMode() +} + +var detailedList = false +async function setViewMode() { + detailedList = !detailedList; + let toggle = document.getElementById('view_mode_toggle') + if(detailedList){ + toggle.innerHTML = `Table ` + } else { + toggle.innerHTML = `Cards ` + } + await reloadCards() +} + +document.addEventListener('DOMContentLoaded', async function() { + await getItems() + await setupFormDefaults() + await reloadCards() +}); + +async function setupFormDefaults() { + let subtype_select = document.getElementById('subtype_select') + for(let i=0; i`; + previousElement.classList.add('uk-disabled'); + }else { + previousElement.innerHTML = ``; + } + paginationElement.append(previousElement) + + //first + let firstElement = document.createElement('li') + if(current_page<=1){ + firstElement.innerHTML = `1`; + firstElement.classList.add('uk-disabled'); + }else { + firstElement.innerHTML = `1`; + } + paginationElement.append(firstElement) + + // ... + if(current_page-2>1){ + let firstDotElement = document.createElement('li') + firstDotElement.classList.add('uk-disabled') + firstDotElement.innerHTML = `…`; + paginationElement.append(firstDotElement) + } + // last + if(current_page-2>0){ + let lastElement = document.createElement('li') + lastElement.innerHTML = `${current_page-1}` + paginationElement.append(lastElement) + } + // current + if(current_page!=1 && current_page != end_page){ + let currentElement = document.createElement('li') + currentElement.innerHTML = `
  • ${current_page}
  • ` + paginationElement.append(currentElement) + } + // next + if(current_page+2${current_page+1}` + paginationElement.append(nextElement) + } + // ... + if(current_page+2<=end_page){ + let secondDotElement = document.createElement('li') + secondDotElement.classList.add('uk-disabled') + secondDotElement.innerHTML = `…`; + paginationElement.append(secondDotElement) + } + //end + let endElement = document.createElement('li') + if(current_page>=end_page){ + endElement.innerHTML = `${end_page}`; + endElement.classList.add('uk-disabled'); + }else { + endElement.innerHTML = `${end_page}`; + } + paginationElement.append(endElement) + //next button + let nextElement = document.createElement('li') + if(current_page>=end_page){ + nextElement.innerHTML = ``; + nextElement.classList.add('uk-disabled'); + }else { + nextElement.innerHTML = ``; + } + paginationElement.append(nextElement) +} + +async function setPage(pageNumber){ + current_page = pageNumber; + await getItems() + await reloadCards() +} + +async function updateTableElements(){ + let items_list = document.getElementById("items_list"); + items_list.innerHTML = ""; + + let main_table = document.createElement('table') + main_table.setAttribute('class', 'uk-table uk-table-striped') + + let table_head = document.createElement('thead') + + let head_row = document.createElement('tr') + let nameCell = document.createElement('th') + nameCell.innerHTML="Name" + let descriptionCell = document.createElement('th') + descriptionCell.innerHTML = 'Description' + descriptionCell.setAttribute('class', 'uk-visible@m') + let qtyUOMCell = document.createElement('th') + qtyUOMCell.innerHTML = 'QTY/UOM' + + let opsCell = document.createElement('th') + opsCell.innerHTML = 'Operations' + + head_row.append(nameCell, descriptionCell, opsCell) + table_head.append(head_row) + main_table.append(table_head) + + + let table_body = document.createElement('tbody') + + for (let i = 0; i < items.length; i++){ + let table_row = document.createElement('tr') + + let nameCell = document.createElement('td') + nameCell.innerHTML = items[i].item_name + nameCell.setAttribute('class', 'uk-width-1-4') + let descriptionCell = document.createElement('td') + descriptionCell.innerHTML = items[i].description + descriptionCell.setAttribute('class', 'uk-text-truncate uk-table-expand uk-visible@m') + + let qtyUOMCell = document.createElement('td') + qtyUOMCell.innerHTML = `${parseFloat(items[i].total_qoh)} ${items[i].uom.fullname}` + + let opsCell = document.createElement('td') + opsCell.setAttribute('class', 'uk-width-1-4') + + let buttonGroup = document.createElement('div') + buttonGroup.setAttribute('class', 'uk-button-group') + + let viewOp = document.createElement('a') + viewOp.innerHTML = `edit ` + viewOp.setAttribute('class', 'uk-button uk-button-default uk-button-small') + viewOp.href = `/item/${items[i].id}` + + let historyOp = document.createElement('a') + historyOp.innerHTML = `history ` + historyOp.setAttribute('class', 'uk-button uk-button-default uk-button-small') + historyOp.href = `/transactions/${items[i].id}` + + buttonGroup.append(viewOp, historyOp) + opsCell.append(buttonGroup) + + table_row.append(nameCell, descriptionCell, qtyUOMCell, opsCell) + table_body.append(table_row) + } + + main_table.append(table_body) + items_list.append(main_table) +} + +async function updateListElements(){ + let items_list = document.getElementById("items_list"); + items_list.innerHTML = ""; + + let main_list = document.createElement('div') + main_list.setAttribute('class', 'uk-child-width-1-3@m') + main_list.setAttribute('uk-grid', 'masonry: pack') + + let placceholderDIV = document.createElement('div') + for (let i = 0; i < items.length; i++){ + let outerShell = document.createElement('div') + + let listItem = document.createElement('div'); + listItem.classList.add('uk-card') + listItem.classList.add('uk-card-default') + listItem.classList.add('uk-card-small') + listItem.classList.add('uk-card-hover') + listItem.style = "border-radius: 10px;" + + let header = document.createElement('div') + header.classList.add('uk-card-header') + header.style = "border-radius: 0px, 10px, 0px, 10px;" + + header.innerHTML = `

    ${items[i].item_name}

    Quantity on Hand: ${parseFloat(items[i].total_qoh)} ${items[i].uom.fullname}
    ` + + let content = document.createElement('div') + content.classList.add('uk-card-body') + content.innerHTML = `

    ${items[i].description}

    ` + + let footer = document.createElement('div') + footer.classList.add('uk-card-footer') + footer.innerHTML = `edit + History` + + listItem.append(header) + if(!items[i].description == ""){ + listItem.append(content) + } + listItem.append(footer) + + outerShell.append(listItem) + + placceholderDIV.append(outerShell) + + } + main_list.innerHTML = placceholderDIV.innerHTML + items_list.append(main_list) +} + +async function getItems(){ + const url = new URL('/item/getItemsWithQOH', window.location.origin); + url.searchParams.append('page', current_page); + url.searchParams.append('limit', limit); + url.searchParams.append('search_text', searchText); + url.searchParams.append('sort_order', sort_order); + url.searchParams.append('view', view); + + await fetch(url) + .then(response => response.json()) + .then(data => { + items = data.items; + end_page = data.end; + }) +}; + +async function openAddItemModal() { + UIkit.modal(document.getElementById('addItemModal')).show(); +} + +async function openAddPrefixModal() { + UIkit.modal(document.getElementById('addPrefixModal')).show(); +} + +async function addSKUPrefix() { + let uuid = `%${document.getElementById('addUUID').value}%` + let name = `${document.getElementById('addPrefixName').value}` + let description = `${document.getElementById('addPrefixDescription').value}` + + const response = await fetch(`/items/addSKUPrefix`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + uuid: uuid, + name: name, + description: description, + }), + }); + data = await response.json(); + transaction_status = "success" + if (data.error){ + transaction_status = "danger" + } + + UIkit.notification({ + message: data.message, + status: transaction_status, + pos: 'top-right', + timeout: 5000 + }); + UIkit.modal(document.getElementById('addPrefixModal')).hide(); + +} + +async function addBlankItem() { + let barcode = `%${document.getElementById('addBarcode').value}%` + let name = `${document.getElementById('addName').value}` + let subtype = `${document.getElementById('subtype_select').value}` + + const response = await fetch(`/items/addBlankItem`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + barcode: barcode, + name: name, + subtype: subtype, + }), + }); + data = await response.json(); + transaction_status = "success" + if (data.error){ + transaction_status = "danger" + } + + UIkit.notification({ + message: data.message, + status: transaction_status, + pos: 'top-right', + timeout: 5000 + }); + UIkit.modal(document.getElementById('addItemModal')).hide(); + +} + +async function changeSite(site){ + console.log(site) + const response = await fetch(`/changeSite`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + site: site, + }), + }); + data = await response.json(); + transaction_status = "success" + if (data.error){ + transaction_status = "danger" + } + + UIkit.notification({ + message: data.message, + status: transaction_status, + pos: 'top-right', + timeout: 5000 + }); + location.reload(true) +} \ No newline at end of file diff --git a/static/handlers/groupListHandler.js b/static/handlers/groupListHandler.js new file mode 100644 index 0000000..6e5e3d4 --- /dev/null +++ b/static/handlers/groupListHandler.js @@ -0,0 +1,283 @@ +var mode = false +async function toggleDarkMode() { + let darkMode = document.getElementById("dark-mode"); + darkMode.disabled = !darkMode.disabled; + mode = !mode; + if(mode){ + document.getElementById('modeToggle').innerHTML = "light_mode" + document.getElementById('main_html').classList.add('uk-light') + } else { + document.getElementById('modeToggle').innerHTML = "dark_mode" + document.getElementById('main_html').classList.remove('uk-light') + } +} + + +if(session.user.flags.darkmode){ + toggleDarkMode() +} + +async function changeSite(site){ + console.log(site) + const response = await fetch(`/changeSite`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + site: site, + }), + }); + data = await response.json(); + transaction_status = "success" + if (data.error){ + transaction_status = "danger" + } + + UIkit.notification({ + message: data.message, + status: transaction_status, + pos: 'top-right', + timeout: 5000 + }); + location.reload(true) +} + +// Beginning of site specific code! +document.addEventListener('DOMContentLoaded', async function() { + let groups = await getGroups() + await replenishGroups(groups) + await updatePaginationElement() +}); + + +async function replenishGroups(groups) { + if(!detailedList){ + await replenishGroupsTable(groups) + } + + if(detailedList){ + await replenishGroupsCards(groups) + } +} + +async function replenishGroupsTable(groups) { + document.getElementById('groups_list').innerHTML = '' + + console.log('table') + let main_table = document.createElement('table') + main_table.setAttribute('class', 'uk-table uk-table-striped') + + let table_head = document.createElement('thead') + + let head_row = document.createElement('tr') + let nameCell = document.createElement('th') + nameCell.innerHTML="Name" + let descriptionCell = document.createElement('th') + descriptionCell.innerHTML = 'Description' + let typeCell = document.createElement('th') + typeCell.innerHTML = 'Type' + let opsCell = document.createElement('th') + opsCell.innerHTML = 'Operations' + + head_row.append(nameCell, descriptionCell, typeCell, opsCell) + table_head.append(head_row) + main_table.append(table_head) + + + let table_body = document.createElement('tbody') + for(let i = 0; i < groups.length; i++){ + let table_row = document.createElement('tr') + + let nameCell = document.createElement('td') + nameCell.innerHTML = groups[i].name + let descriptionCell = document.createElement('td') + descriptionCell.innerHTML = groups[i].description + let typeCell = document.createElement('td') + typeCell.innerHTML = groups[i].group_type + let opsCell = document.createElement('td') + + + let buttonGroup = document.createElement('div') + buttonGroup.setAttribute('class', 'uk-button-group') + + let viewOp = document.createElement('a') + viewOp.innerHTML = `view ` + viewOp.setAttribute('class', 'uk-button uk-button-default uk-button-small') + + let editOp = document.createElement('a') + editOp.innerHTML = `edit ` + editOp.setAttribute('class', 'uk-button uk-button-default uk-button-small') + editOp.href = `/group/${groups[i].id}` + + buttonGroup.append(viewOp, editOp) + opsCell.append(buttonGroup) + + table_row.append(nameCell, descriptionCell, typeCell, opsCell) + table_body.append(table_row) + } + + main_table.append(table_body) + + document.getElementById('groups_list').append(main_table) + +} + +async function replenishGroupsCards(groups) { + document.getElementById('groups_list').innerHTML = '' + console.log('cards') + + for(let i=0; i < groups.length; i++){ + let main_div = document.createElement('div') + main_div.setAttribute('class', 'uk-card uk-card-default uk-card-small uk-margin') + + let card_header_div = document.createElement('div') + card_header_div.setAttribute('class', 'uk-card-header') + card_header_div.style = "border: none;" + + let header_grid_div = document.createElement('div') + header_grid_div.setAttribute('class', 'uk-flex-middle uk-grid uk-grid-small') + + let title_div = document.createElement('div') + title_div.setAttribute('class', '') + title_div.innerHTML = ` +

    ${groups[i].name}

    ` + + header_grid_div.append(title_div) + card_header_div.append(header_grid_div) + + let body_div = document.createElement('div') + body_div.setAttribute('class', 'uk-card-body') + body_div.innerHTML = `

    ${groups[i].description}

    ` + body_div.style = 'border: none;' + + let footer_div = document.createElement('div') + footer_div.setAttribute('class', 'uk-card-footer') + footer_div.style = 'height: 40px; border: none;' + + let editOp = document.createElement('a') + editOp.setAttribute('class', 'uk-button uk-button-small uk-button-default') + editOp.innerHTML = ' Edit' + editOp.style = "margin-right: 10px;" + editOp.href = `/group/${groups[i].id}` + + let viewOp = document.createElement('a') + viewOp.setAttribute('class', 'uk-button uk-button-small uk-button-default') + viewOp.innerHTML = ' View' + + footer_div.append(editOp, viewOp) + + main_div.append(card_header_div, body_div, footer_div) + + document.getElementById('groups_list').append(main_div) + } +} + +var pagination_current = 1; +var pagination_end = 1; +var groupLimit = 5; +async function getGroups() { + const url = new URL('/groups/getGroups', window.location.origin) + url.searchParams.append('page', pagination_current); + url.searchParams.append('limit', groupLimit); + const response = await fetch(url) + data = await response.json() + pagination_end = data.end + return data.groups +} + +async function updatePaginationElement() { + let paginationElement = document.getElementById("paginationElement"); + paginationElement.innerHTML = ""; + // previous + let previousElement = document.createElement('li') + if(pagination_current<=1){ + previousElement.innerHTML = ``; + previousElement.classList.add('uk-disabled'); + }else { + previousElement.innerHTML = ``; + } + paginationElement.append(previousElement) + + //first + let firstElement = document.createElement('li') + if(pagination_current<=1){ + firstElement.innerHTML = `1`; + firstElement.classList.add('uk-disabled'); + }else { + firstElement.innerHTML = `1`; + } + paginationElement.append(firstElement) + + // ... + if(pagination_current-2>1){ + let firstDotElement = document.createElement('li') + firstDotElement.classList.add('uk-disabled') + firstDotElement.innerHTML = `…`; + paginationElement.append(firstDotElement) + } + // last + if(pagination_current-2>0){ + let lastElement = document.createElement('li') + lastElement.innerHTML = `${pagination_current-1}` + paginationElement.append(lastElement) + } + // current + if(pagination_current!=1 && pagination_current != pagination_end){ + let currentElement = document.createElement('li') + currentElement.innerHTML = `
  • ${pagination_current}
  • ` + paginationElement.append(currentElement) + } + // next + if(pagination_current+2${pagination_current+1}` + paginationElement.append(nextElement) + } + // ... + if(pagination_current+2<=pagination_end){ + let secondDotElement = document.createElement('li') + secondDotElement.classList.add('uk-disabled') + secondDotElement.innerHTML = `…`; + paginationElement.append(secondDotElement) + } + //end + let endElement = document.createElement('li') + if(pagination_current>=pagination_end){ + endElement.innerHTML = `${pagination_end}`; + endElement.classList.add('uk-disabled'); + }else { + endElement.innerHTML = `${pagination_end}`; + } + paginationElement.append(endElement) + //next button + let nextElement = document.createElement('li') + if(pagination_current>=pagination_end){ + nextElement.innerHTML = ``; + nextElement.classList.add('uk-disabled'); + }else { + nextElement.innerHTML = ``; + } + paginationElement.append(nextElement) +} + +async function setPage(pageNumber){ + pagination_current = pageNumber; + let groups = await getGroups() + await replenishGroups(groups) + await updatePaginationElement() +} + +var detailedList = false +async function setViewMode() { + detailedList = !detailedList; + let toggle = document.getElementById('view_mode_toggle') + if(detailedList){ + toggle.innerHTML = `Table ` + } else { + toggle.innerHTML = `Cards ` + } + let groups = await getGroups() + await replenishGroups(groups) + await updatePaginationElement() +} \ No newline at end of file diff --git a/static/handlers/itemEditHandler.js b/static/handlers/itemEditHandler.js new file mode 100644 index 0000000..392dc72 --- /dev/null +++ b/static/handlers/itemEditHandler.js @@ -0,0 +1,1364 @@ +var item; +var linked_items; +var tags = new Set(); +var weblinks; +var groups; +var shopping_lists; +var food_groups = new Set(); +var ingrediants = new Set(); +var primary_zone; +var primary_zone_id; +var primary_location; +var auto_zone; +var auto_zone_id; +var auto_location; +var brand; +var locations; + +var current_page = 1; +var limit = 2; +var end_page = 1; +var search_string = ''; + +var updated = {}; + +// form defaults, make this editable. +var item_types = [['Single', 'single'], ['Linked List', 'list'], ['Linked Item', 'link']]; +var item_subtypes = [['Food', 'FOOD'], ['Food PLU', 'FOOD_PLU'], ['Other', 'OTHER'], ['Medicinal', 'MEDICINE'], ['Hygenic', 'HYGENIC']]; + +document.addEventListener('DOMContentLoaded', async function() { + await setupFormDefaults() + await fetchItem() + console.log(item) + document.getElementById('title').innerHTML = item.item_name; + await setBasicInfo() + await updateWebLinksTable() + await updateReferenceTable() + await updateLocationsTable() + await updateLinkedItemsTable() + await updateConversionsTableBody() + await updatePrefixTableBody() + await updateTags() +}) + +async function setupFormDefaults() { + let itemTypeSelect = document.getElementById('itemTypeSelect') + for(let i=0; i${weblinks[key]}` + let buttonCell = document.createElement('td') + buttonCell.classList.add('uk-width-1-4') + + let deleteButton = document.createElement('button') + deleteButton.setAttribute('class', 'uk-flex uk-flex-middle uk-flex-center uk-button uk-button-small uk-align-right delete_button') + deleteButton.onclick = function (){ + deleteLink(key) + } + deleteButton.innerHTML = `` + + buttonCell.append(deleteButton) + + tableRow.append(nameCell) + tableRow.append(linkCell) + tableRow.append(buttonCell) + weblinksTableBody.append(tableRow) + } +} + +async function updateTags() { + let chipZoneTags = document.getElementById('tagsRow') + chipZoneTags.innerHTML = ""; + tags.forEach(tagText => { + let tag = document.createElement('div') + tag.setAttribute("uk-tooltip", "title: Double click to Remove; pos: bottom") + tag.setAttribute("class", "chip uk-border-pill uk-label uk-margin-xsmall-right") + tag.setAttribute("id", `tag_${tagText}`) + tag.innerHTML = tagText + tag.ondblclick = function(){ + removeTag(tagText, tag.id) + } + chipZoneTags.append(tag) + }); + let foodGroupsTags = document.getElementById('foodGroupsTagsRow') + foodGroupsTags.innerHTML = ""; + food_groups.forEach(tagText => { + let tag = document.createElement('div') + tag.setAttribute("uk-tooltip", "title: Double click to Remove; pos: bottom") + tag.setAttribute("class", "chip uk-border-pill uk-label uk-margin-xsmall-right") + tag.setAttribute("id", `tag_${tagText}`) + tag.innerHTML = tagText + tag.ondblclick = function(){ + removeFoodGroup(tagText, tag.id) + } + foodGroupsTags.append(tag) + }); + let ingrediantsRow = document.getElementById('ingrediantsRow') + ingrediantsRow.innerHTML = ""; + ingrediants.forEach(tagText => { + let tag = document.createElement('div') + tag.setAttribute("uk-tooltip", "title: Double click to Remove; pos: bottom") + tag.setAttribute("class", "chip uk-border-pill uk-label uk-margin-xsmall-right") + tag.setAttribute("id", `ingr_${tagText}`) + tag.innerHTML = tagText + tag.ondblclick = function(){ + removeIngrediant(tagText, tag.id) + } + ingrediantsRow.append(tag) + }); +} + +async function updateLocationsTable() { + let locationsTableBody = document.getElementById('locationsTableBody') + locationsTableBody.innerHTML = ""; + for(let i=0; i < locations.length; i++){ + console.log(locations[i]) + let tableRow = document.createElement('tr') + + let locationCell = document.createElement('td') + locationCell.innerHTML = `${locations[i].uuid}` + let QOHCell = document.createElement('td') + QOHCell.innerHTML = `${locations[i].quantity_on_hand}` + + tableRow.append(locationCell) + tableRow.append(QOHCell) + locationsTableBody.append(tableRow) + } +} + +async function setBasicInfo() { + document.getElementById('itemName').value = item.item_name + document.getElementById('itemBarcode').innerHTML = item.barcode + document.getElementById('itemBrand').value = brand; + document.getElementById('itemDescription').value = item.description + document.getElementById('itemTypeSelect').value = item.row_type + if(item.row_type === "list"){ + document.getElementById("linkedListLink").classList.remove("uk-disabled") + } else if (item.row_type === "link"){ + document.getElementById('itemTypeSelect').classList.add("uk-disabled") + } else { + document.getElementById("linkedListLink").classList.add("uk-disabled") + document.getElementById('itemTypeSelect').classList.remove("uk-disabled") + } + document.getElementById('itemSubTypeSelect').value = item.item_type + document.getElementById('aiPickableCheckbox').checked = item.item_info.ai_pick + document.getElementById('expiresCheckbox').checked = item.food_info.expires + document.getElementById('expirePeriod').value = item.food_info.default_expiration + document.getElementById('safetyStock').value = item.item_info.safety_stock + document.getElementById('leadTimeInDays').value = item.item_info.lead_time_days + document.getElementById('skuCost').value = item.item_info.cost.toLocaleString('en-US', {style: 'currency', currency: 'USD'}) + document.getElementById('uom_quantity').value = item.item_info.uom_quantity + document.getElementById('uom').value = item.item_info.uom.id + document.getElementById('packaging').value = item.item_info.packaging + document.getElementById('primaryZone').value = primary_zone + document.getElementById('primaryLocation').value = primary_location + document.getElementById('autoZone').value = auto_zone + document.getElementById('autoLocation').value = auto_location + + document.getElementById('main_qty_uom').value = `${item.item_info.uom_quantity} ${item.item_info.uom}` + document.getElementById('main_barcode').value = item.barcode + document.getElementById('search_string_main').value = item.search_string + +} + +function addTag(event){ + if (!updated.hasOwnProperty('item')){ + updated['item'] = {} + } + let tagInput = document.getElementById('tagInput'); + tagText = tagInput.value; + if((event.code=="Enter" || event.type=="click") && !tags.has(tagText)){ + console.log(tagText) + tags.add(tagText) + updated['item']['tags'] = Array.from(tags) + let chipZoneTags = document.getElementById('tagsRow') + + let tag = document.createElement('div') + tag.setAttribute("uk-tooltip", "title: Double click to Remove; pos: bottom") + tag.setAttribute("class", "chip uk-border-pill uk-label uk-margin-xsmall-right") + tag.setAttribute("id", `tag_${tagText}`) + tag.innerHTML = tagText + tag.ondblclick = function(){ + removeTag(tagText, tag.id) + } + chipZoneTags.append(tag) + tagInput.classList.remove('uk-form-danger') + } else if((event.code=="Enter" || event.type=="click") && tags.has(tagText)){ + tagInput.classList.add('uk-form-danger') + UIkit.notification({ + message: 'Duplicate Tags are not Allowed!', + status: 'danger', + pos: 'top-right', + timeout: 2000 + }); + + } else { + tagInput.classList.remove('uk-form-danger') + } +} + +function addFoodGroup(event){ + if (!updated.hasOwnProperty('food_info')){ + updated['food_info'] = {} + } + let foodGroupsInput = document.getElementById('foodGroupsInput'); + tagText = foodGroupsInput.value; + if((event.code=="Enter" || event.type=="click") && !food_groups.has(tagText)){ + food_groups.add(tagText) + updated['food_info']['food_groups'] = Array.from(food_groups) + let chipZoneTags = document.getElementById('foodGroupsTagsRow') + let tag = document.createElement('div') + tag.setAttribute("uk-tooltip", "title: Double click to Remove; pos: bottom") + tag.setAttribute("class", "chip uk-border-pill uk-label uk-margin-xsmall-right") + tag.setAttribute("id", `food_group_${tagText}`) + tag.innerHTML = tagText + tag.ondblclick = function(){ + removeFoodGroup(tagText, tag.id) + } + chipZoneTags.append(tag) + foodGroupsInput.classList.remove('uk-form-danger') + } else if((event.code=="Enter" || event.type=="click") && food_groups.has(tagText)){ + foodGroupsInput.classList.add('uk-form-danger') + UIkit.notification({ + message: 'Duplicate Food Groups are not Allowed!', + status: 'danger', + pos: 'top-right', + timeout: 2000 + }); + + } else { + foodGroupsInput.classList.remove('uk-form-danger') + } +} + +function addIngrediant(event){ + if (!updated.hasOwnProperty('food_info')){ + updated['food_info'] = {} + } + let ingrediantsInput = document.getElementById('ingrediantsInput'); + tagText = ingrediantsInput.value; + if((event.code=="Enter" || event.type=="click") && !ingrediants.has(tagText)){ + ingrediants.add(tagText) + updated['food_info']['ingrediants'] = Array.from(ingrediants) + let chipZoneTags = document.getElementById('ingrediantsRow') + + let tag = document.createElement('div') + tag.setAttribute("uk-tooltip", "title: Double click to Remove; pos: bottom") + tag.setAttribute("class", "chip uk-border-pill uk-label uk-margin-xsmall-right") + tag.setAttribute("id", `ingr_${tagText}`) + tag.innerHTML = tagText + tag.ondblclick = function(){ + removeIngrediant(tagText, tag.id) + } + chipZoneTags.append(tag) + ingrediantsInput.classList.remove('uk-form-danger') + } else if((event.code=="Enter" || event.type=="click") && ingrediants.has(tagText)){ + ingrediantsInput.classList.add('uk-form-danger') + UIkit.notification({ + message: 'Duplicate ingrediants are not Allowed!', + status: 'danger', + pos: 'top-right', + timeout: 2000 + }); + + } else { + ingrediantsInput.classList.remove('uk-form-danger') + } +} + +function removeTag(tagText, elementID) { + if (!updated.hasOwnProperty('item')){ + updated['item'] = {} + } + let childElement = document.getElementById(elementID) + let tempTags = Array.from(tags); + tempTags = tempTags.filter(item => item !== tagText); + updated['item']['tags'] = tempTags; + tags = new Set(tempTags); + childElement.parentNode.removeChild(childElement) +} + +function removeFoodGroup(tagText, elementID) { + if (!updated.hasOwnProperty('food_info')){ + updated['food_info'] = {} + } + let childElement = document.getElementById(elementID) + let tempTags = Array.from(food_groups); + tempTags = tempTags.filter(item => item !== tagText); + updated['food_info']['food_groups'] = tempTags; + food_groups = new Set(tempTags); + childElement.parentNode.removeChild(childElement) +} + +function removeIngrediant(tagText, elementID) { + if (!updated.hasOwnProperty('food_info')){ + updated['food_info'] = {} + } + console.log(tagText) + console.log(elementID) + let childElement = document.getElementById(elementID) + let tempTags = Array.from(ingrediants); + tempTags = tempTags.filter(item => item !== tagText); + updated['food_info']['ingrediants'] = tempTags + ingrediants = new Set(tempTags); + childElement.parentNode.removeChild(childElement) +} + +function deleteLink(linkKey){ + console.log(linkKey) +} + +async function updateLocationsSelectTable(logis) { + let fetchedLocations; + let selectlocationsTableBody = document.getElementById('selectlocationsTableBody') + selectlocationsTableBody.innerHTML = "" + + if (logis=='primary_location'){ + data = await fetchLocations('primary_location'); + fetchedLocations = data.locations; + end_page = data.endpage; + } else if (logis=='auto_issue_location'){ + data = await fetchLocations('auto_issue_location'); + fetchedLocations = data.locations; + end_page = data.endpage; + } + + console.log(fetchedLocations) + for(let i = 0; i < fetchedLocations.length; i++){ + + let tableRow = document.createElement('tr') + tableRow.classList.add("selectableRow") + + let nameCell = document.createElement('td') + nameCell.innerHTML = `${fetchedLocations[i].name}` + + tableRow.id = fetchedLocations[i].id + + tableRow.append(nameCell) + tableRow.onclick = function(){ + closeZoneLocationBrandModal(fetchedLocations[i].name, fetchedLocations[i].id, logis) + } + selectlocationsTableBody.append(tableRow) + } +} + +async function openLocationsModal(logis, elementID){ + let LocationsModal = document.getElementById("LocationsModal") + current_page = 1; + search_string = ''; + await updateLocationsSelectTable(logis) + await updatePaginationElement(logis, elementID) + UIkit.modal(LocationsModal).show(); +} + +async function updateZonesTable(logis) { + let zonesTableBody = document.getElementById('zonesTableBody') + zonesTableBody.innerHTML = "" + data = await fetchZones() + zones = data.zones + end_page = data.endpage + for(let i = 0; i < zones.length; i++){ + let tableRow = document.createElement('tr') + + let nameCell = document.createElement('td') + nameCell.innerHTML = `${zones[i].name}` + + tableRow.id = zones[i].id + + tableRow.append(nameCell) + tableRow.onclick = function(){ + closeZoneLocationBrandModal(zones[i].name, zones[i].id, logis) + } + zonesTableBody.append(tableRow) + } +} + +async function updateLinkedItemsTable() { + let linkedItemsTableBody = document.getElementById('linkedItemsTableBody') + linkedItemsTableBody.innerHTML = "" + + let linked_items = item.linked_items + for(let i = 0; i < linked_items.length; i++){ + + let tableRow = document.createElement('tr') + + let barcodeCell = document.createElement('td') + barcodeCell.innerHTML = linked_items[i].barcode + let nameCell = document.createElement('td') + nameCell.innerHTML = linked_items[i].data.item_name + let opCell = document.createElement('td') + + let editOp = document.createElement('a') + editOp.setAttribute('class', 'uk-button uk-button-default') + editOp.setAttribute('uk-icon', 'icon: pencil') + editOp.setAttribute('href', `/item/${item['id']}/itemLink/${linked_items[i].id}`) + + opCell.append(editOp) + + tableRow.append(barcodeCell, nameCell, opCell) + linkedItemsTableBody.append(tableRow) + } +} + + +async function openZonesModal(logis, elementID){ + let zonesModal = document.getElementById("zonesModal") + current_page = 1; + search_string = ''; + await updateZonesTable(logis) + await updatePaginationElement(logis, elementID) + UIkit.modal(zonesModal).show(); +} + +function closeZoneLocationBrandModal(selectName, selectID, key){ + if (!updated.hasOwnProperty('logistics_info')){ + updated['logistics_info'] = {} + } + if (!updated.hasOwnProperty('item')){ + updated['item'] = {} + } + + if(key=='primary_zone'){ + primary_zone = selectName; + primary_zone_id = selectID; + document.getElementById('primaryZone').value = selectName; + updated['logistics_info']['primary_zone'] = selectID + document.getElementById('primaryLocation').classList.add('uk-form-danger') + document.getElementById('primaryLocation').value = ""; + UIkit.modal(document.getElementById('zonesModal')).hide(); + } + if(key=='auto_issue_zone'){ + auto_zone = selectName; + auto_zone_id = selectID; + document.getElementById('autoZone').value = selectName; + updated['logistics_info']['auto_issue_zone'] = selectID; + document.getElementById('autoLocation').classList.add('uk-form-danger') + document.getElementById('autoLocation').value = ""; + UIkit.modal(document.getElementById('zonesModal')).hide(); + } + if(key=='primary_location'){ + primary_location = selectName; + document.getElementById('primaryLocation').value = selectName; + updated['logistics_info']['primary_location'] = selectID; + document.getElementById('primaryLocation').classList.remove('uk-form-danger') + UIkit.modal(document.getElementById('LocationsModal')).hide(); + } + if(key=='auto_issue_location'){ + auto_location = selectName; + document.getElementById('autoLocation').value = selectName; + updated['logistics_info']['auto_issue_location'] = selectID; + document.getElementById('autoLocation').classList.remove('uk-form-danger') + UIkit.modal(document.getElementById('LocationsModal')).hide(); + } + if(key=='brand'){ + brand = selectName; + document.getElementById('itemBrand').value = selectName; + updated['item']['brand'] = selectID; + UIkit.modal(document.getElementById('brandsModal')).hide(); + } + if(key=='items'){ + barcode = selectName[0]; + document.getElementById('linked_item').value = barcode; + document.getElementById('conversion_factor_uom').value = selectName[1]; + document.getElementById('linked_item_id').value = selectID; + document.getElementById('linkAdd').onclick = async function () { + await addLinkedItem(item_id, selectID) + } + UIkit.modal(document.getElementById('itemsModal')).hide(); + } +} + +async function updateBrandsModalTable(logis) { + let brandsTableBody = document.getElementById('brandsTableBody'); + brandsTableBody.innerHTML = ""; + data = await fetchBrands(); + end_page = data.endpage; + let fetchedBrands = data.brands; + + for(let i=0; i < fetchedBrands.length; i++){ + let tableRow = document.createElement('tr') + + let nameCell = document.createElement('td') + nameCell.innerHTML = `${fetchedBrands[i].name}` + + tableRow.id = fetchedBrands[i].id + tableRow.onclick = function(){ + closeZoneLocationBrandModal(fetchedBrands[i].name, fetchedBrands[i].id, logis) + } + tableRow.append(nameCell) + brandsTableBody.append(tableRow) + } +} + +async function updateItemsModalTable(logis) { + let itemsTableBody = document.getElementById('itemsTableBody'); + itemsTableBody.innerHTML = ""; + data = await fetchItems(); + end_page = data.end; + let fetchedItems = data.items; + + + for(let i=0; i < fetchedItems.length; i++){ + let tableRow = document.createElement('tr') + + let idCell = document.createElement('td') + idCell.innerHTML = `${fetchedItems[i].id}` + + let barcodeCell = document.createElement('td') + barcodeCell.innerHTML = `${fetchedItems[i].barcode}` + + let nameCell = document.createElement('td') + nameCell.innerHTML = `${fetchedItems[i].item_name}` + + tableRow.id = fetchedItems[i].id + tableRow.onclick = async function(){ + closeZoneLocationBrandModal([fetchedItems[i].barcode, fetchedItems[i].item_info.uom], fetchedItems[i].id, logis) + } + tableRow.append(idCell, barcodeCell, nameCell) + itemsTableBody.append(tableRow) + console.log(tableRow.onclick) + } +} + +async function openBrandsModal(logis, elementID) { + let brandsModal = document.getElementById('brandsModal') + current_page = 1; + search_string = ''; + await updateBrandsModalTable(logis) + await updatePaginationElement(logis, elementID) + UIkit.modal(brandsModal).show(); + +} + +async function openItemsModal(logis, elementID) { + let itemsModal = document.getElementById('itemsModal') + current_page = 1; + search_string = ''; + document.getElementById('searchItemsInput').value = ''; + await updateItemsModalTable(logis) + await updatePaginationElement(logis, elementID) + UIkit.modal(itemsModal).show(); +} + +async function openAddConversionsModal() { + let conversionsModal = document.getElementById('conversionsModal') + document.getElementById('parent_uom').value = `${item.item_info.uom.fullname}` + document.getElementById('conversionSubmitButton').innerHTML = "Add" + document.getElementById('conversionSubmitButton').onclick = async function() { + await postConversion() + } + UIkit.modal(conversionsModal).show() +} + +async function openEditConversionsModal(conversion) { + let conversionsModal = document.getElementById('conversionsModal') + document.getElementById('parent_uom').value = `${item.item_info.uom.fullname}` + document.getElementById('conversion_factor_modal').value = `${conversion.conv_factor}` + document.getElementById('conversion_uom').value = `${conversion.id}` + document.getElementById('conversionSubmitButton').innerHTML = "Save" + document.getElementById('conversionSubmitButton').onclick = async function() { + let update = {'conv_factor': document.getElementById('conversion_factor_modal').value} + await postConversionUpdate(conversion.conv_id, update) + } + UIkit.modal(conversionsModal).show() +} + + +async function postConversion() { + const response = await fetch(`/item/addConversion`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + parent_id: parseInt(item.id), + uom_id: parseInt(document.getElementById('conversion_uom').value), + conv_factor: parseFloat(document.getElementById('conversion_factor_modal').value) + }), + }); + data = await response.json(); + response_status = 'primary' + if (data.error){ + response_status = 'danger' + } + + UIkit.notification({ + message: data.message, + status: response_status, + pos: 'top-right', + timeout: 5000 + }); + await fetchItem() + await setBasicInfo() + await updateConversionsTableBody() + + UIkit.modal(conversionsModal).hide() +} + +async function postConversionUpdate(id, update) { + const response = await fetch(`/item/updateConversion`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + conversion_id: id, + update: update + }), + }); + data = await response.json(); + response_status = 'primary' + if (data.error){ + response_status = 'danger' + } + + UIkit.notification({ + message: data.message, + status: response_status, + pos: 'top-right', + timeout: 5000 + }); + await fetchItem() + await setBasicInfo() + await updateConversionsTableBody() + + UIkit.modal(conversionsModal).hide() +} + +async function deleteConversion(conversion_id) { + const response = await fetch(`/item/deleteConversion`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + conversion_id: conversion_id + }), + }); + data = await response.json(); + response_status = 'primary' + if (data.error){ + response_status = 'danger' + } + + UIkit.notification({ + message: data.message, + status: response_status, + pos: 'top-right', + timeout: 5000 + }); + + await fetchItem() + await setBasicInfo() + await updateConversionsTableBody() + + UIkit.modal(conversionsModal).hide() + +} + +async function openAddPrefixesModal() { + let prefixesModal = document.getElementById('prefixesModal') + current_page = 1; + let data = await fetchPrefixes() + let prefixes = data.prefixes + end_page = data.end; + await updatePrefixModalTableBody(prefixes) + await updatePrefixPaginationElement() + UIkit.modal(prefixesModal).show() +} + +async function postPrefix(id) { + const response = await fetch(`/item/addPrefix`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + parent_id: parseInt(item.item_info_id), + prefix_id: parseInt(id) + }), + }); + data = await response.json(); + response_status = 'primary' + if (data.error){ + response_status = 'danger' + } + + UIkit.notification({ + message: data.message, + status: response_status, + pos: 'top-right', + timeout: 5000 + }); + await fetchItem() + await setBasicInfo() + await updatePrefixTableBody() + UIkit.modal(document.getElementById('prefixesModal')).hide() +} + +async function deletePrefix(prefix_id) { + const response = await fetch(`/item/deletePrefix`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + item_info_id: item.item_info_id, + prefix_id: prefix_id + }), + }); + data = await response.json(); + response_status = 'primary' + if (data.error){ + response_status = 'danger' + } + + UIkit.notification({ + message: data.message, + status: response_status, + pos: 'top-right', + timeout: 5000 + }); + + await fetchItem() + await setBasicInfo() + await updatePrefixTableBody() + + UIkit.modal(document.getElementById('prefixesModal')).hide() + +} + +let prefix_limit = 2; +async function fetchPrefixes() { + const url = new URL('/item/getPrefixes', window.location.origin); + url.searchParams.append('page', current_page); + url.searchParams.append('limit', prefix_limit); + const response = await fetch(url); + data = await response.json(); + return data; +} + +let brands_limit = 25; +async function fetchBrands() { + const url = new URL('/item/getBrands', window.location.origin); + url.searchParams.append('page', current_page); + url.searchParams.append('limit', brands_limit); + const response = await fetch(url); + data = await response.json(); + return data; +} + +let items_limit = 25; +async function fetchItems() { + const url = new URL('/item/getModalItems', window.location.origin); + url.searchParams.append('page', current_page); + url.searchParams.append('limit', items_limit); + url.searchParams.append('search_string', search_string); + const response = await fetch(url); + data = await response.json(); + return data; +} + +let zones_limit = 20; +async function fetchZones(){ + const url = new URL('/item/getZones', window.location.origin); + url.searchParams.append('page', current_page); + url.searchParams.append('limit', zones_limit); + const response = await fetch(url); + data = await response.json(); + return data; +} + +let locations_limit = 10; +async function fetchLocations(logis) { + const url = new URL('/item/getLocations', window.location.origin); + url.searchParams.append('page', current_page); + url.searchParams.append('limit', locations_limit); + if(logis=="primary_location"){ + url.searchParams.append('id', primary_zone_id); + } else if (logis=="auto_issue_location"){ + url.searchParams.append('id', auto_zone_id); + } + const response = await fetch(url); + data = await response.json(); + return data; +} + +async function fetchItem() { + const url = new URL('/item/getItem', window.location.origin); + url.searchParams.append('id', item_id); + const response = await fetch(url); + data = await response.json(); + item = data.item; + tags = new Set(item.tags); + weblinks = item.links; + groups = item.item_groups; + shopping_lists = item.item_shopping_lists; + food_groups = new Set(item.food_info.food_groups); + ingrediants = new Set(item.food_info.ingrediants); + + primary_zone = item.logistics_info.primary_zone.name + primary_zone_id = item.logistics_info.primary_zone.id + primary_location = item.logistics_info.primary_location.name + + auto_zone = item.logistics_info.auto_issue_zone.name + auto_zone_id = item.logistics_info.auto_issue_zone.id + auto_location = item.logistics_info.auto_issue_location.name + locations = item.item_locations + + brand = item.brand.name +}; + +async function searchTable(event, logis, elementID) { + if(event.key==='Enter' && logis==='items'){ + search_string = event.srcElement.value + await updateItemsModalTable(logis) + } + await updatePaginationElement(logis, elementID) +} + +async function setPage(pageNumber, logis, elementID){ + current_page = pageNumber; + + if(elementID=="zonesPage"){ + await updateZonesTable(logis) + } else if(elementID=="locationsPage"){ + await updateLocationsSelectTable(logis) + }else if (elementID=="brandsPage"){ + await updateBrandsModalTable(logis) + } else if (elementID=="itemsPage"){ + await updateItemsModalTable(logis) + } + await updatePaginationElement(logis, elementID) + console.log(current_page) +} + +async function updatePaginationElement(logis, elementID) { + let paginationElement = document.getElementById(elementID); + paginationElement.innerHTML = ""; + // previous + let previousElement = document.createElement('li') + if(current_page<=1){ + previousElement.innerHTML = ``; + previousElement.classList.add('uk-disabled'); + }else { + previousElement.innerHTML = ``; + } + paginationElement.append(previousElement) + + //first + let firstElement = document.createElement('li') + if(current_page<=1){ + firstElement.innerHTML = `1`; + firstElement.classList.add('uk-disabled'); + }else { + firstElement.innerHTML = `1`; + } + paginationElement.append(firstElement) + + // ... + if(current_page-2>1){ + let firstDotElement = document.createElement('li') + firstDotElement.classList.add('uk-disabled') + firstDotElement.innerHTML = `…`; + paginationElement.append(firstDotElement) + } + // last + if(current_page-2>0){ + let lastElement = document.createElement('li') + lastElement.innerHTML = `${current_page-1}` + paginationElement.append(lastElement) + } + // current + if(current_page!=1 && current_page != end_page){ + let currentElement = document.createElement('li') + currentElement.innerHTML = `
  • ${current_page}
  • ` + paginationElement.append(currentElement) + } + // next + if(current_page+2${current_page+1}` + paginationElement.append(nextElement) + } + // ... + if(current_page+2<=end_page){ + let secondDotElement = document.createElement('li') + secondDotElement.classList.add('uk-disabled') + secondDotElement.innerHTML = `…`; + paginationElement.append(secondDotElement) + } + //end + let endElement = document.createElement('li') + if(current_page>=end_page){ + endElement.innerHTML = `${end_page}`; + endElement.classList.add('uk-disabled'); + }else { + endElement.innerHTML = `${end_page}`; + } + paginationElement.append(endElement) + //next button + let nextElement = document.createElement('li') + if(current_page>=end_page){ + nextElement.innerHTML = ``; + nextElement.classList.add('uk-disabled'); + }else { + nextElement.innerHTML = ``; + console.log(nextElement.innerHTML) + } + paginationElement.append(nextElement) +} + +async function addLinkedItem(parent_id, child_id) { + let conversion_factor = parseFloat(document.getElementById('conversion_factor').value) + + if(Number.isInteger(conversion_factor)){ + document.getElementById('conversion_factor').classList.remove('uk-form-danger') + const response = await fetch(`/item/addLinkedItem`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + parent_id: parseInt(parent_id), + child_id: parseInt(child_id), + conv_factor: conversion_factor + }), + }); + data = await response.json(); + response_status = 'primary' + if (data.error){ + response_status = 'danger' + } + + UIkit.notification({ + message: data.message, + status: response_status, + pos: 'top-right', + timeout: 5000 + }); + + document.getElementById('linked_item').value = "" + document.getElementById('conversion_factor').value = "" + document.getElementById('linked_item_id').value = "" + document.getElementById('linkAdd').onclick = null + + await fetchItem() + await setBasicInfo() + await updateLinkedItemsTable() + + } else { + document.getElementById('conversion_factor').classList.add('uk-form-danger') + } +} + +async function saveUpdated() { + const response = await fetch(`/item/updateItem`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + id: parseInt(item_id), + data: updated + }), + }); + + data = await response.json(); + response_status = 'success' + if (data.error){ + response_status = 'danger' + } + + UIkit.notification({ + message: data.message, + status: response_status, + pos: 'top-right', + timeout: 5000 + }); + + updated = {} + await fetchItem() + await setBasicInfo() +}; + +async function refreshSearchString() { + const response = await fetch(`/item/refreshSearchString`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + item_id: parseInt(item.id) + }), + }); + + data = await response.json(); + response_status = 'success' + if (data.error){ + response_status = 'danger' + } + + UIkit.notification({ + message: data.message, + status: response_status, + pos: 'top-right', + timeout: 5000 + }); + + await fetchItem() + await setBasicInfo() +}; + + +async function descriptionChanged() { + if (!updated.hasOwnProperty('item')){ + updated['item'] = {} + } + + updated['item']['description'] = document.getElementById('itemDescription').value +} + +async function nameChanged() { + if (!updated.hasOwnProperty('item')){ + updated['item'] = {} + } + + updated['item']['item_name'] = document.getElementById('itemName').value +} + +async function selectChanged(logis) { + if (!updated.hasOwnProperty('item')){ + updated['item'] = {} + } + if(logis=='row_type'){ + updated['item'][logis] = document.getElementById('itemTypeSelect').value + } + if(logis == 'item_type'){ + updated['item'][logis] = document.getElementById('itemSubTypeSelect').value + } +} + +async function itemInfoChanged(logis) { + if (!updated.hasOwnProperty('item_info')){ + updated['item_info'] = {} + } + if (logis == 'safety_stock'){ + let value = document.getElementById('safetyStock').value + updated['item_info']['safety_stock'] = parseFloat(value) + } + if (logis == 'lead_time_days'){ + let value = document.getElementById('leadTimeInDays').value + updated['item_info']['lead_time_days'] = parseFloat(value) + } + if (logis == 'cost'){ + let value = document.getElementById('skuCost').value + value = parseFloat(value.replace(/[^0-9.-]+/g,"")); + updated['item_info']['cost'] = value + } + if (logis == 'uom_quantity'){ + let value = document.getElementById('uom_quantity').value + updated['item_info']['uom_quantity'] = value + } + if (logis == 'uom'){ + let value = document.getElementById('uom').value + updated['item_info']['uom'] = value + } + if (logis == 'packaging'){ + let value = document.getElementById('packaging').value + updated['item_info']['packaging'] = value + } + if (logis == 'ai_pick'){ + let value = document.getElementById('aiPickableCheckbox').checked + console.log(value) + updated['item_info']['ai_pick'] = value + } +} + +async function foodInfoChanged(logis) { + if (!updated.hasOwnProperty('food_info')){ + updated['food_info'] = {} + } + if (logis === "expires"){ + let value = document.getElementById('expiresCheckbox').checked + updated['food_info']['expires'] = value + } + if (logis === "default_expiration"){ + let value = document.getElementById('expirePeriod').value + updated['food_info']['default_expiration'] = value + } +} + +async function setPrefixPage(pageNumber){ + current_page = pageNumber; + let data = await fetchPrefixes() + end_page = data.end; + await updatePrefixModalTableBody(data.prefixes) + await updatePrefixPaginationElement() +} + +async function updatePrefixPaginationElement() { + let paginationElement = document.getElementById('prefixesModalPage'); + paginationElement.innerHTML = ""; + // previous + let previousElement = document.createElement('li') + if(current_page<=1){ + previousElement.innerHTML = ``; + previousElement.classList.add('uk-disabled'); + }else { + previousElement.innerHTML = ``; + } + paginationElement.append(previousElement) + + //first + let firstElement = document.createElement('li') + if(current_page<=1){ + firstElement.innerHTML = `1`; + firstElement.classList.add('uk-disabled'); + }else { + firstElement.innerHTML = `1`; + } + paginationElement.append(firstElement) + + // ... + if(current_page-2>1){ + let firstDotElement = document.createElement('li') + firstDotElement.classList.add('uk-disabled') + firstDotElement.innerHTML = `…`; + paginationElement.append(firstDotElement) + } + // last + if(current_page-2>0){ + let lastElement = document.createElement('li') + lastElement.innerHTML = `${current_page-1}` + paginationElement.append(lastElement) + } + // current + if(current_page!=1 && current_page != end_page){ + let currentElement = document.createElement('li') + currentElement.innerHTML = `
  • ${current_page}
  • ` + paginationElement.append(currentElement) + } + // next + if(current_page+2${current_page+1}` + paginationElement.append(nextElement) + } + // ... + if(current_page+2<=end_page){ + let secondDotElement = document.createElement('li') + secondDotElement.classList.add('uk-disabled') + secondDotElement.innerHTML = `…`; + paginationElement.append(secondDotElement) + } + //end + let endElement = document.createElement('li') + if(current_page>=end_page){ + endElement.innerHTML = `${end_page}`; + endElement.classList.add('uk-disabled'); + }else { + endElement.innerHTML = `${end_page}`; + } + paginationElement.append(endElement) + //next button + let nextElement = document.createElement('li') + if(current_page>=end_page){ + nextElement.innerHTML = ``; + nextElement.classList.add('uk-disabled'); + }else { + nextElement.innerHTML = ``; + console.log(nextElement.innerHTML) + } + paginationElement.append(nextElement) +} + +var darkmode = false +function toggleDarkMode(){ + if (!darkmode){ + document.body.classList.add('dark-mode-body') + document.body.classList.add('uk-light') + document.getElementById('navbar').classList.add('uk-light') + document.getElementById('navbar').style = "background-color: #121212;" + document.getElementById('weblinkModal').classList.add('dark-mode-element') + document.getElementById('weblinkModalFooter').classList.add('dark-mode-element') + document.getElementById('brandsModalinner').classList.add('dark-mode-element') + document.getElementById('locationsModalInner').classList.add('dark-mode-element') + document.getElementById('zonesModalInner').classList.add('dark-mode-element') + document.getElementById('modeToggle').innerHTML = "light_mode" + + darkmode = true + } else { + document.body.classList.remove('dark-mode-body') + document.body.classList.remove('uk-light') + document.getElementById('navbar').classList.remove('uk-light') + document.getElementById('navbar').style = "" + document.getElementById('weblinkModal').classList.remove('dark-mode-element') + document.getElementById('weblinkModalFooter').classList.remove('dark-mode-element') + document.getElementById('brandsModalinner').classList.remove('dark-mode-element') + document.getElementById('locationsModalInner').classList.remove('dark-mode-element') + document.getElementById('zonesModalInner').classList.remove('dark-mode-element') + document.getElementById('modeToggle').innerHTML = "dark_mode" + + darkmode=false + } +} \ No newline at end of file diff --git a/static/handlers/loginHandler.js b/static/handlers/loginHandler.js new file mode 100644 index 0000000..000d638 --- /dev/null +++ b/static/handlers/loginHandler.js @@ -0,0 +1,134 @@ +async function loginUser() { + let username = document.getElementById('login_username').value + let password = document.getElementById('login_password').value + + const response = await fetch(`/login`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + username: username, + password: password + }), + }); + + data = await response.json(); + transaction_status = "success" + if (data.error){ + transaction_status = "danger" + } else { + window.location.href = '/'; + } + + UIkit.notification({ + message: data.message, + status: transaction_status, + pos: 'top-right', + timeout: 5000 + }); +} + +function validateEmail(email) { + const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + return emailPattern.test(email); +} + +function isNotEmpty(inputValue) { + return inputValue.trim().length > 0; +} + +async function signUpValidate() { + + let error_total = 0 + + let user_email = document.getElementById('signup_email') + if(!validateEmail(user_email.value)){ + user_email.classList.add('uk-form-danger') + error_total = error_total + 1 + } else { + user_email.classList.remove('uk-form-danger') + } + + let password = document.getElementById('signup_password') + let password_confirm = document.getElementById('signup_password_confirm') + + if(!isNotEmpty(password.value)){ + password.classList.add('uk-form-danger') + password_confirm.classList.add('uk-form-danger') + error_total = error_total + 1 + } else if (!isNotEmpty(password_confirm.value)){ + password.classList.add('uk-form-danger') + password_confirm.classList.add('uk-form-danger') + error_total = error_total + 1 + } else if (!password.value === password_confirm.value){ + password.classList.add('uk-form-danger') + password_confirm.classList.add('uk-form-danger') + error_total = error_total + 1 + } else { + password.classList.remove('uk-form-danger') + password_confirm.classList.remove('uk-form-danger') + } + + let username = document.getElementById('signup_username') + if(isNotEmpty(username.value)){ + username.classList.remove('uk-form-danger') + } else { + username.classList.add('uk-form-danger') + error_total = error_total + 1 + } + + let valid = true + if(error_total > 0){ + valid = false + } + return valid +} + +async function signupUser() { + let valid = await signUpValidate() + if(valid){ + let user_email = document.getElementById('signup_email').value + let password = document.getElementById('signup_password').value + let username = document.getElementById('signup_username').value + const response = await fetch(`/signup`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + username: username, + password: password, + email: user_email + }), + }); + + data = await response.json(); + transaction_status = "success" + if (data.error){ + transaction_status = "danger" + } + + UIkit.notification({ + message: data.message, + status: transaction_status, + pos: 'top-right', + timeout: 5000 + }); + + if(!data.error){ + document.getElementById('signup_email').value = "" + document.getElementById('signup_password').value = "" + document.getElementById('signup_password_confirm').value = "" + document.getElementById('signup_username').value = "" + } + + } else { + UIkit.notification({ + message: 'Please review the form!', + status: 'danger', + pos: 'top-right', + timeout: 5000 + }); + } +} \ No newline at end of file diff --git a/static/handlers/receiptHandler.js b/static/handlers/receiptHandler.js new file mode 100644 index 0000000..a12216d --- /dev/null +++ b/static/handlers/receiptHandler.js @@ -0,0 +1,507 @@ +var pagination_current = 1; +var pagination_end = 10 + +document.addEventListener('DOMContentLoaded', async function() { + await refreshReceipt() +}) + +async function refreshReceipt() { + let receipt = await getReceipt(receipt_id) + console.log(receipt) + await replenishFields(receipt) + await replenishLinesTable(receipt.receipt_items) + await replenishFilesCards(receipt.files) +} + +async function replenishFields(receipt) { + if (receipt){ + document.getElementById('title').innerHTML = receipt.receipt_id + document.getElementById('crumbID').innerHTML = receipt.receipt_id + document.getElementById('receipt_id').innerHTML = receipt.receipt_id + document.getElementById('database_id').value = receipt.id + document.getElementById('date_submitted').value = receipt.date_submitted + document.getElementById('submitted_by').value = receipt.submitted_by + document.getElementById('receipt_status').value = receipt.receipt_status + document.getElementById('vendor_id').value = receipt.vendor.id + document.getElementById('vendor_name').value = receipt.vendor.vendor_name + document.getElementById('vendor_address').value = receipt.vendor.vendor_address + document.getElementById('vendor_phone').value = receipt.vendor.phone_number + } +} + +async function checkAPI(line_id, barcode) { + console.log(barcode) + const response = await fetch(`/receipts/checkAPI`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + line_id: line_id, + barcode: barcode + }), + }); + data = await response.json() + message_type = "primary" + if(data.error){ + message_type = "danger" + } + UIkit.notification({ + message: data.message, + status: message_type, + pos: 'top-right', + timeout: 5000 + }); + await refreshReceipt() +} + +async function replenishLinesTable(receipt_items) { + let linesTableBody = document.getElementById("linesTableBody") + linesTableBody.innerHTML = "" + + let deniedTableBody = document.getElementById("deniedTableBody") + deniedTableBody.innerHTML = "" + + let resolvedTableBody = document.getElementById("resolvedTableBody") + resolvedTableBody.innerHTML = "" + + for(let i = 0; i < receipt_items.length; i++){ + let tableRow = document.createElement('tr') + + + let statusCell = document.createElement('td') + statusCell.innerHTML = receipt_items[i].status + let barcodeCell = document.createElement('td') + barcodeCell.innerHTML = receipt_items[i].barcode + let typeCell = document.createElement('td') + + let label_color = 'grey' + if(receipt_items[i].type == 'sku'){ + label_color = 'green' + } + if(receipt_items[i].type == 'new sku'){ + label_color = 'orange' + } + if(receipt_items[i].type == 'api'){ + label_color = 'purple' + } + + typeCell.innerHTML = `${receipt_items[i].type}` + let nameCell = document.createElement('td') + nameCell.innerHTML = receipt_items[i].name + + + + let operationsCell = document.createElement('td') + + let apiOp = document.createElement('a') + + if(receipt_items[i].type === "new sku"){ + apiOp.style = "margin-right: 5px;" + apiOp.setAttribute('class', 'uk-button uk-button-small uk-button-default') + apiOp.setAttribute('uk-icon', 'icon: pull') + apiOp.onclick = async function () { + await checkAPI(receipt_items[i].id, receipt_items[i].barcode) + } + } + + let editOp = document.createElement('a') + editOp.style = "margin-right: 5px;" + editOp.setAttribute('class', 'uk-button uk-button-small uk-button-default') + editOp.setAttribute('uk-icon', 'icon: pencil') + editOp.onclick = async function () { + await openLineEditModal(receipt_items[i]) + } + + let resolveOp = document.createElement('a') + resolveOp.style = "margin-right: 5px;" + resolveOp.setAttribute('class', 'uk-button uk-button-small uk-button-default') + resolveOp.setAttribute('uk-icon', 'icon: check') + resolveOp.onclick = async function(){ + await resolveLine(receipt_items[i].id) + } + + let denyOp = document.createElement('a') + denyOp.style = "margin-right: 5px;" + denyOp.setAttribute('class', 'uk-button uk-button-small uk-button-default') + denyOp.setAttribute('uk-icon', 'icon: close-circle') + denyOp.onclick = async function() { + await denyLine(receipt_items[i].id) + } + + let deleteOp = document.createElement('a') + deleteOp.setAttribute('class', 'uk-button uk-button-small uk-button-default') + deleteOp.setAttribute('uk-icon', 'icon: trash') + deleteOp.onclick = async function(){ + await deleteLine(receipt_items[i].id) + } + + + if (receipt_items[i].type === "new sku"){ + operationsCell.append(apiOp) + } + + operationsCell.append(editOp, resolveOp, denyOp, deleteOp) + + operationsCell.classList.add("uk-flex") + operationsCell.classList.add("uk-flex-right") + + if(receipt_items[i].status === "Denied" || receipt_items[i].status === "Resolved"){ + tableRow.classList.add('uk-disabled') + } + + tableRow.append(statusCell, barcodeCell,typeCell, nameCell, operationsCell) + + if(receipt_items[i].status === "Denied"){ + deniedTableBody.append(tableRow) + } else if(receipt_items[i].status === "Resolved") { + resolvedTableBody.append(tableRow) + } else { + linesTableBody.append(tableRow) + } + } +} + +async function replenishItemsTable(items) { + let itemsTableBody = document.getElementById("itemsTableBody") + itemsTableBody.innerHTML = "" + + for(let i = 0; i < items.length; i++){ + let tableRow = document.createElement('tr') + + let idCell = document.createElement('td') + idCell.innerHTML = items[i].id + let barcodeCell = document.createElement('td') + barcodeCell.innerHTML = items[i].barcode + let nameCell = document.createElement('td') + nameCell.innerHTML = items[i].item_name + + tableRow.onclick = async function() { + await addSKULine(items[i].id) + } + + tableRow.append(idCell, barcodeCell, nameCell) + itemsTableBody.append(tableRow) + } +} + +async function replenishFilesCards(files) { + let fileCards = document.getElementById('fileCards') + fileCards.innerHTML = "" + + for(let key in files){ + let parent_div = document.createElement('div') + + let card_div = document.createElement('div') + card_div.setAttribute('class', 'uk-card uk-card-default uk-card-small') + + console.log(files[key]) + + let baseStaticUrl = '/static/files/receipts/previews/'; + let imgSrc = `${baseStaticUrl}${files[key].preview_image}`; + + let media_div = document.createElement('div') + media_div.setAttribute('class', 'uk-card-media-top') + media_div.innerHTML = ``; + let body_div = document.createElement('div') + body_div.setAttribute('class', 'uk-card-body') + + let file_size = (files[key].file_size / (1024 * 1024)).toFixed(2) + + body_div.innerHTML = ` +

    ${key}

    +

    Size: ${file_size} MB

    +

    uploaded_by: ${files[key].uploaded_by}

    +

    Type: ${files[key].file_type}

    + + ` + + card_div.append(media_div, body_div) + parent_div.append(card_div) + fileCards.append(parent_div) + + } +} + +async function viewFile(source) { + let iframeModalBody = document.getElementById('iframeModalBody') + iframeModalBody.innerHTML = "" + + document.getElementById('filenameiframemodal').innerHTML = source + + let iframe = document.createElement('iframe') + iframe.src = `/receipt/getFile/${source}` + iframe.width = "100%" + iframe.style.height = "100%" + + iframeModalBody.append(iframe) + + UIkit.modal(document.getElementById("iframeModal")).show(); + +} + +async function openCustomModal() { + console.log("custom") + +} + +async function openSKUModal() { + pagination_current = 1 + let items = await getItems() + await replenishItemsTable(items) + await updateItemsPaginationElement() + UIkit.dropdown(document.getElementById("addLineDropDown")).hide(false); + UIkit.modal(document.getElementById("itemsModal")).show(); +} + +async function openLineEditModal(line_data) { + console.log(line_data) + document.getElementById('lineName').value = line_data.name + document.getElementById('lineQty').value = line_data.qty + document.getElementById('lineUOM').value = line_data.uom.id + document.getElementById('lineCost').value = line_data.data.cost + document.getElementById('lineExpires').value = line_data.data.expires + if(line_data.type === 'sku'){ + document.getElementById('lineUOM').classList.add('uk-disabled') + } else { + document.getElementById('lineUOM').classList.remove('uk-disabled') + } + + if(!line_data.data.expires){ + document.getElementById('lineExpires').classList.add('uk-disabled') + } else { + document.getElementById('lineExpires').classList.remove('uk-disabled') + } + document.getElementById('saveLineButton').onclick = async function() { + await saveLine(line_data.id) + } + UIkit.modal(document.getElementById("lineEditModal")).show(); +} + +async function addSKULine(item_id) { + console.log(item_id) + const response = await fetch(`/receipts/addSKULine`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + item_id: item_id, + receipt_id: receipt_id + }), + }); + await refreshReceipt() + UIkit.modal(document.getElementById("itemsModal")).hide(); + +} + +async function resolveLine(line_id) { + const response = await fetch(`/receipts/resolveLine`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + line_id: line_id + }), + }); + await refreshReceipt() +} + +async function resolveReceipt() { + const response = await fetch(`/receipts/resolveReceipt`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + receipt_id: receipt_id + }), + }); + await refreshReceipt() +} + +async function uploadFile() { + const fileInput = document.querySelector('input[type="file"]'); + const formData = new FormData(); + formData.append('file', fileInput.files[0]); + + await fetch(`/receipt/uploadfile/${receipt_id}`, { + method: 'POST', + body: formData + }) + .then(response => response.json()) + .then(data => console.log('File uploaded!', data)) + .catch(error => console.error('Error:', error)); +} + +async function saveLine(line_id){ + let name = document.getElementById('lineName').value + let qty = document.getElementById('lineQty').value + let uom = document.getElementById('lineUOM').value + let cost = document.getElementById('lineCost').value + let expires = document.getElementById('lineExpires').value + console.log(expires) + + if(expires === ''){ + expires = false + } + + UIkit.modal(document.getElementById("lineEditModal")).hide(); + + let payload = { + name: name, + qty: qty, + uom: uom, + data: { + cost: cost, + expires: expires + } + } + + const response = await fetch(`/receipts/saveLine`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + line_id: line_id, + payload: payload + }), + }); + await refreshReceipt() + + +} + +async function deleteLine(id) { + const response = await fetch(`/receipts/deleteLine`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + line_id: id + }), + }); + await refreshReceipt() +} + +async function denyLine(id) { + console.log(id) + const response = await fetch(`/receipts/denyLine`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + line_id: id + }), + }); + await refreshReceipt() +} + +async function getReceipt(id) { + const url = new URL('/receipts/getReceipt', window.location.origin); + url.searchParams.append('id', id); + const response = await fetch(url); + data = await response.json(); + let receipt = data.receipt; + return receipt; +} + +let items_limit = 50; +async function getItems() { + console.log("getting items") + const url = new URL('/receipts/getItems', window.location.origin); + url.searchParams.append('page', pagination_current); + url.searchParams.append('limit', items_limit); + const response = await fetch(url); + data = await response.json(); + pagination_end = data.end + let items = data.items; + return items; +} + +async function setPage(page) { + pagination_current = page + let items = await getItems() + await replenishItemsTable(items) + await updateItemsPaginationElement() +} + +async function updateItemsPaginationElement() { + let paginationElement = document.getElementById("itemsPage"); + paginationElement.innerHTML = ""; + // previous + let previousElement = document.createElement('li') + if(pagination_current<=1){ + previousElement.innerHTML = ``; + previousElement.classList.add('uk-disabled'); + }else { + previousElement.innerHTML = ``; + } + paginationElement.append(previousElement) + + //first + let firstElement = document.createElement('li') + if(pagination_current<=1){ + firstElement.innerHTML = `1`; + firstElement.classList.add('uk-disabled'); + }else { + firstElement.innerHTML = `1`; + } + paginationElement.append(firstElement) + + // ... + if(pagination_current-2>1){ + let firstDotElement = document.createElement('li') + firstDotElement.classList.add('uk-disabled') + firstDotElement.innerHTML = `…`; + paginationElement.append(firstDotElement) + } + // last + if(pagination_current-2>0){ + let lastElement = document.createElement('li') + lastElement.innerHTML = `${pagination_current-1}` + paginationElement.append(lastElement) + } + // current + if(pagination_current!=1 && pagination_current != pagination_end){ + let currentElement = document.createElement('li') + currentElement.innerHTML = `
  • ${pagination_current}
  • ` + paginationElement.append(currentElement) + } + // next + if(pagination_current+2${pagination_current+1}` + paginationElement.append(nextElement) + } + // ... + if(pagination_current+2<=pagination_end){ + let secondDotElement = document.createElement('li') + secondDotElement.classList.add('uk-disabled') + secondDotElement.innerHTML = `…`; + paginationElement.append(secondDotElement) + } + //end + let endElement = document.createElement('li') + if(pagination_current>=pagination_end){ + endElement.innerHTML = `${pagination_end}`; + endElement.classList.add('uk-disabled'); + }else { + endElement.innerHTML = `${pagination_end}`; + } + paginationElement.append(endElement) + //next button + let nextElement = document.createElement('li') + if(pagination_current>=pagination_end){ + nextElement.innerHTML = ``; + nextElement.classList.add('uk-disabled'); + }else { + nextElement.innerHTML = ``; + console.log(nextElement.innerHTML) + } + paginationElement.append(nextElement) +} diff --git a/static/handlers/receiptsHandler.js b/static/handlers/receiptsHandler.js new file mode 100644 index 0000000..95e3a7c --- /dev/null +++ b/static/handlers/receiptsHandler.js @@ -0,0 +1,145 @@ +var pagination_current = 1; +var pagination_end = 10 + +document.addEventListener('DOMContentLoaded', async function() { + let receipts = await getReceipts() + await replenishReceiptsTable(receipts) + updatePaginationElement() +}) + + +async function replenishReceiptsTable(receipts) { + let receiptsTableBody = document.getElementById("receiptsTableBody") + receiptsTableBody.innerHTML = "" + + for(let i = 0; i < receipts.length; i++){ + let tableRow = document.createElement('tr') + + let receiptIDCell = document.createElement('td') + receiptIDCell.innerHTML = receipts[i].receipt_id + + let statusCell = document.createElement('td') + statusCell.innerHTML = receipts[i].receipt_status + + let dateCell = document.createElement('td') + dateCell.innerHTML = receipts[i].date_submitted + dateCell.classList.add("uk-visible@m") + + let submittedByCell = document.createElement('td') + submittedByCell.innerHTML = receipts[i].submitted_by + submittedByCell.classList.add("uk-visible@m") + + + tableRow.append( + receiptIDCell, + statusCell, + dateCell, + submittedByCell + ) + + tableRow.onclick = async function() { + let url = `${window.location.origin}/receipt/${receipts[i].id}`; + window.location.href = url; + } + + tableRow.style = "cursor: pointer;" + + receiptsTableBody.append(tableRow) + } +} + + +var receipts_limit = 10 +async function getReceipts() { + const url = new URL('/receipts/getReceipts', window.location.origin); + url.searchParams.append('page', pagination_current); + url.searchParams.append('limit', receipts_limit); + const response = await fetch(url); + data = await response.json(); + pagination_end = data.end + let receipts = data.receipts; + return receipts; +} + +async function setPage(page) { + pagination_current = page + let receipts = await getReceipts() + replenishReceiptsTable(receipts) + updatePaginationElement() +} + +async function updatePaginationElement() { + let paginationElement = document.getElementById("paginationElement"); + paginationElement.innerHTML = ""; + // previous + let previousElement = document.createElement('li') + if(pagination_current<=1){ + previousElement.innerHTML = ``; + previousElement.classList.add('uk-disabled'); + }else { + previousElement.innerHTML = ``; + } + paginationElement.append(previousElement) + + //first + let firstElement = document.createElement('li') + if(pagination_current<=1){ + firstElement.innerHTML = `1`; + firstElement.classList.add('uk-disabled'); + }else { + firstElement.innerHTML = `1`; + } + paginationElement.append(firstElement) + + // ... + if(pagination_current-2>1){ + let firstDotElement = document.createElement('li') + firstDotElement.classList.add('uk-disabled') + firstDotElement.innerHTML = `…`; + paginationElement.append(firstDotElement) + } + // last + if(pagination_current-2>0){ + let lastElement = document.createElement('li') + lastElement.innerHTML = `${pagination_current-1}` + paginationElement.append(lastElement) + } + // current + if(pagination_current!=1 && pagination_current != pagination_end){ + let currentElement = document.createElement('li') + currentElement.innerHTML = `
  • ${pagination_current}
  • ` + paginationElement.append(currentElement) + } + // next + if(pagination_current+2${pagination_current+1}` + paginationElement.append(nextElement) + } + // ... + if(pagination_current+2<=pagination_end){ + let secondDotElement = document.createElement('li') + secondDotElement.classList.add('uk-disabled') + secondDotElement.innerHTML = `…`; + paginationElement.append(secondDotElement) + } + //end + let endElement = document.createElement('li') + if(pagination_current>=pagination_end){ + endElement.innerHTML = `${pagination_end}`; + endElement.classList.add('uk-disabled'); + }else { + endElement.innerHTML = `${pagination_end}`; + } + paginationElement.append(endElement) + //next button + let nextElement = document.createElement('li') + if(pagination_current>=pagination_end){ + nextElement.innerHTML = ``; + nextElement.classList.add('uk-disabled'); + }else { + nextElement.innerHTML = ``; + console.log(nextElement.innerHTML) + } + paginationElement.append(nextElement) +} diff --git a/static/handlers/recipeEditHandler.js b/static/handlers/recipeEditHandler.js new file mode 100644 index 0000000..7bca145 --- /dev/null +++ b/static/handlers/recipeEditHandler.js @@ -0,0 +1,494 @@ +var mode = false +async function toggleDarkMode() { + let darkMode = document.getElementById("dark-mode"); + darkMode.disabled = !darkMode.disabled; + mode = !mode; + if(mode){ + document.getElementById('modeToggle').innerHTML = "light_mode" + document.getElementById('main_html').classList.add('uk-light') + + } else { + document.getElementById('modeToggle').innerHTML = "dark_mode" + document.getElementById('main_html').classList.remove('uk-light') + } +} + + +if(session.user.flags.darkmode){ + toggleDarkMode() +} + +// Beginning of site specific code! +var recipe = []; +document.addEventListener('DOMContentLoaded', async function() { + recipe = await getRecipe() + console.log(recipe) + await replenishRecipe() +}); + + +async function replenishRecipe() { + document.getElementById('title').innerHTML = `${recipe.name}` + document.getElementById('breadcrumb').innerHTML = `${recipe.name}` + + document.getElementById('recipeName').value = `${recipe.name}` + document.getElementById('recipeCreationDate').value = `${recipe.creation_date}` + document.getElementById('recipeAuthor').value = `${recipe.author}` + document.getElementById('recipeDescription').value = `${recipe.description}` + + await replenishInstructions() + await replenishIngrediants() + await getImage() +} + +async function replenishInstructions() { + let instructions_list = document.getElementById('instructions_list') + instructions_list.innerHTML = '' + + for(let i = 0; i < recipe.instructions.length; i++){ + let liElem = document.createElement('li') + liElem.setAttribute('class', 'instruction-card') + liElem.innerHTML = `${i+1}. ${recipe.instructions[i]}` + instructions_list.append(liElem) + } +} + +async function replenishIngrediants() { + let ingrediantsTableBody = document.getElementById('ingrediantsTableBody') + ingrediantsTableBody.innerHTML = "" + + for(let i=0; i< recipe.recipe_items.length; i++){ + let tableRow = document.createElement('tr') + + let typeCell = document.createElement('td') + typeCell.innerHTML = `${recipe.recipe_items[i].item_type}` + + let nameCell = document.createElement('td') + nameCell.innerHTML = `${recipe.recipe_items[i].item_name}` + + let qtyCell = document.createElement('td') + qtyCell.innerHTML = `${recipe.recipe_items[i].qty}` + + let uomCell = document.createElement('td') + uomCell.innerHTML = `${recipe.recipe_items[i].uom.fullname}` + + tableRow.append(typeCell, nameCell, qtyCell, uomCell) + + tableRow.onclick = async function(){ + await openLineItemModal(recipe.recipe_items[i]) + } + + ingrediantsTableBody.append(tableRow) + } + +} + +async function openLineItemModal(item){ + document.getElementById('lineHeader').innerHTML = `Edit ${item.uuid}...` + document.getElementById('lineType').value = `${item.item_type}` + document.getElementById('lineName').value = `${item.item_name}` + document.getElementById('lineQty').value = `${item.qty}` + document.getElementById('lineWeblink').value = `${item.links.main}` + + document.getElementById('lineUOM').innerHTML = "" + + if(item.item_type=="sku"){ + document.getElementById('lineName').classList.add('uk-disabled') + document.getElementById('lineWeblink').classList.add('uk-disabled') + let main_uom = document.createElement('option') + main_uom.value = item.item_uom.id + main_uom.innerHTML = item.item_uom.fullname + + document.getElementById('lineUOM').append(main_uom) + + for(let i=0; i response.blob()) + .then(imageBlob => { + const imageURL = URL.createObjectURL(imageBlob); + document.getElementById('recipeImage').src = imageURL; + }); +} + +async function addCustomItem() { + payload = { + rp_id: recipe.id, + item_type: document.getElementById('customType').value, + item_name: document.getElementById('customName').value, + qty: document.getElementById('customQty').value, + uom: document.getElementById('customUOM').value, + links: {main: document.getElementById('customWeblink').value} + } + const response = await fetch(`/recipe/postCustomItem`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payload), + }); + data = await response.json() + message_type = "primary" + if(data.error){ + message_type = "danger" + } + UIkit.notification({ + message: data.message, + status: message_type, + pos: 'top-right', + timeout: 5000 + }); + recipe = data.recipe + await replenishRecipe() + document.getElementById('customName').value = "" + document.getElementById('customQty').value = "" + document.getElementById('customUOM').value = "" + document.getElementById('customWeblink').value = "" + UIkit.modal(document.getElementById('addCustomItem')).hide(); +} + +async function addSKUItem(item_id) { + const response = await fetch(`/recipe/postSKUItem`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + recipe_id: recipe.id, + item_id: item_id + }), + }); + data = await response.json() + message_type = "primary" + if(data.error){ + message_type = "danger" + } + UIkit.notification({ + message: data.message, + status: message_type, + pos: 'top-right', + timeout: 5000 + }); + recipe = data.recipe + await replenishRecipe() + UIkit.modal(document.getElementById('itemsModal')).hide(); +} + +let updated = {} +async function postUpdate() { + let description = document.getElementById('recipeDescription').value + updated.description = description + + + console.log(updated) + + + const response = await fetch(`/recipe/postUpdate`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + recipe_id: recipe_id, + update: updated + }), + }); + data = await response.json() + message_type = "primary" + if(data.error){ + message_type = "danger" + } else { + updated = {} + } + UIkit.notification({ + message: data.message, + status: message_type, + pos: 'top-right', + timeout: 5000 + }); +}; + +async function updateImage() { + const fileInput = document.querySelector('input[type="file"]'); + const formData = new FormData(); + formData.append('file', fileInput.files[0]); + + await fetch(`/recipe/postImage/${recipe.id}`, { + method: 'POST', + body: formData + }) + .then(response => response.json()) + .then(data => console.log('File uploaded!', data)) + .catch(error => console.error('Error:', error)); +} + +async function updateName() { + updated.name = document.getElementById('recipeName').value +} + +async function updateDescription() { + updated.description = document.getElementById('recipeDescription').value +} + +async function addInstruction() { + let instruction = document.getElementById('addInstruction').value + if(!document.getElementById('addInstruction').value==""){ + let instructions = recipe.instructions.slice() + document.getElementById('addInstruction').value = "" + instructions.push(instruction) + recipe.instructions = instructions + updated.instructions = instructions + await replenishInstructions() + } +} + +async function deleteInstruction(index){ + recipe.instructions.splice(index, 1) + let instructions = recipe.instructions.slice() + recipe.instructions = instructions + updated.instructions = instructions + await replenishInstructions() +} + +let pagination_current = 1; +let pagination_end = 10; +let search_string = ""; +let items_limit = 25; +async function openSKUModal() { + let itemsModal = document.getElementById('itemsModal') + pagination_current = 1; + search_string = ''; + document.getElementById('searchItemsInput').value = ''; + let items = await fetchItems() + await updateItemsModalTable(items) + await updateItemsPaginationElement() + UIkit.modal(itemsModal).show(); +} + +async function searchItemTable(event) { + if(event.key==='Enter'){ + search_string = event.srcElement.value + let items = await fetchItems() + await updateItemsModalTable(items) + await updateItemsPaginationElement() + } +} + +async function setItemsPage(pageNumber){ + pagination_current = pageNumber; + let items = await fetchItems() + await updateItemsModalTable(items) + await updateItemsPaginationElement() +} + +async function updateItemsPaginationElement() { + let paginationElement = document.getElementById('itemsPage'); + paginationElement.innerHTML = ""; + // previous + let previousElement = document.createElement('li') + if(pagination_current<=1){ + previousElement.innerHTML = ``; + previousElement.classList.add('uk-disabled'); + }else { + previousElement.innerHTML = ``; + } + paginationElement.append(previousElement) + + //first + let firstElement = document.createElement('li') + if(pagination_current<=1){ + firstElement.innerHTML = `1`; + firstElement.classList.add('uk-disabled'); + }else { + firstElement.innerHTML = `1`; + } + paginationElement.append(firstElement) + + // ... + if(pagination_current-2>1){ + let firstDotElement = document.createElement('li') + firstDotElement.classList.add('uk-disabled') + firstDotElement.innerHTML = `…`; + paginationElement.append(firstDotElement) + } + // last + if(pagination_current-2>0){ + let lastElement = document.createElement('li') + lastElement.innerHTML = `${pagination_current-1}` + paginationElement.append(lastElement) + } + // current + if(pagination_current!=1 && pagination_current != pagination_end){ + let currentElement = document.createElement('li') + currentElement.innerHTML = `
  • ${pagination_current}
  • ` + paginationElement.append(currentElement) + } + // next + if(pagination_current+2${pagination_current+1}` + paginationElement.append(nextElement) + } + // ... + if(pagination_current+2<=pagination_end){ + let secondDotElement = document.createElement('li') + secondDotElement.classList.add('uk-disabled') + secondDotElement.innerHTML = `…`; + paginationElement.append(secondDotElement) + } + //end + let endElement = document.createElement('li') + if(pagination_current>=pagination_end){ + endElement.innerHTML = `${pagination_end}`; + endElement.classList.add('uk-disabled'); + }else { + endElement.innerHTML = `${pagination_end}`; + } + paginationElement.append(endElement) + //next button + let nextElement = document.createElement('li') + if(pagination_current>=pagination_end){ + nextElement.innerHTML = ``; + nextElement.classList.add('uk-disabled'); + }else { + nextElement.innerHTML = ``; + console.log(nextElement.innerHTML) + } + paginationElement.append(nextElement) +} + +async function fetchItems() { + const url = new URL('/recipe/getItems', window.location.origin); + url.searchParams.append('page', pagination_current); + url.searchParams.append('limit', items_limit); + url.searchParams.append('search_string', search_string); + const response = await fetch(url); + data = await response.json(); + pagination_end = data.end + return data.items; +} + +async function updateItemsModalTable(items) { + let itemsTableBody = document.getElementById('itemsTableBody'); + itemsTableBody.innerHTML = ""; + + for(let i=0; i < items.length; i++){ + let tableRow = document.createElement('tr') + + let idCell = document.createElement('td') + idCell.innerHTML = `${items[i].id}` + + let barcodeCell = document.createElement('td') + barcodeCell.innerHTML = `${items[i].barcode}` + + let nameCell = document.createElement('td') + nameCell.innerHTML = `${items[i].item_name}` + + tableRow.id = items[i].id + tableRow.onclick = async function(){ + await addSKUItem(items[i].id) + } + tableRow.append(idCell, barcodeCell, nameCell) + itemsTableBody.append(tableRow) + } +} \ No newline at end of file diff --git a/static/handlers/recipeViewHandler.js b/static/handlers/recipeViewHandler.js new file mode 100644 index 0000000..2a310dd --- /dev/null +++ b/static/handlers/recipeViewHandler.js @@ -0,0 +1,102 @@ +var mode = false +async function toggleDarkMode() { + let darkMode = document.getElementById("dark-mode"); + darkMode.disabled = !darkMode.disabled; + mode = !mode; + if(mode){ + document.getElementById('modeToggle').innerHTML = "light_mode" + document.getElementById('main_html').classList.add('uk-light') + + } else { + document.getElementById('modeToggle').innerHTML = "dark_mode" + document.getElementById('main_html').classList.remove('uk-light') + } +} + +if(session.user.flags.darkmode){ + toggleDarkMode() +} + +// Beginning of site specific code! +var recipe = []; +document.addEventListener('DOMContentLoaded', async function() { + recipe = await getRecipe() + console.log(recipe) + await replenishRecipe() +}); + +async function replenishRecipe() { + document.getElementById('title').innerHTML = `${recipe.name}` + document.getElementById('breadcrumb').innerHTML = `${recipe.name}` + document.getElementById('recipeTitle').innerHTML = `${recipe.name}` + document.getElementById('recipeAuthor').innerHTML = `${recipe.author}` + document.getElementById('recipeDescription').innerHTML = `${recipe.description}` + document.getElementById('recipeImage').src = `${recipe.picture_path}` + + if(recipe.picture_path){ + document.getElementById('imgDiv').classList.remove('uk-hidden') + document.getElementById('titleDiv').classList.add('uk-width-3-4@m') + } + + await replenishIngrediantsTable() + await replenishInstructions() + + await getImage() + +} + +async function replenishIngrediantsTable() { + let ingrediantsTableBody = document.getElementById('ingrediantsTableBody') + ingrediantsTableBody.innerHTML = "" + + for(let i=0; i response.blob()) + .then(imageBlob => { + const imageURL = URL.createObjectURL(imageBlob); + document.getElementById('recipeImage').src = imageURL; + }); +} \ No newline at end of file diff --git a/static/handlers/recipesListHandler.js b/static/handlers/recipesListHandler.js new file mode 100644 index 0000000..5b846bb --- /dev/null +++ b/static/handlers/recipesListHandler.js @@ -0,0 +1,321 @@ +var mode = false +async function toggleDarkMode() { + let darkMode = document.getElementById("dark-mode"); + darkMode.disabled = !darkMode.disabled; + mode = !mode; + if(mode){ + document.getElementById('modeToggle').innerHTML = "light_mode" + document.getElementById('main_html').classList.add('uk-light') + } else { + document.getElementById('modeToggle').innerHTML = "dark_mode" + document.getElementById('main_html').classList.remove('uk-light') + } +} + + +if(session.user.flags.darkmode){ + toggleDarkMode() +} + +async function changeSite(site){ + console.log(site) + const response = await fetch(`/changeSite`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + site: site, + }), + }); + data = await response.json(); + transaction_status = "success" + if (data.error){ + transaction_status = "danger" + } + + UIkit.notification({ + message: data.message, + status: transaction_status, + pos: 'top-right', + timeout: 5000 + }); + location.reload(true) +} + +// Beginning of site specific code! +var recipes = []; +document.addEventListener('DOMContentLoaded', async function() { + recipes = await getRecipes() + await replenishRecipes() + await updatePaginationElement() +}); + +async function openAddRecipeModal() { + UIkit.modal(document.getElementById('addRecipeModal')).show(); +} + +async function replenishRecipes() { + if(!detailedList){ + await replenishRecipesTable() + } + + if(detailedList){ + await replenishRecipesCards() + } +} + +async function replenishRecipesTable() { + document.getElementById('recipes_list').innerHTML = '' + + let main_table = document.createElement('table') + main_table.setAttribute('class', 'uk-table uk-table-striped') + + let table_head = document.createElement('thead') + + let head_row = document.createElement('tr') + let nameCell = document.createElement('th') + nameCell.innerHTML="Name" + let descriptionCell = document.createElement('th') + descriptionCell.innerHTML = 'Description' + descriptionCell.setAttribute('class', 'uk-visible@m') + let opsCell = document.createElement('th') + opsCell.innerHTML = 'Operations' + + head_row.append(nameCell, descriptionCell, opsCell) + table_head.append(head_row) + main_table.append(table_head) + + + let table_body = document.createElement('tbody') + for(let i = 0; i < recipes.length; i++){ + let table_row = document.createElement('tr') + + let nameCell = document.createElement('td') + nameCell.innerHTML = recipes[i].name + nameCell.setAttribute('class', 'uk-width-1-4') + let descriptionCell = document.createElement('td') + descriptionCell.innerHTML = recipes[i].description + descriptionCell.setAttribute('class', 'uk-text-truncate uk-table-expand uk-visible@m') + let opsCell = document.createElement('td') + opsCell.setAttribute('class', 'uk-width-1-4') + + + let buttonGroup = document.createElement('div') + buttonGroup.setAttribute('class', 'uk-button-group') + + let viewOp = document.createElement('a') + viewOp.innerHTML = `view ` + viewOp.setAttribute('class', 'uk-button uk-button-default uk-button-small') + viewOp.href = `/recipe/view/${recipes[i].id}` + + let editOp = document.createElement('a') + editOp.innerHTML = `edit ` + editOp.setAttribute('class', 'uk-button uk-button-default uk-button-small') + editOp.href = `/recipe/edit/${recipes[i].id}` + + buttonGroup.append(viewOp, editOp) + opsCell.append(buttonGroup) + + table_row.append(nameCell, descriptionCell, opsCell) + table_body.append(table_row) + } + + main_table.append(table_body) + + document.getElementById('recipes_list').append(main_table) + +} + +async function replenishRecipesCards() { + document.getElementById('recipes_list').innerHTML = '' + console.log('cards') + + for(let i=0; i < recipes.length; i++){ + let main_div = document.createElement('div') + main_div.setAttribute('class', 'uk-card uk-card-default uk-card-small uk-margin') + + let card_header_div = document.createElement('div') + card_header_div.setAttribute('class', 'uk-card-header') + card_header_div.style = "border: none;" + + let header_grid_div = document.createElement('div') + header_grid_div.setAttribute('class', 'uk-flex-middle uk-grid uk-grid-small') + + let title_div = document.createElement('div') + title_div.setAttribute('class', '') + title_div.innerHTML = ` +

    ${recipes[i].name}

    ` + + header_grid_div.append(title_div) + card_header_div.append(header_grid_div) + + let body_div = document.createElement('div') + body_div.setAttribute('class', 'uk-card-body') + body_div.innerHTML = `

    ${recipes[i].description}

    ` + body_div.style = 'border: none;' + + let footer_div = document.createElement('div') + footer_div.setAttribute('class', 'uk-card-footer') + footer_div.style = 'height: 40px; border: none;' + + let editOp = document.createElement('a') + editOp.setAttribute('class', 'uk-button uk-button-small uk-button-default') + editOp.innerHTML = ' Edit' + editOp.style = "margin-right: 10px;" + editOp.href = `/recipe/edit/${recipes[i].id}` + + let viewOp = document.createElement('a') + viewOp.setAttribute('class', 'uk-button uk-button-small uk-button-default') + viewOp.innerHTML = ' View' + viewOp.href = `/recipe/view/${recipes[i].id}` + + footer_div.append(editOp, viewOp) + + main_div.append(card_header_div, body_div, footer_div) + + document.getElementById('recipes_list').append(main_div) + } +} + +var pagination_current = 1; +var pagination_end = 1; +var recipesLimit = 10; + +async function getRecipes() { + const url = new URL('/recipes/getRecipes', window.location.origin) + url.searchParams.append('page', pagination_current); + url.searchParams.append('limit', recipesLimit); + const response = await fetch(url) + data = await response.json() + pagination_end = data.end + return data.recipes +} + +async function addRecipe() { + let name = `${document.getElementById('addRecipeName').value}` + let description = `${document.getElementById('addRecipeDescription').value}` + + const response = await fetch(`/recipes/addRecipe`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + recipe_name: name, + recipe_description: description + }), + }); + data = await response.json(); + transaction_status = "success" + if (data.error){ + transaction_status = "danger" + } + + UIkit.notification({ + message: data.message, + status: transaction_status, + pos: 'top-right', + timeout: 5000 + }); + recipes = await getRecipes() + await replenishRecipes() + await updatePaginationElement() + UIkit.modal(document.getElementById('addRecipeModal')).hide(); + +} + +async function updatePaginationElement() { + let paginationElement = document.getElementById("paginationElement"); + paginationElement.innerHTML = ""; + // previous + let previousElement = document.createElement('li') + if(pagination_current<=1){ + previousElement.innerHTML = ``; + previousElement.classList.add('uk-disabled'); + }else { + previousElement.innerHTML = ``; + } + paginationElement.append(previousElement) + + //first + let firstElement = document.createElement('li') + if(pagination_current<=1){ + firstElement.innerHTML = `1`; + firstElement.classList.add('uk-disabled'); + }else { + firstElement.innerHTML = `1`; + } + paginationElement.append(firstElement) + + // ... + if(pagination_current-2>1){ + let firstDotElement = document.createElement('li') + firstDotElement.classList.add('uk-disabled') + firstDotElement.innerHTML = `…`; + paginationElement.append(firstDotElement) + } + // last + if(pagination_current-2>0){ + let lastElement = document.createElement('li') + lastElement.innerHTML = `${pagination_current-1}` + paginationElement.append(lastElement) + } + // current + if(pagination_current!=1 && pagination_current != pagination_end){ + let currentElement = document.createElement('li') + currentElement.innerHTML = `
  • ${pagination_current}
  • ` + paginationElement.append(currentElement) + } + // next + if(pagination_current+2${pagination_current+1}` + paginationElement.append(nextElement) + } + // ... + if(pagination_current+2<=pagination_end){ + let secondDotElement = document.createElement('li') + secondDotElement.classList.add('uk-disabled') + secondDotElement.innerHTML = `…`; + paginationElement.append(secondDotElement) + } + //end + let endElement = document.createElement('li') + if(pagination_current>=pagination_end){ + endElement.innerHTML = `${pagination_end}`; + endElement.classList.add('uk-disabled'); + }else { + endElement.innerHTML = `${pagination_end}`; + } + paginationElement.append(endElement) + //next button + let nextElement = document.createElement('li') + if(pagination_current>=pagination_end){ + nextElement.innerHTML = ``; + nextElement.classList.add('uk-disabled'); + }else { + nextElement.innerHTML = ``; + } + paginationElement.append(nextElement) +} + +async function setPage(pageNumber){ + pagination_current = pageNumber; + recipes = await getRecipes() + await replenishRecipes() + await updatePaginationElement() +} + +var detailedList = false +async function setViewMode() { + detailedList = !detailedList; + let toggle = document.getElementById('view_mode_toggle') + if(detailedList){ + toggle.innerHTML = `Table ` + } else { + toggle.innerHTML = `Cards ` + } + await replenishRecipes() + await updatePaginationElement() +} \ No newline at end of file diff --git a/static/handlers/shoppingListEditHandler.js b/static/handlers/shoppingListEditHandler.js new file mode 100644 index 0000000..2f71022 --- /dev/null +++ b/static/handlers/shoppingListEditHandler.js @@ -0,0 +1,404 @@ +var mode = false +async function toggleDarkMode() { + let darkMode = document.getElementById("dark-mode"); + darkMode.disabled = !darkMode.disabled; + mode = !mode; + if(mode){ + document.getElementById('modeToggle').innerHTML = "light_mode" + document.getElementById('main_html').classList.add('uk-light') + } else { + document.getElementById('modeToggle').innerHTML = "dark_mode" + document.getElementById('main_html').classList.remove('uk-light') + + } +} + +document.addEventListener('DOMContentLoaded', async function() { + let shopping_list = await fetchShoppingList() + await replenishForm(shopping_list) + await replenishLineTable(shopping_list.sl_items) +}) + + +async function replenishForm(shopping_list){ + document.getElementById('list_name').value = shopping_list.name + document.getElementById('list_creation_date').value = shopping_list.creation_date + document.getElementById('list_description').value = shopping_list.description + document.getElementById('list_author').value = shopping_list.author + document.getElementById('list_type').value = shopping_list.type + + if(shopping_list.type == "calculated"){ + document.getElementById('addLineButton').classList.add("uk-disabled") + } else { + document.getElementById('addLineButton').classList.remove("uk-disabled") + } + + if(shopping_list.type == "plain"){ + document.getElementById('lineCalc').classList.add("uk-disabled") + document.getElementById('lineUOM').classList.add("uk-disabled") + document.getElementById('lineName').classList.add("uk-disabled") + } else { + document.getElementById('lineCalc').classList.remove("uk-disabled") + document.getElementById('lineUOM').classList.remove("uk-disabled") + document.getElementById('lineName').classList.remove("uk-disabled") + } + + + +} + +async function replenishLineTable(sl_items){ + let listItemsTableBody = document.getElementById('listItemsTableBody') + listItemsTableBody.innerHTML = "" + + for(let i = 0; i < sl_items.length; i++){ + let tableRow = document.createElement('tr') + + let typeCell = document.createElement('td') + typeCell.innerHTML = sl_items[i].item_type + + let uuidCell = document.createElement('td') + uuidCell.innerHTML = sl_items[i].uuid + + let nameCell = document.createElement('td') + nameCell.innerHTML = sl_items[i].item_name + + let opCell = document.createElement('td') + + let editOp = document.createElement('a') + editOp.setAttribute('class', 'uk-button uk-button-default uk-button-small') + editOp.innerHTML = `` + editOp.style = 'margin-right: 5px;' + editOp.onclick = async function () { + await openLineEditModal(sl_items[i].id) + } + + let deleteOp = document.createElement('a') + deleteOp.setAttribute('class', 'uk-button uk-button-default uk-button-small') + deleteOp.innerHTML = `` + deleteOp.onclick = async function () { + await deleteLineItem(sl_items[i].id) + } + + opCell.append(editOp, deleteOp) + + tableRow.append(typeCell, uuidCell, nameCell, opCell) + listItemsTableBody.append(tableRow) + } +} + +async function fetchShoppingList() { + const url = new URL('/shopping-lists/getList', window.location.origin); + url.searchParams.append('id', sl_id); + const response = await fetch(url); + data = await response.json(); + return data.shopping_list; +} + +var pagination_current = 1; +var pagination_end = 1; +var search_string = "" + +async function updateItemsModalTable(items) { + let itemsTableBody = document.getElementById('itemsTableBody'); + itemsTableBody.innerHTML = ""; + + for(let i=0; i < items.length; i++){ + let tableRow = document.createElement('tr') + + let idCell = document.createElement('td') + idCell.innerHTML = `${items[i].id}` + + let barcodeCell = document.createElement('td') + barcodeCell.innerHTML = `${items[i].barcode}` + + let nameCell = document.createElement('td') + nameCell.innerHTML = `${items[i].item_name}` + + tableRow.id = items[i].id + tableRow.onclick = async function(){ + + let newItem = { + uuid: items[i].barcode, + sl_id: sl_id, + item_type: 'sku', + item_name: items[i].item_name, + uom: items[i].item_info.uom, + qty: items[i].item_info.uom_quantity, + item_id: items[i].id, + links: {'main': items[i].links['main']} + } + + await submitItemToList(newItem) + let shopping_list = await fetchShoppingList() + await replenishForm(shopping_list) + await replenishLineTable(shopping_list.sl_items) + let itemsModal = document.getElementById('itemsModal') + UIkit.modal(itemsModal).hide(); + + } + tableRow.append(idCell, barcodeCell, nameCell) + itemsTableBody.append(tableRow) + } +} + +async function openSKUModal() { + let itemsModal = document.getElementById('itemsModal') + let items = await fetchItems() + pagination_current = 1; + search_string = ''; + document.getElementById('searchItemsInput').value = ''; + await updateItemsModalTable(items) + await updateItemsPaginationElement() + UIkit.modal(itemsModal).show(); +} + +async function openLineEditModal(sli_id) { + let sl_item = await fetchSLItem(sli_id) + console.log(sl_item) + document.getElementById('lineName').value = sl_item.item_name + document.getElementById('lineQty').value = sl_item.qty + document.getElementById('lineUOM').value = sl_item.uom.fullname + console.log(sl_item.links) + + if(!sl_item.links.hasOwnProperty('main')){ + sl_item.links.main = '' + } + + document.getElementById('lineLink').value = sl_item.links.main + + document.getElementById('saveLineButton').onclick = async function () { + links = sl_item.links + links.main = document.getElementById('lineLink').value + update = { + item_name: document.getElementById('lineName').value, + qty: document.getElementById('lineQty').value, + uom: document.getElementById('lineUOM').value, + links: links + } + await saveLineItem(sl_item.id, update) + UIkit.modal(document.getElementById('lineEditModal')).hide(); + } + UIkit.modal(document.getElementById('lineEditModal')).show(); + +} + +async function searchItemTable(event) { + if(event.key==='Enter'){ + search_string = event.srcElement.value + let items = await fetchItems() + await updateItemsModalTable(items) + await updateItemsPaginationElement() + } +} + +async function setItemsPage(pageNumber){ + pagination_current = pageNumber; + let items = await fetchItems() + await updateItemsModalTable(items) + await updateItemsPaginationElement() +} + +async function updateItemsPaginationElement() { + let paginationElement = document.getElementById('itemsPage'); + paginationElement.innerHTML = ""; + // previous + let previousElement = document.createElement('li') + if(pagination_current<=1){ + previousElement.innerHTML = ``; + previousElement.classList.add('uk-disabled'); + }else { + previousElement.innerHTML = ``; + } + paginationElement.append(previousElement) + + //first + let firstElement = document.createElement('li') + if(pagination_current<=1){ + firstElement.innerHTML = `1`; + firstElement.classList.add('uk-disabled'); + }else { + firstElement.innerHTML = `1`; + } + paginationElement.append(firstElement) + + // ... + if(pagination_current-2>1){ + let firstDotElement = document.createElement('li') + firstDotElement.classList.add('uk-disabled') + firstDotElement.innerHTML = `…`; + paginationElement.append(firstDotElement) + } + // last + if(pagination_current-2>0){ + let lastElement = document.createElement('li') + lastElement.innerHTML = `${pagination_current-1}` + paginationElement.append(lastElement) + } + // current + if(pagination_current!=1 && pagination_current != pagination_end){ + let currentElement = document.createElement('li') + currentElement.innerHTML = `
  • ${pagination_current}
  • ` + paginationElement.append(currentElement) + } + // next + if(pagination_current+2${pagination_current+1}` + paginationElement.append(nextElement) + } + // ... + if(pagination_current+2<=pagination_end){ + let secondDotElement = document.createElement('li') + secondDotElement.classList.add('uk-disabled') + secondDotElement.innerHTML = `…`; + paginationElement.append(secondDotElement) + } + //end + let endElement = document.createElement('li') + if(pagination_current>=pagination_end){ + endElement.innerHTML = `${pagination_end}`; + endElement.classList.add('uk-disabled'); + }else { + endElement.innerHTML = `${pagination_end}`; + } + paginationElement.append(endElement) + //next button + let nextElement = document.createElement('li') + if(pagination_current>=pagination_end){ + nextElement.innerHTML = ``; + nextElement.classList.add('uk-disabled'); + }else { + nextElement.innerHTML = ``; + console.log(nextElement.innerHTML) + } + paginationElement.append(nextElement) +} + +let items_limit = 25; +async function fetchItems() { + const url = new URL('/shopping-lists/getItems', window.location.origin); + url.searchParams.append('page', pagination_current); + url.searchParams.append('limit', items_limit); + url.searchParams.append('search_string', search_string); + const response = await fetch(url); + data = await response.json(); + pagination_end = data.end + return data.items; +} + +async function fetchSLItem(sli_id) { + const url = new URL('/shopping-lists/getListItem', window.location.origin); + url.searchParams.append('sli_id', sli_id); + const response = await fetch(url); + data = await response.json(); + return data.list_item; +} + +async function addCustomItem() { + let customModal = document.getElementById('customModal') + UIkit.modal(customModal).hide(); + + uuid = `${sl_id}${Math.random().toString(36).substring(2, 8)}` + + let newItem = { + uuid: uuid, + sl_id: sl_id, + item_type: 'custom', + item_name: document.getElementById('customName').value, + uom: document.getElementById('customUOM').value, + qty: parseFloat(document.getElementById('customQty').value), + item_id: null, + links: {'main': document.getElementById('customLink').value} + } + + await submitItemToList(newItem) + + let shopping_list = await fetchShoppingList() + await replenishForm(shopping_list) + await replenishLineTable(shopping_list.sl_items) +} + +async function submitItemToList(newItem) { + const response = await fetch(`/shopping-lists/postListItem`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + data: newItem + }), + }); + + data = await response.json(); + response_status = 'success' + if (data.error){ + response_status = 'danger' + } + + UIkit.notification({ + message: data.message, + status: response_status, + pos: 'top-right', + timeout: 5000 + }); +} + +async function deleteLineItem(sli_id) { + const response = await fetch(`/shopping-lists/deleteListItem`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + sli_id: sli_id + }), + }); + + data = await response.json(); + response_status = 'success' + if (data.error){ + response_status = 'danger' + } + + UIkit.notification({ + message: data.message, + status: response_status, + pos: 'top-right', + timeout: 5000 + }); + + let shopping_list = await fetchShoppingList() + await replenishForm(shopping_list) + await replenishLineTable(shopping_list.sl_items) +} + +async function saveLineItem(sli_id, update) { + const response = await fetch(`/shopping-lists/saveListItem`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + sli_id: sli_id, + update: update + }), + }); + + data = await response.json(); + response_status = 'success' + if (data.error){ + response_status = 'danger' + } + + UIkit.notification({ + message: data.message, + status: response_status, + pos: 'top-right', + timeout: 5000 + }); + + let shopping_list = await fetchShoppingList() + await replenishForm(shopping_list) + await replenishLineTable(shopping_list.sl_items) +} \ No newline at end of file diff --git a/static/handlers/shoppingListViewHandler.js b/static/handlers/shoppingListViewHandler.js new file mode 100644 index 0000000..1b4cf8d --- /dev/null +++ b/static/handlers/shoppingListViewHandler.js @@ -0,0 +1,83 @@ +var mode = false +async function toggleDarkMode() { + let darkMode = document.getElementById("dark-mode"); + darkMode.disabled = !darkMode.disabled; + mode = !mode; + if(mode){ + document.getElementById('modeToggle').innerHTML = "light_mode" + document.getElementById('main_html').classList.add('uk-light') + } else { + document.getElementById('modeToggle').innerHTML = "dark_mode" + document.getElementById('main_html').classList.remove('uk-light') + + } +} + +document.addEventListener('DOMContentLoaded', async function() { + let shopping_list = await fetchShoppingList() + await replenishForm(shopping_list) + + list_items = shopping_list.sl_items + if(shopping_list.type == "calculated"){ + list_items = await fetchItemsFullCalculated() + } + + await replenishLineTable(list_items) +}) + + +async function replenishForm(shopping_list){ + document.getElementById('listName').innerHTML = shopping_list.name + document.getElementById('listCreationDate').innerHTML = shopping_list.creation_date + document.getElementById('listDescription').innerHTML = shopping_list.description + +} + +async function replenishLineTable(sl_items){ + let listItemsTableBody = document.getElementById('listItemsTableBody') + listItemsTableBody.innerHTML = "" + + for(let i = 0; i < sl_items.length; i++){ + let tableRow = document.createElement('tr') + + let checkboxCell = document.createElement('td') + checkboxCell.innerHTML = `` + + namefield = sl_items[i].item_name + if(sl_items[i].links.hasOwnProperty('main')){ + namefield = `${sl_items[i].item_name}` + } + + let nameCell = document.createElement('td') + nameCell.innerHTML = namefield + + let qtyuomCell = document.createElement('td') + qtyuomCell.innerHTML = `${sl_items[i].qty} ${sl_items[i].uom.fullname}` + + tableRow.append(checkboxCell, nameCell, qtyuomCell) + listItemsTableBody.append(tableRow) + } +} + +async function fetchShoppingList() { + const url = new URL('/shopping-lists/getList', window.location.origin); + url.searchParams.append('id', sl_id); + const response = await fetch(url); + data = await response.json(); + return data.shopping_list; +} + +async function fetchSLItem(sli_id) { + const url = new URL('/shopping-lists/getListItem', window.location.origin); + url.searchParams.append('sli_id', sli_id); + const response = await fetch(url); + data = await response.json(); + return data.list_item; +} + +async function fetchItemsFullCalculated() { + const url = new URL('/shopping-lists/getSKUItemsFull', window.location.origin); + const response = await fetch(url); + data = await response.json(); + return data.list_items; +} \ No newline at end of file diff --git a/static/handlers/shoppingListsHandler.js b/static/handlers/shoppingListsHandler.js new file mode 100644 index 0000000..a3166bd --- /dev/null +++ b/static/handlers/shoppingListsHandler.js @@ -0,0 +1,246 @@ +var pagination_current = 1; +var pagination_end = 3; + + + +document.addEventListener('DOMContentLoaded', async function() { + let lists = await getShoppingLists() + await replenishShoppingListCards(lists) + await updatePaginationElement() +}); + + +async function replenishShoppingListCards(lists) { + let shopping_list_lists = document.getElementById('shopping_list_lists') + shopping_list_lists.innerHTML = "" + + for(let i=0; i < lists.length; i++){ + console.log(lists[i]) + let main_div = document.createElement('div') + main_div.setAttribute('class', 'uk-card uk-card-default uk-card-small uk-margin') + + let badge_div = document.createElement('div') + badge_div.setAttribute('class', 'uk-card-badge uk-label') + badge_div.innerHTML = `${lists[i].sl_items.length} Lines` + + let badge_div_dos = document.createElement('div') + badge_div_dos.setAttribute('class', 'uk-card-badge uk-label') + badge_div_dos.innerHTML = lists[i].type + badge_div_dos.style = "margin-top: 30px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width:150px; text-align: right;" + + let card_header_div = document.createElement('div') + card_header_div.setAttribute('class', 'uk-card-header') + card_header_div.style = "border: none;" + + let header_grid_div = document.createElement('div') + header_grid_div.setAttribute('class', 'uk-flex-middle uk-grid uk-grid-small') + + let title_div = document.createElement('div') + title_div.setAttribute('class', '') + title_div.innerHTML = ` +

    ${lists[i].name}

    +

    + ` + + header_grid_div.append(title_div) + card_header_div.append(badge_div, badge_div_dos, header_grid_div) + + let body_div = document.createElement('div') + body_div.setAttribute('class', 'uk-card-body') + body_div.innerHTML = `

    ${lists[i].description}

    ` + body_div.style = 'border: none;' + + let footer_div = document.createElement('div') + footer_div.setAttribute('class', 'uk-card-footer') + footer_div.style = 'height: 40px; border: none;' + + let editOp = document.createElement('a') + editOp.setAttribute('class', 'uk-button uk-button-small uk-button-default') + editOp.innerHTML = ' Edit' + editOp.style = "margin-right: 10px;" + editOp.href = `/shopping-list/edit/${lists[i].id}` + + let viewOp = document.createElement('a') + viewOp.setAttribute('class', 'uk-button uk-button-small uk-button-default') + viewOp.innerHTML = ' View' + viewOp.href = `/shopping-list/view/${lists[i].id}` + //viewOp.style = "margin-right: 20px;" + + + footer_div.append(editOp, viewOp) + + main_div.append(card_header_div, body_div, footer_div) + + shopping_list_lists.append(main_div) + + } +} + +async function openAddListModal() { + UIkit.modal(document.getElementById('addListModal')).show(); +} + +var listLimit = 5; +async function getShoppingLists(){ + console.log(pagination_current) + const url = new URL('/shopping-lists/getLists', window.location.origin); + url.searchParams.append('page', pagination_current); + url.searchParams.append('limit', listLimit); + response = await fetch(url) + data = await response.json() + pagination_end = data.end + console.log(pagination_end) + return data.shopping_lists +}; + +async function addList() { + let list_name = document.getElementById('addListName').value + let list_description = document.getElementById('addListDescription').value + let list_type = document.getElementById('list_type').value + + const response = await fetch(`/shopping-lists/addList`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + list_name: list_name, + list_description: list_description, + list_type: list_type + }), + }); + data = await response.json(); + transaction_status = "success" + if (data.error){ + transaction_status = "danger" + } + + UIkit.notification({ + message: data.message, + status: transaction_status, + pos: 'top-right', + timeout: 5000 + }); +} + +async function changeSite(site){ + const response = await fetch(`/changeSite`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + site: site, + }), + }); + data = await response.json(); + transaction_status = "success" + if (data.error){ + transaction_status = "danger" + } + + UIkit.notification({ + message: data.message, + status: transaction_status, + pos: 'top-right', + timeout: 5000 + }); + location.reload(true) +} + +async function updatePaginationElement() { + let paginationElement = document.getElementById("paginationElement"); + paginationElement.innerHTML = ""; + // previous + let previousElement = document.createElement('li') + if(pagination_current<=1){ + previousElement.innerHTML = ``; + previousElement.classList.add('uk-disabled'); + }else { + previousElement.innerHTML = ``; + } + paginationElement.append(previousElement) + + //first + let firstElement = document.createElement('li') + if(pagination_current<=1){ + firstElement.innerHTML = `1`; + firstElement.classList.add('uk-disabled'); + }else { + firstElement.innerHTML = `1`; + } + paginationElement.append(firstElement) + + // ... + if(pagination_current-2>1){ + let firstDotElement = document.createElement('li') + firstDotElement.classList.add('uk-disabled') + firstDotElement.innerHTML = `…`; + paginationElement.append(firstDotElement) + } + // last + if(pagination_current-2>0){ + let lastElement = document.createElement('li') + lastElement.innerHTML = `${pagination_current-1}` + paginationElement.append(lastElement) + } + // current + if(pagination_current!=1 && pagination_current != pagination_end){ + let currentElement = document.createElement('li') + currentElement.innerHTML = `
  • ${pagination_current}
  • ` + paginationElement.append(currentElement) + } + // next + if(pagination_current+2${pagination_current+1}` + paginationElement.append(nextElement) + } + // ... + if(pagination_current+2<=pagination_end){ + let secondDotElement = document.createElement('li') + secondDotElement.classList.add('uk-disabled') + secondDotElement.innerHTML = `…`; + paginationElement.append(secondDotElement) + } + //end + let endElement = document.createElement('li') + if(pagination_current>=pagination_end){ + endElement.innerHTML = `${pagination_end}`; + endElement.classList.add('uk-disabled'); + }else { + endElement.innerHTML = `${pagination_end}`; + } + paginationElement.append(endElement) + //next button + let nextElement = document.createElement('li') + if(pagination_current>=pagination_end){ + nextElement.innerHTML = ``; + nextElement.classList.add('uk-disabled'); + }else { + nextElement.innerHTML = ``; + } + paginationElement.append(nextElement) +} + +async function setPage(pageNumber){ + pagination_current = pageNumber; + let lists = await getShoppingLists() + await replenishShoppingListCards(lists) + await updatePaginationElement() +} + +var mode = false +async function toggleDarkMode() { + let darkMode = document.getElementById("dark-mode"); + darkMode.disabled = !darkMode.disabled; + mode = !mode; + if(mode){ + document.getElementById('modeToggle').innerHTML = "light_mode" + document.getElementById('main_html').classList.add('uk-light') + } else { + document.getElementById('modeToggle').innerHTML = "dark_mode" + document.getElementById('main_html').classList.remove('uk-light') + + } +} diff --git a/static/handlers/transactionHandler.js b/static/handlers/transactionHandler.js new file mode 100644 index 0000000..d42904b --- /dev/null +++ b/static/handlers/transactionHandler.js @@ -0,0 +1,708 @@ +var pagination_current = 1; +var search_string = ''; +var defaqult_limit = 2; +var pagination_end = 1; +var item; + +async function replenishItemsTable(items) { + let itemsTableBody = document.getElementById("itemsTableBody") + itemsTableBody.innerHTML = "" + + for(let i = 0; i < items.length; i++){ + let tableRow = document.createElement('tr') + + + let idCell = document.createElement('td') + idCell.innerHTML = items[i].id + let barcodeCell = document.createElement('td') + barcodeCell.innerHTML = items[i].barcode + let nameCell = document.createElement('td') + nameCell.innerHTML = items[i].item_name + + tableRow.append(idCell) + tableRow.append(barcodeCell) + tableRow.append(nameCell) + + tableRow.onclick = function(){ + selectItem(items[i].id) + } + + itemsTableBody.append(tableRow) + } +} + +async function populateForm() { + if (item){ + console.log(item) + document.getElementById('database_id').value = item.id + document.getElementById('barcode').value = item.barcode + document.getElementById('name').value = item.item_name + document.getElementById('transaction_cost').value = parseFloat(item.item_info.cost) + + await selectLocation( + item.logistics_info.primary_zone.id, + item.logistics_info.primary_location.id, + item.logistics_info.primary_zone.name, + item.logistics_info.primary_location.name + ) + + + let quantity_on_hand = 0 + let locations = await getItemLocations() + for(let i = 0; i < locations.length; i++){ + quantity_on_hand = quantity_on_hand + locations[i].quantity_on_hand + } + document.getElementById('QOH').value = quantity_on_hand + document.getElementById('UOM').value = item.item_info.uom.fullname + + await replenishItemLocationsTable(locations) + + } +} + +async function selectItem(id) { + UIkit.modal(document.getElementById("itemsModal")).hide(); + item = await getItem(id) + await populateForm() +} + +var transaction_zone_id = 0 +var transaction_item_location_id = 0 +async function selectLocation(zone_id, location_id, zone_name, location_name) { + document.getElementById('zone').value = zone_name + document.getElementById('location').value = location_name + transaction_zone_id = zone_id + transaction_item_location_id = location_id +} + +async function openItemsModal(elementID){ + UIkit.modal(document.getElementById("itemsModal")).show(); + pagination_current = 1 + search_string = '' + let items = await getItems() + await replenishItemsTable(items) + await updatePaginationElement(elementID) + setFormButtonsEnabled(true) +} + +async function setFormButtonsEnabled(state) { + let item_location_button = document.getElementById("itemLocations") + + if(state){ + item_location_button.classList.remove("uk-disabled") + } else { + item_location_button.classList.add("uk-disabled") + } +} + +async function setTransactionTypeAdjustments() { + let trans_type = document.getElementById('trans_type').value + + if(trans_type=="Adjust Out"){ + document.getElementById('transaction_cost').classList.add('uk-disabled') + } + if(trans_type=="Adjust In"){ + document.getElementById('transaction_cost').classList.remove('uk-disabled') + } + +} + +async function replenishItemLocationsTable(locations) { + let itemLocationTableBody = document.getElementById('itemLocationTableBody') + itemLocationTableBody.innerHTML = "" + for(let i = 0; i < locations.length; i++){ + let tableRow = document.createElement('tr') + + let loca = locations[i].uuid.split('@') + + let zoneCell = document.createElement('td') + zoneCell.innerHTML = loca[0] + + let locationCell = document.createElement('td') + locationCell.innerHTML = loca[1] + + let qohCell = document.createElement('td') + qohCell.innerHTML = parseFloat(locations[i].quantity_on_hand) + + tableRow.append(zoneCell, locationCell, qohCell) + tableRow.onclick = async function(){ + await selectLocation( + locations[i].zone_id, + locations[i].id, + loca[0], + loca[1] + ) + } + itemLocationTableBody.append(tableRow) + } +} + +let locations_limit = 10; +async function getItemLocations() { + console.log("getting Locations") + const url = new URL('/external/getItemLocations', window.location.origin); + url.searchParams.append('page', pagination_current); + url.searchParams.append('limit', locations_limit); + url.searchParams.append('id', item.id); + const response = await fetch(url); + data = await response.json(); + pagination_end = data.end + let locations = data.locations; + console.log(locations) + return locations; +} + + +let items_limit = 50; +async function getItems() { + console.log("getting items") + const url = new URL('/external/getModalItems', window.location.origin); + url.searchParams.append('page', pagination_current); + url.searchParams.append('limit', items_limit); + url.searchParams.append('search_string', search_string) + const response = await fetch(url); + data = await response.json(); + pagination_end = data.end + let items = data.items; + return items; +} + +async function getItem(id) { + console.log(`selected item: ${id}`) + const url = new URL('/external/getItem', window.location.origin); + url.searchParams.append('id', id); + const response = await fetch(url); + data = await response.json(); + item = data.item; + return item; +} + +async function validateTransaction() { + let database_id = document.getElementById("database_id") + let transaction_type = document.getElementById("trans_type") + let transaction_zone = document.getElementById("zone") + let transaction_location = document.getElementById("location") + let transaction_quantity = document.getElementById("transaction_quantity") + let transaction_cost = document.getElementById("transaction_cost") + + + let error_count = 0 + if(database_id.value === ""){ + error_count = error_count + 1 + database_id.classList.add("uk-form-danger") + } else { + database_id.classList.remove("uk-form-danger") + } + if(transaction_type.value === "0"){ + error_count = error_count + 1 + transaction_type.classList.add("uk-form-danger") + } else { + transaction_type.classList.remove("uk-form-danger") + } + + if (transaction_zone.value === ""){ + error_count = error_count + 1 + transaction_zone.classList.add("uk-form-danger") + } else { + transaction_zone.classList.remove("uk-form-danger") + } + + if (transaction_location.value === ""){ + error_count = error_count + 1 + transaction_location.classList.add("uk-form-danger") + } else { + transaction_location.classList.remove("uk-form-danger") + } + + let transaction_quantity_int = parseFloat(transaction_quantity.value) + if (transaction_quantity_int === 0.00 || transaction_quantity_int < 0.00){ + error_count = error_count + 1 + transaction_quantity.classList.add("uk-form-danger") + } else { + transaction_quantity.classList.remove("uk-form-danger") + } + + let transaction_cost_int = parseFloat(transaction_cost.value) + if (transaction_cost_int == 0.00 && transaction_type.value == "Adjust In"){ + error_count = error_count + 1 + transaction_cost.classList.add("uk-form-danger") + } else { + transaction_cost.classList.remove("uk-form-danger") + } + + if(error_count > 0){ + return false + } + + return true +} + +async function submitTransaction() { + let validated = await validateTransaction() + if (validated){ + let cost = parseFloat(document.getElementById('transaction_cost').value.replace(/[^0-9.-]+/g, "")); + const response = await fetch(`/external/postTransaction`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + item_id: item.id, + logistics_info_id: item.logistics_info_id, + barcode: item.barcode, + item_name: item.item_name, + transaction_type: document.getElementById('trans_type').value, + quantity: parseFloat(document.getElementById('transaction_quantity').value), + description: document.getElementById('transaction_description').value, + cost: cost, + vendor: 0, + expires: null, + location_id: transaction_item_location_id + }), + }); + data = await response.json(); + transaction_status = "success" + if (data.error){ + transaction_status = "danger" + } + + UIkit.notification({ + message: data.message, + status: transaction_status, + pos: 'top-right', + timeout: 5000 + }); + + item = await getItem(item.id) + await populateForm() + document.getElementById('transaction_quantity').value = '0.00' + + } else { + UIkit.notification({ + message: 'Please verify your transaction receipt.', + status: 'warning', + pos: 'top-right', + timeout: 5000 + }) +} +} + +async function searchTable(event, logis, elementID) { + if(event.key==='Enter' && logis==='items'){ + search_string = event.srcElement.value + let items = await getItems() + await replenishItemsTable(items) + } + await updatePaginationElement(elementID) +} + +async function setPage(pageNumber, elementID){ + pagination_current = pageNumber; + + if(elementID=="itemsPage"){ + let items = await getItems() + await replenishItemsTable(items) + } + await updatePaginationElement(elementID) +} + +async function updatePaginationElement(elementID) { + let paginationElement = document.getElementById(elementID); + paginationElement.innerHTML = ""; + // previous + let previousElement = document.createElement('li') + if(pagination_current<=1){ + previousElement.innerHTML = ``; + previousElement.classList.add('uk-disabled'); + }else { + previousElement.innerHTML = ``; + } + paginationElement.append(previousElement) + + //first + let firstElement = document.createElement('li') + if(pagination_current<=1){ + firstElement.innerHTML = `1`; + firstElement.classList.add('uk-disabled'); + }else { + firstElement.innerHTML = `1`; + } + paginationElement.append(firstElement) + + // ... + if(pagination_current-2>1){ + let firstDotElement = document.createElement('li') + firstDotElement.classList.add('uk-disabled') + firstDotElement.innerHTML = `…`; + paginationElement.append(firstDotElement) + } + // last + if(pagination_current-2>0){ + let lastElement = document.createElement('li') + lastElement.innerHTML = `${pagination_current-1}` + paginationElement.append(lastElement) + } + // current + if(pagination_current!=1 && pagination_current != pagination_end){ + let currentElement = document.createElement('li') + currentElement.innerHTML = `
  • ${pagination_current}
  • ` + paginationElement.append(currentElement) + } + // next + if(pagination_current+2${pagination_current+1}` + paginationElement.append(nextElement) + } + // ... + if(pagination_current+2<=pagination_end){ + let secondDotElement = document.createElement('li') + secondDotElement.classList.add('uk-disabled') + secondDotElement.innerHTML = `…`; + paginationElement.append(secondDotElement) + } + //end + let endElement = document.createElement('li') + if(pagination_current>=pagination_end){ + endElement.innerHTML = `${pagination_end}`; + endElement.classList.add('uk-disabled'); + }else { + endElement.innerHTML = `${pagination_end}`; + } + paginationElement.append(endElement) + //next button + let nextElement = document.createElement('li') + if(pagination_current>=pagination_end){ + nextElement.innerHTML = ``; + nextElement.classList.add('uk-disabled'); + }else { + nextElement.innerHTML = ``; + console.log(nextElement.innerHTML) + } + paginationElement.append(nextElement) +} + +var scannedItems = Array(); +const queueLimit = 5; // 49 should be default + +async function addToQueue(event) { + if (event.key == "Enter"){ + let data = await getItemBarcode(document.getElementById('barcode-scan').value) + let scannedItem = data.item + if(data.error){ + UIkit.notification({ + message: data.message, + status: "danger", + pos: 'top-right', + timeout: 5000 + }); + } + if(scannedItems.length > queueLimit){ + scannedItems.shift() + } + if(!Array.isArray(scannedItem) && !data.error){ + let status = await submitScanTransaction(scannedItem) + scannedItems.push({'item': scannedItem, 'type': `${document.getElementById('scan_trans_type').value}`, 'error': status}) + document.getElementById('barcode-scan').value = "" + } + } + await replenishScanTable() +} + +async function getItemBarcode(barcode) { + console.log(`selected item: ${barcode}`) + const url = new URL('/external/getItem/barcode', window.location.origin); + url.searchParams.append('barcode', barcode); + const response = await fetch(url); + data = await response.json(); + return data; +} + +async function submitScanTransaction(scannedItem) { + /// I need to find the location that matches the items auto issue location id + + let trans_type = document.getElementById('scan_trans_type').value + let scan_transaction_item_location_id = 0 + let comparator = 0 + + if (trans_type === "Adjust In"){ + comparator = scannedItem.logistics_info.primary_location.id + } else if (trans_type === "Adjust Out"){ + comparator = scannedItem.logistics_info.auto_issue_location.id + } + + for (let i = 0; i < scannedItem.item_locations.length; i++){ + if (scannedItem.item_locations[i].location_id === comparator){ + scan_transaction_item_location_id = scannedItem.item_locations[i].id + } + } + + const response = await fetch(`/external/postTransaction`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + item_id: scannedItem.id, + logistics_info_id: scannedItem.logistics_info_id, + barcode: scannedItem.barcode, + item_name: scannedItem.item_name, + transaction_type: document.getElementById('scan_trans_type').value, + quantity: scannedItem.item_info.uom_quantity, + description: "", + cost: parseFloat(scannedItem.item_info.cost), + vendor: 0, + expires: null, + location_id: scan_transaction_item_location_id + }), + }); + data = await response.json(); + transaction_status = "success" + if (data.error){ + transaction_status = "danger" + } + + UIkit.notification({ + message: data.message, + status: transaction_status, + pos: 'top-right', + timeout: 5000 + }); + + return data.error + +} + +async function replenishScanTable() { + let scanTableBody = document.getElementById("scanTableBody") + scanTableBody.innerHTML = "" + + let reversedScannedItems = scannedItems.slice().reverse() + + for(let i = 0; i < reversedScannedItems.length; i++){ + let tableRow = document.createElement('tr') + + let icon = `` + if(reversedScannedItems[i].error){ + icon = `` + } + + let statusCell = document.createElement('td') + statusCell.innerHTML = icon + let barcodeCell = document.createElement('td') + barcodeCell.innerHTML = reversedScannedItems[i].item.barcode + let nameCell = document.createElement('td') + nameCell.innerHTML = reversedScannedItems[i].item.item_name + let typeCell = document.createElement('td') + typeCell.innerHTML = reversedScannedItems[i].type + let locationCell = document.createElement('td') + if (reversedScannedItems[i].type === "Adjust In"){ + locationCell.innerHTML = reversedScannedItems[i].item.logistics_info.primary_location.uuid + } else { + locationCell.innerHTML = reversedScannedItems[i].item.logistics_info.auto_issue_location.uuid + } + + tableRow.append(statusCell, barcodeCell, nameCell, typeCell, locationCell) + scanTableBody.append(tableRow) + } +} + +async function submitScanReceipt(items) { + const response = await fetch(`/external/postReceipt`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + items: items + }), + }); + data = await response.json(); + transaction_status = "success" + if (data.error){ + transaction_status = "danger" + } + + UIkit.notification({ + message: data.message, + status: transaction_status, + pos: 'top-right', + timeout: 5000 + }); + + return data.error +} + +var openedReceipt = false +async function startReceipt() { + openedReceipt = true + document.getElementById('barcode-input').classList.remove('uk-disabled') + document.getElementById('barcode-table').classList.remove('uk-disabled') + + document.getElementById('receiptStart').classList.add('uk-disabled') + document.getElementById('receiptComplete').classList.remove('uk-disabled') + document.getElementById('receiptClose').classList.remove('uk-disabled') + +} + +async function completeReceipt() { + openedReceipt = false + document.getElementById('barcode-input').classList.add('uk-disabled') + document.getElementById('barcode-table').classList.add('uk-disabled') + + document.getElementById('receiptStart').classList.remove('uk-disabled') + document.getElementById('receiptComplete').classList.add('uk-disabled') + document.getElementById('receiptClose').classList.add('uk-disabled') + + await submitScanReceipt(scannedReceiptItems) + let scanReceiptTableBody = document.getElementById("scanReceiptTableBody") + scanReceiptTableBody.innerHTML = "" + + scannedReceiptItems = Array() + +} + +async function closeReceipt(){ + openedReceipt = false + document.getElementById('barcode-input').classList.add('uk-disabled') + document.getElementById('barcode-table').classList.add('uk-disabled') + + document.getElementById('receiptStart').classList.remove('uk-disabled') + document.getElementById('receiptComplete').classList.add('uk-disabled') + document.getElementById('receiptClose').classList.add('uk-disabled') + + let scanReceiptTableBody = document.getElementById("scanReceiptTableBody") + scanReceiptTableBody.innerHTML = "" + + scannedReceiptItems = Array() +} + +var scannedReceiptItems = Array(); +async function addToReceipt(event) { + if (event.key == "Enter"){ + let barcode = document.getElementById('barcode-scan-receipt').value + let data = await getItemBarcode(barcode) + let scannedItem = data.item + if(scannedItem){ + let expires = scannedItem.food_info.expires + console.log(expires) + if(scannedItem.food_info.expires){ + let today = new Date(); + today.setDate(today.getDate() + Number(scannedItem.food_info.default_expiration)) + expires = today.toISOString().split('T')[0]; + } + scannedReceiptItems.push({item: { + barcode: scannedItem.barcode, + item_name: scannedItem.item_name, + qty: scannedItem.item_info.uom_quantity, + uom: scannedItem.item_info.uom.id, + data: {cost: scannedItem.item_info.cost, expires: expires} + }, type: 'sku'}) + document.getElementById('barcode-scan-receipt').value = "" + } else { + scannedReceiptItems.push({item: { + barcode: `%${barcode}%`, + item_name: "unknown", + qty: 1, + uom: 1, + data: {'cost': 0.00, 'expires': false} + }, type: 'new sku'}) + document.getElementById('barcode-scan-receipt').value = "" + } + } + await replenishScannedReceiptTable(scannedReceiptItems) +} + +async function replenishScannedReceiptTable(items) { + let scanReceiptTableBody = document.getElementById("scanReceiptTableBody") + scanReceiptTableBody.innerHTML = "" + + for(let i = 0; i < items.length; i++){ + let tableRow = document.createElement('tr') + + let typeCell = document.createElement('td') + typeCell.innerHTML = items[i].type + let barcodeCell = document.createElement('td') + barcodeCell.innerHTML = items[i].item.barcode + let nameCell = document.createElement('td') + nameCell.innerHTML = items[i].item.item_name + + let operationsCell = document.createElement('td') + + let editOp = document.createElement('a') + editOp.style = "margin-right: 5px;" + editOp.setAttribute('class', 'uk-button uk-button-small uk-button-default') + editOp.setAttribute('uk-icon', 'icon: pencil') + editOp.onclick = async function () { + await openLineEditModal(i, items[i]) + } + + let deleteOp = document.createElement('a') + deleteOp.setAttribute('class', 'uk-button uk-button-small uk-button-default') + deleteOp.setAttribute('uk-icon', 'icon: trash') + deleteOp.onclick = async function() { + scannedReceiptItems.splice(i, 1) + await replenishScannedReceiptTable(scannedReceiptItems) + } + + operationsCell.append(editOp, deleteOp) + + operationsCell.classList.add("uk-flex") + operationsCell.classList.add("uk-flex-right") + + tableRow.append(typeCell, barcodeCell, nameCell, operationsCell) + scanReceiptTableBody.append(tableRow) + } +} + +async function openLineEditModal(ind, line_data) { + console.log(line_data) + document.getElementById('lineName').value = line_data.item.item_name + document.getElementById('lineQty').value = line_data.item.qty + document.getElementById('lineUOM').value = line_data.item.uom + document.getElementById('lineCost').value = line_data.item.data.cost + document.getElementById('lineExpires').value = line_data.item.data.expires + if(line_data.type === 'sku'){ + document.getElementById('lineUOM').classList.add('uk-disabled') + } else { + document.getElementById('lineUOM').classList.remove('uk-disabled') + } + + if(!line_data.item.data.expires){ + document.getElementById('lineExpires').classList.add('uk-disabled') + } else { + document.getElementById('lineExpires').classList.remove('uk-disabled') + } + + document.getElementById('saveLineButton').onclick = async function() { + line_data.item.item_name = document.getElementById('lineName').value + line_data.item.qty = document.getElementById('lineQty').value + line_data.item.uom = document.getElementById('lineUOM').value + line_data.item.data.cost = document.getElementById('lineCost').value + if(line_data.item.data.expires){ + line_data.item.data.expires = document.getElementById('lineExpires').value + } + + scannedReceiptItems[ind] = line_data + UIkit.modal(document.getElementById("lineEditModal")).hide(); + await replenishScannedReceiptTable(scannedReceiptItems) + } + + UIkit.modal(document.getElementById("lineEditModal")).show(); +} + +var mode = false +async function toggleDarkMode() { + let darkMode = document.getElementById("dark-mode"); + darkMode.disabled = !darkMode.disabled; + mode = !mode; + if(mode){ + document.getElementById('modeToggle').innerHTML = "light_mode" + document.getElementById('main_html').classList.add('uk-light') + } else { + document.getElementById('modeToggle').innerHTML = "dark_mode" + document.getElementById('main_html').classList.remove('uk-light') + + } + +} \ No newline at end of file diff --git a/static/handlers/transactionsHandler.js b/static/handlers/transactionsHandler.js new file mode 100644 index 0000000..b517777 --- /dev/null +++ b/static/handlers/transactionsHandler.js @@ -0,0 +1,209 @@ +var pagination_current = 1; +var limit = 50; +var pagination_end = 10 +var item; + +document.addEventListener('DOMContentLoaded', async function() { + item = await getItem(item_id); + let transactions = await getTransactions() + replenishTransactionsTable(transactions) + updatePaginationElement() +}) + +async function populateTransactionReceipt(transaction) { + document.getElementById('trans_barcode').innerHTML = transaction.barcode + document.getElementById('trans_database_id').innerHTML = transaction.id + document.getElementById('trans_timestamp').innerHTML = transaction.timestamp + document.getElementById('trans_name').innerHTML = transaction.name + document.getElementById('trans_type').innerHTML = transaction.transaction_type + document.getElementById('trans_qty').innerHTML = transaction.quantity + document.getElementById('trans_description').innerHTML = transaction.description + document.getElementById('trans_user').innerHTML = transaction.user_id + + let receiptTableBody = document.getElementById('receiptTableBody') + receiptTableBody.innerHTML = "" + + for(let key in transaction.data){ + let tableRow = document.createElement('tr') + + let keyCell = document.createElement('td') + keyCell.innerHTML = key + + let valueCell = document.createElement('td') + valueCell.innerHTML = transaction.data[key] + + tableRow.append(keyCell, valueCell) + + receiptTableBody.append(tableRow) + } +} + +async function inspectTransactions(id) { + let transaction = await getTransaction(id) + await populateTransactionReceipt(transaction) + UIkit.modal(document.getElementById("transactionModal")).show(); + +} + +async function replenishTransactionsTable(transactions) { + let transactionsTableBody = document.getElementById("transactionsTableBody") + transactionsTableBody.innerHTML = "" + + for(let i = 0; i < transactions.length; i++){ + let tableRow = document.createElement('tr') + + + + + let timestampCell = document.createElement('td') + timestampCell.innerHTML = transactions[i].timestamp + + let barcodeCell = document.createElement('td') + barcodeCell.innerHTML = transactions[i].barcode + + let nameCell = document.createElement('td') + nameCell.innerHTML = transactions[i].name + + let typeCell = document.createElement('td') + typeCell.innerHTML = transactions[i].transaction_type + + let qtyCell = document.createElement('td') + qtyCell.innerHTML = transactions[i].quantity + + let descriptionCell = document.createElement('td') + descriptionCell.innerHTML = transactions[i].description + + let userCell = document.createElement('td') + userCell.innerHTML = transactions[i].user_id + + + tableRow.append( + timestampCell, + barcodeCell, + nameCell, + typeCell, + qtyCell, + descriptionCell, + userCell + ) + + tableRow.onclick = async function() { + await inspectTransactions(transactions[i].id) + } + + transactionsTableBody.append(tableRow) + } +} + +async function getItem(id) { + const url = new URL('/external/getItem', window.location.origin); + url.searchParams.append('id', id); + const response = await fetch(url); + data = await response.json(); + item = data.item; + return item; +} + +async function getTransaction(id) { + const url = new URL('/item/getTransaction', window.location.origin); + url.searchParams.append('id', id); + const response = await fetch(url); + data = await response.json(); + let transaction = data.transaction; + return transaction; +} + +async function getTransactions(){ + const url = new URL('/item/getTransactions', window.location.origin); + url.searchParams.append('page', pagination_current); + url.searchParams.append('limit', limit); + url.searchParams.append('logistics_info_id', item.logistics_info_id) + const response = await fetch(url); + data = await response.json(); + pagination_end = data.end + let transactions = data.transactions; + return transactions; +} + +async function setPage(page) { + pagination_current = page + let transactions = await getTransactions() + replenishTransactionsTable(transactions) + updatePaginationElement() +} + +async function updatePaginationElement() { + let paginationElement = document.getElementById("paginationElement"); + paginationElement.innerHTML = ""; + // previous + let previousElement = document.createElement('li') + if(pagination_current<=1){ + previousElement.innerHTML = ``; + previousElement.classList.add('uk-disabled'); + }else { + previousElement.innerHTML = ``; + } + paginationElement.append(previousElement) + + //first + let firstElement = document.createElement('li') + if(pagination_current<=1){ + firstElement.innerHTML = `1`; + firstElement.classList.add('uk-disabled'); + }else { + firstElement.innerHTML = `1`; + } + paginationElement.append(firstElement) + + // ... + if(pagination_current-2>1){ + let firstDotElement = document.createElement('li') + firstDotElement.classList.add('uk-disabled') + firstDotElement.innerHTML = `…`; + paginationElement.append(firstDotElement) + } + // last + if(pagination_current-2>0){ + let lastElement = document.createElement('li') + lastElement.innerHTML = `${pagination_current-1}` + paginationElement.append(lastElement) + } + // current + if(pagination_current!=1 && pagination_current != pagination_end){ + let currentElement = document.createElement('li') + currentElement.innerHTML = `
  • ${pagination_current}
  • ` + paginationElement.append(currentElement) + } + // next + if(pagination_current+2${pagination_current+1}` + paginationElement.append(nextElement) + } + // ... + if(pagination_current+2<=pagination_end){ + let secondDotElement = document.createElement('li') + secondDotElement.classList.add('uk-disabled') + secondDotElement.innerHTML = `…`; + paginationElement.append(secondDotElement) + } + //end + let endElement = document.createElement('li') + if(pagination_current>=pagination_end){ + endElement.innerHTML = `${pagination_end}`; + endElement.classList.add('uk-disabled'); + }else { + endElement.innerHTML = `${pagination_end}`; + } + paginationElement.append(endElement) + //next button + let nextElement = document.createElement('li') + if(pagination_current>=pagination_end){ + nextElement.innerHTML = ``; + nextElement.classList.add('uk-disabled'); + }else { + nextElement.innerHTML = ``; + console.log(nextElement.innerHTML) + } + paginationElement.append(nextElement) +} \ No newline at end of file diff --git a/static/itemHandler.js b/static/itemHandler.js deleted file mode 100644 index 9379daa..0000000 --- a/static/itemHandler.js +++ /dev/null @@ -1,210 +0,0 @@ -async function fetchItem() { - const url = new URL('/getItem', window.location.origin); - url.searchParams.append('id', item_id); - const response = await fetch(url); - data = await response.json(); - item = data.item; - linked_items = data.linked_items; -}; - -async function fetchZones() { - const url = new URL('/getZones', window.location.origin); - const response = await fetch(url); - data = await response.json(); - zones = data.zones; -}; - -async function fetchLocations(zone) { - const url = new URL('/getLocations', window.location.origin); - url.searchParams.append('zone', zone); - const response = await fetch(url); - data = await response.json(); - return data.locations; -}; - -async function setupLocations(locations, el) { - let loc_el = document.getElementById(el) - console.log(locations) - loc_el.innerHTML = "" - - let option = document.createElement('option') - option.value = "undefined" - option.innerHTML = "Select Location..." - loc_el.appendChild(option) - - for (let i = 0; i < locations.length; i++){ - let option = document.createElement('option') - option.value = locations[i] - option.innerHTML = locations[i] - loc_el.appendChild(option) - }; -}; - -async function setupZones() { - let primary_zone = document.getElementById('primary_zone') - - for (let i = 0; i < zones.length; i++){ - let option = document.createElement('option') - option.value = zones[i] - option.innerHTML = zones[i] - primary_zone.appendChild(option) - }; - - let issue_zone = document.getElementById('issue_zone') - for (let i = 0; i < zones.length; i++){ - let option = document.createElement('option') - option.value = zones[i] - option.innerHTML = zones[i] - issue_zone.appendChild(option) - }; - -}; - -async function loadPrimaryLocations() { - let primary_zone = document.getElementById('primary_zone').value - primary_locations = await fetchLocations(primary_zone) - await setupLocations(primary_locations, 'primary_location') -}; - -async function loadIssueLocations() { - let issue_zone = document.getElementById('issue_zone').value - issue_locations = await fetchLocations(issue_zone) - await setupLocations(issue_locations, 'issue_location') -}; - -async function addLink(){ - event.preventDefault() - let key = document.getElementById('link_name').value; - let link = document.getElementById('link').value; - links[key] = link; - console.log(links) - links_changed = true; - await propagateLinks() -}; - -function updatePrimaryLocation(){ - let primary_zone = document.getElementById('primary_zone').value - let primary_location = document.getElementById('primary_location').value - - if (primary_location == "undefined"){ - document.getElementById('primary_location').style = "border-color: red;" - } else { - document.getElementById('primary_location').style = "" - logistics_info['primary_location'] = `${primary_zone}@${primary_location}` - }; -}; - -function updateIssueLocation(){ - let issue_zone = document.getElementById('issue_zone').value - let issue_location = document.getElementById('issue_location').value - - if (issue_location == "undefined"){ - document.getElementById('issue_location').style = "border-color: red;" - } else { - document.getElementById('issue_location').style = "" - logistics_info['auto_issue_location'] = `${issue_zone}@${issue_location}` - }; -}; - -function updateEntryType(){ - updated['row_type'] = document.getElementById('entry_type').value; -}; - -function updateItemType(){ - updated['item_type'] = document.getElementById('item_type').value; -}; - -function updatePackaging(){ - let packaging = document.getElementById('packaging').value; - item_info['packaging'] = packaging; -}; - -function updateUOM(){ - let uom = document.getElementById('uom').value; - item_info['uom'] = uom; -}; - -function updateCost(){ - let cost = document.getElementById('cost').value; - item_info['cost'] = parseFloat(cost); -}; - -function updateSafetyStock(){ - let safety_stock = document.getElementById('safety_stock').value; - item_info['safety_stock'] = parseFloat(safety_stock); -}; - -function updateLeadTimeDays(){ - let lead_time_days = document.getElementById('lead_time_days').value; - item_info['lead_time_days'] = parseFloat(lead_time_days); -}; - -function updateAiPickable(){ - let ai_pick = document.getElementById('ai_pickable'); - item_info['ai_pick'] = ai_pick.checked; -}; - -function updateExpires(){ - let expires = document.getElementById('expires'); - food_info['expires'] = expires.checked; -}; - -function updateNutrients(){ - nutrients = { - serving: document.getElementById('serving').value, - serving_unit: document.getElementById('serving_unit').value, - calories: document.getElementById('calories').value, - calories_unit: document.getElementById('calories_unit').value, - proteins: document.getElementById('proteins').value, - proteins_unit: document.getElementById('proteins_unit').value, - fats: document.getElementById('fats').value, - fats_unit: document.getElementById('fats_unit').value, - carbohydrates: document.getElementById('carbohydrates').value, - carbohydrates_unit: document.getElementById('carbohydrates_unit').value, - sugars: document.getElementById('sugars').value, - sugars_unit: document.getElementById('sugars_unit').value, - sodium: document.getElementById('sodium').value, - sodium_unit: document.getElementById('sodium_unit').value, - fibers: document.getElementById('fibers').value, - fibers_unit: document.getElementById('fibers_unit').value - }; - nutrients_changed = true; -} - -async function saveItem() { - - // Only add the key, values if something has changed - if (food_groups_changed){ - food_info['food_groups'] = food_groups; - }; - if (tags_changed){ - updated['tags'] = tags; - }; - if (ingrediants_changed){ - food_info['ingrediants'] = ingrediants; - }; - if (nutrients_changed){ - food_info['nutrients'] = nutrients; - }; - if (links_changed){ - updated['links'] = links; - }; - - await fetch(`/updateItem`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - id: item_id, - logistics_info_id: item[8], - food_info_id: item[9], - item_info_id: item[7], - updated: updated, - item_info: item_info, - logistics_info: logistics_info, - food_info: food_info, - }), - }); - M.toast({html: "Item has been saved successfully!", classes: "rounded green lighten-4 black-text"}); -}; diff --git a/static/receiptHandler.js b/static/receiptHandler.js deleted file mode 100644 index 602c77e..0000000 --- a/static/receiptHandler.js +++ /dev/null @@ -1,276 +0,0 @@ -let receipt; -let receipt_items; -document.addEventListener('DOMContentLoaded', async function() { - await updateReceipt(); - - var elems = document.querySelectorAll('.modal'); - var instances = M.Modal.init(elems, { - // specify options here - }); - var elems = document.getElementById('vendor_address'); - var instances = M.CharacterCounter.init(elems); - var elems = document.querySelectorAll('.tooltipped'); - var instances = M.Tooltip.init(elems, { - // specify options here - }); -}); - -async function updateReceipt(){ - await fetchReceipt(); - await propagateInfo(); - await propagateItems(); -}; - -async function fetchReceiptItem(index){ - const url = new URL('/getReceiptItem', window.location.origin); - url.searchParams.append('index', index); - const response = await fetch(url); - data = await response.json(); - console.log(data) - receipt_item = data.receipt_item; - return receipt_item -} - -async function fetchReceipt(){ - const url = new URL('/getReceipt', window.location.origin); - url.searchParams.append('id', receipt_id); - const response = await fetch(url); - data = await response.json(); - receipt = data.receipt; - receipt_items = data.receipt_items -}; - -async function propagateInfo(){ - document.getElementById('receipt_id').innerHTML = receipt[1] - document.getElementById('database_id').innerHTML = `Database ID: ${receipt[0]}` - document.getElementById('status').innerHTML = receipt[2] - document.getElementById('created').innerHTML = receipt[3] - document.getElementById('vendor_name').value = receipt[8] - document.getElementById('vendor_number').value = receipt[12] - document.getElementById('vendor_address').value = receipt[9] - M.Forms.textareaAutoResize(document.getElementById('vendor_address')); -}; - -async function propagateItems(){ - const table = document.getElementById('item_table') - while (table.rows.length > 1) { - table.deleteRow(1); - }; - let reference_state = 1 - receipt_items.sort((a, b) => a[0] - b[0]) - for (let i = 0; i < receipt_items.length; i++){ - var row = table.insertRow(); - if (receipt_items[i][7] == "Resolved" || receipt_items[i][7] == "Voided"){ - row.classList.add("disabled-row") - } - - var row_type = row.insertCell(); - var row_barcode = row.insertCell(); - var row_name = row.insertCell(); - var row_qty = row.insertCell(); - var row_cost = row.insertCell(); - var row_status = row.insertCell(); - - row_type.innerHTML = receipt_items[i][1] - row_barcode.innerHTML = receipt_items[i][3] - row_name.innerHTML = receipt_items[i][4] - row_qty.innerHTML = receipt_items[i][5] - row_cost.innerHTML = receipt_items[i][6][28] - row_status.innerHTML = receipt_items[i][7] - - if ((reference_state % 2) == 0){ - row.classList.add('green') - row.classList.add('lighten-5') - } - row.classList.add("custom_row") - row.addEventListener('click', function(){ - modify_item(receipt_items[i][0]) - }) - reference_state++ - }; - -} - -async function modify_item(index){ - console.log(index) - item = await fetchReceiptItem(index) - console.log(item) - const modal = document.getElementById("modify_item") - var instance = M.Modal.getInstance(modal); - document.getElementById('item_barcode').value = item[3] - document.getElementById('item_database_id').value = item[0] - document.getElementById('item_type').value = item[1] - document.getElementById('item_name').value = item[4] - document.getElementById('item_qty').value = item[5] - document.getElementById('item_cost').value = item[6][28] - instance.open() -} - -async function saveItem(){ - let index = document.getElementById('item_database_id').value - console.log(index) - const url = new URL('/saveReceiptItem', window.location.origin); - await fetch(url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - index: index, - cost: parseFloat(document.getElementById('item_cost').value), - qty: parseFloat(document.getElementById('item_qty').value), - barcode: document.getElementById('item_barcode').value - }) - }) - await updateReceipt(); - const modal = document.getElementById("modify_item") - var instance = M.Modal.getInstance(modal); - instance.close() -} - - -async function deleteItem(){ - let index = document.getElementById('item_database_id').value - const url = new URL('/deleteReceiptItem', window.location.origin); - await fetch(url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - index: index - }) - }) - await updateReceipt(); - const modal = document.getElementById("modify_item") - var instance = M.Modal.getInstance(modal); - instance.close() -} - -async function voidItem(){ - let index = document.getElementById('item_database_id').value - const url = new URL('/voidReceiptItem', window.location.origin); - await fetch(url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - index: index - }) - }) - await updateReceipt(); - const modal = document.getElementById("modify_item") - var instance = M.Modal.getInstance(modal); - instance.close() -} - - -async function resolveItem(){ - let index = document.getElementById('item_database_id').value - console.log(index) - await saveItem() - const url = new URL('/resolveReceiptItem', window.location.origin); - await fetch(url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - index: index - }) - }) - await updateReceipt(); - const modal = document.getElementById("modify_item") - var instance = M.Modal.getInstance(modal); - instance.close() -} - -async function fetchVendors(){ - const url = new URL('/getVendors', window.location.origin); - const response = await fetch(url); - data = await response.json(); - var vendors = data.vendors; - return vendors -} - -async function selectVendor(index){ - const url = new URL('/saveReceipt', window.location.origin); - await fetch(url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - vendor_index: index, - receipt_index: receipt[0] - }) - }) - await updateReceipt(); - const modal = document.getElementById("vendors") - var instance = M.Modal.getInstance(modal); - instance.close() -} - -async function populateVendors() { - const modal = document.getElementById("vendors") - var instance = M.Modal.getInstance(modal); - vendors = await fetchVendors() - console.log(vendors) - instance.open() - - var table = document.getElementById("vendors_table") - while (table.rows.length > 0) { - table.deleteRow(0); - } - const header = table.createTHead(); - const row = header.insertRow(0); - - var header_database_id = row.insertCell(); - header_database_id.classList.add('center') - var header_name = row.insertCell(); - header_name.classList.add('center') - var header_address = row.insertCell(); - header_address.classList.add('center') - var header_number = row.insertCell(); - header_number.classList.add('center') - - - - header_database_id.innerHTML = `ID`; - header_name.innerHTML = `Name`; - header_address.innerHTML = `Address`; - header_number.innerHTML = `Phone Number`; - - let colorstate = 1; - for (let i = 0; i < vendors.length; i++){ - - var vendor_row = table.insertRow(); - - var row_id = vendor_row.insertCell(); - row_id.classList.add('center'); - var row_name = vendor_row.insertCell(); - row_name.classList.add('center'); - var row_address = vendor_row.insertCell(); - row_address.classList.add('center'); - var row_number = vendor_row.insertCell(); - row_number.classList.add('center'); - - row_id.innerHTML = vendors[i][0]; - row_name.innerHTML = vendors[i][1]; - row_address.innerHTML = vendors[i][2]; - row_number.innerHTML = vendors[i][5]; - - - - if ((colorstate % 2) == 0){ - vendor_row.classList.add('green') - vendor_row.classList.add('lighten-5') - } - vendor_row.classList.add("custom_row") - vendor_row.addEventListener('click', function(){ - selectVendor(vendors[i][0]) - }) - colorstate++ - } -} \ No newline at end of file diff --git a/static/transactionHandler.js b/static/transactionHandler.js deleted file mode 100644 index 7f74129..0000000 --- a/static/transactionHandler.js +++ /dev/null @@ -1,328 +0,0 @@ -let current_page = 1 -let end_page; -let limit = 50 -let search_text = "" -let zones; -let barcode = "" -let item_name = "" -let logistics_info_id = 0 - -async function setupZones() { - let primary_zone = document.getElementById('zone') - - for (let i = 0; i < zones.length; i++){ - let option = document.createElement('option') - option.value = zones[i] - option.innerHTML = zones[i] - primary_zone.appendChild(option) - }; -}; - -async function fetchZones() { - const url = new URL('/getZones', window.location.origin); - const response = await fetch(url); - data = await response.json(); - zones = data.zones; -}; - -async function fetchLocations(zone) { - const url = new URL('/getLocations', window.location.origin); - url.searchParams.append('zone', zone); - const response = await fetch(url); - data = await response.json(); - return data.locations; -}; - -async function loadLocations() { - let zone = document.getElementById('zone').value - let locations = await fetchLocations(zone) - await setupLocations(locations, 'location') -}; - -async function setupLocations(locations, el) { - let loc_el = document.getElementById(el) - console.log(locations) - loc_el.innerHTML = "" - - let option = document.createElement('option') - option.value = "undefined" - option.innerHTML = "Select Location..." - loc_el.appendChild(option) - - for (let i = 0; i < locations.length; i++){ - let option = document.createElement('option') - option.value = locations[i] - option.innerHTML = locations[i] - loc_el.appendChild(option) - }; -}; - -async function fetchItems(){ - if (current_page === 1){ - document.getElementById('back').classList.add("disabled") - document.getElementById('back').classList.remove("waves-effect") - } else { - document.getElementById('back').classList.remove("disabled") - document.getElementById('back').classList.add("waves-effect") - }; - - const url = new URL('/getItems', window.location.origin); - url.searchParams.append('page', current_page); - url.searchParams.append('limit', limit); - await fetch(url) - .then(response => response.json()) - .then(data => { - console.log(data) - end_page = parseInt(data.end) - if (current_page === end_page){ - document.getElementById('forward').classList.add("disabled") - document.getElementById('forward').classList.remove("waves-effect") - } else { - document.getElementById('forward').classList.remove("disabled") - document.getElementById('forward').classList.add("waves-effect") - }; - - // This is to populate the item table! - var table = document.getElementById("item_table") - while (table.rows.length > 0) { - table.deleteRow(0); - } - const header = table.createTHead(); - const row = header.insertRow(0); - - var header_database_id = row.insertCell(); - header_database_id.classList.add('center') - var header_barcode = row.insertCell(); - header_barcode.classList.add('center') - var header_name = row.insertCell(); - header_name.classList.add('center') - header_name.classList.add('hide-on-med-and-down') - - header_database_id.innerHTML = `Database ID`; - header_barcode.innerHTML = `Barcode`; - header_name.innerHTML = `Product Name`; - - let colorstate = 1; - data.items.forEach(transaction => { - console.log(transaction) - var row = table.insertRow(); - - var row_id = row.insertCell(); - row_id.classList.add('center') - var row_barcode = row.insertCell(); - row_barcode.classList.add('center') - var row_name = row.insertCell(); - row_name.classList.add('hide-on-med-and-down') - row_name.classList.add('center') - - - row_id.innerHTML = transaction[0]; - row_barcode.innerHTML = transaction[1]; - row_name.innerHTML = transaction[2]; - - - if ((colorstate % 2) == 0){ - row.classList.add('grey') - row.classList.add('lighten-5') - } - row.classList.add("custom_row") - row.addEventListener('click', function(){ - clickRow(transaction[0]) - }) - colorstate++ - }); - }) -} - -async function populateLocations(locations) { - console.log(locations) - var table = document.getElementById("location_table") - while (table.rows.length > 0) { - table.deleteRow(0); - } - const header = table.createTHead(); - const row = header.insertRow(0); - - var header_database_id = row.insertCell(); - header_database_id.classList.add('center') - var header_barcode = row.insertCell(); - header_barcode.classList.add('center') - var header_name = row.insertCell(); - header_name.classList.add('center') - - header_database_id.innerHTML = `Zone`; - header_barcode.innerHTML = `Location`; - header_name.innerHTML = `QOH`; - - let colorstate = 1; - for (let key in locations){ - console.log(key); - - var location_row = table.insertRow(); - - var row_zone = location_row.insertCell(); - row_zone.classList.add('center'); - var row_location = location_row.insertCell(); - row_location.classList.add('center'); - var row_qoh = location_row.insertCell(); - row_qoh.classList.add('center'); - - let r_location = key.split("@"); - - row_zone.innerHTML = r_location[0]; - row_location.innerHTML = r_location[1]; - row_qoh.innerHTML = locations[key]; - - - if ((colorstate % 2) == 0){ - location_row.classList.add('grey') - location_row.classList.add('lighten-5') - } - location_row.classList.add("custom_row") - location_row.addEventListener('click', function(){ - clickRowLocation(r_location) - }) - colorstate++ - } -} - -async function clickRow(database_id){ - let item = await fetchItem(database_id); - await populateFields(item) - await populateLocations(item[18]) - let modal = document.getElementById("item_modal") - var instance = M.Modal.getInstance(modal) - instance.close() -}; - -async function clickRowLocation(location){ - console.log(location) - let modal = document.getElementById("locations") - var instance = M.Modal.getInstance(modal) - await setLocation(location[0], location[1]) - instance.close() -}; - -async function populateFields(item){ - barcode = item[1] - item_name = item[2] - logistics_info_id = item[8] - document.getElementById("database_id").value = item[0]; - document.getElementById("database_id").style = ""; - document.getElementById("barcode").value = item[1]; - document.getElementById("barcode").style = ""; - document.getElementById("name").value = item[2]; - document.getElementById("QOH").value = item[19]; - document.getElementById("UOM").value = item[27]; - document.getElementById("transaction_cost").value = item[28]; - - let location = item[16].split('@') - await setLocation(location[0], location[1]) -} - -async function setLocation(zone, location){ - document.getElementById('zone').value = zone - document.getElementById('zone').style = "" - await loadLocations() - document.getElementById('location').value = location - document.getElementById('location').style = "" -}; - -async function fetchItem(database_id){ - const url = new URL('/getItem', window.location.origin); - url.searchParams.append('id', database_id); - const response = await fetch(url); - data = await response.json(); - return data.item; -} - -function validateSubmit(){ - var checked = true; - let database_id = document.getElementById('database_id') - let barcode = document.getElementById("barcode") - let zone = document.getElementById('zone') - let loc = document.getElementById('location') - let trans_type = document.getElementById("trans_type") - let qty = document.getElementById('transaction_quantity') - - if (database_id.value == ""){ - database_id.style = "border-color: red;" - checked = false; - } else { - database_id.style = "" - } - if (barcode.value == ""){ - barcode.style = "border-color: red;" - checked = false; - } else { - barcode.style = "" - } - if (trans_type.value == ""){ - trans_type.style = "border-color: red;" - checked = false; - } else { - trans_type.style = "" - } - if (parseFloat(qty.value) == 0.0 || Number.isNaN(parseFloat(qty.value))){ - qty.style = "border-color: red;" - checked = false; - } - if (zone.value == ""){ - zone.style = "border-color: red;" - checked = false; - } - if (loc.value == ""){ - loc.style = "border-color: red;" - checked = false; - } else { - loc.style = "" - } - - return checked; -} - -function addTransaction() { - let zone = document.getElementById('zone').value - let loc = document.getElementById('location').value - let location = `${zone}@${loc}` - let barcode = document.getElementById("barcode").value - let trans_type = document.getElementById("trans_type").value - let trans_cost = parseFloat(document.getElementById("transaction_cost").value) - let qty = parseFloat(document.getElementById('transaction_quantity').value) - - var result = validateSubmit(); - - console.log(result) - if (result === true){ - fetch(`/transact`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - logistics_info_id: logistics_info_id, - barcode: barcode, - name: item_name, - location: location, - qty: qty, - trans_type: trans_type, - trans_cost: trans_cost - }), - }); - M.toast({text: 'Transaction Complete!'}) - document.getElementById('transaction_quantity').value = ""; - } else { - M.toast({text: 'Please ensure your receipt is filled out.'}) - } - -} - -document.getElementById('forward').addEventListener('click', async function(){ - current_page++ - await fetchItems() -}) - -document.getElementById('back').addEventListener('click', async function(){ - current_page-- - await fetchItems() -}) \ No newline at end of file diff --git a/templates/groups/index.html b/templates/groups/index.html index cc91184..5ca8215 100644 --- a/templates/groups/index.html +++ b/templates/groups/index.html @@ -1,9 +1,10 @@ - + - My Pantry - Groups - + Groups + + @@ -12,443 +13,128 @@ - - - - - - - - -
    -
    - -
    -
    - menu -
    -
    - search - -
    -
    - tune -
    -
    -
    - -
    -
    -

    Set Items Per Page

    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    - - -
      ' - - if current_page > 1: - pag += f'
    • chevron_left
    • ' - - p = [_ for _ in [current_page-2, current_page-1, current_page] if _ >= 1] - y = [_ for _ in [current_page+1, current_page+2] if _ <= total_pages] - _elems = p + y - print(_elems) - - for _element in _elems: - if _element == current_page: - pag += f'
    • {_element}
    • ' - else: - pag += f'
    • {_element}
    • ' - - if current_page != total_pages: - pag += f'
    • chevron_right
    • ' - - pag += "