diff --git a/routes/register.js b/routes/register.js index 8307dc7..27d8aa3 100644 --- a/routes/register.js +++ b/routes/register.js @@ -1,139 +1,160 @@ -const express = require('express'); -const Database = require('better-sqlite3'); -const validateSepa = require('../utils/sepaValidator'); -const { encrypt } = require('../utils/crypto'); -const generateVertragsnummer = require('../utils/vertragsnummer'); -const createContractPdf = require('../utils/contractPdf'); -const sendContractMail = require('../utils/sendContractMail'); -const sendAdminMail = require('../utils/sendAdminMail'); +const express = require("express"); +const Database = require("better-sqlite3"); +const validateSepa = require("../utils/sepaValidator"); +const { encrypt } = require("../utils/crypto"); +const generateVertragsnummer = require("../utils/vertragsnummer"); +const createContractPdf = require("../utils/contractPdf"); +const sendContractMail = require("../utils/sendContractMail"); +const sendAdminMail = require("../utils/sendAdminMail"); const router = express.Router(); -const db = new Database('plusfit.db'); +const db = new Database("plusfit.db"); /* ========================= Helper ========================= */ function loadActiveContracts() { - return db.prepare(` + return db + .prepare( + ` SELECT * FROM vertragsarten WHERE aktiv = 1 ORDER BY betrag ASC - `).all(); + `, + ) + .all(); } /* ========================= GET /register ========================= */ -router.get('/', (req, res) => { - const vertragId = req.query.vertrag || null; +router.get("/", (req, res) => { + const vertragId = req.query.vertrag || null; - return res.render('register', { - vertragsarten: loadActiveContracts(), - selectedVertrag: vertragId, - formData: {} - }); + const vertraege = loadActiveContracts(); + + // Prüfen ob Vertrag existiert + const selected = vertraege.find((v) => v.id == vertragId); + + return res.render("register", { + vertragsarten: vertraege, + selectedVertrag: selected ? selected.id : null, + selectedVertragData: selected || null, + formData: {}, + }); }); /* ========================= POST /register/create ========================= */ -router.post('/create', async (req, res) => { - const u = req.body; - const vertragsarten = loadActiveContracts(); +router.post("/create", async (req, res) => { + const u = req.body; + const vertragsarten = loadActiveContracts(); - /* ========================= + /* ========================= Vertragsdaten laden ========================= */ - const contractData = db.prepare(` + const contractData = db + .prepare( + ` SELECT name, laufzeit, betrag FROM vertragsarten WHERE id = ? AND aktiv = 1 - `).get(u.vertragsvariante); + `, + ) + .get(u.vertragsvariante); - if (!contractData) { - return res.render('register', { - vertragsarten, - selectedVertrag: u.vertragsvariante, - error: 'Vertragsdaten konnten nicht geladen werden.', - formData: u - }); - } + if (!contractData) { + return res.render("register", { + vertragsarten, + selectedVertrag: u.vertragsvariante, + error: "Vertragsdaten konnten nicht geladen werden.", + formData: u, + }); + } - /* ========================= + /* ========================= Pflicht-Zustimmungen ========================= */ - if (!u.agreeConsent || !u.agreeAgb || !u.agreeSepa) { - return res.render('register', { - vertragsarten, - selectedVertrag: u.vertragsvariante, - error: 'Bitte bestätige alle rechtlichen Hinweise, um fortzufahren.', - formData: u - }); - } + if (!u.agreeConsent || !u.agreeAgb || !u.agreeSepa) { + return res.render("register", { + vertragsarten, + selectedVertrag: u.vertragsvariante, + error: "Bitte bestätige alle rechtlichen Hinweise, um fortzufahren.", + formData: u, + }); + } - /* ========================= + /* ========================= Formale SEPA-Prüfung ========================= */ - const sepaError = validateSepa({ - ibanValue: u.iban, - bic: u.bic, - mandatsreferenz: u.mandatsreferenz + const sepaError = validateSepa({ + ibanValue: u.iban, + bic: u.bic, + mandatsreferenz: u.mandatsreferenz, + }); + + if (sepaError) { + return res.render("register", { + vertragsarten, + selectedVertrag: u.vertragsvariante, + error: sepaError, + formData: u, }); + } - if (sepaError) { - return res.render('register', { - vertragsarten, - selectedVertrag: u.vertragsvariante, - error: sepaError, - formData: u - }); - } - - /* ========================= + /* ========================= Logische Prüfungen ========================= */ - const mandatsExists = db.prepare(` + const mandatsExists = db + .prepare( + ` SELECT id FROM users WHERE mandatsreferenz = ? - `).get(u.mandatsreferenz); + `, + ) + .get(u.mandatsreferenz); - if (mandatsExists) { - return res.render('register', { - vertragsarten, - selectedVertrag: u.vertragsvariante, - error: 'Diese Mandatsreferenz ist bereits vergeben.', - formData: u - }); - } + if (mandatsExists) { + return res.render("register", { + vertragsarten, + selectedVertrag: u.vertragsvariante, + error: "Diese Mandatsreferenz ist bereits vergeben.", + formData: u, + }); + } - /* ========================= + /* ========================= Vertrags- & Zustimmungsdaten ========================= */ - const vertragsnummer = generateVertragsnummer(); + const vertragsnummer = generateVertragsnummer(); - const zustimmungsDatum = new Date().toISOString(); - const zustimmungsIp = ( - req.headers['x-forwarded-for'] || - req.socket?.remoteAddress || - '' - ).split(',')[0].trim(); + const zustimmungsDatum = new Date().toISOString(); + const zustimmungsIp = ( + req.headers["x-forwarded-for"] || + req.socket?.remoteAddress || + "" + ) + .split(",")[0] + .trim(); - const vertragsversion = 'v1.0'; + const vertragsversion = "v1.0"; - const widerrufBis = new Date(); - widerrufBis.setDate(widerrufBis.getDate() + 14); + const widerrufBis = new Date(); + widerrufBis.setDate(widerrufBis.getDate() + 14); - /* ========================= + /* ========================= Verschlüsselung ========================= */ - const ibanEncrypted = encrypt(u.iban); - const bicEncrypted = encrypt(u.bic); + const ibanEncrypted = encrypt(u.iban); + const bicEncrypted = encrypt(u.bic); - /* ========================= + /* ========================= SPEICHERN ========================= */ - db.prepare(` + db.prepare( + ` INSERT INTO users ( vertragsnummer, vertragsvariante, @@ -165,34 +186,42 @@ router.post('/create', async (req, res) => { ?,?, 0 ) - `).run( - vertragsnummer, - u.vertragsvariante, + `, + ).run( + vertragsnummer, + u.vertragsvariante, - u.vorname, u.nachname, - u.strasse, u.hausnummer, u.plz, u.ort, u.land, - u.mobil, u.telefon, u.email, + u.vorname, + u.nachname, + u.strasse, + u.hausnummer, + u.plz, + u.ort, + u.land, + u.mobil, + u.telefon, + u.email, - u.kontoinhaber, - ibanEncrypted, - bicEncrypted, - u.mandatsreferenz, + u.kontoinhaber, + ibanEncrypted, + bicEncrypted, + u.mandatsreferenz, - u.agreeAgb ? 1 : 0, - u.agreeSepa ? 1 : 0, - u.agreeConsent ? 1 : 0, - zustimmungsDatum, - zustimmungsIp, - vertragsversion, + u.agreeAgb ? 1 : 0, + u.agreeSepa ? 1 : 0, + u.agreeConsent ? 1 : 0, + zustimmungsDatum, + zustimmungsIp, + vertragsversion, - widerrufBis.toISOString(), - 'aktiv' - ); + widerrufBis.toISOString(), + "aktiv", + ); - /* ========================= + /* ========================= Vertrags-PDF ========================= */ - const pdfPath = await createContractPdf({ + const pdfPath = await createContractPdf({ vertragsnummer, vorname: u.vorname, nachname: u.nachname, @@ -200,23 +229,23 @@ router.post('/create', async (req, res) => { laufzeit: contractData.laufzeit, betrag: contractData.betrag, datum: zustimmungsDatum, - ip: zustimmungsIp -}); + ip: zustimmungsIp, + }); - /* ========================= + /* ========================= Vertragsmail ========================= */ - await sendContractMail({ + await sendContractMail({ email: u.email, vorname: u.vorname, vertragsnummer, vertragName: contractData.name, betrag: contractData.betrag, datum: zustimmungsDatum, - pdfPath -}); + pdfPath, + }); -await sendAdminMail({ + await sendAdminMail({ vertragsnummer, vorname: u.vorname, nachname: u.nachname, @@ -224,13 +253,13 @@ await sendAdminMail({ vertragName: contractData.name, betrag: contractData.betrag, datum: zustimmungsDatum, - ip: zustimmungsIp -}); + ip: zustimmungsIp, + }); - /* ========================= + /* ========================= ERFOLG ========================= */ - return res.render('registerSuccess', { vertragsnummer }); + return res.render("registerSuccess", { vertragsnummer }); }); module.exports = router; diff --git a/views/register.ejs b/views/register.ejs index bd8fe63..b1ee2ed 100644 --- a/views/register.ejs +++ b/views/register.ejs @@ -1,61 +1,64 @@ <%- include('partials/header') %> +
-<% if (typeof error !== 'undefined') { %> +<% if(error){ %>
- ⚠️ <%= error %> +⚠️ <%= error %>
<% } %>

Mitglied werden

+ +
-
-
+
+
+ +
- Daten - Bank - Prüfen +Daten +Bank +Prüfen
-
+ + +
@@ -66,14 +69,16 @@ +name="geburtsdatum" +id="geburtsdatum" +class="form-control mb-2" +required> + +
Adresse
@@ -82,12 +87,17 @@ -
+ +
@@ -98,29 +108,40 @@ Weiter → +
- - + + +
+
- - +
+ +
@@ -130,198 +151,290 @@ Weiter →
+ + + + +
Vertrag
- +
+ + +<% if(selectedVertragData){ %> +<%= selectedVertragData.name %> – +<%= selectedVertragData.betrag.toFixed(2) %> € / Monat +<% }else{ %> +Kein Vertrag gewählt +<% } %> + + +
+ +
Rechtliches
+ +
+ +type="checkbox" +name="agreeConsent" +id="agreeConsent" +value="on"> + +
+ +
+ +type="checkbox" +name="agreeAgb" +value="on" +required> + +
+
- - +
+ + + + <%- include('partials/footer') %> \ No newline at end of file