152 lines
6.3 KiB
Python
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 |