minor: display payments on overview
Payments are now displayed at the bottom of the lists. Also, receipts can now be uploaded without necessarily providing an image of the original.
This commit is contained in:
parent
7ae57ae3a4
commit
497e421c9a
@ -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))
|
||||
|
||||
|
||||
@ -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)))
|
||||
|
||||
@ -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')}")
|
||||
|
||||
@ -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"})
|
||||
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
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
try:
|
||||
with open(strPDFFile) as doc:
|
||||
return PDFReceipt(doc, parser)
|
||||
except FileNotFoundError as e:
|
||||
return PDFReceipt(None)
|
||||
@ -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())
|
||||
@ -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 %}
|
||||
<form action="" method="post" novalidate enctype="multipart/form-data">
|
||||
{{ form.hidden_tag() }}
|
||||
{{ wtf.form_field(form.pdfReceipt, class=form.pdfReceipt.render_kw["class"] or "form-control") }}
|
||||
{{ wtf.form_field(form.submit, class=form.submit.render_kw["class"] or "btn btn-primary mt-3") }}
|
||||
{{ render_field(form.hidden_tag) }}
|
||||
{{ render_field(form.user) }}
|
||||
{{ render_field(form.date) }}
|
||||
{{ render_field(form.pdfReceipt) }}
|
||||
{{ render_field(form.submit) }}
|
||||
</form>
|
||||
{% endblock %}
|
||||
@ -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 %}
|
||||
|
||||
7
backend/web/templates/utils/form/_render_file_field.html
Normal file
7
backend/web/templates/utils/form/_render_file_field.html
Normal file
@ -0,0 +1,7 @@
|
||||
{% macro render_field(field) %}
|
||||
<div class="form-group">
|
||||
File upload<br>
|
||||
{{ field(**kwargs)|safe }}
|
||||
{% include "utils/form/_render_field_errors.html" %}
|
||||
</div>
|
||||
{% endmacro %}
|
||||
@ -0,0 +1,6 @@
|
||||
{% macro render_field(field) %}
|
||||
<div class="form-group">
|
||||
{{ field(**kwargs)|safe }}
|
||||
{% include "utils/form/_render_field_errors.html" %}
|
||||
</div>
|
||||
{% endmacro %}
|
||||
Loading…
x
Reference in New Issue
Block a user