Lunaresk 4d1e7eb944 major: edit database and finish check_items
New:
- Removed the connection between tables 'receipt_item' and 'item'.
Instead the position on the receipt will be stored as a primary key
with the receipt.id.
- Uploading a receipt and checking items for invoice is now working.
- Uploading a receipt now redirects directly to the form where the
items on the receipt can be marked for invoice.
- Added pagination for candidates-page.

Refactoring:
- Added _rencer_field_errors.html for centralized error display.
- Added edeka_parser.py for better management of different parsers.

Known Bugs:
- Uploading a receipt without any fields results in an error.

Todo:
- Generate a general form if no fields are recognized on the uploaded
receipt.
- Create form where Admin can confirm receipt invoices.
- Display Notification for admin when users upload receipt.
- Display Notification for admin on new candidate.
2023-11-12 16:05:09 +01:00

57 lines
2.8 KiB
Python

from datetime import date
from models import AmountChange, Item, PriceChange, Receipt, ReceiptItem
from src import db, LOGGER
def insert_new_item(formitemdict: dict[str: str]):
LOGGER.debug("Inserting new Item")
newitem = Item(id=formitemdict.get('new_ean'), name=formitemdict.get('itemname'), description=formitemdict.get('new_description'), Brand=formitemdict.get('new_brand'))
newamount = formitemdict.get('new_amount')
if(newamount and newamount not in [0, 1]):
newitem.AmountChange.append(AmountChange(amount=newamount))
newprice = int(formitemdict.get("price").replace(",", ""))
newitem.PriceChange.append(PriceChange(price=newprice))
db.session.add(newitem)
db.session.commit()
def insert_existing_item(formitemdict: dict[str: str], receipt_date: date = None):
if not receipt_date:
receipt_date = date.today()
LOGGER.debug("Updating existing Item")
itemobject: Item = formitemdict.get("existing_item")
LOGGER.debug("Retrieving and comparing old and new price")
# TODO compare the dates around the receipt date (before and after receipt date)
pricechange_list: list[PriceChange] = itemobject.PriceChange.order_by(PriceChange.date.desc()).all()
neighboring_prices: list[PriceChange] = get_neighboring_prices(pricechange_list, receipt_date)
newprice = int(formitemdict.get("price").replace(",", ""))
LOGGER.debug(neighboring_prices)
if newprice != neighboring_prices[1].price:
LOGGER.debug("New Price different from earlier price, inserting new price")
new_pricechange = PriceChange(Item=itemobject, date=str(receipt_date), price=newprice)
db.session.add(new_pricechange)
if newprice == neighboring_prices[0].price:
LOGGER.debug("New Price same as later price, removing later entry")
db.session.delete(neighboring_prices[0])
db.session.commit()
def insert_item_to_receipt(receipt: Receipt, item_dict: dict[str: str], item_index:int=0):
receipt.ReceiptItem.append(ReceiptItem(item=item_index, amount=item_dict.get('amount'), price=int(item_dict.get('price').replace(',',''))))
db.session.add(receipt)
db.session.commit()
def clear_receipt_items(receipt: Receipt):
receipt.registered = False
for receipt_item in receipt.ReceiptItem.all():
db.session.delete(receipt_item)
db.session.commit()
def get_neighboring_prices(pricechange_list: list[PriceChange], target_date: date):
upper_date, lower_date = None, None
for pricechange in pricechange_list:
if pricechange.date > target_date:
if (not upper_date) or (upper_date.date > pricechange.date):
upper_date = pricechange
elif pricechange.date < target_date:
if (not lower_date) or (lower_date.date < pricechange.date):
lower_date = pricechange
return [upper_date, lower_date]