minor: insert primitive possibility for invoice
It's ugly. Future updates will make it more beautiful.
This commit is contained in:
parent
050fed33b2
commit
f26dee5489
@ -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})>"
|
||||
|
||||
@ -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,8 @@ 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:
|
||||
@ -124,10 +125,25 @@ def get_report_from_user():
|
||||
if request.content_type == "application/json":
|
||||
return jsonify(result_list)
|
||||
else:
|
||||
return render_template("overview.html", results=result_list)
|
||||
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:
|
||||
abort(403)
|
||||
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:
|
||||
result_list = []
|
||||
if request.content_type == "application/json":
|
||||
return jsonify(result_list)
|
||||
else:
|
||||
return render_template("overview.html", results=result_list)
|
||||
@ -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>
|
||||
|
||||
@ -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">
|
||||
|
||||
@ -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():
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user