From ed6dd8da13549fec6a45e32d4ea77303f08b9ae4 Mon Sep 17 00:00:00 2001 From: rene Date: Fri, 15 May 2026 13:38:08 +0200 Subject: [PATCH] Fix: Quartalssumme korrekt (alle inkl. Storno), Netto ausgeblendet (SW by-v977) --- backend/main.py | 2 +- backend/routes/invoices.py | 18 ++++++++---------- backend/static/js/app.js | 2 +- backend/static/js/pages/admin.js | 5 ++--- backend/static/sw.js | 2 +- 5 files changed, 13 insertions(+), 16 deletions(-) diff --git a/backend/main.py b/backend/main.py index bd5662d..8bcb55c 100644 --- a/backend/main.py +++ b/backend/main.py @@ -408,7 +408,7 @@ async def serve_media(path: str, request: _Request): raise _HE(404, "Nicht gefunden.") return _media_response(filepath) -APP_VER = "976" # muss mit APP_VER in app.js übereinstimmen +APP_VER = "977" # muss mit APP_VER in app.js übereinstimmen @app.get("/.well-known/assetlinks.json") async def assetlinks(): diff --git a/backend/routes/invoices.py b/backend/routes/invoices.py index 07ac400..cb7bd90 100644 --- a/backend/routes/invoices.py +++ b/backend/routes/invoices.py @@ -467,18 +467,16 @@ def get_quarterly(year: int, q: int, admin=Depends(require_admin)): # Nach Datum sortieren entries.sort(key=lambda e: (e.get("created_at") or "")) - # Summen: Originalrechnungen positiv + Stornos negativ - total_net = sum(e["amount_net"] for e in entries if e["status"] != "cancelled") - total_tax = sum(e.get("tax_amount") or 0 for e in entries if e["status"] != "cancelled") - total_gross = sum(e["amount_gross"] for e in entries if e["status"] != "cancelled") + # Summen: alle Einträge — Storno (-) und Original (+) heben sich gegenseitig auf + total_gross = sum(e.get("amount_gross") or 0 for e in entries) + total_tax = sum(e.get("tax_amount") or 0 for e in entries) return { - "period": period, - "invoices": entries, - "total_net": round(total_net, 2), - "total_tax": round(total_tax, 2), - "total_gross": round(total_gross, 2), - "count": len(entries), + "period": period, + "invoices": entries, + "total_tax": round(total_tax, 2), + "total_gross": round(total_gross, 2), + "count": len(entries), } diff --git a/backend/static/js/app.js b/backend/static/js/app.js index 36b0ba0..4fb0b34 100644 --- a/backend/static/js/app.js +++ b/backend/static/js/app.js @@ -3,7 +3,7 @@ Router, State-Management, Navigation, Initialisierung. ============================================================ */ -const APP_VER = '976'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '977'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.6.0'; // ← semantische Version, wird bei make release gesetzt const IS_STAGING = location.hostname === 'staging.banyaro.app'; // Cache-Bust-Parameter nach Update-Reload sofort entfernen diff --git a/backend/static/js/pages/admin.js b/backend/static/js/pages/admin.js index cf24474..2d71fb6 100644 --- a/backend/static/js/pages/admin.js +++ b/backend/static/js/pages/admin.js @@ -4356,12 +4356,11 @@ window.Page_admin = (() => { const escape = v => `"${String(v || '').replace(/"/g, '""')}"`; const statusLabel = { paid: 'Bezahlt', sent: 'Versendet', cancelled: 'Storniert (Original)', storno: 'Stornorechnung' }; - const header = 'Nummer;Empfaenger;E-Mail;Datum;Leistungszeitraum;Nettobetrag;Bruttobetrag;Eingegangener Betrag;Status;Versendet am;Zahlungseingang\n'; + const header = 'Nummer;Empfaenger;E-Mail;Datum;Leistungszeitraum;Betrag;Eingegangener Betrag;Status;Versendet am;Zahlungseingang\n'; const csvRows = data.invoices.map(inv => [ inv.invoice_number, inv.recipient_name, inv.recipient_email || '', fmtDate(inv.created_at), inv.service_period || '', - fmtEur(inv.amount_net), fmtEur(inv.amount_gross), inv.paid_amount != null ? fmtEur(inv.paid_amount) : '', statusLabel[inv.status] || inv.status, @@ -4411,7 +4410,7 @@ window.Page_admin = (() => { }).join(''); resultEl.innerHTML = `
- ${_esc(data.period || `Q${q} ${year}`)} — ${data.count} Rechnung(en) · Brutto: ${_fmtE(data.total_gross)} + ${_esc(data.period || `Q${q} ${year}`)} — ${data.count} Buchung(en) · Summe: ${_fmtE(data.total_gross)}
diff --git a/backend/static/sw.js b/backend/static/sw.js index 645709c..0c0b8f3 100644 --- a/backend/static/sw.js +++ b/backend/static/sw.js @@ -3,7 +3,7 @@ Offline-Cache + Push Notifications + Tile-Cache ============================================================ */ -const CACHE_VERSION = 'by-v976'; +const CACHE_VERSION = 'by-v977'; const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache