minor: insert primitive possibility for invoice

It's ugly. Future updates will make it more beautiful.
This commit is contained in:
Lunaresk 2022-03-23 13:45:45 +01:00
parent 050fed33b2
commit e94472ac4a
5 changed files with 58 additions and 9 deletions

View File

@ -14,8 +14,9 @@ class User(UserMixin, db.Model):
username = db.Column(db.String(64), nullable=False, unique=True)
password_hash = db.Column(db.String(128), nullable=False)
# Bought = db.relationship("Bought", backref='User', lazy='dynamic')
LoginToken = db.relationship("LoginToken", backref='User', lazy='dynamic')
Bought = db.relationship("Bought", secondary="login_token",
lazy='dynamic', overlaps="User,LoginToken")
def set_password(self, password):
self.password_hash = generate_password_hash(password)
@ -32,6 +33,8 @@ class Establishment(db.Model):
owner = db.Column(db.ForeignKey('user.id'), nullable=False)
LoginToken = db.relationship("LoginToken", backref='Establishment', lazy='dynamic')
Bought = db.relationship("Bought", secondary="login_token",
lazy='dynamic', overlaps="Establishment,LoginToken,Bought")
def __repr__(self) -> str:
return f"<Establishment {self.id} ({self.name})>"

View File

@ -1,6 +1,6 @@
from app import app, db, LOGGER
from app.forms import NewItemForm, LoginForm, RegistrationForm
from app.models import LoginToken, User, Item, Brand, PriceChange, AmountChange
from app.models import Establishment, LoginToken, User, Item, Brand, PriceChange, AmountChange
from app.utils import view_utils, database_utils
from app.utils.routes_utils import render_custom_template as render_template
from datetime import date
@ -116,7 +116,29 @@ def get_report_from_user():
abort(400)
LOGGER.info("Getting results.")
results = database_utils.get_report(**request.args)
LOGGER.debug(f"Results received: {results}")
LOGGER.debug(f"Results received.")
# LOGGER.debug(str(results))
if results:
result_list = view_utils.group_results(results)
else:
result_list = []
if request.content_type == "application/json":
return jsonify(result_list)
else:
if "establishment" in request.args:
return render_template("overview.html", results=result_list, establishment = Establishment.query.get(int(request.args['establishment'])))
else:
return render_template("overview.html", results=result_list)
@app.route(f'/{APPNAME}/overview/register_boughts', methods=['GET'])
@login_required
def check_unregistered_items():
if current_user.is_anonymous or not request.args or 'establishment' not in request.args:
abort(403)
establishment = Establishment.query.get(int(request.args['establishment']))
if current_user.id != establishment.owner:
abort(403)
results = database_utils.get_unregistered_and_register(establishment.id)
if results:
result_list = view_utils.group_results(results)
else:
@ -125,9 +147,3 @@ def get_report_from_user():
return jsonify(result_list)
else:
return render_template("overview.html", results=result_list)
@app.route(f'/{APPNAME}/overview/register_boughts', methods=['GET'])
@login_required
def check_unregistered_items():
if current_user.is_anonymous:
abort(403)

View File

@ -10,6 +10,7 @@
{% else %}
<title>Scan2Kasse</title>
{% endif %}
<!-- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> -->
</head>
<body>
<main>
@ -91,9 +92,11 @@
{% endwith %}
<div style="width: 280px;"></div>
<div class="container">
<div class="row my-3"></div>
<div class="row-md-3">
{% block content %}{% endblock %}
</div>
<div class="row my-3"></div>
</div>
</main>
</body>

View File

@ -1,6 +1,13 @@
{% extends "base.html" %}
{% block content %}
{% if establishment %}
{% if current_user.id == establishment.owner %}
<button type="button" class="btn btn-outline-dark px-2" data-bs-toggle="button" autocomplete="off" onclick="window.location.href='{{ url_for('check_unregistered_items', establishment=establishment.id) }}'">
Abrechnung
</button>
{% endif %}
{% endif %}
{% for user in results %}
<div class="card">
<button class="btn btn-primary" data-bs-toggle="collapse" data-bs-target="#b{{ user.id }}" aria-expanded="true">

View File

@ -6,7 +6,7 @@ from datetime import date as dtdate, timedelta
from flask_login import current_user
from psycopg2 import errors
from random import choice as rndchoice
from sqlalchemy import text
from sqlalchemy import and_, text
from sqlalchemy.dialects.postgresql import insert
from string import ascii_letters, digits
@ -42,7 +42,7 @@ def get_report(**kwargs):
else:
_filter = db.session.query(LoginToken.token).filter_by(establishment = int(establishment), user=current_user.id)
query_select = query_select.filter(bwp.c.token.in_(_filter))
LOGGER.debug(str(query_select))
# LOGGER.debug(str(query_select))
match kwargs:
case {"month": month}:
LOGGER.debug("Month present")
@ -52,10 +52,30 @@ def get_report(**kwargs):
LOGGER.debug("Year present")
query_select = query_select.filter(bwp.c.date.between(dtdate(int(year), 1, 1), dtdate(int(year), 12, 31)))
query_select = query_select.order_by(bwp.c.token, bwp.c.date, bwp.c.item)
LOGGER.debug(str(query_select))
# LOGGER.debug(str(query_select))
results = query_select.all()
return tuple(results)
def get_unregistered_and_register(intEstablishment: int):
LOGGER.debug("Getting unregistered")
establishment = Establishment.query.get(intEstablishment)
if current_user.id != establishment.owner:
LOGGER.debug("!!!Wrong User!!!")
return False
query_select = db.session.query(bwp.c.token, User.username, bwp.c.date, bwp.c.item, Item.name, bwp.c.amount, bwp.c.price)
query_select = query_select.select_from(bwp).join(LoginToken, LoginToken.token==bwp.c.token).join(User, LoginToken.user==User.id)
query_select = query_select.join(Item, Item.id==bwp.c.item).join(Bought, and_(Bought.token==bwp.c.token, Bought.item==bwp.c.item, Bought.date==bwp.c.date))
query_select = query_select.filter(bwp.c.token.in_(db.session.query(LoginToken.token).filter_by(establishment = intEstablishment)))
query_select = query_select.filter(Bought.registered == False)
query_select = query_select.order_by(bwp.c.token, bwp.c.date, bwp.c.item)
results = query_select.all()
unregistered_boughts = establishment.Bought.filter_by(registered = False).all()
for x in unregistered_boughts:
x.registered = True
db.session.commit()
return results
def generate_token(length = 15, allowed_chars = ascii_letters + digits):
new_token = "".join((rndchoice(allowed_chars) for i in range(length)))
if not LoginToken.query.filter_by(token=new_token).first():