const express = require('express'); const Database = require('better-sqlite3'); const { decrypt } = require('../utils/crypto'); const auth = require('../middleware/authMiddleware'); const router = express.Router(); const db = new Database('plusfit.db'); router.get('/export', auth, (req, res) => { const users = db.prepare(` SELECT u.*, v.betrag, v.name AS vertragsname FROM users u JOIN vertragsarten v ON u.vertragsvariante = v.id WHERE u.status = 'aktiv' -- 🔐 WICHTIGSTER FILTER AND u.gesperrt = 0 -- optional, zusätzlich AND v.aktiv = 1 AND u.iban IS NOT NULL AND u.mandatsreferenz IS NOT NULL `).all(); if (users.length === 0) { return res.send('Keine aktiven SEPA-Lastschriften vorhanden'); } const now = new Date(); const msgId = `PLUSFIT-${now.getTime()}`; const date = now.toISOString().slice(0, 10); const totalSum = users.reduce( (sum, u) => sum + Number(u.betrag), 0 ); let xml = ` ${msgId} ${now.toISOString()} ${users.length} ${totalSum.toFixed(2)} Plusfit PMT-${date} DD ${users.length} ${totalSum.toFixed(2)} SEPA CORE RCUR ${date} Plusfit DE12345678901234567890 GENODEF1XXX SLEV `; users.forEach(u => { const iban = decrypt(u.iban); xml += ` ${u.vertragsnummer} ${Number(u.betrag).toFixed(2)} ${u.mandatsreferenz} ${date} ${u.kontoinhaber || `${u.vorname} ${u.nachname}`} ${iban} Mitgliedsbeitrag ${u.vertragsname} `; }); xml += ` `; res.setHeader('Content-Type', 'application/xml'); res.setHeader('Content-Disposition', 'attachment; filename=plusfit_sepa.xml'); res.send(xml); }); module.exports = router;