From 97ad1359e1995c577b5e096bab906a805e40234e Mon Sep 17 00:00:00 2001 From: cay Date: Fri, 27 Mar 2026 13:47:51 +0000 Subject: [PATCH] drtjh --- routes/billing.js | 15 ++++++++++++ routes/finance.js | 11 +++++++++ views/admin/finance.ejs | 52 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/routes/billing.js b/routes/billing.js index 781c7d8..f81ee8b 100644 --- a/routes/billing.js +++ b/routes/billing.js @@ -342,5 +342,20 @@ router.get('/export/pdf/:invoiceId', requireAdmin, async (req, res) => { } }); + +// POST – Rechnung stornieren +router.post('/invoices/:id/cancel', requireAdmin, async (req, res) => { + const period = req.body.period || currentPeriod(); + try { + await db.query( + "UPDATE invoices SET status='cancelled' WHERE id=?", + [req.params.id] + ); + res.redirect(`/admin/billing?period=${period}&success=Rechnung+storniert`); + } catch (err) { + res.redirect(`/admin/billing?period=${period}&error=Fehler+beim+Stornieren`); + } +}); + module.exports = router; module.exports.currentPeriod = currentPeriod; diff --git a/routes/finance.js b/routes/finance.js index ceb0652..f016689 100644 --- a/routes/finance.js +++ b/routes/finance.js @@ -93,6 +93,16 @@ router.get('/', requireAdmin, async (req, res) => { ORDER BY m.effective_end ASC `); + // Stornierte Rechnungen + const [cancelledInvoices] = await db.query(` + SELECT i.*, m.first_name, m.last_name, m.email, t.name as tariff_name + FROM invoices i + JOIN memberships m ON i.membership_id = m.id + LEFT JOIN tariffs t ON m.tariff_id = t.id + WHERE i.status = 'cancelled' + ORDER BY i.created_at DESC + `); + // Alle Mitglieder für Dropdowns const [members] = await db.query(` SELECT m.id, m.first_name, m.last_name @@ -121,6 +131,7 @@ router.get('/', requireAdmin, async (req, res) => { expiringContracts, members, openInvoicesDropdown, + cancelledInvoices, success: req.query.success || null, error: req.query.error || null }); diff --git a/views/admin/finance.ejs b/views/admin/finance.ejs index 033237b..c58233d 100644 --- a/views/admin/finance.ejs +++ b/views/admin/finance.ejs @@ -74,6 +74,7 @@ + @@ -285,6 +286,55 @@ + + +
+
+

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

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

Keine stornierten Rechnungen vorhanden.

+ <% } else { %> +
+ + + + + + + + + + + + + + <% cancelledInvoices.forEach(inv => { %> + + + + + + + + + + <% }) %> + +
Nr.MitgliedTarifPeriodeBetragStorniert amAktion
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 + +
+
+ <% } %> +
+
+
@@ -579,7 +629,7 @@ new Chart(ctx, { // Tabs const tabMap = { - chart: 0, open: 1, chargebacks: 2, dunning: 3, expiring: 4, settings: 5 + chart: 0, open: 1, chargebacks: 2, dunning: 3, expiring: 4, cancelled: 5, settings: 6 }; function showTab(name, el) {