From e2eea3ca84fa1ccac3e0781c9b2713e282c7967c Mon Sep 17 00:00:00 2001 From: Jadowyne Ulve Date: Wed, 30 Apr 2025 17:35:02 -0500 Subject: [PATCH] items_API.additemlink updated to new schema --- MyDataclasses.py | 2 +- __pycache__/receipts_API.cpython-312.pyc | Bin 28210 -> 28210 bytes .../__pycache__/postsqldb.cpython-312.pyc | Bin 92633 -> 94447 bytes .../database_items.cpython-312.pyc | Bin 25449 -> 40469 bytes .../__pycache__/items_API.cpython-312.pyc | Bin 37820 -> 36455 bytes .../items_processes.cpython-312.pyc | Bin 0 -> 6816 bytes application/items/database_items.py | 344 ++++++++++++++++++ application/items/items_API.py | 102 ++---- application/items/items_processes.py | 169 +++++++++ .../items/sql/insertCostLayersTuple.sql | 4 + .../items/sql/insertItemLinksTuple.sql | 4 + .../items/sql/insertItemLocationsTuple.sql | 4 + application/postsqldb.py | 41 ++- process.py | 4 +- .../Order_details_-_Walmart.com_04282025.pdf | Bin 0 -> 276743 bytes .../Order_details_-_Walmart.com_04282025.jpg | Bin 0 -> 9458 bytes 16 files changed, 606 insertions(+), 68 deletions(-) create mode 100644 application/items/__pycache__/items_processes.cpython-312.pyc create mode 100644 application/items/items_processes.py create mode 100644 application/items/sql/insertCostLayersTuple.sql create mode 100644 application/items/sql/insertItemLinksTuple.sql create mode 100644 application/items/sql/insertItemLocationsTuple.sql create mode 100644 static/files/receipts/Order_details_-_Walmart.com_04282025.pdf create mode 100644 static/files/receipts/previews/Order_details_-_Walmart.com_04282025.jpg diff --git a/MyDataclasses.py b/MyDataclasses.py index d196664..03c6fe9 100644 --- a/MyDataclasses.py +++ b/MyDataclasses.py @@ -96,7 +96,7 @@ class ItemsPayload: self.search_string ) - + # done @dataclass class TransactionPayload: timestamp: datetime.datetime diff --git a/__pycache__/receipts_API.cpython-312.pyc b/__pycache__/receipts_API.cpython-312.pyc index 9202ebe455713ba90e857565da1b052b85eabb44..eff152328572c360162ab701e1012f3930ca81f6 100644 GIT binary patch delta 22 ccmdmVhjG&#M()$Ryj%=Guxq=(MsD>y09pP9>i_@% delta 22 ccmdmVhjG&#M()$Ryj%=Gu+NxfBe!}U09M8ZUjP6A diff --git a/application/__pycache__/postsqldb.cpython-312.pyc b/application/__pycache__/postsqldb.cpython-312.pyc index 38faa62eaa84b8534ad8fd75e953a948a7bb8dc1..7b040b41e607fc1619fbf9c1a34cd37049f97137 100644 GIT binary patch delta 2090 zcmb7^dr(wW7{Kp$_U>JFxyvr#F3VGx09{%e2nu6B9Um|}IT<^qdi9LBBF-gpI(|1{3Te{YJVW8|;eR3}yj# z(Htuj&~2HZr(3Nsn^t5&jB?%zGc|P|0LMxFi2aBU5eE=Oh-$<^#2{h-aTsw3aRl)Z z;$y^7#Ad`X20M}VqTCDe@G2Y4iwBWPG2jYSN4K+NrCvG_14-~U)x<&-d_r&6K{VYE z3wL3U(hvtalJ+Tj=t0}#C}pEG7cqqD9>fX6Nw!IWO*xtXOCa>IVG4<03s;Tb!DS-i z49Mm?QJ^Rb6Cqk8XMvXKAx`l)U`$|9RAhop_!7OIqs^HRFZ7_?Lw9DvDbfS-d$VoI z+APQi0sYp2oYXXfjywZhmT%B-4BHa>`hoHP0H@O%B#WGJz(Ngcz+kOpo+Kl}gu7RuWF~Ugji}`!4j`7` zmRP=5xoejAF-z*GCDq5L`okhS%KQdXN3lQB>f^2ch{*Q*EsNM#Qc8QlmX%}1gi&LH zk58H6L$qvDbSWesbFVLHY+C!U`oR;BignqKi?*VqLzL2C zfN1&K2bJ>B>PWfoHLJY-!hG6ggy%w}ZD_GwePH$R(=O%VG>f|y6R2UX+PN#H=$_V5(h-F@JS%^j*b zoqX0lY(H7+&0Xq^EA>T`dBw7ThBK$pQ()I8j6?GPMwNX#E$0sJKU5pzQ;{tju_Dzd@W9v$#Zp^a^3!|2F21=3GE5u6lpU%xw zn`Jb2l=uzCj>5~~*1on&;g0sjTatae!yg^fUfgBz@iCJ;uPuiuQJ8KJ`mm?a!8I^2 z^G)1Heec!BQ@yq7eOlg=J UP}O90A_6BE)QQ`KNoq2G1BstNVE_OC delta 1089 zcmZvbTS!z<6o%(N&Kz}S9F3fDbn@1P8uUR?o1(IUQZUkjC<-HT%nCxm!0^Q$3h|*} z^oUD}E|#TcnnRZ@;e{}|sfpQ3q|s1jSH&Kpgru{!56(mL@Uiw@|K96g>+G2cnBI(; zY=aRIW`q9A?6w_i*jj6ID)aEKnTN3w?zA%{iYQTV#R4~}HmufsFT+HZ4W-aGnj_Jm z`KFR-$OE%D5``!gbyVR%uIhuqQ0}7v2U6f8za6n6ECz`oMNOQz!MMh_&S+-jF%B?p zGFllej9ZL0#%)GBqm$9WILo-B!>yEG;P@i#24bl)9#-m%L$O8fp4S`HQ}He&qk%TN zu*c}v)!J;NgF0OJg+|f5455nq9^cW(>iZmdI9kW(mI=lKh9Li1#EIzyY=fmSXnRu< zoKaGIk&js!eH8G(iMygI39(jX0NUv8Wm>_urPLdaP%)B7p2KyWpa~^c5$}>>cez@pqHUyrF)0+_*stkfgqv52hIasa^@rA?M`};1< zw>^?}coB&SwylnEW`vS*QHzlUMW>Nte!3#37zxTsD0)g^ z7+F-ujfKc1;{-2FR8xXE)xaADsyT`SGIp<^>Qc1Z<=?fQ56kZ+YZ+))8RE_1`Vl>0 TIGHU@m0=^yvx);|`HKDlxNa!? diff --git a/application/items/__pycache__/database_items.cpython-312.pyc b/application/items/__pycache__/database_items.cpython-312.pyc index 50c6a0e55b55a9d3684bcfacb6c731ababa59b60..d25c6ccb2c611fbea9f2d30598ef0626c94a82c9 100644 GIT binary patch delta 11361 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 NJJ+XoDXa;r{{_b&Xj1?H literal 0 HcmV?d00001 diff --git a/application/items/database_items.py b/application/items/database_items.py index ac8974c..deb2aea 100644 --- a/application/items/database_items.py +++ b/application/items/database_items.py @@ -165,6 +165,23 @@ def getItemLink(site: str, payload:tuple, convert:bool=True): except Exception as error: raise postsqldb.DatabaseError(error, payload, sql) +def getLocation(site:str, payload:tuple, convert:bool=True): + selected = () + database_config = config.config() + sql = f"SELECT * FROM {site}_locations WHERE id=%s;" + try: + with psycopg2.connect(**database_config) as conn: + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + selected = postsqldb.tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + selected = rows + return selected + except Exception as error: + raise postsqldb.DatabaseError(error, payload, sql) + def paginateZonesBySku(site: str, payload: tuple, convert=True): database_config = config.config() zones, count = (), 0 @@ -403,3 +420,330 @@ def postUpdateItemLink(site: str, payload: dict): postUpdateData(conn, f"{site}_itemlinks", {'id': payload['id'], 'update': {'conv_factor': payload['update']['conv_factor']}}) postAddTransaction(conn, site, transaction.payload()) +def postUpdateCostLayer(site, payload, convert=True, conn=None): + """_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 = () + self_conn = False + + set_clause, values = postsqldb.updateStringFactory(payload['update']) + values.append(payload['id']) + sql = f"UPDATE {site}_cost_layers SET {set_clause} WHERE 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 = postsqldb.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 postsqldb.DatabaseError(error, payload, sql) + +def insertCostLayersTuple(site, payload, convert=True, conn=None): + cost_layer = () + self_conn = False + + with open(f"application/items/sql/insertCostLayersTuple.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: + cost_layer = postsqldb.tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + cost_layer = rows + + if self_conn: + conn.commit() + conn.close() + + return cost_layer + except Exception as error: + raise postsqldb.DatabaseError(error, payload, sql) + +def insertItemLocationsTuple(conn, site, payload, convert=True): + location = () + database_config = config.config() + with open(f"application/items/sql/insertItemLocationsTuple.sql", "r+") as file: + sql = file.read().replace("%%site_name%%", site) + try: + conn = psycopg2.connect(**database_config) + conn.autocommit = False + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + location = postsqldb.tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + location = rows + return location, conn + except Exception as error: + raise postsqldb.DatabaseError(error, payload, sql) + +def selectItemLocationsTuple(site_name, payload, convert=True): + """select a single tuple from ItemLocations table for site_name + + Args: + conn (_T_connector@connect): + site_name (str): + payload (tuple): [item_id, location_id] + convert (bool): defaults to False, used to determine return of tuple/dict + + Returns: + tuple: the row that was returned from the table + """ + item_locations = () + database_config = config.config() + select_item_location_sql = f"SELECT * FROM {site_name}_item_locations WHERE part_id = %s AND location_id = %s;" + try: + with psycopg2.connect(**database_config) as conn: + with conn.cursor() as cur: + cur.execute(select_item_location_sql, payload) + rows = cur.fetchone() + if rows and convert: + item_locations = postsqldb.tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + item_locations = rows + return item_locations + except Exception as error: + return error + +def selectCostLayersTuple(site_name, payload, convert=True): + """select a single or series of cost layers from the database for site_name + + Args: + conn (_T_connector@connect): + site_name (str): + payload (tuple): (item_locations_id, ) + convert (bool): defaults to False, used for determining return as tuple/dict + + Returns: + list: list of tuples/dict from the cost_layers table for site_name + """ + cost_layers = () + database_config = config.config() + select_cost_layers_sql = f"SELECT cl.* FROM {site_name}_item_locations il JOIN {site_name}_cost_layers cl ON cl.id = ANY(il.cost_layers) where il.id=%s;" + try: + with psycopg2.connect(**database_config) as conn: + with conn.cursor() as cur: + cur.execute(select_cost_layers_sql, payload) + rows = cur.fetchall() + if rows and convert: + cost_layers = rows + cost_layers = [postsqldb.tupleDictionaryFactory(cur.description, layer) for layer in rows] + elif rows and not convert: + cost_layers = rows + return cost_layers + except Exception as error: + return error + +def postDeleteCostLayer(site_name, payload, convert=True, conn=None): + """ + payload (tuple): (table_to_delete_from, tuple_id) + Raises: + DatabaseError: + + Returns: + tuple or dict: deleted tuple + """ + deleted = () + self_conn = False + sql = f"WITH deleted_rows AS (DELETE FROM {site_name}_cost_layers WHERE 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 = False + self_conn = True + + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchall() + if rows and convert: + deleted = [postsqldb.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 postsqldb.DatabaseError(error, payload, sql) + +def postUpdateItemLocation(site, payload, conn=None): + + item_location = () + self_conn = False + with open(f"sql/updateItemLocation.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 = False + self_conn = True + + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows: + item_location = rows + + if self_conn: + conn.commit() + conn.close() + + return item_location + except Exception as error: + return error + +def postAddTransaction(site, payload, convert=False, conn=None): + transaction = () + self_conn = False + + with open(f"application/items/sql/insertTransactionsTuple.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 = False + self_conn = True + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + transaction = postsqldb.tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + transaction = rows + if self_conn: + conn.commit() + conn.close() + + return transaction + except Exception as error: + raise postsqldb.DatabaseError(error, payload, sql) + + +def postInsertItemLink(site, payload, convert=True, conn=None): + """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 = () + self_conn = False + + with open(f"application/items/sql/insertItemLinksTuple.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 = False + self_conn = True + + with conn.cursor() as cur: + cur.execute(sql, payload) + rows = cur.fetchone() + if rows and convert: + link = postsqldb.tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + link = rows + + if self_conn: + conn.commit() + conn.close() + + return link, conn + except Exception as error: + raise postsqldb.DatabaseError(error, payload, sql) + +def postUpdateItemByID(site, payload, convert=True, conn=None): + """ high level update of an item specific data, none of its relationships + + 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 = () + self_conn = False + set_clause, values = postsqldb.updateStringFactory(payload['update']) + values.append(payload['id']) + sql = f"UPDATE {site}_items SET {set_clause} WHERE 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 = postsqldb.tupleDictionaryFactory(cur.description, rows) + elif rows and not convert: + updated = rows + + if self_conn: + conn.commit() + conn.close() + + return updated, conn + except Exception as error: + raise postsqldb.DatabaseError(error, payload, sql) diff --git a/application/items/items_API.py b/application/items/items_API.py index 3c329be..f53b3c0 100644 --- a/application/items/items_API.py +++ b/application/items/items_API.py @@ -5,6 +5,7 @@ from main import unfoldCostLayers from user_api import login_required import application.postsqldb as db from application.items import database_items +from application.items import items_processes items_api = Blueprint('items_api', __name__) @@ -485,78 +486,51 @@ def getLinkedItem(): return jsonify({'linked_item': linked_item, 'error': False, 'message': 'Linked Item added!!'}) return jsonify({'linked_item': linked_item, 'error': True, 'message': f'method {request.method} not allowed'}) -@items_api.route('/item/addLinkedItem', methods=["POST"]) +@items_api.route('/item/addLinkedItem', methods=["POST"]) +@login_required def addLinkedItem(): + """ POST a link between items by passing a parent_id, a child_id, conv_factor + --- + parameters: + - in: query + name: parent_id + schema: + type: integer + default: 1 + required: true + description: id to linked list item + - in: query + name: child_id + schema: + type: integer + default: 1 + required: true + description: id to item to be linked to list. + - in: query + name: conv_factor + schema: + type: integer + default: 1 + required: true + description: integer factor between child id to parent id. + responses: + 200: + description: Items linked successfully. + """ 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'}}) + items_processes.postLinkedItem(site_name, { + 'parent_id': parent_id, + 'child_id': child_id, + 'user_id': user_id, + 'conv_factor': conv_factor + }) + return jsonify({'error': False, 'message': 'Linked Item added!!'}) return jsonify({'error': True, 'message': 'These was an error with adding to the linked list!'}) diff --git a/application/items/items_processes.py b/application/items/items_processes.py new file mode 100644 index 0000000..1d3d1c8 --- /dev/null +++ b/application/items/items_processes.py @@ -0,0 +1,169 @@ +from application.items import database_items +import application.postsqldb as db +import config + +import datetime +import psycopg2 + +def postLinkedItem(site, payload): + """ + payload = {parent_id, child_id, user_id, conv_factor} + """ + parent_item = database_items.getItemAllByID(site, (payload['parent_id'],)) + child_item = database_items.getItemAllByID(site, (payload['child_id'],)) + + database_config = config.config() + conn = psycopg2.connect(**database_config) + conn.autocommit = False + + # i need to transact out ALL locations for child item. + sum_child_qoh = 0 + for location in child_item['item_locations']: + sum_child_qoh += location['quantity_on_hand'] + adjustment_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'] + } + + print(conn) + conn = postAdjustment(site, payload['user_id'], adjustment_payload, conn=conn) + print(conn) + #process.postTransaction(conn, site_name, user_id, payload) + + print(sum_child_qoh) + + primary_location = database_items.selectItemLocationsTuple(site, (parent_item['id'], parent_item['logistics_info']['primary_location']['id']), convert=True) + + print(primary_location) + + adjustment_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(payload['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'] + } + print(conn) + conn=postAdjustment(site, payload['user_id'], adjustment_payload, conn=conn) + print(conn) + itemLink = db.ItemLinkPayload( + barcode=child_item['barcode'], + link=parent_item['id'], + data=child_item, + conv_factor=payload['conv_factor'] + ) + + _, conn = database_items.postInsertItemLink(site, itemLink.payload(), conn=conn) + print(conn) + print(_['id']) + _, conn = database_items.postUpdateItemByID(site, {'id': child_item['id'], 'update': {'row_type': 'link'}}, conn=conn) + print(conn) + print(_['id']) + conn.commit() + conn.close() + +def postAdjustment(site_name, user_id, data: dict, conn=None): + """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() + + self_conn = False + + if not conn: + database_config = config.config() + conn = psycopg2.connect(**database_config) + conn.autocommit = False + self_conn = True + + cost_layer = db.CostLayerPayload( + aquisition_date=transaction_time, + quantity=float(data['quantity']), + cost=float(data['cost']), + currency_type="USD", + vendor=int(data['vendor']), + expires=data['expires'] + ) + + transaction = db.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_items.selectItemLocationsTuple(site_name, payload=(data['item_id'], data['location_id'])) + cost_layers: list = location['cost_layers'] + if data['transaction_type'] == "Adjust In": + cost_layer = database_items.insertCostLayersTuple(site_name, cost_layer.payload(), conn=conn) + cost_layers.append(cost_layer['id']) + + if data['transaction_type'] == "Adjust Out": + if float(location['quantity_on_hand']) < float(data['quantity']): + pass + else: + cost_layers = database_items.selectCostLayersTuple(site_name, (location['id'], )) + + 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_items.postUpdateCostLayer(site_name, {'id': layer['id'], 'update': {'quantity': layer['quantity']}}, conn=conn) + qty = 0.0 + + if layer['quantity'] == 0.0: + database_items.postDeleteCostLayer(site_name, (layer['id'], ), conn=conn) + + 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_items.postUpdateItemLocation(site_name, updated_item_location_payload) + + site_location = database_items.getLocation(site_name, (location['location_id'], )) + + transaction.data = {'location': site_location['uuid']} + + database_items.postAddTransaction(site_name, transaction.payload(), conn=conn) + + if self_conn: + conn.commit() + conn.close() + return False + + return conn \ No newline at end of file diff --git a/application/items/sql/insertCostLayersTuple.sql b/application/items/sql/insertCostLayersTuple.sql new file mode 100644 index 0000000..c3d381f --- /dev/null +++ b/application/items/sql/insertCostLayersTuple.sql @@ -0,0 +1,4 @@ +INSERT INTO %%site_name%%_cost_layers +(aquisition_date, quantity, cost, currency_type, expires, vendor) +VALUES (%s, %s, %s, %s, %s, %s) +RETURNING *; \ No newline at end of file diff --git a/application/items/sql/insertItemLinksTuple.sql b/application/items/sql/insertItemLinksTuple.sql new file mode 100644 index 0000000..81fb2c6 --- /dev/null +++ b/application/items/sql/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/application/items/sql/insertItemLocationsTuple.sql b/application/items/sql/insertItemLocationsTuple.sql new file mode 100644 index 0000000..67abbd4 --- /dev/null +++ b/application/items/sql/insertItemLocationsTuple.sql @@ -0,0 +1,4 @@ +INSERT INTO %%site_name%%_item_locations +(part_id, location_id, quantity_on_hand, cost_layers) +VALUES (%s, %s, %s, %s) +RETURNING *; \ No newline at end of file diff --git a/application/postsqldb.py b/application/postsqldb.py index d194610..9a8e00c 100644 --- a/application/postsqldb.py +++ b/application/postsqldb.py @@ -2369,4 +2369,43 @@ class TransactionPayload: self.user_id, json.dumps(self.data) ) - \ No newline at end of file + +@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 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 + ) diff --git a/process.py b/process.py index 2eee402..9424803 100644 --- a/process.py +++ b/process.py @@ -227,7 +227,7 @@ def postTransaction(conn, site_name, user_id, data: dict): transaction_time = datetime.datetime.now() - cost_layer = MyDataclasses.CostLayerPayload( + cost_layer = postsqldb.CostLayerPayload( aquisition_date=transaction_time, quantity=float(data['quantity']), cost=float(data['cost']), @@ -235,7 +235,7 @@ def postTransaction(conn, site_name, user_id, data: dict): vendor=int(data['vendor']), expires=data['expires'] ) - transaction = MyDataclasses.TransactionPayload( + transaction = postsqldb.TransactionPayload( timestamp=transaction_time, logistics_info_id=int(data['logistics_info_id']), barcode=data['barcode'], diff --git a/static/files/receipts/Order_details_-_Walmart.com_04282025.pdf b/static/files/receipts/Order_details_-_Walmart.com_04282025.pdf new file mode 100644 index 0000000000000000000000000000000000000000..add14c326957511647a445c1722634d7522cfebd GIT binary patch literal 276743 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ȕ{iy( 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%0A>;~1iKmO%AlhOvwOvNoXmn9`DuqID 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 literal 0 HcmV?d00001 diff --git a/static/files/receipts/previews/Order_details_-_Walmart.com_04282025.jpg b/static/files/receipts/previews/Order_details_-_Walmart.com_04282025.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee0ac775ac2e10ace6da4b53034f33531f5d9e59 GIT binary patch literal 9458 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 literal 0 HcmV?d00001