add detailed finance stuff and reuse euro teplate tag
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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)}")
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 😎 ...
|
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
|
||||||
|
|||||||
0
gaehsnitz/templatetags/__init__.py
Normal file
0
gaehsnitz/templatetags/__init__.py
Normal file
11
gaehsnitz/templatetags/money.py
Normal file
11
gaehsnitz/templatetags/money.py
Normal 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} €"
|
||||||
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user