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)
|
username = db.Column(db.String(64), nullable=False, unique=True)
|
||||||
password_hash = db.Column(db.String(128), nullable=False)
|
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')
|
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):
|
def set_password(self, password):
|
||||||
self.password_hash = generate_password_hash(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)
|
owner = db.Column(db.ForeignKey('user.id'), nullable=False)
|
||||||
|
|
||||||
LoginToken = db.relationship("LoginToken", backref='Establishment', lazy='dynamic')
|
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:
|
def __repr__(self) -> str:
|
||||||
return f"<Establishment {self.id} ({self.name})>"
|
return f"<Establishment {self.id} ({self.name})>"
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
from app import app, db, LOGGER
|
from app import app, db, LOGGER
|
||||||
from app.forms import NewItemForm, LoginForm, RegistrationForm
|
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 import view_utils, database_utils
|
||||||
from app.utils.routes_utils import render_custom_template as render_template
|
from app.utils.routes_utils import render_custom_template as render_template
|
||||||
from datetime import date
|
from datetime import date
|
||||||
@ -116,7 +116,29 @@ def get_report_from_user():
|
|||||||
abort(400)
|
abort(400)
|
||||||
LOGGER.info("Getting results.")
|
LOGGER.info("Getting results.")
|
||||||
results = database_utils.get_report(**request.args)
|
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:
|
if results:
|
||||||
result_list = view_utils.group_results(results)
|
result_list = view_utils.group_results(results)
|
||||||
else:
|
else:
|
||||||
@ -125,9 +147,3 @@ def get_report_from_user():
|
|||||||
return jsonify(result_list)
|
return jsonify(result_list)
|
||||||
else:
|
else:
|
||||||
return render_template("overview.html", results=result_list)
|
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)
|
|
||||||
@ -10,6 +10,7 @@
|
|||||||
{% else %}
|
{% else %}
|
||||||
<title>Scan2Kasse</title>
|
<title>Scan2Kasse</title>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<!-- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> -->
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<main>
|
<main>
|
||||||
@ -91,9 +92,11 @@
|
|||||||
{% endwith %}
|
{% endwith %}
|
||||||
<div style="width: 280px;"></div>
|
<div style="width: 280px;"></div>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
<div class="row my-3"></div>
|
||||||
<div class="row-md-3">
|
<div class="row-md-3">
|
||||||
{% block content %}{% endblock %}
|
{% block content %}{% endblock %}
|
||||||
</div>
|
</div>
|
||||||
|
<div class="row my-3"></div>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@ -1,6 +1,13 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
|
|
||||||
{% block content %}
|
{% 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 %}
|
{% for user in results %}
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<button class="btn btn-primary" data-bs-toggle="collapse" data-bs-target="#b{{ user.id }}" aria-expanded="true">
|
<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 flask_login import current_user
|
||||||
from psycopg2 import errors
|
from psycopg2 import errors
|
||||||
from random import choice as rndchoice
|
from random import choice as rndchoice
|
||||||
from sqlalchemy import text
|
from sqlalchemy import and_, text
|
||||||
from sqlalchemy.dialects.postgresql import insert
|
from sqlalchemy.dialects.postgresql import insert
|
||||||
from string import ascii_letters, digits
|
from string import ascii_letters, digits
|
||||||
|
|
||||||
@ -42,7 +42,7 @@ def get_report(**kwargs):
|
|||||||
else:
|
else:
|
||||||
_filter = db.session.query(LoginToken.token).filter_by(establishment = int(establishment), user=current_user.id)
|
_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))
|
query_select = query_select.filter(bwp.c.token.in_(_filter))
|
||||||
LOGGER.debug(str(query_select))
|
# LOGGER.debug(str(query_select))
|
||||||
match kwargs:
|
match kwargs:
|
||||||
case {"month": month}:
|
case {"month": month}:
|
||||||
LOGGER.debug("Month present")
|
LOGGER.debug("Month present")
|
||||||
@ -52,10 +52,30 @@ def get_report(**kwargs):
|
|||||||
LOGGER.debug("Year present")
|
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.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)
|
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()
|
results = query_select.all()
|
||||||
return tuple(results)
|
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):
|
def generate_token(length = 15, allowed_chars = ascii_letters + digits):
|
||||||
new_token = "".join((rndchoice(allowed_chars) for i in range(length)))
|
new_token = "".join((rndchoice(allowed_chars) for i in range(length)))
|
||||||
if not LoginToken.query.filter_by(token=new_token).first():
|
if not LoginToken.query.filter_by(token=new_token).first():
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user