Add free-drink toggle, payment deletion, donation flow, expanded dashboard

- Crew can mark bookings as free (Gratis checkbox) on staff_user page;
  free anonymous bookings skip the auto-payment.
- Users (and crew) can delete their UserPayments with a confirmation page.
- Pay page redesigned around "Eintrittsspende": quick-pick amount buttons
  (drinks rounded to 5 € + 10/15/20/25/30), "Nur Drinks" escape, intro
  text, type=text input to dodge browser locale formatting.
- Me page: always-visible donate button, intro text linking drinks +
  Eintrittsspende.
- Day cutoff at 06:00 Berlin: festival day rolls at 06:00, applied to
  current_festival_day plus Frühaufsteher/Nachtschwärmer/Goldene Stunde.
- Dashboard: single Finanzen section (income vs costs) with breakdown,
  fun facts grouped (Trinker / Getränke / Zeit / Geld / Gratis).
- Offene Beträge filtered to open > 0.
- Staff list shows "(das bist du)" disabled row for own user.
- Renamed seed_drinks_2026 -> seed_2026, added Baumarkt 194 € entry.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
flo
2026-05-26 23:50:25 +02:00
co-authored by Claude Opus 4.7
parent 50fc32c577
commit 51d079a467
12 changed files with 653 additions and 83 deletions
+14 -11
View File
@@ -2,11 +2,11 @@
{% block content %}
<p class="muted">Crew-Ansicht</p>
<h2>Buchen für <span class="staff-target">{{ tab_user.username }}</span>{% if is_anonymous_target %} (Bar / Anonym){% endif %}</h2>
<h2>Buchen für <span class="staff-target">{{ tab_user.username }}</span></h2>
{% if booked_drink %}
<div class="toast" role="status">
Gebucht: +1 {{ booked_drink.name }}{% if is_anonymous_target %} (bar bezahlt){% endif %}
Gebucht: +1 {{ booked_drink.name }}{% if booked_free %} (gratis){% elif is_anonymous_target %} (bar bezahlt){% endif %}
</div>
{% endif %}
@@ -38,19 +38,22 @@
{% if phase == "booking" %}
<section>
<h3>Getränk buchen</h3>
<div class="drink-grid">
{% for drink in drinks %}
<form method="post" action="{% url 'suff:staff_book' tab_user.username %}">
{% csrf_token %}
<input type="hidden" name="drink_id" value="{{ drink.id }}" />
<button type="submit" class="drink-btn drink-btn-{{ drink.category }}">
<form method="post" action="{% url 'suff:staff_book' tab_user.username %}">
{% csrf_token %}
<label class="for-free-toggle">
<input type="checkbox" name="for_free" value="1" />
<span>Gratis (z.b. Artists am Spieltag)</span>
</label>
<div class="drink-grid">
{% for drink in drinks %}
<button type="submit" name="drink_id" value="{{ drink.id }}" class="drink-btn drink-btn-{{ drink.category }}">
<span class="drink-plus">+1</span>
<span class="drink-name">{{ drink.name }}</span>
<span class="drink-price">{{ drink.sale_price_per_bottle|floatformat:2 }} €</span>
</button>
</form>
{% endfor %}
</div>
{% endfor %}
</div>
</form>
</section>
{% endif %}