diff --git a/backend/models/payment.py b/backend/models/payment.py index 29167cd..f2f64c2 100644 --- a/backend/models/payment.py +++ b/backend/models/payment.py @@ -4,7 +4,7 @@ from src import db class Payment(db.Model): id = db.Column(db.BigInteger, primary_key=True, autoincrement=True) token = db.Column(db.ForeignKey('login_token.token'), - primary_key=True, server_onupdate=db.FetchedValue()) + server_onupdate=db.FetchedValue()) date = db.Column(db.Date, nullable=False, server_default=db.func.now()) amount = db.Column(db.BigInteger, nullable=False, server_default=str(0)) diff --git a/backend/src/establishment/overview/routes.py b/backend/src/establishment/overview/routes.py index 0d72318..5fc2565 100644 --- a/backend/src/establishment/overview/routes.py +++ b/backend/src/establishment/overview/routes.py @@ -38,6 +38,7 @@ def get_report_from_user(establishment_id): result_list = [] # LOGGER.debug(result_list) if request.content_type == "application/json": + LOGGER.debug("Returning JSON") return jsonify(result_list) else: return render_template("establishment/overview/overview.html", results=result_list, establishment=Establishment.query.get(int(establishment_id))) diff --git a/backend/src/establishment/overview/utils.py b/backend/src/establishment/overview/utils.py index ae24f46..e38430f 100644 --- a/backend/src/establishment/overview/utils.py +++ b/backend/src/establishment/overview/utils.py @@ -138,9 +138,11 @@ def sum_entries(grouped_result_list, login_token_dates): result_user['sum'] -= entry_people_per_date.get('sum')/len(entry_people_per_date.get('people')) def calculate_payments(grouped_result_list): + LOGGER.debug("Calculating Payments") for result_user in grouped_result_list: - payments:list[Payment] = Payment.query.filter_by(token=result_user.get('id')).all() + payments:list[Payment] = Payment.query.filter_by(token=result_user.get('id')).order_by(Payment.date).all() if payments: + LOGGER.debug(f"Payments found for user {result_user.get('id')}") result_user['payments'] = [{"date": x.date, "amount": x.amount} for x in payments] paymentsum = sum([x.amount for x in payments]) LOGGER.debug(f"Adding payments of a total of {paymentsum} to {result_user.get('id')}") diff --git a/backend/src/receipts/upload/forms.py b/backend/src/receipts/upload/forms.py index b8fea00..5a8c2f5 100644 --- a/backend/src/receipts/upload/forms.py +++ b/backend/src/receipts/upload/forms.py @@ -1,7 +1,16 @@ from flask_wtf import FlaskForm from flask_wtf.file import FileAllowed, FileField, FileRequired -from wtforms import SubmitField +from wtforms import DateField, SelectField, SubmitField +from models import Establishment class UploadReceiptForm(FlaskForm): - pdfReceipt = FileField("PDF", validators=[FileRequired(), FileAllowed(["pdf"], "Invalid Format, must be .pdf")]) - submit = SubmitField("Submit", render_kw={"class": "btn btn-primary mt-3"}) \ No newline at end of file + user = SelectField("User", choices=[], render_kw={"class": "form-control"}) + date = DateField("Insert Date", render_kw={"class": "form-control"}) + pdfReceipt = FileField("PDF", validators=[FileAllowed(["pdf"], "Invalid Format, must be .pdf")]) + submit = SubmitField("Submit", render_kw={"class": "btn btn-primary mt-3"}) + + @classmethod + def new(cls, establishment): + form = cls() + form.user.choices = [(None, "")]+[(t.token, t.User.email) for t in Establishment.query.get(establishment).LoginToken.order_by("user").all()] + return form \ No newline at end of file diff --git a/backend/src/receipts/upload/routes.py b/backend/src/receipts/upload/routes.py index a65a02e..1bc723a 100644 --- a/backend/src/receipts/upload/routes.py +++ b/backend/src/receipts/upload/routes.py @@ -18,19 +18,29 @@ def upload_receipt(establishment: int): if current_user.is_anonymous: abort(403) if LoginToken.query.filter_by(establishment=establishment, user=current_user.id).first(): - form = UploadReceiptForm() + form = UploadReceiptForm.new(establishment) LOGGER.debug(form.pdfReceipt.data) if form.validate_on_submit(): pdfReceipt = form.pdfReceipt.data - pdfReceipt.save(f"{PDFDir}/temp.pdf") - with open(f"{PDFDir}/temp.pdf") as doc: - receipt = PDFReceipt(doc) - dbReceipt = Receipt(bonid = receipt.id, date = receipt.date, - from_user = LoginToken.query.filter_by(establishment=establishment, user=current_user.id).first().token) + receipt_date = form.date.data + bonid = None + if form.user.data: + from_user = form.user.data + else: + from_user = LoginToken.query.filter_by(establishment=establishment, user=current_user.id).first_or_404().token + if pdfReceipt: + pdfReceipt.save(f"{PDFDir}/temp.pdf") + with open(f"{PDFDir}/temp.pdf") as doc: + receipt = PDFReceipt(doc) + bonid = receipt.id + if receipt.date: + receipt_date = receipt.date + dbReceipt = Receipt(date = receipt_date, from_user = from_user, bonid = bonid) db.session.add(dbReceipt) db.session.commit() - rename(f"{PDFDir}/temp.pdf", f"{PDFDir}{secure_filename(f'{dbReceipt.id}.pdf')}") - LOGGER.debug(receipt.text) + if pdfReceipt: + rename(f"{PDFDir}/temp.pdf", f"{PDFDir}{secure_filename(f'{dbReceipt.id}.pdf')}") + LOGGER.debug(receipt.text) return redirect(url_for("receipts.check_items.confirm_receipt_items", receipt_id = dbReceipt.id)) else: LOGGER.debug(form.errors) diff --git a/backend/src/utils/modules/receipt_parser/pdf_receipt_parser.py b/backend/src/utils/modules/receipt_parser/pdf_receipt_parser.py index 4541a06..af39309 100644 --- a/backend/src/utils/modules/receipt_parser/pdf_receipt_parser.py +++ b/backend/src/utils/modules/receipt_parser/pdf_receipt_parser.py @@ -56,5 +56,8 @@ class PDFReceipt: return (intReceiptNumber, date, items) def getPDFReceiptFromFile(strPDFFile: str, parser: str = "edeka"): - with open(strPDFFile) as doc: - return PDFReceipt(doc, parser) \ No newline at end of file + try: + with open(strPDFFile) as doc: + return PDFReceipt(doc, parser) + except FileNotFoundError as e: + return PDFReceipt(None) \ No newline at end of file diff --git a/backend/src/utils/routes_utils.py b/backend/src/utils/routes_utils.py index d15437a..40e6730 100644 --- a/backend/src/utils/routes_utils.py +++ b/backend/src/utils/routes_utils.py @@ -1,6 +1,7 @@ from datetime import date from flask import render_template from flask_login import current_user +from src import LOGGER def get_base_infos(): @@ -15,4 +16,5 @@ def get_base_infos(): return infos def render_custom_template(*args, **kwargs): + LOGGER.debug("Rendering template") return render_template(*args, **kwargs, **get_base_infos()) \ No newline at end of file diff --git a/backend/web/templates/receipts/upload.html b/backend/web/templates/receipts/upload.html index 20f8762..2d0b1ef 100644 --- a/backend/web/templates/receipts/upload.html +++ b/backend/web/templates/receipts/upload.html @@ -1,10 +1,13 @@ {% extends "base.html" %} {% import 'bootstrap/wtf.html' as wtf %} +{% from 'utils/form/_render_field.html' import render_field %} {% block app_content %}
{% endblock %} \ No newline at end of file diff --git a/backend/web/templates/utils/form/_render_field.html b/backend/web/templates/utils/form/_render_field.html index f3b91a4..4a14cdf 100644 --- a/backend/web/templates/utils/form/_render_field.html +++ b/backend/web/templates/utils/form/_render_field.html @@ -1,12 +1,18 @@ {% from 'utils/form/_render_radio_button.html' import render_field as render_radio %} {% from 'utils/form/_render_generic_field.html' import render_field as render_generic %} {% from 'utils/form/_render_hidden_field.html' import render_field as render_hidden %} +{% from 'utils/form/_render_submit_field.html' import render_field as render_submit %} +{% from 'utils/form/_render_file_field.html' import render_field as render_file %} {% macro render_field(field) %} {% if field.__class__.__name__ == "RadioField" %} {{ render_radio(field) }} {% elif field.__class__.__name__ == "HiddenField" %} {{ render_hidden(field) }} +{% elif field.__class__.__name__ == "SubmitField" %} +{{ render_submit(field) }} +{% elif field.__class__.__name__ == "FileField" %} +{{ render_file(field) }} {% else %} {{ render_generic(field)}} {% endif %} diff --git a/backend/web/templates/utils/form/_render_file_field.html b/backend/web/templates/utils/form/_render_file_field.html new file mode 100644 index 0000000..f37996a --- /dev/null +++ b/backend/web/templates/utils/form/_render_file_field.html @@ -0,0 +1,7 @@ +{% macro render_field(field) %} +