add detailed finance stuff and reuse euro teplate tag

This commit is contained in:
2022-09-16 09:50:41 +02:00
parent cd9e929727
commit ebef0fed6f
9 changed files with 94 additions and 41 deletions

View File

@@ -1,20 +1,14 @@
from decimal import Decimal
from typing import Union
from django.contrib import admin from django.contrib import admin
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin from django.contrib.auth.admin import UserAdmin
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from gaehsnitz.models import Donation, Payment, Drink, Consumption, Payback from gaehsnitz.models import Donation, Payment, Drink, Consumption, Payback
from gaehsnitz.templatetags.money import euro
User = get_user_model() User = get_user_model()
def euro(value: Union[int, float, Decimal]) -> str:
return f"{value:.2f}"
class DonationInline(admin.TabularInline): class DonationInline(admin.TabularInline):
model = Donation model = Donation
extra = 0 extra = 0

View File

@@ -2,6 +2,7 @@ from django.core.management import BaseCommand
from django.db.models import Sum from django.db.models import Sum
from gaehsnitz.models import Drink from gaehsnitz.models import Drink
from gaehsnitz.templatetags.money import euro
class Command(BaseCommand): class Command(BaseCommand):
@@ -29,4 +30,4 @@ class Command(BaseCommand):
remaining = bought - consumed remaining = bought - consumed
print(f" übrig: {remaining}") print(f" übrig: {remaining}")
purchase_value = remaining * drink.purchase_price_per_bottle purchase_value = remaining * drink.purchase_price_per_bottle
print(f" Wert: {purchase_value:.2f}") print(f" Wert: {euro(purchase_value)}")

View File

@@ -3,6 +3,7 @@ from django.core.management import BaseCommand
from django.db.models import Sum from django.db.models import Sum
from gaehsnitz.models import Payment, Donation from gaehsnitz.models import Payment, Donation
from gaehsnitz.templatetags.money import euro
User = get_user_model() User = get_user_model()
@@ -10,23 +11,23 @@ User = get_user_model()
class Command(BaseCommand): class Command(BaseCommand):
def handle(self, *args, **options): def handle(self, *args, **options):
all_donations_sum = Donation.objects.all().aggregate(sum=Sum("amount"))["sum"] all_donations_sum = Donation.objects.all().aggregate(sum=Sum("amount"))["sum"]
print(f"Alle Spenden/Zahlungen: {all_donations_sum:.2f}") print(f"Alle Spenden/Zahlungen: {euro(all_donations_sum)}")
all_payments_sum = Payment.objects.all().aggregate(sum=Sum("amount"))["sum"] all_payments_sum = Payment.objects.all().aggregate(sum=Sum("amount"))["sum"]
print(f"Alle Ausgaben: {all_payments_sum:.2f}") print(f"Alle Ausgaben: {euro(all_payments_sum)}")
balance = all_donations_sum - all_payments_sum balance = all_donations_sum - all_payments_sum
print("-------------------------") print("-------------------------")
print(f"Bilanz: {balance:.2f}") print(f"Bilanz: {euro(balance)}")
print() print()
print("Leute mit Schulden:") print("Leute mit Schulden:")
awaited_sum = 0 awaited_sum = 0
for user in User.objects.all().order_by("username"): for user in User.objects.all().order_by("username"):
if (value := user.balance) < 0: if (value := user.balance) < 0:
print(f"{user}: {-value:.2f}") print(f"{user}: {euro(-value)}")
awaited_sum -= value awaited_sum -= value
print("-------------------------") print("-------------------------")
print(f"gesamt: {awaited_sum:.2f}") print(f"gesamt: {euro(awaited_sum)}")
balance_after_payments = balance + awaited_sum balance_after_payments = balance + awaited_sum
print("-------------------------") print("-------------------------")
print(f"Bilanz danach: {balance_after_payments:.2f}") print(f"Bilanz danach: {euro(balance_after_payments)}")
print() print()

View File

@@ -3,6 +3,7 @@ from django.core.management import BaseCommand
from django.db.models import Sum from django.db.models import Sum
from gaehsnitz.models import Drink from gaehsnitz.models import Drink
from gaehsnitz.templatetags.money import euro
User = get_user_model() User = get_user_model()
@@ -21,26 +22,26 @@ class Command(BaseCommand):
amount = drink_dict["amount"] amount = drink_dict["amount"]
drink_list.append(f"{amount}x {name}") drink_list.append(f"{amount}x {name}")
drink_list_str = ", ".join(drink_list) drink_list_str = ", ".join(drink_list)
print(f"zu zahlen: {to_pay:.2f} ({drink_list_str})") print(f"zu zahlen: {euro(to_pay)} ({drink_list_str})")
donated = user.donations_made donated = user.donations_made
if donated != 0: if donated != 0:
don_list = [f"{don.date:%d.%m.} {don.amount:.2f}" for don in user.donations.order_by("date")] don_list = [f"{don.date:%d.%m.} {euro(don.amount)}" for don in user.donations.order_by("date")]
don_list_str = ", ".join(don_list) don_list_str = ", ".join(don_list)
print(f"gespendet: {donated:.2f} ({don_list_str})") print(f"gespendet: {euro(donated)} ({don_list_str})")
paid = user.other_payments_made paid = user.other_payments_made
if paid != 0: if paid != 0:
pay_list = [f"{pay.purpose} {pay.amount:.2f}" for pay in user.payments.order_by("date")] pay_list = [f"{pay.purpose} {euro(pay.amount)}" for pay in user.payments.order_by("date")]
pay_list_str = ", ".join(pay_list) pay_list_str = ", ".join(pay_list)
print(f"bezahlt: {paid:.2f} ({pay_list_str})") print(f"bezahlt: {euro(paid)} ({pay_list_str})")
paid_back = user.paybacks_received paid_back = user.paybacks_received
if paid_back != 0: if paid_back != 0:
pb_list = [f"{pb.date:%d.%m.} {pb.amount:.2f}" for pb in user.paybacks.order_by("date")] pb_list = [f"{pb.date:%d.%m.} {euro(pb.amount)}" for pb in user.paybacks.order_by("date")]
pb_list_str = ", ".join(pb_list) pb_list_str = ", ".join(pb_list)
print(f"zurückbekommen: {paid_back:.2f} ({pb_list_str})") print(f"zurückbekommen: {euro(paid_back)} ({pb_list_str})")
balance = donated + paid - to_pay - paid_back balance = donated + paid - to_pay - paid_back
print(f"==> STAND: {balance:.2f}") print(f"==> STAND: {euro(balance)}")
print() print()

