pantry-track/application/shoppinglists/shoplist_processess.py
2025-08-19 16:47:48 -05:00

187 lines
7.1 KiB
Python

import psycopg2
from application.shoppinglists import shoplist_database
from application import postsqldb, database_payloads
import config
def addRecipeItemsToList(site:str, data:dict, user_id: int, conn=None):
"""data = {'recipe_uuid', 'sl_id'}"""
self_conn=False
if not conn:
database_config = config.config()
conn = psycopg2.connect(**database_config)
conn.autocommit = False
self_conn = True
recipe_items = shoplist_database.getRecipeItemsByUUID(site, (data['recipe_uuid'],), conn=conn)
# for each item build a new item payload
for recipe_item in recipe_items:
# add item to the table pointing to the list_uuid
new_sl_item = database_payloads.ShoppingListItemPayload(
list_uuid = data['list_uuid'],
item_type='recipe',
item_name=recipe_item['item_name'],
uom=recipe_item['uom'],
qty=recipe_item['qty'],
item_uuid=recipe_item['item_uuid'],
links=recipe_item['links']
)
shoplist_database.insertShoppingListItemsTuple(site, new_sl_item.payload(), conn=conn)
if self_conn:
conn.commit()
conn.close()
def postNewGeneratedList(site: str, data: dict, user_id: int, conn=None):
"""data={'list_type', 'list_name', 'list_description', 'custom_items', 'uncalculated_items', 'calculated_items', 'recipes', 'full_system_calculated', 'shopping_lists'}"""
list_type: str = data['list_type']
list_name: str = data['list_name']
list_description: str = data['list_description']
custom_items: list = data['custom_items']
uncalculated_items: list = data['uncalculated_items']
calculated_items: list = data['calculated_items']
recipes: list = data['recipes']
full_system_calculated: list = data['full_system_calculated']
shopping_lists: list = data['shopping_lists']
self_conn=False
if not conn:
database_config = config.config()
conn = psycopg2.connect(**database_config)
conn.autocommit = False
self_conn = True
shopping_list = database_payloads.ShoppingListPayload(
name=list_name,
description=list_description,
author=int(user_id),
sub_type="plain",
list_type=list_type
)
shopping_list = shoplist_database.insertShoppingListsTuple(site, shopping_list.payload(), conn=conn)
items_to_add_to_system = []
# start by checcking if i should iterate full sku calc
if full_system_calculated:
safety_stock_items = shoplist_database.getItemsSafetyStock(site, conn=conn)
for item in safety_stock_items:
qty = float(item['item_info']['safety_stock']-float(item['total_sum']))
temp_item = database_payloads.ShoppingListItemPayload(
list_uuid=shopping_list['list_uuid'],
item_type='calculated sku',
item_name=item['item_name'],
uom=item['item_info']['uom'],
qty=qty,
item_uuid=item['item_uuid'],
links=item['links']
)
items_to_add_to_system.append(temp_item)
if calculated_items and not full_system_calculated:
for item_uuid in calculated_items:
item = shoplist_database.getItemByUUID(site, {'item_uuid': item_uuid}, conn=conn)
qty = float(item['item_info']['safety_stock']-float(item['total_sum']))
temp_item = database_payloads.ShoppingListItemPayload(
list_uuid=shopping_list['list_uuid'],
item_type='calculated sku',
item_name=item['item_name'],
uom=item['item_info']['uom'],
qty=qty,
item_uuid=item['item_uuid'],
links=item['links']
)
items_to_add_to_system.append(temp_item)
if custom_items:
for item in custom_items:
temp_item = database_payloads.ShoppingListItemPayload(
list_uuid=shopping_list['list_uuid'],
item_type='custom',
item_name=item['item_name'],
uom=item['uom'],
qty=float(item['qty']),
item_uuid=None,
links={'main': item['link']}
)
items_to_add_to_system.append(temp_item)
if uncalculated_items:
for item in uncalculated_items:
temp_item = database_payloads.ShoppingListItemPayload(
list_uuid=shopping_list['list_uuid'],
item_type='uncalculated sku',
item_name=item['item_name'],
uom=item['uom'],
qty=float(item['qty']),
item_uuid=None,
links={'main': item['link']}
)
items_to_add_to_system.append(temp_item)
if recipes:
for recipe_uuid in recipes:
recipe_items = shoplist_database.getRecipeItemsByUUID(site, (recipe_uuid,), conn=conn)
for item in recipe_items:
temp_item = database_payloads.ShoppingListItemPayload(
list_uuid=shopping_list['list_uuid'],
item_type='recipe',
item_name=item['item_name'],
uom=item['uom'],
qty=float(item['qty']),
item_uuid=item['item_uuid'],
links=item['links']
)
items_to_add_to_system.append(temp_item)
if shopping_lists:
for shopping_list_uuid in shopping_lists:
shopping_list_items = shoplist_database.getShoppingList(site, (shopping_list_uuid,), conn=conn)['sl_items']
for item in shopping_list_items:
temp_item = database_payloads.ShoppingListItemPayload(
list_uuid=shopping_list['list_uuid'],
item_type=item['item_type'],
item_name=item['item_name'],
uom=item['uom']['id'],
qty=float(item['qty']),
item_uuid=item['item_uuid'],
links=item['links']
)
items_to_add_to_system.append(temp_item)
if items_to_add_to_system:
for item in items_to_add_to_system:
shoplist_database.insertShoppingListItemsTuple(site, item.payload(), conn=conn)
if self_conn:
conn.commit()
conn.close()
def deleteShoppingList(site: str, data: dict, user_id: int, conn=None):
shopping_list_uuid = data['shopping_list_uuid']
self_conn=False
if not conn:
database_config = config.config()
conn = psycopg2.connect(**database_config)
conn.autocommit = False
self_conn = True
shopping_list_items = shoplist_database.getShoppingList(site, (shopping_list_uuid, ), conn=conn)['sl_items']
shopping_list_items = [item['list_item_uuid'] for item in shopping_list_items]
shoplist_database.deleteShoppingListsTuple(site, (shopping_list_uuid,), conn=conn)
shoplist_database.deleteShoppingListItemsTuple(site, shopping_list_items, conn=conn)
if self_conn:
conn.commit()
conn.close()