From 03913c6680859a0fb5debfada2e25b3c4b13db09 Mon Sep 17 00:00:00 2001 From: Cay Date: Wed, 25 Feb 2026 19:12:12 +0000 Subject: [PATCH] =?UTF-8?q?=C3=A4nderung=20hier=20wird=20nun=20die=20vertt?= =?UTF-8?q?ragsnummer=20=C3=BCbergeben?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- routes/contracts.js | 412 +++++++++++++++++++++++--------- routes/register.js | 568 ++++++++++++++++++++++++-------------------- views/register.ejs | 45 ++-- 3 files changed, 639 insertions(+), 386 deletions(-) diff --git a/routes/contracts.js b/routes/contracts.js index 8ec6504..23eed58 100644 --- a/routes/contracts.js +++ b/routes/contracts.js @@ -1,135 +1,325 @@ -const express = require('express'); -const Database = require('better-sqlite3'); -const auth = require('../middleware/authMiddleware'); +<%- include('partials/header') %> -const router = express.Router(); -const db = new Database('plusfit.db'); + - res.redirect('/contracts'); -}); +
-// Vertragsart aktiv / inaktiv setzen -router.post('/toggle/:id', auth, (req, res) => { - const { id } = req.params; +<% if (typeof error !== 'undefined') { %> +
+ ⚠️ <%= error %> +
+<% } %> - db.prepare(` - UPDATE vertragsarten - SET aktiv = CASE - WHEN aktiv = 1 THEN 0 - ELSE 1 - END - WHERE id = ? - `).run(id); +

Mitglied werden

