more database migration

This commit is contained in:
Jadowyne Ulve 2025-09-30 15:07:59 -05:00
parent a412a02652
commit cbfe74c868
28 changed files with 498 additions and 49 deletions

1
.gitignore vendored
View File

@ -9,3 +9,4 @@ test.py
.VScodeCounter .VScodeCounter
celerybeat-schedule celerybeat-schedule
instance/application.cfg.py instance/application.cfg.py
docs

View File

@ -234,6 +234,7 @@ class BaseModel(ABC):
@classmethod @classmethod
def select_tuple(self, site: str, payload: dict, convert: bool = True, conn=None): def select_tuple(self, site: str, payload: dict, convert: bool = True, conn=None):
''' payload = {'key': value_to_filter}'''
record = () record = ()
self_conn = False self_conn = False
@ -265,6 +266,40 @@ class BaseModel(ABC):
except Exception as error: except Exception as error:
raise DatabaseError(error, payload, sql) raise DatabaseError(error, payload, sql)
@classmethod
def select_tuples_by_key(self, site: str, payload: dict, convert: bool = True, conn=None):
'''payload = {'key'}'''
records = ()
self_conn = False
if self.site_agnostic:
sql = f"SELECT * FROM {self.table_name} WHERE {self.primary_key} = %(key)s::{self.primary_key_type};"
else:
sql = f"SELECT * FROM {site}_{self.table_name} WHERE {self.primary_key} = %(key)s::{self.primary_key_type};"
try:
if not conn:
database_config = config.config()
conn = psycopg2.connect(**database_config)
conn.autocommit = True
self_conn = True
with conn.cursor() as cur:
cur.execute(sql, payload)
rows = cur.fetchall()
if rows and convert:
records = [tupleDictionaryFactory(cur.description, row) for row in rows]
elif rows and not convert:
records = rows
if self_conn:
conn.commit()
conn.close()
return records
except Exception as error:
raise DatabaseError(error, {}, sql)
@classmethod @classmethod
def select_tuples(self, site: str, convert: bool = True, conn=None): def select_tuples(self, site: str, convert: bool = True, conn=None):
records = () records = ()

View File

@ -1,17 +1,93 @@
from dataclasses import dataclass from dataclasses import dataclass
import datetime import datetime
from application.database_postgres.BaseModel import BasePayload, BaseModel import config
import psycopg2
from application.database_postgres.BaseModel import BasePayload, BaseModel, tupleDictionaryFactory, DatabaseError, updateStringFactory
class CostLayersModel(BaseModel): class CostLayersModel(BaseModel):
table_name = "cost_layers" table_name = "cost_layers"
primary_key = "item_location_uuid"
primary_key_type = "uuid"
@dataclass @dataclass
class Payload(BasePayload): class Payload(BasePayload):
aquisition_date: datetime.datetime item_location_uuid: str
quantity: float layer_aquisition_date: datetime.datetime
cost: float layer_quantity: float
currency_type: str layer_cost: float
vendor: int = 0 layer_currency_type: str
expires: datetime.datetime = None layer_vendor: str = None
layer_expires: datetime.datetime = None
@classmethod
def delete_by_layer_id(self, site: str, payload: tuple, convert: bool = True, conn=None):
""" Pass a tuple of layer_ids to remove from the database.
Args:
site (str): name of the site to delete from
payload (tuple): a tuple of layer_ids
convert (bool, optional): whether to return the deleted rows as dictionaries. Defaults to True.
conn (_type_, optional): postgresql connector object. Defaults to None.
Raises:
DatabaseError: raised for all errors with database handling, logs to database.log
Returns:
dict, list: returns a list of all deleted rows.
"""
deleted = ()
self_conn = False
sql = f"WITH deleted_rows AS (DELETE FROM {site}_{self.table_name} WHERE layer_id IN ({','.join(['%s'] * len(payload))}) RETURNING *) SELECT * FROM deleted_rows;"
try:
if not conn:
database_config = config.config()
conn = psycopg2.connect(**database_config)
conn.autocommit = True
self_conn = True
with conn.cursor() as cur:
cur.execute(sql, payload)
rows = cur.fetchall()
if rows and convert:
deleted = [tupleDictionaryFactory(cur.description, r) for r in rows]
elif rows and not convert:
deleted = rows
if self_conn:
conn.commit()
conn.close()
return deleted
except Exception as error:
raise DatabaseError(error, payload, sql)
@classmethod
def update_by_layer_id(self, site: str, payload:dict, convert=True, conn=None):
updated = ()
self_conn = False
set_clause, values = updateStringFactory(payload['update'])
values.append(payload['key'])
sql = f"UPDATE {site}_{self.table_name} SET {set_clause} WHERE layer_id=%s RETURNING *;"
try:
if not conn:
database_config = config.config()
conn = psycopg2.connect(**database_config)
conn.autocommit = False
self_conn = True
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
if self_conn:
conn.commit()
conn.close()
return updated
except Exception as error:
raise DatabaseError(error, payload, sql)

View File

@ -1,5 +1,9 @@
from dataclasses import dataclass, field from dataclasses import dataclass, field
from application.database_postgres.BaseModel import BasePayload, BaseModel, lst2pgarr from application.database_postgres.BaseModel import BasePayload, BaseModel, lst2pgarr, tupleDictionaryFactory, DatabaseError
import config
import psycopg2
class ItemLocationsModel(BaseModel): class ItemLocationsModel(BaseModel):
table_name = "item_locations" table_name = "item_locations"
@ -12,3 +16,31 @@ class ItemLocationsModel(BaseModel):
location_uuid: str location_uuid: str
item_quantity_on_hand: float = 0.0 item_quantity_on_hand: float = 0.0
@classmethod
def select_by_location_and_item(self, site:str, payload:dict, convert: bool=True, conn = None):
recordset = ()
self_conn = False
sql = f"SELECT * FROM {site}_item_locations WHERE item_uuid = %(item_uuid)s AND location_uuid = %(location_uuid)s;"
try:
if not conn:
database_config = config.config()
conn = psycopg2.connect(**database_config)
conn.autocommit = True
self_conn = True
with conn.cursor() as cur:
cur.execute(sql, payload)
rows = cur.fetchone()
if rows and convert:
recordset = tupleDictionaryFactory(cur.description, rows)
if rows and not convert:
recordset = rows
if self_conn:
conn.close()
return recordset
except Exception as error:
raise DatabaseError(error, payload, sql)

View File

@ -33,6 +33,35 @@ class ItemsModel(BaseModel):
payload['item_links'] = json.dumps(self.item_links) payload['item_links'] = json.dumps(self.item_links)
return payload return payload
@classmethod
def get_item_by_uuid(self, site:str, payload: dict, convert: bool=True, conn = None):
record = ()
self_conn = False
with open('application/database_postgres/sql/ItemsModel/getItemAllByUUID.sql', 'r+') as file:
sql = file.read().replace("%%site_name%%", site)
try:
if not conn:
database_config = config.config()
conn = psycopg2.connect(**database_config)
conn.autocommit = True
self_conn = True
with conn.cursor() as cur:
cur.execute(sql, payload)
rows = cur.fetchone()
if rows and convert:
record = tupleDictionaryFactory(cur.description, rows)
if rows and not convert:
record = rows
if self_conn:
conn.close()
return record
except Exception as error:
raise DatabaseError(error, payload, sql)
@classmethod @classmethod
def paginate_items_with_qoh(self, site:str, payload: dict, convert: bool=True, conn = None): def paginate_items_with_qoh(self, site:str, payload: dict, convert: bool=True, conn = None):
recordset = () recordset = ()

View File

@ -6,7 +6,7 @@ from application.database_postgres.BaseModel import BasePayload, BaseModel
class TransactionsModel(BaseModel): class TransactionsModel(BaseModel):
table_name = "transactions" table_name = "transactions"
primary_key = "item_uuid" primary_key = "transaction_uuid"
primary_key_type = "uuid" primary_key_type = "uuid"
@dataclass @dataclass

View File

