-- SMTP-Stack: konfigurierbare Verbindung (statt Umgebungsvariablen) und Mailvorlagen mit dokumentierten Platzhaltern. CREATE TABLE smtp_settings ( id TINYINT PRIMARY KEY DEFAULT 1, host VARCHAR(253) NULL, port SMALLINT UNSIGNED NOT NULL DEFAULT 587, secure_mode ENUM('none','starttls','tls') NOT NULL DEFAULT 'starttls', username VARCHAR(200) NULL, secrets_enc TEXT NULL, from_name VARCHAR(150) NULL, from_email VARCHAR(254) NULL, updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), updated_by CHAR(36) NULL REFERENCES users(id), CONSTRAINT chk_smtp_singleton CHECK (id = 1) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO smtp_settings (id) VALUES (1); -- Vorlagen je Ereignis ("Definition"): Betreff/Text mit {{platzhalter}}, dokumentierte verfügbare Daten je Vorlage. CREATE TABLE mail_templates ( `key` VARCHAR(60) PRIMARY KEY, name VARCHAR(150) NOT NULL, trigger_text VARCHAR(300) NOT NULL, variables_json JSON NOT NULL, subject VARCHAR(300) NOT NULL, body TEXT NOT NULL, enabled TINYINT(1) NOT NULL DEFAULT 1, updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), updated_by CHAR(36) NULL REFERENCES users(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO mail_templates (`key`, name, trigger_text, variables_json, subject, body) VALUES ('invite', 'Zugang eingerichtet', 'Wenn für einen Kunden ein neuer Zugang angelegt wird.', JSON_ARRAY('name','inviteLink','validDays'), 'Ihr Zugang zum Kundencenter', 'Hallo {{name}},\n\nfür Sie wurde ein Zugang eingerichtet. Bitte legen Sie hier Ihr Passwort fest ({{validDays}} Tage gültig):\n{{inviteLink}}\n'), ('password_reset', 'Passwort zurücksetzen', 'Wenn ein Passwort-Reset angefordert wird (Kunde oder Personal).', JSON_ARRAY('name','resetLink'), 'Passwort zurücksetzen', 'Hallo {{name}},\n\nüber diesen Link können Sie Ihr Passwort zurücksetzen (1 Stunde gültig):\n{{resetLink}}\n\nWenn Sie das nicht angefordert haben, ignorieren Sie diese E-Mail.\n'), ('panel_credentials', 'Neue Panel-Zugangsdaten', 'Wenn Personal nach dem Neuvergeben eines Panel-Passworts auf „Per E-Mail senden“ klickt.', JSON_ARRAY('name','resourceName','username','password'), 'Ihre neuen Zugangsdaten für {{resourceName}}', 'Hallo {{name}},\n\nfür {{resourceName}} wurden neue Zugangsdaten vergeben:\n\nBenutzername: {{username}}\nPasswort: {{password}}\n\nBitte bewahren Sie die Zugangsdaten sicher auf und ändern Sie das Passwort nach der ersten Anmeldung, falls möglich.\n'), ('ticket_created', 'Ticket erstellt (Bestätigung an Kunde)', 'Wenn ein Kunde selbst ein neues Ticket erstellt.', JSON_ARRAY('name','number','subject'), 'Ticket {{number}} wurde erstellt', 'Hallo {{name}},\n\nIhr Ticket „{{subject}}“ ({{number}}) wurde bei uns erstellt. Wir melden uns, sobald es eine Antwort gibt.\n'), ('ticket_message', 'Antwort auf Ticket (an Kunde)', 'Wenn Personal auf ein Kunden-Ticket antwortet (keine interne Notiz).', JSON_ARRAY('name','number','subject'), 'Neue Antwort zu Ticket {{number}}', 'Hallo {{name}},\n\nes gibt eine neue Antwort zu Ihrem Ticket „{{subject}}“ ({{number}}). Bitte im Kundencenter ansehen und bei Bedarf antworten.\n'), ('invoice_issued', 'Rechnung erstellt', 'Wenn eine Rechnung ausgestellt wird.', JSON_ARRAY('name','number','amount','dueDate'), 'Ihre Rechnung {{number}}', 'Hallo {{name}},\n\nIhre Rechnung {{number}} über {{amount}} wurde erstellt, fällig am {{dueDate}}. Sie können sie im Kundencenter einsehen und als PDF herunterladen.\n');