major: add calculation for payments

This commit is contained in:
Lunaresk 2024-02-09 23:12:23 +01:00
parent 04a13635dc
commit 7ae57ae3a4
5 changed files with 77 additions and 33 deletions

1
.gitignore vendored
View File

@ -354,3 +354,4 @@ tests*
*.pdf
*.backup
Dockerfile.*
docker-compose.*

View File

@ -34,7 +34,7 @@ login = LoginManager()
login.login_view = 'auth.web_login'
ma = Marshmallow()
mail = Mail()
migrate = Migrate()
migrate = Migrate(transaction_per_migration=True)
def create_app(config_class=Config):

View File

@ -2,7 +2,7 @@ from flask import abort, request
from flask.json import jsonify
from flask_login import current_user, login_required
from . import bp
from .utils import get_report, group_results, sum_entries
from .utils import calculate_payments, get_report, group_results, sum_entries
from src import LOGGER
from models import Establishment, LoginToken
from src.utils.routes_utils import render_custom_template as render_template
@ -25,7 +25,7 @@ def get_report_from_user(establishment_id):
LOGGER.info("Getting results.")
results = get_report(**request.args, **{"establishment": establishment_id})
LOGGER.debug(f"Results received.")
LOGGER.debug(str(results))
# LOGGER.debug(str(results))
if results:
result_list = group_results(results)
tokens = establishment.LoginToken.all()
@ -33,6 +33,7 @@ def get_report_from_user(establishment_id):
for token in tokens:
token_dates.extend(token.LoginTokenDates.all())
sum_entries(result_list, token_dates)
calculate_payments(result_list)
else:
result_list = []
# LOGGER.debug(result_list)

View File