@ -1,4 +1,5 @@
CREATE TABLE IF NOT EXISTS %%site_name%%_cost_layers ( CREATE TABLE IF NOT EXISTS %%site_name%%_cost_layers (
layer_id SERIAL UNIQUE,
item_location_uuid UUID REFERENCES %%site_name%%_item_locations(item_location_uuid) ON DELETE SET NULL, item_location_uuid UUID REFERENCES %%site_name%%_item_locations(item_location_uuid) ON DELETE SET NULL,
layer_aquisition_date TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL, layer_aquisition_date TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL,
layer_quantity FLOAT8 DEFAULT 0.00 NOT NULL, layer_quantity FLOAT8 DEFAULT 0.00 NOT NULL,

View File

@ -7,5 +7,5 @@ CREATE TABLE IF NOT EXISTS %%site_name%%_item_info (
item_safety_stock FLOAT8 DEFAULT 0.00 NOT NULL, item_safety_stock FLOAT8 DEFAULT 0.00 NOT NULL,
item_lead_time_days FLOAT8 DEFAULT 0.00 NOT NULL, item_lead_time_days FLOAT8 DEFAULT 0.00 NOT NULL,
item_ai_pick BOOLEAN DEFAULT false NOT NULL, item_ai_pick BOOLEAN DEFAULT false NOT NULL,
item_prefixes INTEGER [] DEFAULT '{}' NOT NULL item_prefixes UUID [] DEFAULT '{}' NOT NULL
); );

View File

@ -1,6 +1,6 @@
CREATE TABLE IF NOT EXISTS %%site_name%%_transactions ( CREATE TABLE IF NOT EXISTS %%site_name%%_transactions (
item_uuid UUID PRIMARY KEY REFERENCES %%site_name%%_items(item_uuid) ON DELETE CASCADE, transaction_uuid UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
transaction_uuid UUID DEFAULT uuid_generate_v4() NOT NULL; item_uuid UUID REFERENCES %%site_name%%_items(item_uuid) ON DELETE CASCADE NOT NULL,
transaction_created_at TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL, transaction_created_at TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL,
transaction_name VARCHAR(255) DEFAULT NULL, transaction_name VARCHAR(255) DEFAULT NULL,
transaction_type VARCHAR(64) DEFAULT '' NOT NULL, transaction_type VARCHAR(64) DEFAULT '' NOT NULL,

View File

@ -1,4 +1,4 @@
INSERT INTO %%site_name%%_cost_layers INSERT INTO %%site_name%%_cost_layers
(aquisition_date, quantity, cost, currency_type, expires, vendor) (item_location_uuid, layer_aquisition_date, layer_quantity, layer_cost, layer_currency_type, layer_expires, layer_vendor)
VALUES (%(aquisition_date)s, %(quantity)s, %(cost)s, %(currency_type)s, %(expires)s, %(vendor)s) VALUES (%(item_location_uuid)s::uuid, %(layer_aquisition_date)s, %(layer_quantity)s, %(layer_cost)s, %(layer_currency_type)s, %(layer_expires)s, %(layer_vendor)s)
RETURNING *; RETURNING *;

View File

@ -0,0 +1,44 @@
WITH passed_uuid AS (SELECT %(item_uuid)s::uuid AS passed_uuid),
cte_conversions AS (
SELECT *
FROM %%site_name%%_conversions conversion
WHERE conversion.item_uuid = (SELECT passed_uuid FROM passed_uuid)
),
cte_item_info AS (SELECT item_info.*,
COALESCE((SELECT json_agg(convs) FROM cte_conversions convs), '[]'::json) AS conversions,
COALESCE((SELECT json_agg(p.*) FROM %%site_name%%_sku_prefix p WHERE p.sku_prefix_uuid = ANY(item_info.item_prefixes)), '[]'::json) as prefixes
FROM %%site_name%%_item_info item_info
WHERE item_info.item_uuid = (SELECT passed_uuid FROM passed_uuid)
),
cte_food_info AS (SELECT *
FROM %%site_name%%_food_info food_info
WHERE food_info.item_uuid = (SELECT passed_uuid FROM passed_uuid)
),
cte_logistics_info AS (SELECT *
FROM %%site_name%%_logistics_info log_info
WHERE log_info.item_uuid = (SELECT passed_uuid FROM passed_uuid)
),
cte_item_locations AS (
SELECT * FROM %%site_name%%_item_locations item_locations
LEFT JOIN %%site_name%%_locations locations ON locations.location_uuid = item_locations.location_uuid
WHERE item_locations.item_uuid = (SELECT passed_uuid FROM passed_uuid)
),
cte_barcodes AS (
SELECT
barcode.barcode As barcode,
barcode.in_exchange AS in_exchange,
barcode.out_exchange AS out_exchange,
barcode.descriptor AS descriptor
FROM %%site_name%%_barcodes AS barcode
LEFT JOIN %%site_name%%_items AS item ON item.item_uuid = (SELECT passed_uuid FROM passed_uuid)
WHERE barcode.item_uuid = item.item_uuid
)
SELECT item.*,
(SELECT COALESCE(row_to_json(ii), '{}') FROM cte_item_info ii) AS item_info,
(SELECT COALESCE(row_to_json(fi), '{}') FROM cte_food_info fi) AS food_info,
(SELECT COALESCE(row_to_json(li), '{}') FROM cte_logistics_info li) AS logistics_info,
(SELECT COALESCE(array_agg(row_to_json(ils)), '{}') FROM cte_item_locations ils) AS item_locations,
(SELECT COALESCE(array_agg(row_to_json(bar)), '{}') FROM cte_barcodes bar) AS item_barcodes
FROM %%site_name%%_items item
WHERE item.item_uuid=(SELECT passed_uuid FROM passed_uuid)

View File

@ -18,8 +18,9 @@ import application.database_payloads as dbPayloads
from application.database_postgres.UsersModel import UsersModel from application.database_postgres.UsersModel import UsersModel
from application.database_postgres.SitesModel import SitesModel from application.database_postgres.SitesModel import SitesModel
from application.database_postgres.UnitsModel import UnitsModel from application.database_postgres.UnitsModel import UnitsModel
from application.items import models from application.items import models, services
from application.database_postgres.ItemsModel import ItemsModel from application.database_postgres.ItemsModel import ItemsModel
from application.database_postgres.TransactionsModel import TransactionsModel
items_api = Blueprint('items_api', __name__, template_folder="templates", static_folder="static") items_api = Blueprint('items_api', __name__, template_folder="templates", static_folder="static")
@ -44,7 +45,7 @@ def items():
def item(item_uuid): def item(item_uuid):
sites = [SitesModel.select_tuple('', {'key': site})['site_name'] for site in session['user'].get('user_sites', [])] sites = [SitesModel.select_tuple('', {'key': site})['site_name'] for site in session['user'].get('user_sites', [])]
units = UnitsModel.select_tuples('') units = UnitsModel.select_tuples('')
return render_template("item_new.html", id=id, units=units, current_site=session['selected_site'], sites=sites) return render_template("item_new.html", item_uuid=item_uuid, units=units, current_site=session['selected_site'], sites=sites)
@items_api.route("/transaction") @items_api.route("/transaction")
@access_api.login_required @access_api.login_required
@ -82,9 +83,10 @@ def getTransactions():
def getTransaction(): def getTransaction():
transaction = () transaction = ()
if request.method == "GET": if request.method == "GET":
id = int(request.args.get('id', 1)) transaction_uuid = int(request.args.get('transaction_uuid', None))
if transaction_uuid:
site_name = session['selected_site'] site_name = session['selected_site']
transaction = database_items.getTransaction(site_name, (id, )) transaction = TransactionsModel.select_tuple(site_name, {'key': transaction_uuid})
return jsonify({"transaction": transaction, "error": False, "message": ""}) return jsonify({"transaction": transaction, "error": False, "message": ""})
return jsonify({"transaction": transaction, "error": True, "message": f"method {request.method} is not allowed."}) return jsonify({"transaction": transaction, "error": True, "message": f"method {request.method} is not allowed."})
@ -92,11 +94,13 @@ def getTransaction():
@access_api.login_required @access_api.login_required
def get_item(): def get_item():
if request.method == "GET": if request.method == "GET":
id = int(request.args.get('id', 1)) item_uuid = request.args.get('item_uuid', None)
site_name = session['selected_site']
item = () item = ()
print(item_uuid)
item = database_items.getItemAllByID(site_name, (id, )) if item_uuid:
site_name = session['selected_site']
item = ItemsModel.get_item_by_uuid(site_name, {'item_uuid': item_uuid})
print(item)
return jsonify({'item': item, 'error': False, 'message': ''}) return jsonify({'item': item, 'error': False, 'message': ''})
return jsonify({'item': item, 'error': True, 'message': f'method {request.method} not allowed.'}) return jsonify({'item': item, 'error': True, 'message': f'method {request.method} not allowed.'})
@ -424,15 +428,13 @@ def getItemLocations():
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":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"}) return jsonify({"locations":recordset, "end": math.ceil(count/limit), "error":True, "message":"There was an error with this GET statement"})
@items_api.route('/postTransaction', methods=["POST"]) @items_api.route('/postTransaction', methods=["POST"])
@access_api.login_required @access_api.login_required
def post_transaction(): def post_transaction():
if request.method == "POST": if request.method == "POST":
result = items_processes.postAdjustment( print(session.keys())
site_name=session['selected_site'], result = services.postAdjustment(site_name=session['selected_site'], user_uuid=session['user_uuid'], data=request.get_json())
user_id=session['user_id'],
data=dict(request.json)
)
return jsonify(result) return jsonify(result)
return jsonify({"error":True, "message":"There was an error with this POST statement"}) return jsonify({"error":True, "message":"There was an error with this POST statement"})

View File

@ -1,4 +1,5 @@
import psycopg2 import psycopg2
import datetime
from application.database_postgres.ItemsModel import ItemsModel from application.database_postgres.ItemsModel import ItemsModel
from application.database_postgres.ItemInfoModel import ItemInfoModel from application.database_postgres.ItemInfoModel import ItemInfoModel
@ -6,6 +7,7 @@ from application.database_postgres.LogisticsInfoModel import LogisticsInfoModel
from application.database_postgres.FoodInfoModel import FoodInfoModel from application.database_postgres.FoodInfoModel import FoodInfoModel
from application.database_postgres.TransactionsModel import TransactionsModel from application.database_postgres.TransactionsModel import TransactionsModel
from application.database_postgres.ItemLocationsModel import ItemLocationsModel from application.database_postgres.ItemLocationsModel import ItemLocationsModel
from application.database_postgres.CostLayersModel import CostLayersModel
import config import config
def add_new_item(site: str, data: dict, user_uuid: str, conn=None): def add_new_item(site: str, data: dict, user_uuid: str, conn=None):
@ -42,7 +44,7 @@ def add_new_item(site: str, data: dict, user_uuid: str, conn=None):
) )
items_location = ItemLocationsModel.insert_tuple(site, items_location.payload_dictionary(), conn=conn) items_location = ItemLocationsModel.insert_tuple(site, items_location.payload_dictionary(), conn=conn)
if item['item_category'] in ['FOOD', 'FOOD PLU']: if item['item_category'] in ['FOOD', 'FOOD_PLU']:
food_info['item_uuid'] = item['item_uuid'] food_info['item_uuid'] = item['item_uuid']
food_info_payload = FoodInfoModel.Payload(**food_info) food_info_payload = FoodInfoModel.Payload(**food_info)
food_info = FoodInfoModel.insert_tuple(site, food_info_payload.payload_dictionary(), conn=conn) food_info = FoodInfoModel.insert_tuple(site, food_info_payload.payload_dictionary(), conn=conn)
@ -59,3 +61,92 @@ def add_new_item(site: str, data: dict, user_uuid: str, conn=None):
if self_conn: if self_conn:
conn.commit() conn.commit()
conn.close() conn.close()
def postAdjustment(site_name, user_uuid, data: dict, conn=None):
""" This process handles manual transactions found at /items/transaction endpoint
Args:
site_name (_type_): _description_
user_uuid (_type_): _description_
data (dict): dataKEYS = {'item_uuid', 'item_name', 'transaction_type', 'transaction_quantity', 'transaction_description', 'transaction_cost', 'transaction_vendor', 'trans_action_expires', 'location_uuid'}
conn (_type_, optional): _description_. Defaults to None.
"""
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!")
self_conn = False
if not conn:
database_config = config.config()
conn = psycopg2.connect(**database_config)
conn.autocommit = False
self_conn = True
transaction_data = {
'item_uuid': data['item_uuid'],
'transaction_created_by': user_uuid,
'transaction_name': data['item_name'],
'transaction_type': data['transaction_type'],
'transaction_quantity': data['transaction_quantity'],
'transaction_cost': data['transaction_cost'],
'transaction_description': data['transaction_description']
}
transaction = TransactionsModel.Payload(**transaction_data)
location = ItemLocationsModel.select_by_location_and_item(site_name, {'item_uuid': data['item_uuid'], 'location_uuid': data['location_uuid']})
cost_layer_data = {
'item_location_uuid': location['item_location_uuid'],
'layer_aquisition_date': datetime.datetime.now(),
'layer_quantity': data['transaction_quantity'],
'layer_cost': data['transaction_cost'],
'layer_currency_type': "USD"
}
new_cost_layer = CostLayersModel.Payload(**cost_layer_data)
cost_layers = list(CostLayersModel.select_tuples_by_key(site_name, {'key': location['item_location_uuid']}, conn=conn))
print(cost_layers)
cost_layers.sort(key=lambda x: x['layer_aquisition_date'])
if data['transaction_type'] == "Adjust In":
CostLayersModel.insert_tuple(site_name, new_cost_layer.payload_dictionary(), conn=conn)
if data['transaction_type'] == "Adjust Out":
if float(location['item_quantity_on_hand']) < float(data['transaction_quantity']):
pass
else:
qty = float(data['transaction_quantity'])
for layer in cost_layers:
if qty >= float(layer['layer_quantity']):
qty -= float(layer['layer_quantity'])
layer['layer_quantity'] = 0.0
else:
layer['layer_quantity'] -= qty
CostLayersModel.update_by_layer_id(site_name, {'key': layer['layer_id'], 'update': {'layer_quantity': layer['layer_quantity']}}, conn=conn)
qty = 0.0
if layer['layer_quantity'] == 0.0:
CostLayersModel.delete_by_layer_id(site_name, (layer['layer_id'],), conn=conn)
quantity_on_hand = quantityFactory(float(location['item_quantity_on_hand']), data['transaction_quantity'], data['transaction_type'])
ItemLocationsModel.update_tuple(site_name, {'key': location['item_location_uuid'], 'update': {'item_quantity_on_hand': quantity_on_hand}}, conn=conn)
transaction.data = {'location': location['item_location_uuid']}
TransactionsModel.insert_tuple(site_name, transaction.payload_dictionary(), conn=conn)
if self_conn:
conn.commit()
conn.close()
return False
return conn

