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.auth import get_user_model
from django.contrib.auth.admin import UserAdmin
from django.utils.safestring import mark_safe
from gaehsnitz.models import Donation, Payment, Drink, Consumption, Payback
from gaehsnitz.templatetags.money import euro
User = get_user_model()
def euro(value: Union[int, float, Decimal]) -> str:
return f"{value:.2f}"
class DonationInline(admin.TabularInline):
model = Donation
extra = 0

View File

@@ -2,6 +2,7 @@ from django.core.management import BaseCommand
from django.db.models import Sum
from gaehsnitz.models import Drink
from gaehsnitz.templatetags.money import euro
class Command(BaseCommand):
@@ -29,4 +30,4 @@ class Command(BaseCommand):
remaining = bought - consumed
print(f" übrig: {remaining}")
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 gaehsnitz.models import Payment, Donation
from gaehsnitz.templatetags.money import euro
User = get_user_model()
@@ -10,23 +11,23 @@ User = get_user_model()
class Command(BaseCommand):
def handle(self, *args, **options):
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"]
print(f"Alle Ausgaben: {all_payments_sum:.2f}")
print(f"Alle Ausgaben: {euro(all_payments_sum)}")
balance = all_donations_sum - all_payments_sum
print("-------------------------")
print(f"Bilanz: {balance:.2f}")
print(f"Bilanz: {euro(balance)}")
print()
print("Leute mit Schulden:")
awaited_sum = 0
for user in User.objects.all().order_by("username"):
if (value := user.balance) < 0:
print(f"{user}: {-value:.2f}")
print(f"{user}: {euro(-value)}")
awaited_sum -= value
print("-------------------------")
print(f"gesamt: {awaited_sum:.2f}")
print(f"gesamt: {euro(awaited_sum)}")
balance_after_payments = balance + awaited_sum
print("-------------------------")
print(f"Bilanz danach: {balance_after_payments:.2f}")
print(f"Bilanz danach: {euro(balance_after_payments)}")
print()

View File

@@ -3,6 +3,7 @@ from django.core.management import BaseCommand
from django.db.models import Sum
from gaehsnitz.models import Drink
from gaehsnitz.templatetags.money import euro
User = get_user_model()
@@ -21,26 +22,26 @@ class Command(BaseCommand):
amount = drink_dict["amount"]
drink_list.append(f"{amount}x {name}")
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
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)
print(f"gespendet: {donated:.2f} ({don_list_str})")
print(f"gespendet: {euro(donated)} ({don_list_str})")
paid = user.other_payments_made
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)
print(f"bezahlt: {paid:.2f} ({pay_list_str})")
print(f"bezahlt: {euro(paid)} ({pay_list_str})")
paid_back = user.paybacks_received
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)
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
print(f"==> STAND: {balance:.2f}")
print(f"==> STAND: {euro(balance)}")
print()

View File

@@ -114,8 +114,8 @@ p, ul {
}
table {
margin-top: 12px;
margin-bottom: 12px;
margin-top: 16px;
margin-bottom: 16px;
border-spacing: 1px;
}
@@ -132,7 +132,8 @@ thead {
}
td {
padding: 3px 8px;
padding: 3px 12px;
text-align: right;
}
hr {
@@ -172,20 +173,6 @@ hr {
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 {
display: flex;
flex-direction: row;

View File

@@ -1,4 +1,5 @@
{% extends "gaehsnitz/base.html" %}
{% load money %}
{% block content %}
@@ -40,9 +41,46 @@
ganz transparent eine Übersicht, von wo nach wo eigentlich wie viel Kohle geflossen ist.
Nur keine Klarnamen. ;)
</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>
... 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>
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

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 django.db.models import Sum
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)
@@ -34,8 +37,25 @@ class FinanceView(GaehsnitzTemplateView):
def get_context_data(self, **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