From 451616b10ef70d49db34665ebcd75fa0fe6496b0 Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Thu, 5 Mar 2026 08:22:38 +0100 Subject: [PATCH] docs: MkDocs-Dokumentation fuer DSR, E-Mail-Templates, Banner Consent - 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 --- .../services/sdk-modules/banner-consent.md | 157 ++++++++++++++ docs-src/services/sdk-modules/dsr.md | 173 ++++++++++++++++ .../services/sdk-modules/email-templates.md | 191 ++++++++++++++++++ .../services/sdk-modules/rechtliche-texte.md | 79 ++++++++ mkdocs.yml | 3 + 5 files changed, 603 insertions(+) create mode 100644 docs-src/services/sdk-modules/banner-consent.md create mode 100644 docs-src/services/sdk-modules/dsr.md create mode 100644 docs-src/services/sdk-modules/email-templates.md diff --git a/docs-src/services/sdk-modules/banner-consent.md b/docs-src/services/sdk-modules/banner-consent.md new file mode 100644 index 0000000..53dcc96 --- /dev/null +++ b/docs-src/services/sdk-modules/banner-consent.md @@ -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]]`). diff --git a/docs-src/services/sdk-modules/dsr.md b/docs-src/services/sdk-modules/dsr.md new file mode 100644 index 0000000..d7f4a1c --- /dev/null +++ b/docs-src/services/sdk-modules/dsr.md @@ -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. diff --git a/docs-src/services/sdk-modules/email-templates.md b/docs-src/services/sdk-modules/email-templates.md new file mode 100644 index 0000000..e89425f --- /dev/null +++ b/docs-src/services/sdk-modules/email-templates.md @@ -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": "

Sehr geehrte/r {{user_name}}

...", + "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]]`). diff --git a/docs-src/services/sdk-modules/rechtliche-texte.md b/docs-src/services/sdk-modules/rechtliche-texte.md index 2d7a9d1..100f8dd 100644 --- a/docs-src/services/sdk-modules/rechtliche-texte.md +++ b/docs-src/services/sdk-modules/rechtliche-texte.md @@ -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 diff --git a/mkdocs.yml b/mkdocs.yml index dbd5e0e..b2eae9d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -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