2025-09-30 15:07:59 -05:00

152 lines
6.3 KiB
Python

import psycopg2
import datetime
from application.database_postgres.ItemsModel import ItemsModel
from application.database_postgres.ItemInfoModel import ItemInfoModel
from application.database_postgres.LogisticsInfoModel import LogisticsInfoModel
from application.database_postgres.FoodInfoModel import FoodInfoModel
from application.database_postgres.TransactionsModel import TransactionsModel
from application.database_postgres.ItemLocationsModel import ItemLocationsModel
from application.database_postgres.CostLayersModel import CostLayersModel
import config
def add_new_item(site: str, data: dict, user_uuid: str, conn=None):
item_data = data.get('item_data')
food_info = data.get('food_data', {})
item_info = data.get('item_info', {})
logistics_info = data.get('logistics_info', {})
self_conn = False
if not conn:
database_config = config.config()
conn = psycopg2.connect(**database_config)
conn.autocommit = False
self_conn = True
item_payload = ItemsModel.Payload(**item_data)
item = ItemsModel.insert_tuple(site, item_payload.payload_dictionary(), conn=conn)
item_info['item_uuid'] = item['item_uuid']
item_info_payload = ItemInfoModel.Payload(**item_info)
item_info = ItemInfoModel.insert_tuple(site, item_info_payload.payload_dictionary(), conn=conn)
logistics_info['item_uuid'] = item['item_uuid']
logistics_info_payload = LogisticsInfoModel.Payload(**logistics_info)
logistics_info = LogisticsInfoModel.insert_tuple(site, logistics_info_payload.payload_dictionary(), conn=conn)
if 'item_primary_location' in logistics_info.keys():
items_location = ItemLocationsModel.Payload(
item_uuid=item['item_uuid'],
location_uuid=logistics_info['item_primary_location']
)
items_location = ItemLocationsModel.insert_tuple(site, items_location.payload_dictionary(), conn=conn)
if item['item_category'] in ['FOOD', 'FOOD_PLU']:
food_info['item_uuid'] = item['item_uuid']
food_info_payload = FoodInfoModel.Payload(**food_info)
food_info = FoodInfoModel.insert_tuple(site, food_info_payload.payload_dictionary(), conn=conn)
transaction = TransactionsModel.Payload(
item_uuid=item['item_uuid'],
transaction_created_by=user_uuid,
transaction_name="Item Created",
transaction_type="SYSTEM"
)
transaction = TransactionsModel.insert_tuple(site, transaction.payload_dictionary(), conn=conn)
if self_conn:
conn.commit()
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