diff --git a/routes/finance.js b/routes/finance.js index 261d13b..ceb0652 100644 --- a/routes/finance.js +++ b/routes/finance.js @@ -163,7 +163,7 @@ router.post('/chargebacks/add', requireAdmin, async (req, res) => { res.redirect('/admin/finance?success=Rückläufer+eingetragen'); } catch (err) { console.error(err); - res.redirect('/admin/finance?error=Fehler+beim+Eintragen'); + res.redirect('/admin/finance?error=Fehler+beim+Eintragen#chargebacks'); } }); @@ -224,16 +224,16 @@ router.post('/dunning/add', requireAdmin, async (req, res) => { 'INSERT INTO dunning_fees (membership_id, invoice_id, amount, reason, issued_date, notes) VALUES (?,?,?,?,?,?)', [membership_id, invoice_id || null, amount, reason || 'Mahngebühr', issued_date, notes || null] ); - res.redirect('/admin/finance?success=Mahngebühr+eingetragen'); + res.redirect('/admin/finance?success=Mahngeb%C3%BChr+eingetragen#dunning'); } catch (err) { - res.redirect('/admin/finance?error=Fehler+beim+Eintragen'); + res.redirect('/admin/finance?error=Fehler+beim+Eintragen#chargebacks'); } }); router.post('/dunning/:id/paid', requireAdmin, async (req, res) => { try { await db.query("UPDATE dunning_fees SET status='paid', paid_at=NOW() WHERE id=?", [req.params.id]); - res.redirect('/admin/finance?success=Mahngebühr+als+bezahlt+markiert'); + res.redirect('/admin/finance?success=Mahngeb%C3%BChr+bezahlt#dunning'); } catch (err) { res.redirect('/admin/finance?error=Fehler'); } @@ -242,7 +242,7 @@ router.post('/dunning/:id/paid', requireAdmin, async (req, res) => { router.post('/dunning/:id/cancel', requireAdmin, async (req, res) => { try { await db.query("UPDATE dunning_fees SET status='cancelled' WHERE id=?", [req.params.id]); - res.redirect('/admin/finance?success=Mahngebühr+storniert'); + res.redirect('/admin/finance?success=Mahngeb%C3%BChr+storniert#dunning'); } catch (err) { res.redirect('/admin/finance?error=Fehler'); } @@ -270,10 +270,10 @@ router.post('/chargebacks/dunning-all', requireAdmin, async (req, res) => { ); count++; } - res.redirect(`/admin/finance?success=${count}+Mahngebühren+eingetragen#chargebacks`); + res.redirect('/admin/finance?success=Mahngeb%C3%BChren+eingetragen#chargebacks'); } catch (err) { console.error(err); - res.redirect('/admin/finance?error=Fehler+beim+Eintragen'); + res.redirect('/admin/finance?error=Fehler+beim+Eintragen#chargebacks'); } }); @@ -287,7 +287,7 @@ router.post('/dunning/add-from-chargeback', requireAdmin, async (req, res) => { 'INSERT INTO dunning_fees (membership_id, amount, reason, issued_date, notes) VALUES (?,?,?,?,?)', [cbs[0].membership_id, amount, reason || 'Mahngebühr Rücklastschrift', issued_date, notes || null] ); - res.redirect('/admin/finance?success=Mahngebühr+eingetragen'); + res.redirect('/admin/finance?success=Mahngeb%C3%BChr+eingetragen#dunning'); } catch (err) { res.redirect('/admin/finance?error=Fehler'); } diff --git a/views/admin/finance.ejs b/views/admin/finance.ejs index f519a2e..46e4a99 100644 --- a/views/admin/finance.ejs +++ b/views/admin/finance.ejs @@ -69,12 +69,12 @@
- - - - - - + + + + + +
@@ -175,8 +175,8 @@
<% if (c.status === 'open') { %> -
@@ -578,13 +578,27 @@ new Chart(ctx, { }); // Tabs -function showTab(name) { +const tabMap = { + chart: 0, open: 1, chargebacks: 2, dunning: 3, expiring: 4, settings: 5 +}; + +function showTab(name, el) { document.querySelectorAll('.ftab-content').forEach(t => t.classList.remove('active')); document.querySelectorAll('.ftab').forEach(t => t.classList.remove('active')); document.getElementById('tab-' + name).classList.add('active'); - event.target.classList.add('active'); + const btn = el || document.querySelectorAll('.ftab')[tabMap[name]]; + if (btn) btn.classList.add('active'); + history.replaceState(null, '', '#' + name); } +// Beim Laden Hash auswerten +document.addEventListener('DOMContentLoaded', () => { + const hash = window.location.hash.replace('#', ''); + if (hash && document.getElementById('tab-' + hash)) { + showTab(hash); + } +}); + function toggleModal(id) { document.getElementById(id).classList.toggle('hidden'); }