📊 Finanzübersicht

<% if (success) { %>
<%= success %>
<% } %> <% if (error) { %>
<%= error %>
<% } %>
Gesamtumsatz (bezahlt)
<%= Number(totalRevenue.paid_total).toFixed(2).replace('.', ',') %> €
<%= totalRevenue.invoice_count %> Rechnungen gesamt
Offene Posten
<%= Number(totalRevenue.open_total).toFixed(2).replace('.', ',') %> €
<%= openInvoices.length %> offene Rechnungen
Rückläufer (offen)
<%= chargebackStats.open_count %>
<%= Number(chargebackStats.total_amount).toFixed(2).replace('.', ',') %> € gesamt
Mahngebühren (offen)
<%= Number(dunningStats.open_total).toFixed(2).replace('.', ',') %> €
<%= dunningStats.open_count %> offene Mahnungen
Mahngebühren (bezahlt)
<%= Number(dunningStats.paid_total).toFixed(2).replace('.', ',') %> €
Aktueller Satz: <%= Number(dunningFee).toFixed(2).replace('.', ',') %> €
Auslaufende Verträge
<%= expiringContracts.length %>
In den nächsten 3 Monaten

Monatlicher Umsatz (letzte 12 Monate)

<% monthlyRevenue.slice().reverse().forEach(m => { %> <% }) %> <% if (monthlyRevenue.length === 0) { %> <% } %>
PeriodeRechnungenBezahltOffenGesamt
<%= m.period %> <%= m.count %> <%= Number(m.paid).toFixed(2).replace('.', ',') %> € <%= Number(m.open_amount).toFixed(2).replace('.', ',') %> € <%= Number(m.total).toFixed(2).replace('.', ',') %> €
Noch keine Abrechnungsdaten.

Offene Posten (<%= openInvoices.length %>)

<% if (openInvoices.length === 0) { %>

✅ Keine offenen Posten!

<% } else { %>
<% openInvoices.forEach(inv => { %> <% }) %>
MitgliedTarifPeriodeBetragRechnung Nr.Aktion
<%= inv.last_name %>, <%= inv.first_name %>
<%= inv.email %>
<%= inv.tariff_name || '–' %> <%= inv.period %> <%= Number(inv.amount).toFixed(2).replace('.', ',') %> € PF24-<%= String(inv.id).padStart(6,'0') %> Zur Abrechnung
<% } %>

Rückläufer

📥 SEPA Nachforderung
<% if (chargebacks.length === 0) { %>

Keine Rückläufer vorhanden.

<% } else { %>
<% chargebacks.forEach(c => { %> <% }) %>
DatumMitgliedPeriodeBetragGrundStatusAktion
<%= new Date(c.chargeback_date).toLocaleDateString('de-DE') %> <%= c.last_name %>, <%= c.first_name %> <%= c.period %> <%= Number(c.amount).toFixed(2).replace('.', ',') %> € <%= c.reason || '–' %> <%= c.status === 'resolved' ? '✅ Erledigt' : '🔴 Offen' %>
<% if (c.status === 'open') { %>
<% } %>
<% } %>

Mahngebühren

<% if (dunnings.length === 0) { %>

Keine Mahngebühren eingetragen.

<% } else { %>
<% dunnings.forEach(d => { %> <% }) %>
DatumMitgliedBetragGrundStatusAktion
<%= new Date(d.issued_date).toLocaleDateString('de-DE') %> <%= d.last_name %>, <%= d.first_name %> <%= Number(d.amount).toFixed(2).replace('.', ',') %> € <%= d.reason %> <%= d.status === 'paid' ? '✅ Bezahlt' : d.status === 'cancelled' ? '❌ Storniert' : '🔴 Offen' %> <% if (d.paid_at) { %>
<%= new Date(d.paid_at).toLocaleDateString('de-DE') %><% } %>
<% if (d.status === 'open') { %>
<% } %>
<% } %>

Auslaufende Verträge – nächste 3 Monate (<%= expiringContracts.length %>)

<% if (expiringContracts.length === 0) { %>

Keine auslaufenden Verträge in den nächsten 3 Monaten.

<% } else { %>
<% expiringContracts.forEach(m => { %> <% const endDate = new Date(m.effective_end); const today = new Date(); const diffDays = Math.ceil((endDate - today) / (1000*60*60*24)); const urgency = diffDays <= 30 ? 'urgent' : diffDays <= 60 ? 'warning' : 'normal'; %> <% }) %>
MitgliedTarifVertragsendeRestlaufzeitMonatsbeitragAktion
<%= m.last_name %>, <%= m.first_name %>
<%= m.email %>
<%= m.tariff_name %> <%= endDate.toLocaleDateString('de-DE') %> noch <%= diffDays %> Tage <%= Number(m.price_monthly).toFixed(2).replace('.', ',') %> €
Karteikarte
<% } %>

Stornierte Rechnungen (<%= cancelledInvoices.length %>)

<% if (cancelledInvoices.length === 0) { %>

Keine stornierten Rechnungen vorhanden.

<% } else { %>
<% cancelledInvoices.forEach(inv => { %> <% }) %>
Nr. Mitglied Tarif Periode Betrag Storniert am Aktion
PF24-<%= String(inv.id).padStart(6,'0') %> <%= inv.last_name %>, <%= inv.first_name %>
<%= inv.email %>
<%= inv.tariff_name || '–' %> <%= inv.period %> <%= Number(inv.amount).toFixed(2).replace('.', ',') %> € <%= new Date(inv.created_at).toLocaleDateString('de-DE') %> Zur Abrechnung
<% } %>

Finanz-Einstellungen