View File

@ -1117,8 +1117,8 @@ async function fetchLocations(logis) {
} }
async function fetchItem() { async function fetchItem() {
const url = new URL('/items/getItem', window.location.origin); const url = new URL('/items/api/getItem', window.location.origin);
url.searchParams.append('id', item_id); url.searchParams.append('item_uuid', item_uuid);
const response = await fetch(url); const response = await fetch(url);
data = await response.json(); data = await response.json();
item = data.item; item = data.item;

View File

@ -87,7 +87,7 @@ async function selectItem(item_uuid) {
} }
var transaction_zone_uuid = "" var transaction_zone_uuid = ""
var transaction_location_uuid = "" var transaction_item_location_uuid = ""
async function selectLocation(zone_uuid, location_uuid, zone_name, location_name) { async function selectLocation(zone_uuid, location_uuid, zone_name, location_name) {
document.getElementById('zone').value = zone_name document.getElementById('zone').value = zone_name
document.getElementById('location').value = location_name document.getElementById('location').value = location_name
@ -131,6 +131,7 @@ async function replenishItemLocationsTable(locations) {
let itemLocationTableBody = document.getElementById('itemLocationTableBody') let itemLocationTableBody = document.getElementById('itemLocationTableBody')
itemLocationTableBody.innerHTML = "" itemLocationTableBody.innerHTML = ""
for(let i = 0; i < locations.length; i++){ for(let i = 0; i < locations.length; i++){
console.log(locations[i])
let tableRow = document.createElement('tr') let tableRow = document.createElement('tr')
let loca = locations[i].location_shortname.split('@') let loca = locations[i].location_shortname.split('@')
@ -198,7 +199,7 @@ async function getItem(item_uuid) {
} }
async function validateTransaction() { async function validateTransaction() {
let database_id = document.getElementById("database_id") let database_uuid = document.getElementById("database_uuid")
let transaction_type = document.getElementById("trans_type") let transaction_type = document.getElementById("trans_type")
let transaction_zone = document.getElementById("zone") let transaction_zone = document.getElementById("zone")
let transaction_location = document.getElementById("location") let transaction_location = document.getElementById("location")
@ -207,11 +208,11 @@ async function validateTransaction() {
let error_count = 0 let error_count = 0
if(database_id.value === ""){ if(database_uuid.value === ""){
error_count = error_count + 1 error_count = error_count + 1
database_id.classList.add("uk-form-danger") database_uuid.classList.add("uk-form-danger")
} else { } else {
database_id.classList.remove("uk-form-danger") database_uuid.classList.remove("uk-form-danger")
} }
if(transaction_type.value === "0"){ if(transaction_type.value === "0"){
error_count = error_count + 1 error_count = error_count + 1
@ -270,12 +271,12 @@ async function submitTransaction() {
item_uuid: item.item_uuid, item_uuid: item.item_uuid,
item_name: item.item_name, item_name: item.item_name,
transaction_type: document.getElementById('trans_type').value, transaction_type: document.getElementById('trans_type').value,
quantity: parseFloat(document.getElementById('transaction_quantity').value), transaction_quantity: parseFloat(document.getElementById('transaction_quantity').value),
description: document.getElementById('transaction_description').value, transaction_description: document.getElementById('transaction_description').value,
cost: cost, transaction_cost: cost,
vendor: 0, transaction_vendor: null,
expires: null, trans_action_expires: null,
location_id: transaction_location_uuid location_uuid: transaction_item_location_uuid
}), }),
}); });
data = await response.json(); data = await response.json();
@ -291,7 +292,7 @@ async function submitTransaction() {
timeout: 5000 timeout: 5000
}); });
item = await getItem(item.id) item = await getItem(item.item_uuid)
await populateForm() await populateForm()
document.getElementById('transaction_quantity').value = '0.00' document.getElementById('transaction_quantity').value = '0.00'

View File

@ -104,9 +104,9 @@ async function getItem(id) {
return item; return item;
} }
async function getTransaction(id) { async function getTransaction(transaction_uuid) {
const url = new URL('/items/getTransaction', window.location.origin); const url = new URL('/items/getTransaction', window.location.origin);
url.searchParams.append('id', id); url.searchParams.append('transaction_uuid', transaction_uuid);
const response = await fetch(url); const response = await fetch(url);
data = await response.json(); data = await response.json();
let transaction = data.transaction; let transaction = data.transaction;

View File

@ -128,7 +128,7 @@
<div uk-grid> <div uk-grid>
<div class="uk-width-1-1 uk-child-width-expand@s uk-grid-small uk-flex uk-flex-bottom uk-margin" uk-grid> <div class="uk-width-1-1 uk-child-width-expand@s uk-grid-small uk-flex uk-flex-bottom uk-margin" uk-grid>
<div class="uk-width-1-3@m"> <div class="uk-width-1-3@m">
<label class="uk-form-label" for="database_id">Database ID</label> <label class="uk-form-label" for="database_uuid">Database ID</label>
<input autocomplete="off" id="database_uuid" class="uk-input uk-disabled uk-flex uk-flex-bottom" type="text"> <input autocomplete="off" id="database_uuid" class="uk-input uk-disabled uk-flex uk-flex-bottom" type="text">
</div> </div>
<div class="uk-width-2-3@m uk-flex uk-flex-bottom"> <div class="uk-width-2-3@m uk-flex uk-flex-bottom">

View File

@ -926,3 +926,117 @@
2025-09-07 11:31:37.389493 --- ERROR --- DatabaseError(message='value too long for type character varying(32)', 2025-09-07 11:31:37.389493 --- ERROR --- DatabaseError(message='value too long for type character varying(32)',
payload=(None, "Take Out: Richie's Brickhouse BBQ Grill", "Take out dining at Take Out: Richie's Brickhouse BBQ Grill", datetime.datetime(2025, 9, 4, 0, 0), datetime.datetime(2025, 9, 4, 0, 0), 1, None, '08671808-a664-4dbc-8147-8634500364f7', 'take out'), payload=(None, "Take Out: Richie's Brickhouse BBQ Grill", "Take out dining at Take Out: Richie's Brickhouse BBQ Grill", datetime.datetime(2025, 9, 4, 0, 0), datetime.datetime(2025, 9, 4, 0, 0), 1, None, '08671808-a664-4dbc-8147-8634500364f7', 'take out'),
sql='INSERT INTO main_plan_events(plan_uuid, event_shortname, event_description, event_date_start, event_date_end, created_by, recipe_uuid, receipt_uuid, event_type) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;') sql='INSERT INTO main_plan_events(plan_uuid, event_shortname, event_description, event_date_start, event_date_end, created_by, recipe_uuid, receipt_uuid, event_type) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) RETURNING *;')
2025-09-09 09:20:09.636365 --- ERROR --- DatabaseError(message='syntax error at or near ")"LINE 1: ...ed_rows AS (DELETE FROM roles WHERE role_uuid IN () RETURNIN... ^',
payload=[],
sql='WITH deleted_rows AS (DELETE FROM roles WHERE role_uuid IN () RETURNING *) SELECT * FROM deleted_rows;')
2025-09-09 09:26:10.538173 --- ERROR --- DatabaseError(message='syntax error at or near ";"LINE 3: ... transaction_uuid UUID DEFAULT uuid_generate_v4() NOT NULL; ^',
payload=CREATE TABLE IF NOT EXISTS test_transactions (
item_uuid UUID PRIMARY KEY REFERENCES test_items(item_uuid) ON DELETE CASCADE,
transaction_uuid UUID DEFAULT uuid_generate_v4() NOT NULL;
transaction_created_at TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL,
transaction_name VARCHAR(255) DEFAULT NULL,
transaction_type VARCHAR(64) DEFAULT '' NOT NULL,
transaction_quantity FLOAT8 DEFAULT 0.00 NOT NULL,
transaction_description TEXT DEFAULT '' NOT NULL,
transaction_cost FLOAT8 DEFAULT 0.00 NOT NULL,
transaction_created_by UUID DEFAULT NULL REFERENCES users(user_uuid) ON DELETE SET NULL,
transaction_data JSONB DEFAULT '{}' NOT NULL
);,
sql='transactions')
2025-09-09 11:52:17.057408 --- ERROR --- DatabaseError(message='invalid input syntax for type uuid: "undefined"LINE 1: WITH parameters AS (SELECT 'undefined'::uuid AS item_uuid), ^',
payload={},
sql='WITH parameters AS (SELECT %(item_uuid)s::uuid AS item_uuid), cte_item_locations_qty AS ( SELECT SUM(item_locations.item_quantity_on_hand) AS quantity_on_hand FROM test_item_locations item_locations WHERE item_locations.item_uuid = (SELECT item_uuid FROM parameters) ), cte_item_locations AS ( SELECT item_locations.item_location_uuid, item_locations.item_quantity_on_hand, locations.location_shortname, zones.zone_uuid, locations.location_uuid FROM test_item_locations item_locations LEFT JOIN test_locations locations ON locations.location_uuid = item_locations.location_uuid LEFT JOIN test_zones zones ON zones.zone_uuid = locations.zone_uuid WHERE item_locations.item_uuid = (SELECT item_uuid FROM parameters) )SELECT items.item_uuid, items.item_name, item_info.item_cost, (SELECT COALESCE(ilsq.quantity_on_hand, 0.00) FROM cte_item_locations_qty ilsq) AS item_quantity_on_hand, COALESCE(units.unit_fullname, 'ERROR') AS unit_fullname, (SELECT COALESCE(array_agg(row_to_json(ils)), '{}') FROM cte_item_locations ils) AS item_locations, (SELECT COALESCE(row_to_json(zones.*), '{}') FROM test_zones zones WHERE zones.zone_uuid = log_info.item_primary_zone) AS primary_zone, (SELECT COALESCE(row_to_json(locations.*), '{}') FROM test_locations locations WHERE locations.location_uuid = log_info.item_primary_location) AS primary_locationFROM test_items itemsLEFT JOIN test_item_info item_info ON item_info.item_uuid = items.item_uuidLEFT JOIN units ON item_info.item_uom = units.unit_uuidLEFT JOIN test_logistics_info log_info ON log_info.item_uuid = items.item_uuidWHERE items.item_uuid = (SELECT item_uuid FROM parameters);')
2025-09-09 11:53:39.671036 --- ERROR --- DatabaseError(message='invalid input syntax for type uuid: "undefined"LINE 1: WITH parameters AS (SELECT 'undefined'::uuid AS item_uuid), ^',
payload={},
sql='WITH parameters AS (SELECT %(item_uuid)s::uuid AS item_uuid), cte_item_locations_qty AS ( SELECT SUM(item_locations.item_quantity_on_hand) AS quantity_on_hand FROM test_item_locations item_locations WHERE item_locations.item_uuid = (SELECT item_uuid FROM parameters) ), cte_item_locations AS ( SELECT item_locations.item_location_uuid, item_locations.item_quantity_on_hand, locations.location_shortname, zones.zone_uuid, locations.location_uuid FROM test_item_locations item_locations LEFT JOIN test_locations locations ON locations.location_uuid = item_locations.location_uuid LEFT JOIN test_zones zones ON zones.zone_uuid = locations.zone_uuid WHERE item_locations.item_uuid = (SELECT item_uuid FROM parameters) )SELECT items.item_uuid, items.item_name, item_info.item_cost, (SELECT COALESCE(ilsq.quantity_on_hand, 0.00) FROM cte_item_locations_qty ilsq) AS item_quantity_on_hand, COALESCE(units.unit_fullname, 'ERROR') AS unit_fullname, (SELECT COALESCE(array_agg(row_to_json(ils)), '{}') FROM cte_item_locations ils) AS item_locations, (SELECT COALESCE(row_to_json(zones.*), '{}') FROM test_zones zones WHERE zones.zone_uuid = log_info.item_primary_zone) AS primary_zone, (SELECT COALESCE(row_to_json(locations.*), '{}') FROM test_locations locations WHERE locations.location_uuid = log_info.item_primary_location) AS primary_locationFROM test_items itemsLEFT JOIN test_item_info item_info ON item_info.item_uuid = items.item_uuidLEFT JOIN units ON item_info.item_uom = units.unit_uuidLEFT JOIN test_logistics_info log_info ON log_info.item_uuid = items.item_uuidWHERE items.item_uuid = (SELECT item_uuid FROM parameters);')
2025-09-09 11:54:09.097107 --- ERROR --- DatabaseError(message='invalid input syntax for type uuid: "undefined"LINE 1: WITH parameters AS (SELECT 'undefined'::uuid AS item_uuid), ^',
payload={},
sql='WITH parameters AS (SELECT %(item_uuid)s::uuid AS item_uuid), cte_item_locations_qty AS ( SELECT SUM(item_locations.item_quantity_on_hand) AS quantity_on_hand FROM test_item_locations item_locations WHERE item_locations.item_uuid = (SELECT item_uuid FROM parameters) ), cte_item_locations AS ( SELECT item_locations.item_location_uuid, item_locations.item_quantity_on_hand, locations.location_shortname, zones.zone_uuid, locations.location_uuid FROM test_item_locations item_locations LEFT JOIN test_locations locations ON locations.location_uuid = item_locations.location_uuid LEFT JOIN test_zones zones ON zones.zone_uuid = locations.zone_uuid WHERE item_locations.item_uuid = (SELECT item_uuid FROM parameters) )SELECT items.item_uuid, items.item_name, item_info.item_cost, (SELECT COALESCE(ilsq.quantity_on_hand, 0.00) FROM cte_item_locations_qty ilsq) AS item_quantity_on_hand, COALESCE(units.unit_fullname, 'ERROR') AS unit_fullname, (SELECT COALESCE(array_agg(row_to_json(ils)), '{}') FROM cte_item_locations ils) AS item_locations, (SELECT COALESCE(row_to_json(zones.*), '{}') FROM test_zones zones WHERE zones.zone_uuid = log_info.item_primary_zone) AS primary_zone, (SELECT COALESCE(row_to_json(locations.*), '{}') FROM test_locations locations WHERE locations.location_uuid = log_info.item_primary_location) AS primary_locationFROM test_items itemsLEFT JOIN test_item_info item_info ON item_info.item_uuid = items.item_uuidLEFT JOIN units ON item_info.item_uom = units.unit_uuidLEFT JOIN test_logistics_info log_info ON log_info.item_uuid = items.item_uuidWHERE items.item_uuid = (SELECT item_uuid FROM parameters);')
2025-09-09 12:14:04.757096 --- ERROR --- DatabaseError(message='invalid input syntax for type uuid: "undefined"LINE 1: WITH parameters AS (SELECT 'undefined'::uuid AS item_uuid), ^',
payload={},
sql='WITH parameters AS (SELECT %(item_uuid)s::uuid AS item_uuid), cte_item_locations_qty AS ( SELECT SUM(item_locations.item_quantity_on_hand) AS quantity_on_hand FROM test_item_locations item_locations WHERE item_locations.item_uuid = (SELECT item_uuid FROM parameters) ), cte_item_locations AS ( SELECT item_locations.item_location_uuid, item_locations.item_quantity_on_hand, locations.location_shortname, zones.zone_uuid, locations.location_uuid FROM test_item_locations item_locations LEFT JOIN test_locations locations ON locations.location_uuid = item_locations.location_uuid LEFT JOIN test_zones zones ON zones.zone_uuid = locations.zone_uuid WHERE item_locations.item_uuid = (SELECT item_uuid FROM parameters) )SELECT items.item_uuid, items.item_name, item_info.item_cost, (SELECT COALESCE(ilsq.quantity_on_hand, 0.00) FROM cte_item_locations_qty ilsq) AS item_quantity_on_hand, COALESCE(units.unit_fullname, 'ERROR') AS unit_fullname, (SELECT COALESCE(array_agg(row_to_json(ils)), '{}') FROM cte_item_locations ils) AS item_locations, (SELECT COALESCE(row_to_json(zones.*), '{}') FROM test_zones zones WHERE zones.zone_uuid = log_info.item_primary_zone) AS primary_zone, (SELECT COALESCE(row_to_json(locations.*), '{}') FROM test_locations locations WHERE locations.location_uuid = log_info.item_primary_location) AS primary_locationFROM test_items itemsLEFT JOIN test_item_info item_info ON item_info.item_uuid = items.item_uuidLEFT JOIN units ON item_info.item_uom = units.unit_uuidLEFT JOIN test_logistics_info log_info ON log_info.item_uuid = items.item_uuidWHERE items.item_uuid = (SELECT item_uuid FROM parameters);')
2025-09-09 12:40:03.412252 --- ERROR --- DatabaseError(message='invalid input syntax for type uuid: "undefined"LINE 1: WITH parameters AS (SELECT 'undefined'::uuid AS item_uuid), ^',
payload={},
sql='WITH parameters AS (SELECT %(item_uuid)s::uuid AS item_uuid), cte_item_locations_qty AS ( SELECT SUM(item_locations.item_quantity_on_hand) AS quantity_on_hand FROM test_item_locations item_locations WHERE item_locations.item_uuid = (SELECT item_uuid FROM parameters) ), cte_item_locations AS ( SELECT item_locations.item_location_uuid, item_locations.item_quantity_on_hand, locations.location_shortname, zones.zone_uuid, locations.location_uuid FROM test_item_locations item_locations LEFT JOIN test_locations locations ON locations.location_uuid = item_locations.location_uuid LEFT JOIN test_zones zones ON zones.zone_uuid = locations.zone_uuid WHERE item_locations.item_uuid = (SELECT item_uuid FROM parameters) )SELECT items.item_uuid, items.item_name, item_info.item_cost, (SELECT COALESCE(ilsq.quantity_on_hand, 0.00) FROM cte_item_locations_qty ilsq) AS item_quantity_on_hand, COALESCE(units.unit_fullname, 'ERROR') AS unit_fullname, (SELECT COALESCE(array_agg(row_to_json(ils)), '{}') FROM cte_item_locations ils) AS item_locations, (SELECT COALESCE(row_to_json(zones.*), '{}') FROM test_zones zones WHERE zones.zone_uuid = log_info.item_primary_zone) AS primary_zone, (SELECT COALESCE(row_to_json(locations.*), '{}') FROM test_locations locations WHERE locations.location_uuid = log_info.item_primary_location) AS primary_locationFROM test_items itemsLEFT JOIN test_item_info item_info ON item_info.item_uuid = items.item_uuidLEFT JOIN units ON item_info.item_uom = units.unit_uuidLEFT JOIN test_logistics_info log_info ON log_info.item_uuid = items.item_uuidWHERE items.item_uuid = (SELECT item_uuid FROM parameters);')
2025-09-09 12:50:09.059608 --- ERROR --- DatabaseError(message='invalid input syntax for type uuid: "undefined"LINE 1: WITH parameters AS (SELECT 'undefined'::uuid AS item_uuid), ^',
payload={},
sql='WITH parameters AS (SELECT %(item_uuid)s::uuid AS item_uuid), cte_item_locations_qty AS ( SELECT SUM(item_locations.item_quantity_on_hand) AS quantity_on_hand FROM test_item_locations item_locations WHERE item_locations.item_uuid = (SELECT item_uuid FROM parameters) ), cte_item_locations AS ( SELECT item_locations.item_location_uuid, item_locations.item_quantity_on_hand, locations.location_shortname, zones.zone_uuid, locations.location_uuid FROM test_item_locations item_locations LEFT JOIN test_locations locations ON locations.location_uuid = item_locations.location_uuid LEFT JOIN test_zones zones ON zones.zone_uuid = locations.zone_uuid WHERE item_locations.item_uuid = (SELECT item_uuid FROM parameters) )SELECT items.item_uuid, items.item_name, item_info.item_cost, (SELECT COALESCE(ilsq.quantity_on_hand, 0.00) FROM cte_item_locations_qty ilsq) AS item_quantity_on_hand, COALESCE(units.unit_fullname, 'ERROR') AS unit_fullname, (SELECT COALESCE(array_agg(row_to_json(ils)), '{}') FROM cte_item_locations ils) AS item_locations, (SELECT COALESCE(row_to_json(zones.*), '{}') FROM test_zones zones WHERE zones.zone_uuid = log_info.item_primary_zone) AS primary_zone, (SELECT COALESCE(row_to_json(locations.*), '{}') FROM test_locations locations WHERE locations.location_uuid = log_info.item_primary_location) AS primary_locationFROM test_items itemsLEFT JOIN test_item_info item_info ON item_info.item_uuid = items.item_uuidLEFT JOIN units ON item_info.item_uom = units.unit_uuidLEFT JOIN test_logistics_info log_info ON log_info.item_uuid = items.item_uuidWHERE items.item_uuid = (SELECT item_uuid FROM parameters);')
2025-09-09 13:01:03.082952 --- ERROR --- DatabaseError(message='invalid input syntax for type uuid: "undefined"LINE 1: WITH parameters AS (SELECT 'undefined'::uuid AS item_uuid), ^',
payload={},
sql='WITH parameters AS (SELECT %(item_uuid)s::uuid AS item_uuid), cte_item_locations_qty AS ( SELECT SUM(item_locations.item_quantity_on_hand) AS quantity_on_hand FROM test_item_locations item_locations WHERE item_locations.item_uuid = (SELECT item_uuid FROM parameters) ), cte_item_locations AS ( SELECT item_locations.item_location_uuid, item_locations.item_quantity_on_hand, locations.location_shortname, zones.zone_uuid, locations.location_uuid FROM test_item_locations item_locations LEFT JOIN test_locations locations ON locations.location_uuid = item_locations.location_uuid LEFT JOIN test_zones zones ON zones.zone_uuid = locations.zone_uuid WHERE item_locations.item_uuid = (SELECT item_uuid FROM parameters) )SELECT items.item_uuid, items.item_name, item_info.item_cost, (SELECT COALESCE(ilsq.quantity_on_hand, 0.00) FROM cte_item_locations_qty ilsq) AS item_quantity_on_hand, COALESCE(units.unit_fullname, 'ERROR') AS unit_fullname, (SELECT COALESCE(array_agg(row_to_json(ils)), '{}') FROM cte_item_locations ils) AS item_locations, (SELECT COALESCE(row_to_json(zones.*), '{}') FROM test_zones zones WHERE zones.zone_uuid = log_info.item_primary_zone) AS primary_zone, (SELECT COALESCE(row_to_json(locations.*), '{}') FROM test_locations locations WHERE locations.location_uuid = log_info.item_primary_location) AS primary_locationFROM test_items itemsLEFT JOIN test_item_info item_info ON item_info.item_uuid = items.item_uuidLEFT JOIN units ON item_info.item_uom = units.unit_uuidLEFT JOIN test_logistics_info log_info ON log_info.item_uuid = items.item_uuidWHERE items.item_uuid = (SELECT item_uuid FROM parameters);')
2025-09-09 13:04:38.126736 --- ERROR --- DatabaseError(message='column "aquisition_date" of relation "test_cost_layers" does not existLINE 2: (aquisition_date, quantity, cost, currency_type, expires, ve... ^',
payload={'aquisition_date': datetime.datetime(2025, 9, 9, 13, 4, 38, 80004), 'quantity': 1.0, 'cost': 0.5, 'currency_type': 'USD', 'vendor': 0, 'expires': None},
sql='INSERT INTO test_cost_layers(aquisition_date, quantity, cost, currency_type, expires, vendor) VALUES (%(aquisition_date)s, %(quantity)s, %(cost)s, %(currency_type)s, %(expires)s, %(vendor)s) RETURNING *;')
2025-09-09 13:06:39.354770 --- ERROR --- DatabaseError(message=''aquisition_date'',
payload={'item_location_uuid': '278d51f6-efb1-48c5-9c59-d7dd12c13df3', 'layer_aquisition_date': datetime.datetime(2025, 9, 9, 13, 6, 39, 337717), 'layer_quantity': 1.0, 'layer_cost': 0.5, 'layer_currency_type': 'USD', 'layer_vendor': 0, 'layer_expires': None},
sql='INSERT INTO test_cost_layers(aquisition_date, quantity, cost, currency_type, expires, vendor) VALUES (%(aquisition_date)s, %(quantity)s, %(cost)s, %(currency_type)s, %(expires)s, %(vendor)s) RETURNING *;')
2025-09-09 13:07:44.686437 --- ERROR --- DatabaseError(message=''aquisition_date'',
payload={'item_location_uuid': '278d51f6-efb1-48c5-9c59-d7dd12c13df3', 'layer_aquisition_date': datetime.datetime(2025, 9, 9, 13, 7, 44, 643575), 'layer_quantity': 1.0, 'layer_cost': 0.5, 'layer_currency_type': 'USD', 'layer_vendor': 0, 'layer_expires': None},
sql='INSERT INTO test_cost_layers(item_location_uuid, layer_aquisition_date, layer_quantity, layer_cost, layer_currency_type, layer_expires, layer_vendor) VALUES (%(item_location_uuid)s::uuid, %(aquisition_date)s, %(quantity)s, %(cost)s, %(currency_type)s, %(expires)s, %(vendor)s) RETURNING *;')
2025-09-09 13:15:34.859428 --- ERROR --- DatabaseError(message='invalid input syntax for type uuid: "undefined"LINE 1: WITH parameters AS (SELECT 'undefined'::uuid AS item_uuid), ^',
payload={},
sql='WITH parameters AS (SELECT %(item_uuid)s::uuid AS item_uuid), cte_item_locations_qty AS ( SELECT SUM(item_locations.item_quantity_on_hand) AS quantity_on_hand FROM test_item_locations item_locations WHERE item_locations.item_uuid = (SELECT item_uuid FROM parameters) ), cte_item_locations AS ( SELECT item_locations.item_location_uuid, item_locations.item_quantity_on_hand, locations.location_shortname, zones.zone_uuid, locations.location_uuid FROM test_item_locations item_locations LEFT JOIN test_locations locations ON locations.location_uuid = item_locations.location_uuid LEFT JOIN test_zones zones ON zones.zone_uuid = locations.zone_uuid WHERE item_locations.item_uuid = (SELECT item_uuid FROM parameters) )SELECT items.item_uuid, items.item_name, item_info.item_cost, (SELECT COALESCE(ilsq.quantity_on_hand, 0.00) FROM cte_item_locations_qty ilsq) AS item_quantity_on_hand, COALESCE(units.unit_fullname, 'ERROR') AS unit_fullname, (SELECT COALESCE(array_agg(row_to_json(ils)), '{}') FROM cte_item_locations ils) AS item_locations, (SELECT COALESCE(row_to_json(zones.*), '{}') FROM test_zones zones WHERE zones.zone_uuid = log_info.item_primary_zone) AS primary_zone, (SELECT COALESCE(row_to_json(locations.*), '{}') FROM test_locations locations WHERE locations.location_uuid = log_info.item_primary_location) AS primary_locationFROM test_items itemsLEFT JOIN test_item_info item_info ON item_info.item_uuid = items.item_uuidLEFT JOIN units ON item_info.item_uom = units.unit_uuidLEFT JOIN test_logistics_info log_info ON log_info.item_uuid = items.item_uuidWHERE items.item_uuid = (SELECT item_uuid FROM parameters);')
2025-09-09 13:18:03.184985 --- ERROR --- DatabaseError(message='invalid input syntax for type uuid: "undefined"LINE 1: WITH parameters AS (SELECT 'undefined'::uuid AS item_uuid), ^',
payload={},
sql='WITH parameters AS (SELECT %(item_uuid)s::uuid AS item_uuid), cte_item_locations_qty AS ( SELECT SUM(item_locations.item_quantity_on_hand) AS quantity_on_hand FROM test_item_locations item_locations WHERE item_locations.item_uuid = (SELECT item_uuid FROM parameters) ), cte_item_locations AS ( SELECT item_locations.item_location_uuid, item_locations.item_quantity_on_hand, locations.location_shortname, zones.zone_uuid, locations.location_uuid FROM test_item_locations item_locations LEFT JOIN test_locations locations ON locations.location_uuid = item_locations.location_uuid LEFT JOIN test_zones zones ON zones.zone_uuid = locations.zone_uuid WHERE item_locations.item_uuid = (SELECT item_uuid FROM parameters) )SELECT items.item_uuid, items.item_name, item_info.item_cost, (SELECT COALESCE(ilsq.quantity_on_hand, 0.00) FROM cte_item_locations_qty ilsq) AS item_quantity_on_hand, COALESCE(units.unit_fullname, 'ERROR') AS unit_fullname, (SELECT COALESCE(array_agg(row_to_json(ils)), '{}') FROM cte_item_locations ils) AS item_locations, (SELECT COALESCE(row_to_json(zones.*), '{}') FROM test_zones zones WHERE zones.zone_uuid = log_info.item_primary_zone) AS primary_zone, (SELECT COALESCE(row_to_json(locations.*), '{}') FROM test_locations locations WHERE locations.location_uuid = log_info.item_primary_location) AS primary_locationFROM test_items itemsLEFT JOIN test_item_info item_info ON item_info.item_uuid = items.item_uuidLEFT JOIN units ON item_info.item_uom = units.unit_uuidLEFT JOIN test_logistics_info log_info ON log_info.item_uuid = items.item_uuidWHERE items.item_uuid = (SELECT item_uuid FROM parameters);')
2025-09-09 14:50:13.000596 --- ERROR --- DatabaseError(message='syntax error at or near ")"LINE 1: ...ed_rows AS (DELETE FROM roles WHERE role_uuid IN () RETURNIN... ^',
payload=[],
sql='WITH deleted_rows AS (DELETE FROM roles WHERE role_uuid IN () RETURNING *) SELECT * FROM deleted_rows;')
2025-09-09 14:52:54.973873 --- ERROR --- DatabaseError(message='syntax error at or near ";"LINE 2: layer_id SERIAL UNIQUE; ^',
payload=CREATE TABLE IF NOT EXISTS test_cost_layers (
layer_id SERIAL UNIQUE;
item_location_uuid UUID REFERENCES test_item_locations(item_location_uuid) ON DELETE SET NULL,
layer_aquisition_date TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL,
layer_quantity FLOAT8 DEFAULT 0.00 NOT NULL,
layer_cost FLOAT8 DEFAULT 0.00 NOT NULL,
layer_currency_type VARCHAR(16) DEFAULT 'USD' NOT NULL,
layer_expires TIMESTAMP DEFAULT NULL,
layer_vendor UUID DEFAULT NULL
);,
sql='cost_layers')
2025-09-09 15:45:09.078214 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "test_transactions_pkey"DETAIL: Key (item_uuid)=(97d2db16-7896-42cf-a94d-cb7f14971112) already exists.',
payload={'item_uuid': '97d2db16-7896-42cf-a94d-cb7f14971112', 'transaction_created_by': UUID('17488a77-e26f-4f1d-bb7d-63beb1e83f6c'), 'transaction_name': 'test23FOODPLU', 'transaction_type': 'Adjust In', 'transaction_quantity': 1, 'transaction_description': '', 'transaction_cost': 0.1, 'transaction_data': '{}', 'transaction_created_at': datetime.datetime(2025, 9, 9, 15, 45, 9, 38563), 'data': {'location': UUID('00db5522-b8e9-4e20-98b0-cc111fa84785')}},
sql='INSERT INTO test_transactions( item_uuid, transaction_created_by, transaction_name, transaction_type, transaction_created_at, transaction_quantity, transaction_description, transaction_cost, transaction_data) VALUES ( %(item_uuid)s, %(transaction_created_by)s, %(transaction_name)s, %(transaction_type)s, %(transaction_created_at)s, %(transaction_quantity)s, %(transaction_description)s, %(transaction_cost)s, %(transaction_data)s)RETURNING *;')
2025-09-09 15:51:40.473718 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "sites_site_name_key"DETAIL: Key (site_name)=(test) already exists.',
payload={'site_name': 'test', 'site_description': 'Test Site', 'site_created_by': '17488a77-e26f-4f1d-bb7d-63beb1e83f6c', 'site_default_zone_uuid': None, 'site_default_auto_issue_location_uuid': None, 'site_default_primary_location_uuid': None, 'site_flags': '{}', 'site_created_on': datetime.datetime(2025, 9, 9, 15, 51, 40, 459928)},
sql='INSERT INTO sites(site_name, site_description, site_created_by, site_default_zone_uuid, site_default_auto_issue_location_uuid,site_default_primary_location_uuid, site_created_on, site_flags) VALUES (%(site_name)s, %(site_description)s, %(site_created_by)s, %(site_default_zone_uuid)s, %(site_default_auto_issue_location_uuid)s, %(site_default_primary_location_uuid)s, %(site_created_on)s, %(site_flags)s) RETURNING *;')
2025-09-09 17:39:11.341281 --- ERROR --- DatabaseError(message='dict is not a sequence',
payload={'item_uuid': '5b190969-6b23-4cca-84d4-748f607254b3'},
sql='WITH passed_id AS (SELECT id AS passed_id, item_uuid as passed_uuid FROM test_items WHERE id=%s), logistics_id AS (SELECT logistics_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), info_id AS (SELECT item_info_id FROM test_items WHERE id=(SELECT passed_id FROM passed_id)), cte_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 = ANY(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_shopping_lists AS ( SELECT test_shopping_lists.*, test_shopping_list_items.item_type, test_shopping_list_items.qty FROM test_shopping_lists JOIN test_shopping_list_items ON test_shopping_lists.list_uuid = test_shopping_list_items.list_uuid WHERE test_shopping_list_items.item_uuid = (SELECT passed_uuid FROM passed_id) ), cte_recipes AS ( SELECT rp_items.* FROM test_recipe_items rp_items WHERE rp_items.item_uuid = (SELECT passed_uuid FROM passed_id) ), cte_itemlinks AS ( SELECT * FROM test_itemlinks WHERE link=(SELECT passed_id FROM passed_id) ), cte_item_locations AS ( SELECT * FROM test_item_locations LEFT JOIN test_locations ON test_locations.id = test_item_locations.location_id WHERE part_id = (SELECT passed_id FROM passed_id) ), cte_logistics_info AS ( SELECT li.*, row_to_json(pl) AS primary_location, row_to_json(ail) AS auto_issue_location, row_to_json(pz) AS primary_zone, row_to_json(aiz) AS auto_issue_zone FROM test_logistics_info AS li LEFT JOIN test_locations AS pl ON li.primary_location = pl.id LEFT JOIN test_locations AS ail ON li.auto_issue_location = ail.id LEFT JOIN test_zones AS pz ON li.primary_zone = pz.id LEFT JOIN test_zones AS aiz ON li.auto_issue_zone = aiz.id WHERE li.id=(SELECT logistics_info_id FROM logistics_id) ), cte_barcodes AS ( SELECT barcode.barcode As barcode, barcode.in_exchange AS in_exchange, barcode.out_exchange AS out_exchange, barcode.descriptor AS descriptor FROM test_barcodes AS barcode LEFT JOIN test_items AS item ON item.id = (SELECT passed_id FROM passed_id) WHERE barcode.item_uuid = item.item_uuid )SELECT (SELECT passed_id FROM passed_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(sl)), '{}') FROM cte_shopping_lists sl) AS item_shopping_lists, (SELECT COALESCE(array_agg(row_to_json(rp)), '{}') FROM cte_recipes rp) as item_recipes, (SELECT COALESCE(array_agg(row_to_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, (SELECT COALESCE(array_agg(row_to_json(bar)), '{}') FROM cte_barcodes bar) AS item_barcodesFROM test_items LEFT JOIN test_item_info ON test_items.item_info_id = test_item_info.id LEFT JOIN test_food_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_shopping_lists ON test_items.id = cte_shopping_lists.idWHERE test_items.id=(SELECT passed_id FROM passed_id)GROUP BY test_items.id, test_item_info.id, test_food_info.id, test_brands.id;')
2025-09-09 17:45:46.050844 --- ERROR --- DatabaseError(message='syntax error at or near "SELECT"LINE 2: SELECT * ^',
payload={'item_uuid': '5b190969-6b23-4cca-84d4-748f607254b3'},
sql='WITH passed_uuid AS (SELECT %(item_uuid)s AS passed_uuid),SELECT *FROM test_itemsWHERE test_items.item_uuid=(SELECT passed_uuid FROM passed_uuid)')
2025-09-09 17:46:33.040634 --- ERROR --- DatabaseError(message='operator does not exist: uuid = textLINE 2: SELECT * FROM test_items item WHERE item.item_uuid=(SELECT p... ^HINT: No operator matches the given name and argument types. You might need to add explicit type casts.',
payload={'item_uuid': '5b190969-6b23-4cca-84d4-748f607254b3'},
sql='WITH passed_uuid AS (SELECT %(item_uuid)s AS passed_uuid)SELECT * FROM test_items item WHERE item.item_uuid=(SELECT passed_uuid FROM passed_uuid)')
2025-09-09 17:49:07.945816 --- ERROR --- DatabaseError(message='syntax error at or near "{"LINE 3: COLESCE(item_info, {}) AS item_info ^',
payload={'item_uuid': '5b190969-6b23-4cca-84d4-748f607254b3'},
sql='WITH passed_uuid AS (SELECT %(item_uuid)s::uuid AS passed_uuid)SELECT item.*,COLESCE(item_info, {}) AS item_info FROM test_items itemLEFT JOIN test_item_info item_info ON item_info.item_uuid = (SELECT passed_uuid FROM passed_uuid)WHERE item.item_uuid=(SELECT passed_uuid FROM passed_uuid)')
2025-09-09 17:49:44.140644 --- ERROR --- DatabaseError(message='syntax error at or near "{"LINE 3: COALESCE(item_info, {}) AS item_info ^',
payload={'item_uuid': '5b190969-6b23-4cca-84d4-748f607254b3'},
sql='WITH passed_uuid AS (SELECT %(item_uuid)s::uuid AS passed_uuid)SELECT item.*,COALESCE(item_info, {}) AS item_info FROM test_items itemLEFT JOIN test_item_info item_info ON item_info.item_uuid = (SELECT passed_uuid FROM passed_uuid)WHERE item.item_uuid=(SELECT passed_uuid FROM passed_uuid)')
2025-09-09 17:49:58.486463 --- ERROR --- DatabaseError(message='malformed record literal: "{}"LINE 3: COALESCE(item_info, '{}') AS item_info ^DETAIL: Missing left parenthesis.',
payload={'item_uuid': '5b190969-6b23-4cca-84d4-748f607254b3'},
sql='WITH passed_uuid AS (SELECT %(item_uuid)s::uuid AS passed_uuid)SELECT item.*,COALESCE(item_info, '{}') AS item_info FROM test_items itemLEFT JOIN test_item_info item_info ON item_info.item_uuid = (SELECT passed_uuid FROM passed_uuid)WHERE item.item_uuid=(SELECT passed_uuid FROM passed_uuid)')
2025-09-09 17:50:13.306350 --- ERROR --- DatabaseError(message='malformed record literal: "{}"LINE 3: COALESCE(item_info.*, '{}') AS item_info ^DETAIL: Missing left parenthesis.',
payload={'item_uuid': '5b190969-6b23-4cca-84d4-748f607254b3'},
sql='WITH passed_uuid AS (SELECT %(item_uuid)s::uuid AS passed_uuid)SELECT item.*,COALESCE(item_info.*, '{}') AS item_info FROM test_items itemLEFT JOIN test_item_info item_info ON item_info.item_uuid = (SELECT passed_uuid FROM passed_uuid)WHERE item.item_uuid=(SELECT passed_uuid FROM passed_uuid)')
2025-09-09 17:50:24.946483 --- ERROR --- DatabaseError(message='syntax error at or near "{"LINE 3: COALESCE(item_info.*, {}) AS item_info ^',
payload={'item_uuid': '5b190969-6b23-4cca-84d4-748f607254b3'},
sql='WITH passed_uuid AS (SELECT %(item_uuid)s::uuid AS passed_uuid)SELECT item.*,COALESCE(item_info.*, {}) AS item_info FROM test_items itemLEFT JOIN test_item_info item_info ON item_info.item_uuid = (SELECT passed_uuid FROM passed_uuid)WHERE item.item_uuid=(SELECT passed_uuid FROM passed_uuid)')
2025-09-09 17:50:39.169291 --- ERROR --- DatabaseError(message='column "{}" does not existLINE 3: COALESCE(item_info.*, "{}") AS item_info ^',
payload={'item_uuid': '5b190969-6b23-4cca-84d4-748f607254b3'},
sql='WITH passed_uuid AS (SELECT %(item_uuid)s::uuid AS passed_uuid)SELECT item.*,COALESCE(item_info.*, "{}") AS item_info FROM test_items itemLEFT JOIN test_item_info item_info ON item_info.item_uuid = (SELECT passed_uuid FROM passed_uuid)WHERE item.item_uuid=(SELECT passed_uuid FROM passed_uuid)')
2025-09-09 18:24:36.911338 --- ERROR --- DatabaseError(message='syntax error at or near "FROM"LINE 9: FROM test_item_info item_info ^',
payload={'item_uuid': '94631ea3-14e6-4106-8af3-97c11d104ec9'},
sql='WITH passed_uuid AS (SELECT %(item_uuid)s::uuid AS passed_uuid), cte_conversions AS ( SELECT * FROM test_conversions WHERE test_conversions.item_uuid = (SELECT passed_uuid FROM passed_uuid) ), cte_item_info AS (SELECT item_info.*, COALESCE((SELECT json_agg(convs) FROM cte_conversions convs), '[]'::json) AS conversions, FROM test_item_info item_info WHERE item_info.item_uuid = (SELECT passed_uuid FROM passed_uuid) )SELECT item.*,(SELECT COALESCE(row_to_json(ii), '{}') FROM cte_item_info ii) AS item_info,COALESCE(row_to_json(food_info.*), '{}') AS food_info,COALESCE(row_to_json(log_info.*), '{}') AS logistics_infoFROM test_items itemLEFT JOIN test_food_info food_info ON food_info.item_uuid = (SELECT passed_uuid FROM passed_uuid)LEFT JOIN test_logistics_info log_info ON log_info.item_uuid = (SELECT passed_uuid FROM passed_uuid)WHERE item.item_uuid=(SELECT passed_uuid FROM passed_uuid)')
2025-09-09 18:33:06.506619 --- ERROR --- DatabaseError(message='invalid reference to FROM-clause entry for table "test_item_info"LINE 9: ...est_sku_prefix as p WHERE p.sku_prefix_uuid = ANY(test_item_... ^HINT: Perhaps you meant to reference the table alias "item_info".',
payload={'item_uuid': '94631ea3-14e6-4106-8af3-97c11d104ec9'},
sql='WITH passed_uuid AS (SELECT %(item_uuid)s::uuid AS passed_uuid), cte_conversions AS ( SELECT * FROM test_conversions conversion WHERE conversion.item_uuid = (SELECT passed_uuid FROM passed_uuid) ), cte_item_info AS (SELECT item_info.*, 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.sku_prefix_uuid = ANY(test_item_info.prefixes)), '[]'::json) as prefixes FROM test_item_info item_info WHERE item_info.item_uuid = (SELECT passed_uuid FROM passed_uuid) )SELECT item.*,(SELECT COALESCE(row_to_json(ii), '{}') FROM cte_item_info ii) AS item_info,COALESCE(row_to_json(food_info.*), '{}') AS food_info,COALESCE(row_to_json(log_info.*), '{}') AS logistics_infoFROM test_items itemLEFT JOIN test_food_info food_info ON food_info.item_uuid = (SELECT passed_uuid FROM passed_uuid)LEFT JOIN test_logistics_info log_info ON log_info.item_uuid = (SELECT passed_uuid FROM passed_uuid)WHERE item.item_uuid=(SELECT passed_uuid FROM passed_uuid)')
2025-09-09 18:39:42.923673 --- ERROR --- DatabaseError(message='invalid reference to FROM-clause entry for table "test_item_info"LINE 9: ...M test_sku_prefix p WHERE p.sku_prefix_uuid = ANY(test_item_... ^HINT: Perhaps you meant to reference the table alias "item_info".',
payload={'item_uuid': 'b25eaeee-9d83-473e-a493-4f0a2ca15687'},
sql='WITH passed_uuid AS (SELECT %(item_uuid)s::uuid AS passed_uuid), cte_conversions AS ( SELECT * FROM test_conversions conversion WHERE conversion.item_uuid = (SELECT passed_uuid FROM passed_uuid) ), cte_item_info AS (SELECT item_info.*, COALESCE((SELECT json_agg(convs) FROM cte_conversions convs), '[]'::json) AS conversions, COALESCE((SELECT json_agg(p.*) FROM test_sku_prefix p WHERE p.sku_prefix_uuid = ANY(test_item_info.prefixes)), '[]'::json) as prefixes FROM test_item_info item_info WHERE item_info.item_uuid = (SELECT passed_uuid FROM passed_uuid) )SELECT item.*,(SELECT COALESCE(row_to_json(ii), '{}') FROM cte_item_info ii) AS item_info,COALESCE(row_to_json(food_info.*), '{}') AS food_info,COALESCE(row_to_json(log_info.*), '{}') AS logistics_infoFROM test_items itemLEFT JOIN test_food_info food_info ON food_info.item_uuid = (SELECT passed_uuid FROM passed_uuid)LEFT JOIN test_logistics_info log_info ON log_info.item_uuid = (SELECT passed_uuid FROM passed_uuid)WHERE item.item_uuid=(SELECT passed_uuid FROM passed_uuid)')
2025-09-09 18:41:20.537737 --- ERROR --- DatabaseError(message='column item_info.prefixes does not existLINE 9: ...M test_sku_prefix p WHERE p.sku_prefix_uuid = ANY(item_info.... ^',
payload={'item_uuid': 'b25eaeee-9d83-473e-a493-4f0a2ca15687'},
sql='WITH passed_uuid AS (SELECT %(item_uuid)s::uuid AS passed_uuid), cte_conversions AS ( SELECT * FROM test_conversions conversion WHERE conversion.item_uuid = (SELECT passed_uuid FROM passed_uuid) ), cte_item_info AS (SELECT item_info.*, COALESCE((SELECT json_agg(convs) FROM cte_conversions convs), '[]'::json) AS conversions, COALESCE((SELECT json_agg(p.*) FROM test_sku_prefix p WHERE p.sku_prefix_uuid = ANY(item_info.prefixes)), '[]'::json) as prefixes FROM test_item_info item_info WHERE item_info.item_uuid = (SELECT passed_uuid FROM passed_uuid) )SELECT item.*,(SELECT COALESCE(row_to_json(ii), '{}') FROM cte_item_info ii) AS item_info,COALESCE(row_to_json(food_info.*), '{}') AS food_info,COALESCE(row_to_json(log_info.*), '{}') AS logistics_infoFROM test_items itemLEFT JOIN test_food_info food_info ON food_info.item_uuid = (SELECT passed_uuid FROM passed_uuid)LEFT JOIN test_logistics_info log_info ON log_info.item_uuid = (SELECT passed_uuid FROM passed_uuid)WHERE item.item_uuid=(SELECT passed_uuid FROM passed_uuid)')

