73 lines
4.3 KiB
Python

from datetime import date
from flask import abort, current_app, request, url_for
from flask_login import current_user, login_required
from . import bp
from .forms import CheckCustomItemsEntryForm, CheckItemsEntryForm, CheckItemsForm, get_choices
from .utils import insert_existing_item, insert_new_item, insert_item_to_receipt, clear_receipt_items
from src import db, LOGGER
from models import AmountChange, Item, LoginToken, PriceChange, Receipt, ReceiptItem
from src.utils.modules.receipt_parser.pdf_receipt_parser import PDFReceipt
from src.utils.routes_utils import render_custom_template as render_template
@bp.route('/<int:receipt_id>', methods=['GET', 'POST'])
@login_required
def confirm_receipt_items(receipt_id: int):
"""Check items from a receipt if they should be accounted for payment.
Get those items from the receipt PDF itself."""
PDFDir: str = current_app.config["RECEIPT_FOLDER"]
receipt_details: Receipt = Receipt.query.get(receipt_id)
if current_user.is_authenticated and current_user.id == receipt_details.LoginToken.Establishment.owner:
receipt: PDFReceipt = PDFReceipt.getPDFReceiptFromFile(PDFDir + f"/{receipt_details.id}.pdf")
form: CheckItemsForm = CheckItemsForm.new(receipt.items)
_template = CheckCustomItemsEntryForm(prefix="custom_items-_-")
# TODO: Precheck if items are already in database. If yes, check if item is present only once or multiple
# times and provide dropdown menu if necessary. If not, provide input field.
# temp_choices = []
# for item in receipt.items:
# match item:
# case {"itemname": itemname, "price": price}:
# temp_choices.append((itemname.replace(" ", "_"), f"{itemname, price}"))
# case {"itemname": itemname, "price": price, "amount": amount}:
# temp_choices.append((itemname.replace(" ", "_"), f"{itemname}, {price} * {amount}"))
# form.choices = temp_choices
# print(form.data)
# for formitem in form.items:
# LOGGER.debug(formitem.data)
if form.validate():
LOGGER.debug("valid")
else:
LOGGER.debug(form.errors)
if form.validate_on_submit():
LOGGER.debug("Validate on submit")
clear_receipt_items(receipt=receipt_details)
for itempos, formitem in enumerate(form.items):
LOGGER.debug("Iterating through form items")
formitemdata = formitem.data
if formitemdata.get('requesting'):
LOGGER.debug("Item requested")
LOGGER.debug(formitemdata)
insert_item_to_receipt(receipt=receipt_details, item_dict=receipt.items[itempos], item_index=itempos)
if formitemdata.get('new_or_existing') == get_choices()[0][0]: # New Item
LOGGER.debug("New Item catched")
insert_new_item(formitemdict=formitemdata)
elif formitemdata.get('new_or_existing') == get_choices()[1][0]: # Existing Item
LOGGER.debug("Existing Item catched")
insert_existing_item(formitemdict=formitemdata, receipt_date=receipt.date)
elif formitemdata.get('new_or_existing') == get_choices()[2][0]: # Item not for DB
LOGGER.debug("Not listed Item catched")
else:
LOGGER.debug("Cold catched")
abort(400)
for itempos, formcustomitem in enumerate(form.custom_items):
formcustomitemdata = formcustomitem.data
custom_item_dict = {}
custom_item_dict['amount'] = formcustomitemdata.get('amount', 1)
custom_item_dict['price'] = formcustomitemdata.get('price')
custom_item_dict['itemname'] = formcustomitemdata.get('itemname')
LOGGER.debug(formcustomitem)
LOGGER.debug(custom_item_dict)
insert_item_to_receipt(receipt=receipt_details, item_dict=custom_item_dict, item_index=len(form.items)+itempos)
LOGGER.debug("Iterating through form custom items")
return render_template("receipts/check_items.html", form=form, _template=_template)
abort(403)