docs: MkDocs-Dokumentation fuer DSR, E-Mail-Templates, Banner Consent
All checks were successful
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-ai-compliance (push) Successful in 48s
CI / test-python-backend-compliance (push) Successful in 42s
CI / test-python-document-crawler (push) Successful in 24s
CI / test-python-dsms-gateway (push) Successful in 21s
All checks were successful
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-ai-compliance (push) Successful in 48s
CI / test-python-backend-compliance (push) Successful in 42s
CI / test-python-document-crawler (push) Successful in 24s
CI / test-python-dsms-gateway (push) Successful in 21s
- Neue Seiten: dsr.md, email-templates.md, banner-consent.md - rechtliche-texte.md: User-Consents & Cookie-Kategorien (Migration 028) ergaenzt - mkdocs.yml: 3 neue Nav-Eintraege unter SDK Module Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
157
docs-src/services/sdk-modules/banner-consent.md
Normal file
157
docs-src/services/sdk-modules/banner-consent.md
Normal file
@@ -0,0 +1,157 @@
|
||||
# Banner Consent — Device-basiertes Cookie-Consent
|
||||
|
||||
Das Banner-Consent-Modul verwaltet **anonyme Geraete-Consents** fuer Cookie-Banner auf Kunden-Websites.
|
||||
Es ermoeglicht die Erfassung, Verwaltung und den DSGVO-konformen Export von Cookie-Einwilligungen
|
||||
ohne personenbezogene Daten — stattdessen wird ein Device-Fingerprint verwendet.
|
||||
|
||||
---
|
||||
|
||||
## Uebersicht
|
||||
|
||||
| Eigenschaft | Wert |
|
||||
|-------------|------|
|
||||
| **SDK-Route** | `/sdk/cookie-banner` |
|
||||
| **Backend** | `backend-compliance:8002` |
|
||||
| **Router-Prefix** | `/api/compliance/banner` |
|
||||
| **Rechtsgrundlage** | TTDSG § 25, Art. 5 Abs. 3 ePrivacy-RL |
|
||||
| **DB-Migration** | 029_banner_consent.sql |
|
||||
| **Tests** | 25 Tests (`test_banner_routes.py`) |
|
||||
| **Status** | 100% |
|
||||
|
||||
---
|
||||
|
||||
## Funktionsprinzip
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A[Kunden-Website] -->|POST /banner/consent| B[Compliance Backend]
|
||||
B -->|Upsert| C[(compliance_banner_consents)]
|
||||
B -->|Audit-Log| D[(compliance_banner_consent_audit_log)]
|
||||
E[Admin Dashboard] -->|GET /banner/admin/stats| B
|
||||
E -->|Site/Category Config| B
|
||||
```
|
||||
|
||||
1. **Besucher** oeffnet Website → Cookie-Banner wird angezeigt
|
||||
2. **Besucher** waehlt Kategorien (Notwendig, Analyse, Marketing, ...) → `POST /banner/consent`
|
||||
3. **Backend** speichert Consent per `site_id` + `device_fingerprint` (Upsert — bei erneutem Besuch wird aktualisiert)
|
||||
4. **IP-Adresse** wird als SHA256-Hash gespeichert (Datenschutz)
|
||||
5. **Admin** kann Statistiken pro Site einsehen (Acceptance Rate pro Kategorie)
|
||||
|
||||
---
|
||||
|
||||
## API-Endpoints
|
||||
|
||||
### Public SDK-Endpoints (fuer Einbettung in Kunden-Websites)
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `POST` | `/banner/consent` | Device-Consent erfassen (Upsert) |
|
||||
| `GET` | `/banner/consent` | Consent abrufen (`?site_id=...&device_fingerprint=...`) |
|
||||
| `DELETE` | `/banner/consent/{id}` | Consent widerrufen |
|
||||
| `GET` | `/banner/config/{site_id}` | Site-Konfiguration laden (Banner-Titel, Kategorien) |
|
||||
| `GET` | `/banner/consent/export` | DSGVO-Export (Consents + Audit-Trail) |
|
||||
|
||||
### Admin-Endpoints
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `GET` | `/banner/admin/stats/{site_id}` | Consent-Statistiken (total, pro Kategorie) |
|
||||
|
||||
### Site-Konfiguration
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `GET` | `/banner/admin/sites` | Alle Site-Konfigurationen |
|
||||
| `POST` | `/banner/admin/sites` | Neue Site anlegen |
|
||||
| `PUT` | `/banner/admin/sites/{site_id}` | Site aktualisieren |
|
||||
| `DELETE` | `/banner/admin/sites/{site_id}` | Site loeschen |
|
||||
|
||||
### Kategorien-Verwaltung
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `GET` | `/banner/admin/sites/{site_id}/categories` | Kategorien einer Site |
|
||||
| `POST` | `/banner/admin/sites/{site_id}/categories` | Kategorie hinzufuegen |
|
||||
| `DELETE` | `/banner/admin/categories/{id}` | Kategorie loeschen |
|
||||
|
||||
### Vendor-Verwaltung
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `GET` | `/banner/admin/sites/{site_id}/vendors` | Vendors einer Site |
|
||||
| `POST` | `/banner/admin/sites/{site_id}/vendors` | Vendor hinzufuegen |
|
||||
| `DELETE` | `/banner/admin/vendors/{id}` | Vendor loeschen |
|
||||
|
||||
---
|
||||
|
||||
## DB-Tabellen (Migration 029)
|
||||
|
||||
| Tabelle | Beschreibung |
|
||||
|---------|--------------|
|
||||
| `compliance_banner_consents` | Anonyme Geraete-Consents (site_id, device_fingerprint, categories, ip_hash, expires_at) |
|
||||
| `compliance_banner_consent_audit_log` | Immutabler Audit-Trail (consent_given, consent_updated, consent_withdrawn) |
|
||||
| `compliance_banner_site_configs` | Site-Konfiguration (Banner-Titel, Privacy-URL, DSB-Info, TCF) |
|
||||
| `compliance_banner_category_configs` | Consent-Kategorien pro Site (name_de, name_en, is_required, sort_order) |
|
||||
| `compliance_banner_vendor_configs` | Third-Party-Vendor-Tracking (cookie_names, retention_days) |
|
||||
|
||||
---
|
||||
|
||||
## Consent-Erfassung
|
||||
|
||||
### Request (POST /banner/consent)
|
||||
|
||||
```json
|
||||
{
|
||||
"site_id": "example.com",
|
||||
"device_fingerprint": "fp-a1b2c3d4e5",
|
||||
"categories": ["necessary", "analytics"],
|
||||
"ip_address": "192.168.1.100"
|
||||
}
|
||||
```
|
||||
|
||||
### Response
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "uuid",
|
||||
"site_id": "example.com",
|
||||
"device_fingerprint": "fp-a1b2c3d4e5",
|
||||
"categories": ["necessary", "analytics"],
|
||||
"ip_hash": "a1b2c3...",
|
||||
"expires_at": "2027-03-05T10:00:00Z",
|
||||
"created_at": "2026-03-05T10:00:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
!!! info "Upsert-Verhalten"
|
||||
Wenn ein Consent fuer die gleiche Kombination `site_id` + `device_fingerprint` existiert,
|
||||
wird der bestehende Eintrag aktualisiert (Kategorien ueberschrieben, `updated_at` gesetzt).
|
||||
Die IP wird immer als SHA256-Hash gespeichert — nie im Klartext.
|
||||
|
||||
---
|
||||
|
||||
## Statistiken
|
||||
|
||||
`GET /banner/admin/stats/{site_id}` liefert:
|
||||
|
||||
```json
|
||||
{
|
||||
"site_id": "example.com",
|
||||
"total_consents": 1542,
|
||||
"category_acceptance": {
|
||||
"necessary": { "count": 1542, "percentage": 100.0 },
|
||||
"analytics": { "count": 892, "percentage": 57.8 },
|
||||
"marketing": { "count": 423, "percentage": 27.4 }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Frontend-Proxy
|
||||
|
||||
| Frontend-Route | Ziel |
|
||||
|----------------|------|
|
||||
| `/api/sdk/v1/compliance/banner/*` | `backend:8002/api/compliance/banner/*` |
|
||||
|
||||
Nutzt den bestehenden Compliance-Catch-All-Proxy (`/api/sdk/v1/compliance/[[...path]]`).
|
||||
173
docs-src/services/sdk-modules/dsr.md
Normal file
173
docs-src/services/sdk-modules/dsr.md
Normal file
@@ -0,0 +1,173 @@
|
||||
# DSR — Betroffenenrechte (Art. 15–21 DSGVO)
|
||||
|
||||
Das DSR-Modul verwaltet **Data Subject Requests** (Betroffenenanfragen) gemaess DSGVO Art. 15–21.
|
||||
Es ersetzt den bisherigen Proxy zum consent-service durch eine native Python/FastAPI-Implementierung
|
||||
mit eigenem Datenmodell, Status-Workflow, Fristen-Management und Kommunikations-Tracking.
|
||||
|
||||
---
|
||||
|
||||
## Uebersicht
|
||||
|
||||
| Eigenschaft | Wert |
|
||||
|-------------|------|
|
||||
| **SDK-Route** | `/sdk/dsr` |
|
||||
| **Backend** | `backend-compliance:8002` |
|
||||
| **Router-Prefix** | `/api/compliance/dsr` |
|
||||
| **Rechtsgrundlage** | Art. 15–21, Art. 12 Abs. 3 DSGVO |
|
||||
| **DB-Migration** | 026_dsr.sql |
|
||||
| **Tests** | 50 Tests (`test_dsr_routes.py`) |
|
||||
| **Status** | 100% — native Implementierung |
|
||||
|
||||
---
|
||||
|
||||
## Anfragetypen
|
||||
|
||||
| Typ | DSGVO-Artikel | Beschreibung |
|
||||
|-----|--------------|--------------|
|
||||
| `access` | Art. 15 | Auskunftsrecht |
|
||||
| `rectification` | Art. 16 | Berichtigungsrecht |
|
||||
| `erasure` | Art. 17 | Recht auf Loeschung |
|
||||
| `restriction` | Art. 18 | Recht auf Einschraenkung |
|
||||
| `portability` | Art. 20 | Recht auf Datenuebertragbarkeit |
|
||||
| `objection` | Art. 21 | Widerspruchsrecht |
|
||||
|
||||
---
|
||||
|
||||
## Status-Workflow
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A[new] --> B[in_review]
|
||||
B --> C[identity_verification]
|
||||
C --> D[processing]
|
||||
D --> E[completed]
|
||||
D --> F[rejected]
|
||||
B --> F
|
||||
A --> G[cancelled]
|
||||
D --> H[extended]
|
||||
H --> D
|
||||
```
|
||||
|
||||
- **Frist:** 30 Tage ab Eingang (Art. 12 Abs. 3)
|
||||
- **Verlaengerung:** Einmalig um weitere 60 Tage moeglich (mit Begruendung)
|
||||
- **Identitaetspruefung:** Pflicht vor Bearbeitung (Art. 12 Abs. 6)
|
||||
|
||||
---
|
||||
|
||||
## API-Endpoints
|
||||
|
||||
### DSR-Verwaltung
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `POST` | `/dsr` | DSR erstellen (auto request_number, 30-Tage Deadline) |
|
||||
| `GET` | `/dsr` | DSRs auflisten (Filter: status, type, assigned_to, priority, overdue, search, date-range) |
|
||||
| `GET` | `/dsr/stats` | Dashboard-Statistiken (offen, ueberfaellig, avg. Bearbeitungszeit) |
|
||||
| `GET` | `/dsr/{id}` | DSR-Detail |
|
||||
| `PUT` | `/dsr/{id}` | DSR aktualisieren |
|
||||
| `DELETE` | `/dsr/{id}` | DSR loeschen |
|
||||
|
||||
### Status-Aktionen
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `POST` | `/dsr/{id}/status` | Status aendern (mit Kommentar) |
|
||||
| `POST` | `/dsr/{id}/verify-identity` | Identitaet verifizieren (method + verified_by) |
|
||||
| `POST` | `/dsr/{id}/assign` | Bearbeiter zuweisen |
|
||||
| `POST` | `/dsr/{id}/extend` | Frist verlaengern (+60 Tage, mit Begruendung) |
|
||||
| `POST` | `/dsr/{id}/complete` | Abschliessen (mit Zusammenfassung) |
|
||||
| `POST` | `/dsr/{id}/reject` | Ablehnen (mit Begruendung) |
|
||||
|
||||
### Kommunikation & History
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `GET` | `/dsr/{id}/history` | Status-Audit-Trail |
|
||||
| `GET` | `/dsr/{id}/communications` | Kommunikations-Log |
|
||||
| `POST` | `/dsr/{id}/communicate` | Nachricht senden (email/portal/phone) |
|
||||
|
||||
### Art. 17(3) Ausnahmen-Pruefung
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `GET` | `/dsr/{id}/exception-checks` | Ausnahmen-Checks abrufen |
|
||||
| `POST` | `/dsr/{id}/exception-checks/init` | 6 Standard-Checks initialisieren |
|
||||
| `PUT` | `/dsr/{id}/exception-checks/{checkId}` | Einzelnen Check aktualisieren |
|
||||
|
||||
Die 6 Standard-Ausnahmen (Art. 17 Abs. 3 DSGVO):
|
||||
|
||||
1. Ausuebung der Meinungs- und Informationsfreiheit
|
||||
2. Erfuellung rechtlicher Verpflichtungen
|
||||
3. Gruende des oeffentlichen Interesses (Gesundheit)
|
||||
4. Archivzwecke im oeffentlichen Interesse
|
||||
5. Geltendmachung/Ausuebung/Verteidigung von Rechtsanspruechen
|
||||
6. Statistische Zwecke (§ 27 BDSG)
|
||||
|
||||
### Template-Verwaltung
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `GET` | `/dsr/templates` | Alle Kommunikationsvorlagen |
|
||||
| `GET` | `/dsr/templates/published` | Publizierte Vorlagen (Filter: request_type, language) |
|
||||
| `GET` | `/dsr/templates/{id}/versions` | Versionen einer Vorlage |
|
||||
| `POST` | `/dsr/templates/{id}/versions` | Neue Version erstellen |
|
||||
| `PUT` | `/dsr/template-versions/{id}/publish` | Version publizieren |
|
||||
|
||||
### Fristen-Verarbeitung
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `POST` | `/dsr/deadlines/process` | Ueberfaellige DSRs markieren (Batch-Job) |
|
||||
|
||||
---
|
||||
|
||||
## DB-Tabellen (Migration 026)
|
||||
|
||||
| Tabelle | Beschreibung |
|
||||
|---------|--------------|
|
||||
| `compliance_dsr_requests` | Haupttabelle (26+ Spalten, inkl. request_number Sequence) |
|
||||
| `compliance_dsr_status_history` | Immutabler Status-Audit-Trail |
|
||||
| `compliance_dsr_communications` | E-Mail/Portal-Kommunikation |
|
||||
| `compliance_dsr_templates` | Kommunikationsvorlagen |
|
||||
| `compliance_dsr_template_versions` | Versionierte Template-Inhalte |
|
||||
| `compliance_dsr_exception_checks` | Art. 17(3) Ausnahmen-Pruefungen |
|
||||
|
||||
**Sequence:** `compliance_dsr_request_number_seq` — Generiert fortlaufende Antragsnummern (`DSR-2026-000001`).
|
||||
|
||||
---
|
||||
|
||||
## Datenmodell (DSR-Anfrage)
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "uuid",
|
||||
"tenant_id": "uuid",
|
||||
"request_number": "DSR-2026-000001",
|
||||
"request_type": "erasure",
|
||||
"status": "processing",
|
||||
"priority": "high",
|
||||
"subject_name": "Max Mustermann",
|
||||
"subject_email": "max@beispiel.de",
|
||||
"description": "Bitte alle personenbezogenen Daten loeschen",
|
||||
"assigned_to": "dsb@firma.de",
|
||||
"deadline": "2026-04-04T00:00:00Z",
|
||||
"identity_verified": true,
|
||||
"identity_verification_method": "id_card",
|
||||
"created_at": "2026-03-05T10:00:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Frontend-Proxy
|
||||
|
||||
Das DSR-Frontend nutzt den bestehenden Compliance-Catch-All-Proxy:
|
||||
|
||||
| Frontend-Route | Ziel |
|
||||
|----------------|------|
|
||||
| `/api/sdk/v1/compliance/dsr/*` | `backend:8002/api/compliance/dsr/*` |
|
||||
|
||||
!!! info "Migration vom consent-service"
|
||||
Vor der Migration wurden DSR-Anfragen ueber `dsr_api.py` und `dsr_admin_api.py` als Proxy
|
||||
an den Go consent-service weitergeleitet. Diese Proxy-Dateien wurden entfernt.
|
||||
Alle DSR-Daten liegen jetzt nativ in der Compliance-Datenbank.
|
||||
191
docs-src/services/sdk-modules/email-templates.md
Normal file
191
docs-src/services/sdk-modules/email-templates.md
Normal file
@@ -0,0 +1,191 @@
|
||||
# E-Mail-Templates
|
||||
|
||||
Das E-Mail-Templates-Modul verwaltet **Benachrichtigungs-Vorlagen** fuer alle Compliance-Prozesse:
|
||||
DSR-Bestaetigung, Einwilligungsnachweise, Datenschutzverletzungen, Vendor-Management und mehr.
|
||||
Es bietet einen vollstaendigen **Approval-Workflow** (Draft → Review → Approved → Published),
|
||||
Variablen-Substitution und eine Vorschau-Funktion.
|
||||
|
||||
---
|
||||
|
||||
## Uebersicht
|
||||
|
||||
| Eigenschaft | Wert |
|
||||
|-------------|------|
|
||||
| **SDK-Route** | `/sdk/email-templates` |
|
||||
| **Backend** | `backend-compliance:8002` |
|
||||
| **Router-Prefix** | `/api/compliance/email-templates` |
|
||||
| **Paket** | Betrieb (seq 4350) |
|
||||
| **DB-Migration** | 027_email_templates.sql |
|
||||
| **Tests** | 47 Tests (`test_email_template_routes.py`) |
|
||||
| **Status** | 100% — Backend + Frontend |
|
||||
|
||||
---
|
||||
|
||||
## Template-Typen (20)
|
||||
|
||||
| Typ | Kategorie | Beschreibung |
|
||||
|-----|-----------|--------------|
|
||||
| `welcome` | Allgemein | Willkommens-E-Mail |
|
||||
| `verification` | Allgemein | E-Mail-Verifizierung |
|
||||
| `password_reset` | Allgemein | Passwort zuruecksetzen |
|
||||
| `account_locked` | Sicherheit | Konto gesperrt |
|
||||
| `consent_granted` | Einwilligung | Einwilligung erteilt |
|
||||
| `consent_withdrawn` | Einwilligung | Einwilligung widerrufen |
|
||||
| `consent_reminder` | Einwilligung | Einwilligungs-Erinnerung |
|
||||
| `dsr_received` | DSR | Anfrage eingegangen |
|
||||
| `dsr_processing` | DSR | Anfrage in Bearbeitung |
|
||||
| `dsr_completed` | DSR | Anfrage abgeschlossen |
|
||||
| `dsr_rejected` | DSR | Anfrage abgelehnt |
|
||||
| `breach_notification` | Datenschutz | Datenschutzverletzung |
|
||||
| `breach_authority` | Datenschutz | Meldung an Aufsichtsbehoerde |
|
||||
| `vendor_assessment` | Vendor | Auftragsverarbeiter-Bewertung |
|
||||
| `vendor_reminder` | Vendor | Auftragsverarbeiter-Erinnerung |
|
||||
| `training_assigned` | Schulung | Schulung zugewiesen |
|
||||
| `training_reminder` | Schulung | Schulungs-Erinnerung |
|
||||
| `training_completed` | Schulung | Schulung abgeschlossen |
|
||||
| `audit_scheduled` | Audit | Audit geplant |
|
||||
| `audit_completed` | Audit | Audit abgeschlossen |
|
||||
|
||||
---
|
||||
|
||||
## Approval-Workflow
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A[draft] --> B[review]
|
||||
B --> C[approved]
|
||||
B --> D[rejected]
|
||||
D --> A
|
||||
C --> E[published]
|
||||
```
|
||||
|
||||
- **Draft:** Vorlage wird erstellt/bearbeitet
|
||||
- **Review:** Zur Pruefung eingereicht
|
||||
- **Approved:** Von DSB/Compliance-Beauftragtem freigegeben
|
||||
- **Published:** Aktiv im System — wird fuer E-Mail-Versand verwendet
|
||||
- **Rejected:** Zurueck an Autor mit Begruendung
|
||||
|
||||
---
|
||||
|
||||
## API-Endpoints
|
||||
|
||||
### Template-Verwaltung
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `GET` | `/email-templates/types` | Verfuegbare Template-Typen mit Variablen |
|
||||
| `GET` | `/email-templates` | Alle Templates (mit letzter publizierter Version) |
|
||||
| `POST` | `/email-templates` | Template erstellen |
|
||||
| `GET` | `/email-templates/{id}` | Template-Detail |
|
||||
| `GET` | `/email-templates/default/{type}` | Default-Content fuer einen Typ |
|
||||
| `POST` | `/email-templates/initialize` | Default-Templates initialisieren (20 Typen) |
|
||||
|
||||
### Version-Management
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `GET` | `/email-templates/{id}/versions` | Versionen eines Templates |
|
||||
| `POST` | `/email-templates/versions` | Version erstellen |
|
||||
| `POST` | `/email-templates/{id}/versions` | Version fuer Template erstellen |
|
||||
| `GET` | `/email-templates/versions/{id}` | Version-Detail |
|
||||
| `PUT` | `/email-templates/versions/{id}` | Draft aktualisieren |
|
||||
|
||||
### Workflow-Aktionen
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `POST` | `/email-templates/versions/{id}/submit` | Zur Pruefung einreichen |
|
||||
| `POST` | `/email-templates/versions/{id}/approve` | Genehmigen |
|
||||
| `POST` | `/email-templates/versions/{id}/reject` | Ablehnen (mit Begruendung) |
|
||||
| `POST` | `/email-templates/versions/{id}/publish` | Publizieren |
|
||||
|
||||
### Vorschau & Test
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `POST` | `/email-templates/versions/{id}/preview` | Vorschau mit Test-Variablen |
|
||||
| `POST` | `/email-templates/versions/{id}/send-test` | Test-E-Mail senden (Simulation) |
|
||||
|
||||
### Einstellungen & Logs
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `GET` | `/email-templates/settings` | Globale Einstellungen (Branding) |
|
||||
| `PUT` | `/email-templates/settings` | Einstellungen speichern |
|
||||
| `GET` | `/email-templates/stats` | Statistiken (gesamt, publiziert, Entwuerfe) |
|
||||
| `GET` | `/email-templates/logs` | Send-Logs (paginiert) |
|
||||
|
||||
---
|
||||
|
||||
## Variablen
|
||||
|
||||
Templates unterstuetzen **Mustache-Variablen** (`{{variable}}`), die beim Versand ersetzt werden:
|
||||
|
||||
| Variable | Beschreibung | Verfuegbar in |
|
||||
|----------|--------------|---------------|
|
||||
| `{{user_name}}` | Name des Empfaengers | Alle |
|
||||
| `{{company_name}}` | Unternehmensname | Alle |
|
||||
| `{{date}}` | Aktuelles Datum | Alle |
|
||||
| `{{request_number}}` | DSR-Antragsnummer | DSR-Templates |
|
||||
| `{{request_type}}` | Art der Anfrage | DSR-Templates |
|
||||
| `{{deadline}}` | Bearbeitungsfrist | DSR-Templates |
|
||||
| `{{document_title}}` | Dokumenttitel | Consent-Templates |
|
||||
| `{{breach_description}}` | Vorfallbeschreibung | Breach-Templates |
|
||||
| `{{training_title}}` | Schulungstitel | Training-Templates |
|
||||
| `{{vendor_name}}` | Auftragsverarbeiter | Vendor-Templates |
|
||||
| `{{portal_url}}` | Link zum Portal | DSR, Consent |
|
||||
|
||||
---
|
||||
|
||||
## DB-Tabellen (Migration 027)
|
||||
|
||||
| Tabelle | Beschreibung |
|
||||
|---------|--------------|
|
||||
| `compliance_email_templates` | Template-Definitionen (type, name, is_active) |
|
||||
| `compliance_email_template_versions` | Versionierter Content (subject, body_html, body_text, status) |
|
||||
| `compliance_email_template_approvals` | Approval-Workflow (approve/reject mit Kommentar) |
|
||||
| `compliance_email_send_logs` | Audit-Trail gesendeter E-Mails |
|
||||
| `compliance_email_template_settings` | Globale Einstellungen (Logo, Farben, Absender, Footer) |
|
||||
|
||||
---
|
||||
|
||||
## Datenmodell (Template-Version)
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "uuid",
|
||||
"template_id": "uuid",
|
||||
"version_number": 2,
|
||||
"subject": "Ihre Betroffenenanfrage {{request_number}}",
|
||||
"body_html": "<h1>Sehr geehrte/r {{user_name}}</h1>...",
|
||||
"body_text": "Sehr geehrte/r {{user_name}}...",
|
||||
"language": "de",
|
||||
"status": "published",
|
||||
"created_by": "dsb@firma.de",
|
||||
"created_at": "2026-03-05T10:00:00Z",
|
||||
"published_at": "2026-03-05T14:00:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Frontend
|
||||
|
||||
**Route:** `/sdk/email-templates` | **Datei:** `app/(sdk)/sdk/email-templates/page.tsx`
|
||||
|
||||
**4 Tabs:**
|
||||
|
||||
1. **Templates** — Grid aller 20 Template-Typen mit Status-Badge und letzter Aenderung
|
||||
2. **Editor** — Split-View: HTML-Editor + Live-Vorschau, klickbare Variablen-Chips
|
||||
3. **Einstellungen** — Branding: Absender, Logo-URL, Primaerfarbe, Footer-Text
|
||||
4. **Logs** — Tabelle mit Send-History (Empfaenger, Template-Typ, Status, Datum)
|
||||
|
||||
---
|
||||
|
||||
## Frontend-Proxy
|
||||
|
||||
| Frontend-Route | Ziel |
|
||||
|----------------|------|
|
||||
| `/api/sdk/v1/compliance/email-templates/*` | `backend:8002/api/compliance/email-templates/*` |
|
||||
|
||||
Nutzt den bestehenden Compliance-Catch-All-Proxy (`/api/sdk/v1/compliance/[[...path]]`).
|
||||
@@ -15,6 +15,8 @@ Alle vier Module sind vollstaendig backend-persistent und bieten CRUD-Operatione
|
||||
| [Rechtliche Vorlagen](#rechtliche-vorlagen-consent) | `/sdk/consent` | CP-DOC (REQUIRED) | ✅ Migration 007 | 100% |
|
||||
| [Cookie Banner](#cookie-banner) | `/sdk/cookie-banner` | CP-COOK (REQUIRED) | ✅ Migration 008 | 100% |
|
||||
| [Document Workflow](#document-workflow) | `/sdk/workflow` | CP-WRKF (REQUIRED) | ✅ Migration 007 | 100% |
|
||||
| [User-Consents & Audit](#user-consents--audit) | `/sdk/consent` | — | ✅ Migration 028 | 100% |
|
||||
| [Cookie-Kategorien](#cookie-kategorien) | `/sdk/cookie-banner` | — | ✅ Migration 028 | 100% |
|
||||
|
||||
---
|
||||
|
||||
@@ -312,6 +314,83 @@ Alle Aenderungen an Einwilligungen werden automatisch in der Tabelle
|
||||
|
||||
---
|
||||
|
||||
## User-Consents & Audit
|
||||
|
||||
**Erweiterung der Legal Documents** (Migration 028) | **Rechtsgrundlage:** Art. 7 DSGVO
|
||||
|
||||
Diese Endpoints erweitern die bestehende Dokumentenverwaltung um **End-User-Consent-Tracking**:
|
||||
Benutzer koennen ihre Zustimmung zu rechtlichen Dokumenten erteilen und widerrufen.
|
||||
|
||||
### API-Endpoints
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `GET` | `/api/compliance/legal-documents/public` | Aktive Dokumente (fuer Endbenutzer) |
|
||||
| `GET` | `/api/compliance/legal-documents/public/{type}/latest` | Neueste publizierte Version |
|
||||
| `POST` | `/api/compliance/legal-documents/consents` | Consent erfassen (user_id, document_version_id) |
|
||||
| `GET` | `/api/compliance/legal-documents/consents/my` | Eigene Consents (Filter: X-User-ID) |
|
||||
| `GET` | `/api/compliance/legal-documents/consents/check/{type}` | Consent-Status pruefen |
|
||||
| `DELETE` | `/api/compliance/legal-documents/consents/{id}` | Consent widerrufen (Art. 7 Abs. 3) |
|
||||
| `GET` | `/api/compliance/legal-documents/stats/consents` | Consent-Statistiken |
|
||||
| `GET` | `/api/compliance/legal-documents/audit-log` | Audit-Trail (paginiert) |
|
||||
|
||||
### DB-Tabellen (Migration 028)
|
||||
|
||||
| Tabelle | Beschreibung |
|
||||
|---------|--------------|
|
||||
| `compliance_user_consents` | End-User Consent-Records (user_id, document_version_id, ip, user_agent) |
|
||||
| `compliance_consent_audit_log` | Audit-Trail (consent_given, consent_withdrawn, etc.) |
|
||||
|
||||
### Datenmodell (User-Consent)
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "uuid",
|
||||
"tenant_id": "uuid",
|
||||
"user_id": "nutzer@beispiel.de",
|
||||
"document_version_id": "uuid",
|
||||
"consented": true,
|
||||
"ip_address": "192.168.1.1",
|
||||
"user_agent": "Mozilla/5.0...",
|
||||
"consented_at": "2026-03-05T10:00:00Z",
|
||||
"withdrawn_at": null
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Cookie-Kategorien
|
||||
|
||||
**Erweiterung der Legal Documents** (Migration 028) | **Rechtsgrundlage:** TTDSG § 25
|
||||
|
||||
Verwaltung zweisprachiger Cookie-Kategorien (de/en) mit Pflicht-Flag und Sortierung.
|
||||
|
||||
### API-Endpoints
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `GET` | `/api/compliance/legal-documents/cookie-categories` | Alle Kategorien |
|
||||
| `POST` | `/api/compliance/legal-documents/cookie-categories` | Kategorie erstellen |
|
||||
| `PUT` | `/api/compliance/legal-documents/cookie-categories/{id}` | Kategorie aktualisieren |
|
||||
| `DELETE` | `/api/compliance/legal-documents/cookie-categories/{id}` | Kategorie loeschen |
|
||||
|
||||
### DB-Tabelle (Migration 028)
|
||||
|
||||
| Tabelle | Beschreibung |
|
||||
|---------|--------------|
|
||||
| `compliance_cookie_categories` | Cookie-Kategorien (name_de, name_en, is_required, sort_order) |
|
||||
|
||||
### Default-Kategorien
|
||||
|
||||
| Key | Deutsch | Englisch | Pflicht |
|
||||
|-----|---------|----------|---------|
|
||||
| `necessary` | Notwendig | Necessary | ✅ |
|
||||
| `functional` | Funktional | Functional | — |
|
||||
| `analytics` | Analyse | Analytics | — |
|
||||
| `marketing` | Marketing | Marketing | — |
|
||||
|
||||
---
|
||||
|
||||
## Datenfluss Paket 4
|
||||
|
||||
```mermaid
|
||||
|
||||
@@ -69,6 +69,9 @@ nav:
|
||||
- Dokumentations-Module (Paket 3+): services/sdk-modules/dokumentations-module.md
|
||||
- DSFA (Art. 35 DSGVO): services/sdk-modules/dsfa.md
|
||||
- Rechtliche Texte (Paket 4): services/sdk-modules/rechtliche-texte.md
|
||||
- DSR (Betroffenenrechte): services/sdk-modules/dsr.md
|
||||
- E-Mail-Templates: services/sdk-modules/email-templates.md
|
||||
- Banner Consent: services/sdk-modules/banner-consent.md
|
||||
- Academy: services/sdk-modules/academy.md
|
||||
- Whistleblower: services/sdk-modules/whistleblower.md
|
||||
- Incidents: services/sdk-modules/incidents.md
|
||||
|
||||
Reference in New Issue
Block a user