View File

@ -1190,3 +1190,26 @@ DETAIL: Failing row contains (6527c4a4-d1b0-4c62-a1ae-9dcf5d266bca, jadowyne, t
layer_expires TIMESTAMP DEFAULT NULL, layer_expires TIMESTAMP DEFAULT NULL,
layer_vendor UUID DEFAULT NULL REFERENCES test_vendors(vendor_uuid) ON DELETE SET NULL layer_vendor UUID DEFAULT NULL REFERENCES test_vendors(vendor_uuid) ON DELETE SET NULL
);, sql='cost_layers') );, sql='cost_layers')
2025-09-09 09:26:10.545234 --- ERROR --- DatabaseError(message='syntax error at or near ";"LINE 3: ... transaction_uuid UUID DEFAULT uuid_generate_v4() NOT NULL; ^', payload=CREATE TABLE IF NOT EXISTS test_transactions (
item_uuid UUID PRIMARY KEY REFERENCES test_items(item_uuid) ON DELETE CASCADE,
transaction_uuid UUID DEFAULT uuid_generate_v4() NOT NULL;
transaction_created_at TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL,
transaction_name VARCHAR(255) DEFAULT NULL,
transaction_type VARCHAR(64) DEFAULT '' NOT NULL,
transaction_quantity FLOAT8 DEFAULT 0.00 NOT NULL,
transaction_description TEXT DEFAULT '' NOT NULL,
transaction_cost FLOAT8 DEFAULT 0.00 NOT NULL,
transaction_created_by UUID DEFAULT NULL REFERENCES users(user_uuid) ON DELETE SET NULL,
transaction_data JSONB DEFAULT '{}' NOT NULL
);, sql='transactions')
2025-09-09 14:52:54.978207 --- ERROR --- DatabaseError(message='syntax error at or near ";"LINE 2: layer_id SERIAL UNIQUE; ^', payload=CREATE TABLE IF NOT EXISTS test_cost_layers (
layer_id SERIAL UNIQUE;
item_location_uuid UUID REFERENCES test_item_locations(item_location_uuid) ON DELETE SET NULL,
layer_aquisition_date TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL,
layer_quantity FLOAT8 DEFAULT 0.00 NOT NULL,
layer_cost FLOAT8 DEFAULT 0.00 NOT NULL,
layer_currency_type VARCHAR(16) DEFAULT 'USD' NOT NULL,
layer_expires TIMESTAMP DEFAULT NULL,
layer_vendor UUID DEFAULT NULL
);, sql='cost_layers')
2025-09-09 15:51:40.480935 --- ERROR --- DatabaseError(message='duplicate key value violates unique constraint "sites_site_name_key"DETAIL: Key (site_name)=(test) already exists.', payload={'site_name': 'test', 'site_description': 'Test Site', 'site_created_by': '17488a77-e26f-4f1d-bb7d-63beb1e83f6c', 'site_default_zone_uuid': None, 'site_default_auto_issue_location_uuid': None, 'site_default_primary_location_uuid': None, 'site_flags': '{}', 'site_created_on': datetime.datetime(2025, 9, 9, 15, 51, 40, 459928)}, sql='INSERT INTO sites(site_name, site_description, site_created_by, site_default_zone_uuid, site_default_auto_issue_location_uuid,site_default_primary_location_uuid, site_created_on, site_flags) VALUES (%(site_name)s, %(site_description)s, %(site_created_by)s, %(site_default_zone_uuid)s, %(site_default_auto_issue_location_uuid)s, %(site_default_primary_location_uuid)s, %(site_created_on)s, %(site_flags)s) RETURNING *;')