View File

@@ -114,8 +114,8 @@ p, ul {
} }
table { table {
margin-top: 12px; margin-top: 16px;
margin-bottom: 12px; margin-bottom: 16px;
border-spacing: 1px; border-spacing: 1px;
} }
@@ -132,7 +132,8 @@ thead {
} }
td { td {
padding: 3px 8px; padding: 3px 12px;
text-align: right;
} }
hr { hr {
@@ -172,20 +173,6 @@ hr {
max-width: 800px; max-width: 800px;
} }
#drinks-table {
font-size: 0.9rem;
}
#drinks-table td {
padding: 2px 5px;
text-align: right;
white-space: nowrap;
}
#drinks-table tfoot {
color: #EE9933;
}
.bandbox { .bandbox {
display: flex; display: flex;
flex-direction: row; flex-direction: row;

View File

@@ -1,4 +1,5 @@
{% extends "gaehsnitz/base.html" %} {% extends "gaehsnitz/base.html" %}
{% load money %}
{% block content %} {% block content %}
@@ -40,9 +41,46 @@
ganz transparent eine Übersicht, von wo nach wo eigentlich wie viel Kohle geflossen ist. ganz transparent eine Übersicht, von wo nach wo eigentlich wie viel Kohle geflossen ist.
Nur keine Klarnamen. ;) Nur keine Klarnamen. ;)
</p> </p>
<h3>Zusammenfassung</h3>
<table>
<tr class="odd-row">
<td>Summe aller Spenden/Zahlungen</td>
<td>{{ total_donations|euro }}</td>
</tr>
<tr class="even-row-row">
<td>Summe aller Ausgaben</td>
<td>{{ total_payments|euro }}</td>
</tr>
<tr class="odd-row">
<td>Stand</td>
<td class="accent">{{ total_balance|euro }}</td>
</tr>
</table>
<h3>Ausgaben</h3>
<table>
<thead>
<tr class="odd-row">
<td>Zweck</td>
<td>Betrag</td>
<td>Datum</td>
</tr>
</thead>
{% for payment in payments %}
<tr class="{% cycle 'even-row' 'odd-row' %}">
<td>{{ payment.purpose }}</td>
<td>{{ payment.amount|euro }}</td>
<td>{% if payment.date %}{{ payment.date|date:"d.m." }}{% else %}-{% endif %}</td>
</tr>
{% endfor %}
</table>
<p> <p>
... dynamische Listen kommen zeitnah &#128526; ... Details zu den Spenden und Rückzahlungen an die Leute, die die Ausgaben geleistet haben,
lassen wir hier erstmal weg. Wer's ganz genau wissen will, kann ja fragen.
</p> </p>
<p> <p>
Nicht aufgelistet sind kurzfristige Dinge für die Vorbereitungsaktionen, also z.B. Suff und Sprit, den wir für Nicht aufgelistet sind kurzfristige Dinge für die Vorbereitungsaktionen, also z.B. Suff und Sprit, den wir für
die Arbeitseinsätze gekauft und auch direkt vernichtet haben. Danke an dieser Stelle nochmal allen für die die Arbeitseinsätze gekauft und auch direkt vernichtet haben. Danke an dieser Stelle nochmal allen für die

View File

View File

@@ -0,0 +1,11 @@
from decimal import Decimal
from typing import Union
from django.template.defaultfilters import register
@register.filter(name="euro")
def euro(value: Union[int, float, Decimal]):
if not value:
return "-"
return f"{value:.0f}"

View File

@@ -1,7 +1,10 @@
from datetime import date from datetime import date
from django.db.models import Sum
from django.views.generic import TemplateView from django.views.generic import TemplateView
from gaehsnitz.models import Donation, Payment
festival_start_date, festival_end_date = date(2022, 8, 25), date(2022, 8, 28) festival_start_date, festival_end_date = date(2022, 8, 25), date(2022, 8, 28)
@@ -34,8 +37,25 @@ class FinanceView(GaehsnitzTemplateView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
# TODO reimplement total_donations = Donation.objects.all().aggregate(sum=Sum("amount"))["sum"]
total_payments = Payment.objects.all().aggregate(sum=Sum("amount"))["sum"]
total_balance = total_donations - total_payments
band_sum, displayed_payments = 0, []
for pay in Payment.objects.order_by("date"):
if pay.purpose.startswith("Band"):
band_sum += pay.amount
else:
displayed_payments.append(pay)
displayed_payments.append(Payment(purpose="Bands", amount=band_sum))
context.update({
"total_donations": total_donations,
"total_payments": total_payments,
"total_balance": total_balance,
"payments": displayed_payments,
})
return context return context