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 0000000..23bcdf5 Binary files /dev/null and b/__pycache__/MyDataclasses.cpython-312.pyc differ diff --git a/__pycache__/admin.cpython-312.pyc b/__pycache__/admin.cpython-312.pyc index bb65872..4492fed 100644 Binary files a/__pycache__/admin.cpython-312.pyc and b/__pycache__/admin.cpython-312.pyc differ diff --git a/__pycache__/api.cpython-312.pyc b/__pycache__/api.cpython-312.pyc index bbf1038..668ac56 100644 Binary files a/__pycache__/api.cpython-312.pyc and b/__pycache__/api.cpython-312.pyc differ diff --git a/__pycache__/database.cpython-312.pyc b/__pycache__/database.cpython-312.pyc index 5e8d46e..a3f88cc 100644 Binary files a/__pycache__/database.cpython-312.pyc and b/__pycache__/database.cpython-312.pyc differ diff --git a/__pycache__/external_API.cpython-312.pyc b/__pycache__/external_API.cpython-312.pyc new file mode 100644 index 0000000..20700ee Binary files /dev/null and b/__pycache__/external_API.cpython-312.pyc differ diff --git a/__pycache__/group_api.cpython-312.pyc b/__pycache__/group_api.cpython-312.pyc new file mode 100644 index 0000000..71ca217 Binary files /dev/null and b/__pycache__/group_api.cpython-312.pyc differ diff --git a/__pycache__/item_API.cpython-312.pyc b/__pycache__/item_API.cpython-312.pyc new file mode 100644 index 0000000..b21e2dc Binary files /dev/null and b/__pycache__/item_API.cpython-312.pyc differ diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc index ace77b6..6d0c743 100644 Binary files a/__pycache__/main.cpython-312.pyc and b/__pycache__/main.cpython-312.pyc differ diff --git a/__pycache__/postsqldb.cpython-312.pyc b/__pycache__/postsqldb.cpython-312.pyc new file mode 100644 index 0000000..ff8dc99 Binary files /dev/null and b/__pycache__/postsqldb.cpython-312.pyc differ diff --git a/__pycache__/process.cpython-312.pyc b/__pycache__/process.cpython-312.pyc new file mode 100644 index 0000000..0379a10 Binary files /dev/null and b/__pycache__/process.cpython-312.pyc differ diff --git a/__pycache__/receipts_API.cpython-312.pyc b/__pycache__/receipts_API.cpython-312.pyc new file mode 100644 index 0000000..f59419a Binary files /dev/null and b/__pycache__/receipts_API.cpython-312.pyc differ diff --git a/__pycache__/recipes_api.cpython-312.pyc b/__pycache__/recipes_api.cpython-312.pyc new file mode 100644 index 0000000..a6b056e Binary files /dev/null and b/__pycache__/recipes_api.cpython-312.pyc differ diff --git a/__pycache__/shopping_list_API.cpython-312.pyc b/__pycache__/shopping_list_API.cpython-312.pyc new file mode 100644 index 0000000..6af6dfd Binary files /dev/null and b/__pycache__/shopping_list_API.cpython-312.pyc differ diff --git a/__pycache__/user_api.cpython-312.pyc b/__pycache__/user_api.cpython-312.pyc index 570b711..4fbfaad 100644 Binary files a/__pycache__/user_api.cpython-312.pyc and b/__pycache__/user_api.cpython-312.pyc differ 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 += '
    ' - - 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 += "
" - - 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 0000000..9c21c93 Binary files /dev/null and b/static/.webassets-cache/230c2b05ff18323c515e21cf9fb81093 differ diff --git a/static/.webassets-cache/9db6a7b996bcd7e801a856245be5f1d2 b/static/.webassets-cache/9db6a7b996bcd7e801a856245be5f1d2 new file mode 100644 index 0000000..063c4aa Binary files /dev/null and b/static/.webassets-cache/9db6a7b996bcd7e801a856245be5f1d2 differ 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

    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    - - -