- res.redirect('/contracts'); -}); +
+
+
+
-// Vertragsart deaktivieren + User migrieren -router.post('/deactivate/:id', auth, (req, res) => { - const oldId = req.params.id; - const { newContractId } = req.body; +
+ Daten + Bank + Prüfen +
- if (!newContractId) { - return res.status(400).send('Neue Vertragsart fehlt'); +
+ + +
+ +

Mitgliedsdaten

+ + + + + + + + + +
Adresse
+ + + + + + + + + +
+ + +
+ +

Bankdaten

+ + + + + + +
+ + +
+ +
+ + + +
+ +
+ + +
+ +

Zusammenfassung

+ +
+
+
+ +
Vertrag
+ + + +
Rechtliches
+ +
+ + +
+ +
+ + +
+ +
+ + + +
+ +
+ +
+
+ + - -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; +<%- include('partials/footer') %>
\ No newline at end of file diff --git a/routes/register.js b/routes/register.js index 27d8aa3..23eed58 100644 --- a/routes/register.js +++ b/routes/register.js @@ -1,265 +1,325 @@ -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"); +<%- include('partials/header') %> -const router = express.Router(); -const db = new Database("plusfit.db"); + + +
+ +<% if (typeof error !== 'undefined') { %> +
+ ⚠️ <%= error %> +
+<% } %> + +

Mitglied werden

+ +
+
+
+
+ +
+ Daten + Bank + Prüfen +
+ +
+ + +
+ +

Mitgliedsdaten

+ + + + + + + + + +
Adresse
+ + + + + + + + + +
+ + +
+ +

Bankdaten

+ + + + + + +
+ + +
+ +
+ + + +
+ +
+ + +
+ +

Zusammenfassung

+ +
+
+
+ +
Vertrag
+ + + +
Rechtliches
+ +
+ + +
+ +
+ + +
+ +
+ + + +
+ +
+ +
+
+ + - 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, - }); - } - - /* ========================= - Formale SEPA-Prüfung - ========================= */ - 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, - }); - } - - /* ========================= - Logische Prüfungen - ========================= */ - const mandatsExists = db - .prepare( - ` - SELECT id FROM users - WHERE mandatsreferenz = ? - `, - ) - .get(u.mandatsreferenz); - - if (mandatsExists) { - return res.render("register", { - vertragsarten, - selectedVertrag: u.vertragsvariante, - error: "Diese Mandatsreferenz ist bereits vergeben.", - formData: u, - }); - } - - /* ========================= - Vertrags- & Zustimmungsdaten - ========================= */ - const vertragsnummer = generateVertragsnummer(); - - const zustimmungsDatum = new Date().toISOString(); - const zustimmungsIp = ( - req.headers["x-forwarded-for"] || - req.socket?.remoteAddress || - "" - ) - .split(",")[0] - .trim(); - - const vertragsversion = "v1.0"; - - const widerrufBis = new Date(); - widerrufBis.setDate(widerrufBis.getDate() + 14); - - /* ========================= - Verschlüsselung - ========================= */ - const ibanEncrypted = encrypt(u.iban); - const bicEncrypted = encrypt(u.bic); - - /* ========================= - SPEICHERN - ========================= */ - db.prepare( - ` - INSERT INTO users ( - vertragsnummer, - vertragsvariante, - - vorname, nachname, - strasse, hausnummer, plz, ort, land, - mobil, telefon, email, - - kontoinhaber, iban, bic, mandatsreferenz, - - zustimmung_agb, - zustimmung_sepa, - zustimmung_einverstaendnis, - zustimmung_datum, - zustimmung_ip, - vertragsversion, - - widerruf_moeglich_bis, - status, - gesperrt - ) VALUES ( - ?,?, - ?,?, - ?,?,?,?,?, - ?,?,?, - ?,?,?,?, - ?,?,?,?, - ?,?, - ?,?, - 0 - ) - `, - ).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.kontoinhaber, - ibanEncrypted, - bicEncrypted, - u.mandatsreferenz, - - u.agreeAgb ? 1 : 0, - u.agreeSepa ? 1 : 0, - u.agreeConsent ? 1 : 0, - zustimmungsDatum, - zustimmungsIp, - vertragsversion, - - widerrufBis.toISOString(), - "aktiv", - ); - - /* ========================= - Vertrags-PDF - ========================= */ - const pdfPath = await createContractPdf({ - vertragsnummer, - vorname: u.vorname, - nachname: u.nachname, - vertragName: contractData.name, - laufzeit: contractData.laufzeit, - betrag: contractData.betrag, - datum: zustimmungsDatum, - ip: zustimmungsIp, - }); - - /* ========================= - Vertragsmail - ========================= */ - await sendContractMail({ - email: u.email, - vorname: u.vorname, - vertragsnummer, - vertragName: contractData.name, - betrag: contractData.betrag, - datum: zustimmungsDatum, - pdfPath, - }); - - await sendAdminMail({ - vertragsnummer, - vorname: u.vorname, - nachname: u.nachname, - email: u.email, - vertragName: contractData.name, - betrag: contractData.betrag, - datum: zustimmungsDatum, - ip: zustimmungsIp, - }); - - /* ========================= - ERFOLG - ========================= */ - return res.render("registerSuccess", { vertragsnummer }); -}); - -module.exports = router; +<%- include('partials/footer') %>
\ No newline at end of file diff --git a/views/register.ejs b/views/register.ejs index b1ee2ed..3727b0a 100644 --- a/views/register.ejs +++ b/views/register.ejs @@ -1,28 +1,34 @@ <%- include('partials/header') %> @@ -35,6 +41,7 @@ button{width:100%} <% } %> +

Mitglied werden

@@ -47,7 +54,7 @@ style="width:33%"> - +
Daten Bank @@ -155,7 +162,6 @@ Weiter → @@ -167,7 +173,7 @@ value="<%= selectedVertrag || '' %>"> <% if(selectedVertragData){ %> <%= selectedVertragData.name %> – <%= selectedVertragData.betrag.toFixed(2) %> € / Monat -<% }else{ %> +<% } else { %> Kein Vertrag gewählt <% } %> @@ -179,7 +185,7 @@ Kein Vertrag gewählt
Rechtliches
- +
@@ -267,7 +270,7 @@ document.getElementById('step'+step) updateNav(); updateProgress(); -if(step===3){ +if(step === 3){ buildSummary(); checkAgeAndConsent(); }