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 @@ + + +
Keine stornierten Rechnungen vorhanden.
+ <% } else { %> +| 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 + + | +