Vertragsverwaltung_Plusfit24/routes/contracts.js
2026-03-27 15:08:19 +00:00

79 lines
3.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const express = require('express');
const router = express.Router();
const db = require('../config/database');
const { requireAdmin } = require('../middleware/auth');
// GET /admin/contracts
router.get('/', requireAdmin, async (req, res) => {
try {
// Verträge nach Kategorie
const [byCategory] = await db.query(`
SELECT
c.name as category_name,
COUNT(m.id) as total,
SUM(CASE WHEN m.status='active' THEN 1 ELSE 0 END) as active,
SUM(CASE WHEN m.status='paused' THEN 1 ELSE 0 END) as paused,
SUM(CASE WHEN m.status='inactive' THEN 1 ELSE 0 END) as inactive,
SUM(COALESCE(m.agreed_price, t.price_monthly)) as monthly_revenue
FROM memberships m
JOIN tariffs t ON m.tariff_id = t.id
LEFT JOIN categories c ON t.category_id = c.id
GROUP BY c.id, c.name
ORDER BY total DESC
`);
// Verträge nach Tarif
const [byTariff] = await db.query(`
SELECT
t.name as tariff_name, t.price_monthly, t.duration_months, t.active as tariff_active,
COUNT(m.id) as total,
SUM(CASE WHEN m.status='active' THEN 1 ELSE 0 END) as active,
SUM(COALESCE(m.agreed_price, t.price_monthly)) as monthly_revenue
FROM memberships m
JOIN tariffs t ON m.tariff_id = t.id
GROUP BY t.id, t.name, t.price_monthly, t.duration_months, t.active
ORDER BY active DESC, total DESC
`);
// Gesamtübersicht
const [totals] = await db.query(`
SELECT
COUNT(*) as total,
SUM(CASE WHEN status='active' THEN 1 ELSE 0 END) as active,
SUM(CASE WHEN status='paused' THEN 1 ELSE 0 END) as paused,
SUM(CASE WHEN status='inactive' THEN 1 ELSE 0 END) as inactive,
SUM(CASE WHEN is_minor=1 THEN 1 ELSE 0 END) as minors,
SUM(COALESCE(agreed_price, 0)) as total_monthly
FROM memberships
`);
// Auslaufende Verträge 3 Monate
const [expiring] = await db.query(`
SELECT m.*, t.name as tariff_name, t.price_monthly,
COALESCE(m.agreed_price, t.price_monthly) as agreed_price
FROM memberships m
JOIN tariffs t ON m.tariff_id = t.id
WHERE m.status = 'active'
AND m.effective_end BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 MONTH)
ORDER BY m.effective_end ASC
`);
// Alle aktiven Tarife für Dropdown
const [tariffs] = await db.query('SELECT * FROM tariffs WHERE active=1 ORDER BY name ASC');
res.render('admin/contracts', {
admin: req.session.adminUser,
byCategory, byTariff,
totals: totals[0],
expiring, tariffs,
success: req.query.success || null,
error: req.query.error || null
});
} catch (err) {
console.error(err);
res.redirect('/admin?error=Fehler+in+Vertragsübersicht:+' + encodeURIComponent(err.message));
}
});
module.exports = router;