Files
breakpilot-compliance/backend-compliance/migrations/117_dsr_email_templates_content.sql
T
Benjamin Admin eb4ea8bc42 feat: EmailDeliveryService + professional DSR email templates
- EmailDeliveryService: load template → find published version →
  render {{variables}} → send via SMTP → audit log. Fallback to
  inline HTML when no published template exists.
- Migration 117: Professional HTML/text content for all 5 DSR
  templates (receipt, completion, rejection, identity, extension)
  with branded styling and proper Art. references
- DSRArt11Service now uses EmailDeliveryService with dsr_rejection
  template instead of hardcoded HTML

[migration-approved]

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-03 23:38:32 +02:00

165 lines
9.2 KiB
SQL

-- Migration 117: Professional DSR email template content
-- Updates published versions with proper HTML for all 5 DSR template types
-- Note: This updates existing template versions. If no versions exist yet,
-- the email_delivery_service falls back to inline HTML.
-- dsr_receipt: Eingangsbestaetigung
UPDATE compliance_email_template_versions SET
subject = 'Eingangsbestaetigung Ihrer Anfrage {{reference_number}} ({{request_type}})',
body_html = '<div style="font-family:system-ui,sans-serif;max-width:600px;margin:0 auto;">
<div style="background:#7c3aed;color:white;padding:20px 24px;border-radius:12px 12px 0 0;">
<h1 style="margin:0;font-size:20px;">Eingangsbestaetigung</h1>
<p style="margin:4px 0 0;opacity:0.9;font-size:14px;">Ihre Anfrage nach {{request_type}}</p>
</div>
<div style="background:white;padding:24px;border:1px solid #e5e7eb;border-top:none;border-radius:0 0 12px 12px;">
<p>Sehr geehrte/r <strong>{{requester_name}}</strong>,</p>
<p>wir bestaetigen den Eingang Ihrer Anfrage auf Datenauskunft gemaess DSGVO.</p>
<table style="width:100%;border-collapse:collapse;margin:16px 0;">
<tr><td style="padding:8px 12px;border-bottom:1px solid #f3f4f6;color:#6b7280;">Vorgangsnummer:</td><td style="padding:8px 12px;border-bottom:1px solid #f3f4f6;font-weight:bold;">{{reference_number}}</td></tr>
<tr><td style="padding:8px 12px;border-bottom:1px solid #f3f4f6;color:#6b7280;">Art der Anfrage:</td><td style="padding:8px 12px;border-bottom:1px solid #f3f4f6;">{{request_type}}</td></tr>
<tr><td style="padding:8px 12px;border-bottom:1px solid #f3f4f6;color:#6b7280;">Frist:</td><td style="padding:8px 12px;border-bottom:1px solid #f3f4f6;">{{deadline}}</td></tr>
</table>
<p>Wir werden Ihre Anfrage schnellstmoeglich bearbeiten und Ihnen die angeforderten Informationen innerhalb der gesetzlichen Frist zukommen lassen.</p>
<p>Bei Rueckfragen wenden Sie sich bitte unter Angabe der Vorgangsnummer an unseren Datenschutzbeauftragten.</p>
<p style="margin-top:24px;color:#6b7280;font-size:12px;">Mit freundlichen Gruessen<br/><strong>{{sender_name}}</strong></p>
</div></div>',
body_text = 'Eingangsbestaetigung - {{reference_number}}
Sehr geehrte/r {{requester_name}},
wir bestaetigen den Eingang Ihrer Anfrage ({{reference_number}}) auf {{request_type}}.
Frist: {{deadline}}
Mit freundlichen Gruessen
{{sender_name}}',
updated_at = NOW()
WHERE template_id IN (
SELECT id FROM compliance_email_templates WHERE template_type = 'dsr_receipt'
) AND status = 'published';
-- dsr_completion: Abschluss / Datenauskunft
UPDATE compliance_email_template_versions SET
subject = 'Ihre Datenauskunft {{reference_number}} — abgeschlossen',
body_html = '<div style="font-family:system-ui,sans-serif;max-width:600px;margin:0 auto;">
<div style="background:#16a34a;color:white;padding:20px 24px;border-radius:12px 12px 0 0;">
<h1 style="margin:0;font-size:20px;">Datenauskunft</h1>
<p style="margin:4px 0 0;opacity:0.9;font-size:14px;">Vorgangsnummer {{reference_number}}</p>
</div>
<div style="background:white;padding:24px;border:1px solid #e5e7eb;border-top:none;border-radius:0 0 12px 12px;">
<p>Sehr geehrte/r <strong>{{requester_name}}</strong>,</p>
<p>Ihre Anfrage ({{reference_number}}) vom Typ <strong>{{request_type}}</strong> wurde am <strong>{{completion_date}}</strong> abgeschlossen.</p>
<p>Die angeforderten Daten stehen Ihnen in folgenden Formaten zur Verfuegung:</p>
<ul><li><strong>PDF</strong> — druckbare Uebersicht</li><li><strong>JSON</strong> — maschinenlesbar (Art. 20 DSGVO)</li><li><strong>CSV</strong> — tabellarisch</li></ul>
<p>Sollten Sie Fragen haben oder weitere Rechte ausueben wollen (Berichtigung Art. 16, Loeschung Art. 17, Einschraenkung Art. 18), wenden Sie sich bitte erneut an uns.</p>
<p style="margin-top:24px;color:#6b7280;font-size:12px;">Mit freundlichen Gruessen<br/><strong>{{sender_name}}</strong></p>
</div></div>',
body_text = 'Datenauskunft - {{reference_number}}
Sehr geehrte/r {{requester_name}},
Ihre Anfrage ({{reference_number}}) wurde am {{completion_date}} abgeschlossen.
Die Daten stehen als PDF, JSON und CSV zur Verfuegung.
Mit freundlichen Gruessen
{{sender_name}}',
updated_at = NOW()
WHERE template_id IN (
SELECT id FROM compliance_email_templates WHERE template_type = 'dsr_completion'
) AND status = 'published';
-- dsr_rejection: Ablehnung
UPDATE compliance_email_template_versions SET
subject = 'Zu Ihrer Anfrage {{reference_number}} — Entscheidung',
body_html = '<div style="font-family:system-ui,sans-serif;max-width:600px;margin:0 auto;">
<div style="background:#6b7280;color:white;padding:20px 24px;border-radius:12px 12px 0 0;">
<h1 style="margin:0;font-size:20px;">Mitteilung zu Ihrer Anfrage</h1>
</div>
<div style="background:white;padding:24px;border:1px solid #e5e7eb;border-top:none;border-radius:0 0 12px 12px;">
<p>Sehr geehrte/r <strong>{{requester_name}}</strong>,</p>
<p>wir haben Ihre Anfrage ({{reference_number}}) geprueft und muessen Ihnen leider mitteilen, dass wir dieser nicht nachkommen koennen.</p>
<div style="background:#fef2f2;border:1px solid #fecaca;border-radius:8px;padding:16px;margin:16px 0;">
<p style="margin:0;font-weight:bold;color:#991b1b;">Grund:</p>
<p style="margin:4px 0 0;">{{rejection_reason}}</p>
<p style="margin:8px 0 0;font-size:13px;color:#6b7280;">Rechtsgrundlage: {{legal_basis}}</p>
</div>
<p>Sie haben das Recht, eine Beschwerde bei der zustaendigen Aufsichtsbehoerde einzureichen.</p>
<p style="margin-top:24px;color:#6b7280;font-size:12px;">Mit freundlichen Gruessen<br/><strong>{{sender_name}}</strong></p>
</div></div>',
body_text = 'Mitteilung zu {{reference_number}}
Sehr geehrte/r {{requester_name}},
wir koennen Ihrer Anfrage leider nicht nachkommen.
Grund: {{rejection_reason}}
Rechtsgrundlage: {{legal_basis}}
Mit freundlichen Gruessen
{{sender_name}}',
updated_at = NOW()
WHERE template_id IN (
SELECT id FROM compliance_email_templates WHERE template_type = 'dsr_rejection'
) AND status = 'published';
-- dsr_identity_request: Identitaetspruefung
UPDATE compliance_email_template_versions SET
subject = 'Identitaetspruefung erforderlich — {{reference_number}}',
body_html = '<div style="font-family:system-ui,sans-serif;max-width:600px;margin:0 auto;">
<div style="background:#ca8a04;color:white;padding:20px 24px;border-radius:12px 12px 0 0;">
<h1 style="margin:0;font-size:20px;">Identitaetspruefung erforderlich</h1>
</div>
<div style="background:white;padding:24px;border:1px solid #e5e7eb;border-top:none;border-radius:0 0 12px 12px;">
<p>Sehr geehrte/r <strong>{{requester_name}}</strong>,</p>
<p>fuer die Bearbeitung Ihrer Anfrage ({{reference_number}}) benoetigen wir gemaess Art. 12 Abs. 6 DSGVO eine Bestaetigung Ihrer Identitaet.</p>
<p>Bitte senden Sie uns <strong>eines</strong> der folgenden Dokumente:</p>
<ul><li>Kopie Ihres Personalausweises (Vorder-/Rueckseite, Adresse + Foto duerfen geschwärzt werden)</li><li>Screenshot Ihres Kundenkontos mit sichtbarer E-Mail-Adresse</li><li>Antwort von der bei uns registrierten E-Mail-Adresse</li></ul>
<p style="margin-top:24px;color:#6b7280;font-size:12px;">Mit freundlichen Gruessen<br/><strong>{{sender_name}}</strong></p>
</div></div>',
body_text = 'Identitaetspruefung - {{reference_number}}
Sehr geehrte/r {{requester_name}},
fuer Ihre Anfrage ({{reference_number}}) benoetigen wir eine Identitaetsbestaetigung.
Mit freundlichen Gruessen
{{sender_name}}',
updated_at = NOW()
WHERE template_id IN (
SELECT id FROM compliance_email_templates WHERE template_type = 'dsr_identity_request'
) AND status = 'published';
-- dsr_extension: Fristverlaengerung
UPDATE compliance_email_template_versions SET
subject = 'Fristverlaengerung Ihrer Anfrage {{reference_number}}',
body_html = '<div style="font-family:system-ui,sans-serif;max-width:600px;margin:0 auto;">
<div style="background:#2563eb;color:white;padding:20px 24px;border-radius:12px 12px 0 0;">
<h1 style="margin:0;font-size:20px;">Fristverlaengerung</h1>
</div>
<div style="background:white;padding:24px;border:1px solid #e5e7eb;border-top:none;border-radius:0 0 12px 12px;">
<p>Sehr geehrte/r <strong>{{requester_name}}</strong>,</p>
<p>wir informieren Sie, dass die Bearbeitung Ihrer Anfrage ({{reference_number}}) mehr Zeit in Anspruch nimmt als urspruenglich geplant.</p>
<p>Gemaess Art. 12 Abs. 3 DSGVO verlaengern wir die Frist:</p>
<table style="width:100%;border-collapse:collapse;margin:16px 0;">
<tr><td style="padding:8px 12px;border-bottom:1px solid #f3f4f6;color:#6b7280;">Neue Frist:</td><td style="padding:8px 12px;border-bottom:1px solid #f3f4f6;font-weight:bold;">{{new_deadline}}</td></tr>
<tr><td style="padding:8px 12px;border-bottom:1px solid #f3f4f6;color:#6b7280;">Grund:</td><td style="padding:8px 12px;border-bottom:1px solid #f3f4f6;">{{extension_reason}}</td></tr>
</table>
<p style="margin-top:24px;color:#6b7280;font-size:12px;">Mit freundlichen Gruessen<br/><strong>{{sender_name}}</strong></p>
</div></div>',
body_text = 'Fristverlaengerung - {{reference_number}}
Sehr geehrte/r {{requester_name}},
die Frist fuer Ihre Anfrage wurde verlaengert.
Neue Frist: {{new_deadline}}
Grund: {{extension_reason}}
Mit freundlichen Gruessen
{{sender_name}}',
updated_at = NOW()
WHERE template_id IN (
SELECT id FROM compliance_email_templates WHERE template_type = 'dsr_extension'
) AND status = 'published';