@ -1,7 +1,7 @@
from src import LOGGER
from datetime import date as dtdate, timedelta
from flask_login import current_user
from models import Establishment, Item, LoginToken, User, Receipt, ReceiptItem
from models import Establishment, Item, LoginToken, User, Payment, Receipt, ReceiptItem
from src import db, LOGGER
from src.utils.view_utils import bought_with_prices as bwp
@ -14,6 +14,12 @@ def group_results(results: tuple) -> list:
sum: <sum of itemamounts*itemprices>,
membership_dates: [
(datetime.date(entry_date), datetime.date(exit_date))
],
payments: [
{
date: datetime.date(payment date),
amount: <payment (ct)>
}
]
item_infos: [
{
@ -55,15 +61,14 @@ def group_results(results: tuple) -> list:
LOGGER.debug("Grouped.")
return result_list
def sum_entries(grouped_result_list, login_token_dates):
LOGGER.debug("Preparing dict")
dict_people_modifier = {}
def get_token_modifier_on_date(login_token_dates):
# dict_people_modifier:
# {datetime.date(x,y,z): {
# 'add': <list of usertokens>,
# 'remove: <list of usertokens>
# }
# }
dict_people_modifier = {}
for tokendate in login_token_dates:
if not tokendate.activation_date in dict_people_modifier:
dict_people_modifier[tokendate.activation_date] = {}
@ -71,12 +76,14 @@ def sum_entries(grouped_result_list, login_token_dates):
dict_people_modifier[tokendate.activation_date]['add'] = []
dict_people_modifier[tokendate.activation_date]["add"].append(tokendate.token)
if tokendate.deactivation_date != None:
if not tokendate.deactivation_date in dict_people_modifier:
if not tokendate.deactivation_date in dict_people_modifier:
dict_people_modifier[tokendate.deactivation_date] = {}
if not "remove" in dict_people_modifier[tokendate.deactivation_date]:
dict_people_modifier[tokendate.deactivation_date]['remove'] = []
dict_people_modifier[tokendate.deactivation_date]["remove"].append(tokendate.token)
return dict_people_modifier
def generate_better_list(dict_people_modifier):
list_people_amount_per_date = [{"date": key, "people": value} for key, value in dict_people_modifier.items()]
list_people_amount_per_date.sort(key=lambda x: x.get('date'))
list_people_per_date = []
@ -95,19 +102,28 @@ def sum_entries(grouped_result_list, login_token_dates):
list_people_per_date[-1]['people'].remove(person)
except ValueError as e:
LOGGER.debug(f'{person} not in list.')
LOGGER.debug("This is line 91")
return list_people_per_date
def sum_entries(grouped_result_list, login_token_dates):
dict_people_modifier = get_token_modifier_on_date(login_token_dates)
LOGGER.debug(dict_people_modifier)
LOGGER.debug("Preparing dict")
list_people_per_date = generate_better_list(dict_people_modifier)
LOGGER.debug("This is line 106")
for result_user in grouped_result_list:
relevant_date_index = 0
if result_user.get('id'):
for result_date in result_user['item_infos']:
# TODO get relevant date index
if not result_date.get('date'):
result_date['item_list'] = []
continue
for i in range(relevant_date_index + 1, len(list_people_per_date)):
if list_people_per_date[i].get('date') > result_date.get('date'):
LOGGER.debug(f"{list_people_per_date[i].get('date')} > {result_date.get('date')}")
# LOGGER.debug(f"{list_people_per_date[i].get('date')} > {result_date.get('date')}")
relevant_date_index = i-1
break
if i == len(list_people_per_date)-1:
if list_people_per_date[i].get('date') < result_date.get('date'):
if list_people_per_date[i].get('date') <= result_date.get('date'):
relevant_date_index=i
# LOGGER.debug(f"Relevant Date: {list_people_per_date[relevant_date_index].get('date')}, Index: {relevant_date_index}")
# LOGGER.debug(f"Result Date: {result_date.get('date')}")
@ -121,10 +137,19 @@ def sum_entries(grouped_result_list, login_token_dates):
LOGGER.debug(f"Reducing sum of {result_user.get('id')} by {entry_people_per_date.get('sum')/len(entry_people_per_date.get('people'))}")
result_user['sum'] -= entry_people_per_date.get('sum')/len(entry_people_per_date.get('people'))
def calculate_payments(grouped_result_list):
for result_user in grouped_result_list:
payments:list[Payment] = Payment.query.filter_by(token=result_user.get('id')).all()
if payments:
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')}")
result_user['sum'] -= sum([x.amount for x in payments])
def get_report(**kwargs):
query_select_boughts = db.session.query(
bwp.c.token, User.email, bwp.c.date, bwp.c.item, Item.name, bwp.c.amount, bwp.c.price)
query_select_boughts = query_select_boughts.select_from(User).join(LoginToken, LoginToken.user == User.id).join(
LoginToken.token, User.email, bwp.c.date, bwp.c.item, Item.name, bwp.c.amount, bwp.c.price)
query_select_boughts = query_select_boughts.select_from(LoginToken).join(User, LoginToken.user == User.id).join(
bwp, LoginToken.token == bwp.c.token, isouter = True).join(Item, Item.id == bwp.c.item, isouter = True)
query_select_receipts = db.session.query(
Receipt.from_user, User.email, Receipt.date, ReceiptItem.item, ReceiptItem.name, ReceiptItem.amount, -ReceiptItem.price)
@ -161,7 +186,7 @@ def get_report(**kwargs):
query_select_boughts = query_select_boughts.filter(bwp.c.date.between(
dtdate(int(year), 1, 1), dtdate(int(year), 12, 31)))
query_select = query_select_boughts.union(query_select_receipts)
query_select = query_select.order_by(bwp.c.token, bwp.c.date, bwp.c.item)
query_select = query_select.order_by(LoginToken.token, bwp.c.date, bwp.c.item)
LOGGER.debug(str(query_select))
results = query_select.all()
return tuple(results)

View File

@ -38,6 +38,23 @@
</div>
</div>
{% endfor %}
{% if user.payments %}
<h3>Einzahlungen</h3>
{% for payments in user.payments %}
<div class="card-body">
<div class="col-sm-1"></div>
<div class="col">
<h4>{{ payments.date }}</h4>
<div class="row">
<div class="col-sm-1"></div>
<div class="col">
{{ payments.amount/100 }} €
</div>
</div>
</div>
</div>
{% endfor %}
{% endif %}
</div>
{% endif %}
</div>