136 lines
3.0 KiB
JavaScript
136 lines
3.0 KiB
JavaScript
const express = require('express');
|
||
const Database = require('better-sqlite3');
|
||
const auth = require('../middleware/authMiddleware');
|
||
|
||
const router = express.Router();
|
||
const db = new Database('plusfit.db');
|
||
|
||
/* Übersicht */
|
||
router.get('/', auth, (req, res) => {
|
||
const vertragsarten = db
|
||
.prepare('SELECT * FROM vertragsarten ORDER BY id ASC')
|
||
.all();
|
||
|
||
res.render('contracts', { vertragsarten });
|
||
});
|
||
|
||
/* Neu anlegen */
|
||
router.post('/create', auth, (req, res) => {
|
||
const { name, laufzeit, betrag, aktiv, beschreibung } = req.body;
|
||
|
||
db.prepare(`
|
||
INSERT INTO vertragsarten
|
||
(name, beschreibung, laufzeit, betrag, aktiv)
|
||
VALUES (?, ?, ?, ?, ?)
|
||
`).run(
|
||
name,
|
||
beschreibung,
|
||
laufzeit,
|
||
betrag,
|
||
aktiv ? 1 : 0
|
||
);
|
||
|
||
|
||
res.redirect('/contracts');
|
||
});
|
||
|
||
// Vertragsart aktiv / inaktiv setzen
|
||
router.post('/toggle/:id', auth, (req, res) => {
|
||
const { id } = req.params;
|
||
|
||
db.prepare(`
|
||
UPDATE vertragsarten
|
||
SET aktiv = CASE
|
||
WHEN aktiv = 1 THEN 0
|
||
ELSE 1
|
||
END
|
||
WHERE id = ?
|
||
`).run(id);
|
||
|
||
res.redirect('/contracts');
|
||
});
|
||
|
||
// Vertragsart deaktivieren + User migrieren
|
||
router.post('/deactivate/:id', auth, (req, res) => {
|
||
const oldId = req.params.id;
|
||
const { newContractId } = req.body;
|
||
|
||
if (!newContractId) {
|
||
return res.status(400).send('Neue Vertragsart fehlt');
|
||
}
|
||
|
||
const tx = db.transaction(() => {
|
||
|
||
// 1️⃣ Alle User auf neue Vertragsart umstellen
|
||
db.prepare(`
|
||
UPDATE users
|
||
SET vertragsvariante = ?
|
||
WHERE vertragsvariante = ?
|
||
`).run(newContractId, oldId);
|
||
|
||
// 2️⃣ Alte Vertragsart deaktivieren
|
||
db.prepare(`
|
||
UPDATE vertragsarten
|
||
SET aktiv = 0
|
||
WHERE id = ?
|
||
`).run(oldId);
|
||
|
||
});
|
||
|
||
tx();
|
||
|
||
res.redirect('/contracts');
|
||
});
|
||
|
||
// Öffentliche Vertragsauswahl – für ALLE Besucher
|
||
router.get('/select', (req, res) => {
|
||
const vertragsarten = db.prepare(`
|
||
SELECT *
|
||
FROM vertragsarten
|
||
WHERE aktiv = 1
|
||
ORDER BY betrag ASC
|
||
`).all();
|
||
|
||
res.render('contractsSelect', { vertragsarten });
|
||
});
|
||
|
||
|
||
const PDFDocument = require('pdfkit');
|
||
|
||
router.get('/pdf/:id', (req, res) => {
|
||
const v = db.prepare(`
|
||
SELECT *
|
||
FROM vertragsarten
|
||
WHERE id = ? AND aktiv = 1
|
||
`).get(req.params.id);
|
||
|
||
if (!v) {
|
||
return res.status(404).send('Vertrag nicht gefunden');
|
||
}
|
||
|
||
const doc = new PDFDocument();
|
||
res.setHeader('Content-Type', 'application/pdf');
|
||
res.setHeader(
|
||
'Content-Disposition',
|
||
`inline; filename=vertrag_${v.name}.pdf`
|
||
);
|
||
|
||
doc.pipe(res);
|
||
|
||
doc.fontSize(20).text(`Vertrag: ${v.name}`, { align: 'center' });
|
||
doc.moveDown();
|
||
|
||
doc.fontSize(12)
|
||
.text(`Laufzeit: ${v.laufzeit} Monate`)
|
||
.text(`Betrag: ${v.betrag.toFixed(2)} € / Monat`)
|
||
.moveDown();
|
||
|
||
doc.text(v.beschreibung || 'Keine weitere Beschreibung.');
|
||
|
||
doc.end();
|
||
});
|
||
|
||
|
||
|
||
module.exports = router;
|