From a9de7b4010cd0c14535ee82c2a8f2068f47d184b Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Wed, 4 Mar 2026 22:55:31 +0100 Subject: [PATCH] =?UTF-8?q?docs:=20DSFA=20Modul=20=E2=80=94=20MkDocs=20+?= =?UTF-8?q?=20Developer=20Portal=20Dokumentation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - docs-src/services/sdk-modules/dsfa.md: vollständige DSFA-Dokumentation (Endpoints, Datenmodell, Status-Workflow, DB-Tabellen, Tests, Compliance-Kontext) - mkdocs.yml: DSFA in Navigation unter SDK Module eingefügt - docs-src/index.md: DSFA + Paket-Links in Services-Dokumentation - docs-src/services/sdk-modules/dokumentations-module.md: DSFA in Übersichtstabelle - developer-portal/app/api/dsfa/page.tsx: vollständige API-Referenz mit cURL-Beispielen - developer-portal/app/api/page.tsx: DSFA-Abschnitt mit allen 8 Endpoints Co-Authored-By: Claude Sonnet 4.6 --- developer-portal/app/api/dsfa/page.tsx | 282 ++++++++++++++++++ developer-portal/app/api/page.tsx | 21 ++ docs-src/index.md | 3 + .../sdk-modules/dokumentations-module.md | 1 + docs-src/services/sdk-modules/dsfa.md | 262 ++++++++++++++++ mkdocs.yml | 1 + 6 files changed, 570 insertions(+) create mode 100644 developer-portal/app/api/dsfa/page.tsx create mode 100644 docs-src/services/sdk-modules/dsfa.md diff --git a/developer-portal/app/api/dsfa/page.tsx b/developer-portal/app/api/dsfa/page.tsx new file mode 100644 index 0000000..8970bfd --- /dev/null +++ b/developer-portal/app/api/dsfa/page.tsx @@ -0,0 +1,282 @@ +import { DevPortalLayout, ApiEndpoint, CodeBlock, ParameterTable, InfoBox } from '@/components/DevPortalLayout' + +export default function DsfaApiPage() { + return ( + +

Übersicht

+

+ Die DSFA API ermöglicht die vollständige Verwaltung von Datenschutz-Folgenabschätzungen + gemäß Art. 35 DSGVO. Alle DSFAs werden backend-persistent gespeichert und mit + vollständigem Audit-Trail protokolliert. +

+ + + Eine DSFA ist zwingend erforderlich bei voraussichtlich hohem Risiko für Betroffene: + automatisierte Entscheidungen / Profiling, umfangreiche Verarbeitung sensibler Daten, + systematische Überwachung öffentlicher Bereiche oder KI-Hochrisiko-Systeme (EU AI Act). + + + + Alle Endpoints akzeptieren tenant_id als Query-Parameter. + Ohne Angabe wird default als Tenant-ID verwendet. + + + {/* ===================================================================== */} + {/* Liste */} + {/* ===================================================================== */} + +

GET /dsfa

+

Gibt eine gefilterte Liste aller DSFAs für einen Tenant zurück.

+ +

Query-Parameter

+ + + +{`curl -X GET "https://api.breakpilot.io/sdk/v1/dsfa?tenant_id=mein-tenant&status=in-review" \\ + -H "Authorization: Bearer YOUR_API_KEY"`} + + + +{`[ + { + "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", + "tenant_id": "mein-tenant", + "title": "DSFA - Bewerber-Management-System", + "description": "KI-gestütztes Bewerber-Screening", + "status": "in-review", + "risk_level": "high", + "processing_activity": "Automatisierte Bewertung von Bewerbungen", + "data_categories": ["Kontaktdaten", "Beruflicher Werdegang"], + "recipients": ["HR-Abteilung"], + "measures": ["Verschlüsselung", "Menschliche Prüfung"], + "approved_by": null, + "approved_at": null, + "created_by": "admin", + "created_at": "2026-03-04T10:00:00", + "updated_at": "2026-03-04T10:00:00" + } +]`} + + + {/* ===================================================================== */} + {/* Erstellen */} + {/* ===================================================================== */} + +

POST /dsfa

+

Erstellt eine neue DSFA. Gibt HTTP 201 mit dem erstellten Datensatz zurück.

+ + +{`curl -X POST "https://api.breakpilot.io/sdk/v1/dsfa?tenant_id=mein-tenant" \\ + -H "Authorization: Bearer YOUR_API_KEY" \\ + -H "Content-Type: application/json" \\ + -d '{ + "title": "DSFA - Video-Überwachung Büro", + "description": "Videoüberwachung zu Sicherheitszwecken", + "status": "draft", + "risk_level": "medium", + "processing_activity": "Videoüberwachung im Eingangsbereich", + "data_categories": ["Bilddaten", "Bewegungsdaten"], + "recipients": ["Sicherheitsdienst"], + "measures": ["Löschfristen 72h", "Hinweisschilder", "Zugangsbeschränkung"], + "created_by": "dsb@beispiel.de" + }'`} + + + +{`{ + "id": "7b3a1c9d-4e2f-4a8b-9c1d-5f6a7b8c9d0e", + "tenant_id": "mein-tenant", + "title": "DSFA - Video-Überwachung Büro", + "status": "draft", + "risk_level": "medium", + "data_categories": ["Bilddaten", "Bewegungsdaten"], + "measures": ["Löschfristen 72h", "Hinweisschilder", "Zugangsbeschränkung"], + "created_at": "2026-03-04T12:00:00", + "updated_at": "2026-03-04T12:00:00" +}`} + + + + status muss einer der Werte draft, in-review,{' '} + approved, needs-update sein. + risk_level muss low, medium, high{' '} + oder critical sein. Ungültige Werte → HTTP 422. + + + {/* ===================================================================== */} + {/* Einzeln abrufen */} + {/* ===================================================================== */} + +

GET /dsfa/{'{id}'}

+

Gibt eine einzelne DSFA anhand ihrer UUID zurück.

+ + +{`curl -X GET "https://api.breakpilot.io/sdk/v1/dsfa/7b3a1c9d-4e2f-4a8b-9c1d-5f6a7b8c9d0e?tenant_id=mein-tenant" \\ + -H "Authorization: Bearer YOUR_API_KEY"`} + + + {/* ===================================================================== */} + {/* Aktualisieren */} + {/* ===================================================================== */} + +

PUT /dsfa/{'{id}'}

+

+ Aktualisiert eine DSFA. Alle Felder sind optional (Partial Update mit{' '} + exclude_none). Nur gesetzte Felder werden überschrieben. +

+ + +{`curl -X PUT "https://api.breakpilot.io/sdk/v1/dsfa/7b3a1c9d?tenant_id=mein-tenant" \\ + -H "Authorization: Bearer YOUR_API_KEY" \\ + -H "Content-Type: application/json" \\ + -d '{ + "measures": ["Löschfristen 72h", "Hinweisschilder", "Biometrischer Zugang"], + "risk_level": "high" + }'`} + + + {/* ===================================================================== */} + {/* Status-Wechsel */} + {/* ===================================================================== */} + +

PATCH /dsfa/{'{id}'}/status

+

+ Schnell-Statuswechsel ohne vollständiges Update. Bei Status{' '} + approved wird approved_at automatisch gesetzt. +

+ +

Request Body

+ + + +{`curl -X PATCH "https://api.breakpilot.io/sdk/v1/dsfa/7b3a1c9d/status?tenant_id=mein-tenant" \\ + -H "Authorization: Bearer YOUR_API_KEY" \\ + -H "Content-Type: application/json" \\ + -d '{ + "status": "approved", + "approved_by": "Max Mustermann (DSB)" + }'`} + + + {/* ===================================================================== */} + {/* Löschen */} + {/* ===================================================================== */} + +

DELETE /dsfa/{'{id}'}

+

+ Löscht eine DSFA gemäß Art. 17 DSGVO. Die Löschung wird im Audit-Log protokolliert. +

+ + +{`curl -X DELETE "https://api.breakpilot.io/sdk/v1/dsfa/7b3a1c9d?tenant_id=mein-tenant" \\ + -H "Authorization: Bearer YOUR_API_KEY"`} + + + +{`{ + "success": true, + "message": "DSFA 7b3a1c9d gelöscht" +}`} + + + {/* ===================================================================== */} + {/* Statistiken */} + {/* ===================================================================== */} + +

GET /dsfa/stats

+

Gibt Zähler nach Status und Risiko-Level zurück.

+ + +{`curl -X GET "https://api.breakpilot.io/sdk/v1/dsfa/stats?tenant_id=mein-tenant" \\ + -H "Authorization: Bearer YOUR_API_KEY"`} + + + +{`{ + "total": 5, + "by_status": { + "draft": 2, + "in-review": 1, + "approved": 2 + }, + "by_risk_level": { + "low": 1, + "medium": 2, + "high": 2 + }, + "draft_count": 2, + "in_review_count": 1, + "approved_count": 2, + "needs_update_count": 0 +}`} + + + {/* ===================================================================== */} + {/* Audit-Log */} + {/* ===================================================================== */} + +

GET /dsfa/audit-log

+

Gibt den vollständigen Audit-Trail aller DSFA-Aktionen zurück.

+ +

Query-Parameter

+ + + +{`[ + { + "id": "uuid", + "tenant_id": "mein-tenant", + "dsfa_id": "7b3a1c9d-...", + "action": "STATUS_CHANGE", + "changed_by": "system", + "old_values": { "status": "in-review" }, + "new_values": { "status": "approved" }, + "created_at": "2026-03-04T12:30:00" + } +]`} + + + + Folgende Aktionen werden protokolliert:{' '} + CREATE, UPDATE, DELETE, STATUS_CHANGE. + + + {/* ===================================================================== */} + {/* Alle Endpoints */} + {/* ===================================================================== */} + +

Alle Endpoints im Überblick

+ + + + + + + + + +
+ ) +} diff --git a/developer-portal/app/api/page.tsx b/developer-portal/app/api/page.tsx index 10023b7..c89b183 100644 --- a/developer-portal/app/api/page.tsx +++ b/developer-portal/app/api/page.tsx @@ -142,6 +142,27 @@ export default function ApiReferencePage() {

+

DSFA — Datenschutz-Folgenabschätzung

+

+ Verwalten Sie Datenschutz-Folgenabschätzungen gemäß Art. 35 DSGVO mit vollständigem + Audit-Trail, Status-Workflow und Risikobewertung. +

+ + + + + + + + + + +

+ + → Vollständige DSFA API Dokumentation + +

+

Response Format

Alle Responses folgen einem einheitlichen Format: diff --git a/docs-src/index.md b/docs-src/index.md index d88f511..25770e8 100644 --- a/docs-src/index.md +++ b/docs-src/index.md @@ -142,6 +142,9 @@ Compliance-Services nutzen folgende Core-Infrastruktur: - [Document Crawler](services/document-crawler/index.md) - SDK-Module: - [Analyse-Module (Paket 2)](services/sdk-modules/analyse-module.md) — Requirements, Controls, Evidence, Risk Matrix, AI Act, Audit Checklist, Audit Report + - [Dokumentations-Module (Paket 3+)](services/sdk-modules/dokumentations-module.md) — VVT, Source Policy, Document Generator, Audit Checklist, Training Engine + - [DSFA (Art. 35 DSGVO)](services/sdk-modules/dsfa.md) — vollständig backend-persistent, Migration 024 + - [Rechtliche Texte (Paket 4)](services/sdk-modules/rechtliche-texte.md) — Einwilligungen, Consent, Cookie Banner, Workflow - [Academy](services/sdk-modules/academy.md) - [Whistleblower](services/sdk-modules/whistleblower.md) - [Incidents](services/sdk-modules/incidents.md) diff --git a/docs-src/services/sdk-modules/dokumentations-module.md b/docs-src/services/sdk-modules/dokumentations-module.md index ee6055f..459b095 100644 --- a/docs-src/services/sdk-modules/dokumentations-module.md +++ b/docs-src/services/sdk-modules/dokumentations-module.md @@ -11,6 +11,7 @@ Alle Module sind vollständig backend-persistent und bieten CRUD-Operationen üb | Modul | SDK-Route | Paket | Checkpoint | Status | |-------|-----------|-------|-----------|--------| | [VVT](#vvt) | `/sdk/vvt` | Dokumentation | CP-VVT (REQUIRED / DSB) | 100% | +| [DSFA](dsfa.md) | `/sdk/dsfa` | Dokumentation | CP-DSFA (REQUIRED / DSB) | 100% | | [Source Policy](#source-policy) | `/sdk/source-policy` | Vorbereitung | CP-SPOL (REQUIRED) | 100% | | [Document Generator](#document-generator) | `/sdk/document-generator` | Rechtliche Texte | CP-DOCGEN (RECOMMENDED) | 100% | | [Audit Checklist](#audit-checklist) | `/sdk/audit-checklist` | Analyse | CP-CHK (RECOMMENDED) | 100% | diff --git a/docs-src/services/sdk-modules/dsfa.md b/docs-src/services/sdk-modules/dsfa.md new file mode 100644 index 0000000..2a7e6d4 --- /dev/null +++ b/docs-src/services/sdk-modules/dsfa.md @@ -0,0 +1,262 @@ +# DSFA — Datenschutz-Folgenabschätzung (Art. 35 DSGVO) + +Das DSFA-Modul implementiert die Datenschutz-Folgenabschätzung gemäß Art. 35 DSGVO. +Es ist vollständig backend-persistent mit CRUD-Operationen, Audit-Log und Schnell-Statuswechsel. + +**Route:** `/sdk/dsfa` | **Backend:** `backend-compliance:8002` | **Migration:** `024_dsfa.sql` + +--- + +## Übersicht + +| Checkpoint | Reviewer | Rechtsgrundlage | Status | +|-----------|----------|-----------------|--------| +| CP-DSFA (REQUIRED) | DSB | Art. 35 DSGVO | ✅ 100% | + +**Wann ist eine DSFA Pflicht?** +Eine Datenschutz-Folgenabschätzung ist nach Art. 35 Abs. 1 DSGVO zwingend erforderlich, wenn +eine Verarbeitungstätigkeit voraussichtlich ein **hohes Risiko** für die Rechte und Freiheiten +natürlicher Personen mit sich bringt. Typische Fälle: + +- Automatisierte Entscheidungen / Profiling (Art. 35 Abs. 3a) +- Umfangreiche Verarbeitung besonderer Kategorien (Art. 9/10 DSGVO) +- Systematische Überwachung öffentlicher Bereiche (Art. 35 Abs. 3c) +- KI-basierte Systeme im Hochrisiko-Bereich (EU AI Act) + +--- + +## Funktionen + +- **CRUD-Operationen:** Anlegen, Lesen, Aktualisieren, Löschen von DSFA-Datensätzen +- **Status-Workflow:** `draft` → `in-review` → `approved` / `needs-update` +- **Risikostufen:** `low` / `medium` / `high` / `critical` +- **Datenkategorien:** Mehrfachauswahl der verarbeiteten Datenkategorien (JSONB) +- **Empfänger:** Dokumentation der Datenempfänger (JSONB) +- **Schutzmaßnahmen:** Erfassung technischer und organisatorischer Maßnahmen (JSONB) +- **Schnell-Statuswechsel:** PATCH-Endpoint für Status-Übergang ohne vollständiges Update +- **Genehmigungsdokumentation:** `approved_by` + `approved_at` bei Status `approved` +- **Audit-Log:** Nachvollziehbare Protokollierung aller Aktionen (CREATE / UPDATE / DELETE / STATUS_CHANGE) +- **Statistiken:** Zähler nach Status und Risiko-Level +- **Filter:** Liste filterbar nach `status`, `risk_level` +- **Löschung:** DSGVO-Art.-17-konforme Löschung inkl. Audit-Log-Eintrag + +--- + +## API-Endpoints + +| Methode | Pfad | Beschreibung | +|---------|------|--------------| +| `GET` | `/api/v1/dsfa` | Liste (Filter: tenant_id, status, risk_level, skip, limit) | +| `POST` | `/api/v1/dsfa` | Neue DSFA anlegen → HTTP 201 | +| `GET` | `/api/v1/dsfa/stats` | Statistiken nach Status und Risiko | +| `GET` | `/api/v1/dsfa/audit-log` | Audit-Trail (limit, offset) | +| `GET` | `/api/v1/dsfa/{id}` | Einzelne DSFA abrufen | +| `PUT` | `/api/v1/dsfa/{id}` | DSFA vollständig aktualisieren | +| `DELETE` | `/api/v1/dsfa/{id}` | DSFA löschen (Art. 17 DSGVO) | +| `PATCH` | `/api/v1/dsfa/{id}/status` | Schnell-Statuswechsel | + +!!! info "Proxy-Route (Frontend)" + Das Admin-Frontend ruft die Endpoints über den Next.js-Proxy auf: + `/api/sdk/v1/dsfa/**` → `backend-compliance:8002/api/v1/dsfa/**` + +### Query-Parameter (GET /api/v1/dsfa) + +| Parameter | Typ | Default | Beschreibung | +|-----------|-----|---------|--------------| +| `tenant_id` | string | `default` | Mandanten-ID | +| `status` | string | — | Filter: draft, in-review, approved, needs-update | +| `risk_level` | string | — | Filter: low, medium, high, critical | +| `skip` | integer | 0 | Offset für Pagination | +| `limit` | integer | 100 | Max. Einträge (max. 500) | + +### Validierung + +Folgende Felder werden gegen erlaubte Werte geprüft (HTTP 422 bei Verstoß): + +| Feld | Erlaubte Werte | +|------|----------------| +| `status` | `draft`, `in-review`, `approved`, `needs-update` | +| `risk_level` | `low`, `medium`, `high`, `critical` | + +--- + +## Datenmodell + +### DSFA-Objekt (Response) + +```json +{ + "id": "uuid", + "tenant_id": "default", + "title": "DSFA - Bewerber-Management-System", + "description": "Datenschutz-Folgenabschätzung für KI-gestütztes Bewerber-Screening", + "status": "in-review", + "risk_level": "high", + "processing_activity": "Automatisierte Bewertung von Bewerbungsunterlagen", + "data_categories": ["Kontaktdaten", "Beruflicher Werdegang", "Qualifikationen"], + "recipients": ["HR-Abteilung", "Fachabteilungen"], + "measures": ["Verschlüsselung", "Zugriffskontrolle", "Menschliche Prüfung"], + "approved_by": null, + "approved_at": null, + "created_by": "system", + "created_at": "2026-03-04T10:00:00", + "updated_at": "2026-03-04T10:00:00" +} +``` + +### Create-Request (POST) + +```json +{ + "title": "DSFA - Video-Überwachung Büro", + "description": "Datenschutz-Folgenabschätzung für Videoüberwachung", + "status": "draft", + "risk_level": "medium", + "processing_activity": "Videoüberwachung zu Sicherheitszwecken", + "data_categories": ["Bilddaten", "Bewegungsdaten"], + "recipients": ["Sicherheitsdienst"], + "measures": ["Löschfristen", "Zugangsbeschränkung", "Hinweisschilder"], + "created_by": "admin" +} +``` + +### Status-Update-Request (PATCH /{id}/status) + +```json +{ + "status": "approved", + "approved_by": "DSB Müller" +} +``` + +### Stats-Response (GET /stats) + +```json +{ + "total": 5, + "by_status": { + "draft": 2, + "in-review": 1, + "approved": 2 + }, + "by_risk_level": { + "low": 1, + "medium": 2, + "high": 2 + }, + "draft_count": 2, + "in_review_count": 1, + "approved_count": 2, + "needs_update_count": 0 +} +``` + +--- + +## Status-Workflow + +```mermaid +stateDiagram-v2 + [*] --> draft: Neu anlegen + draft --> in-review: Zur Prüfung einreichen + in-review --> approved: Genehmigen (approved_by pflichtend) + in-review --> needs-update: Überarbeitung erforderlich + needs-update --> in-review: Erneut einreichen + approved --> needs-update: Erneut prüfen +``` + +Der Statuswechsel kann über den `PATCH /{id}/status`-Endpoint vorgenommen werden. +Bei Status `approved` wird `approved_at` automatisch auf den aktuellen Zeitstempel gesetzt. + +--- + +## DB-Tabellen + +| Tabelle | Modus | Migration | Beschreibung | +|---------|-------|-----------|--------------| +| `compliance_dsfas` | read/write | 024_dsfa.sql | DSFA-Datensätze mit JSONB-Feldern | +| `compliance_dsfa_audit_log` | write | 024_dsfa.sql | Audit-Trail aller Aktionen | + +### Schema: compliance_dsfas + +```sql +CREATE TABLE compliance_dsfas ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id VARCHAR(255) NOT NULL, + title VARCHAR(500) NOT NULL, + description TEXT DEFAULT '', + status VARCHAR(50) NOT NULL DEFAULT 'draft', + risk_level VARCHAR(50) NOT NULL DEFAULT 'low', + processing_activity VARCHAR(500) DEFAULT '', + data_categories JSONB DEFAULT '[]', + recipients JSONB DEFAULT '[]', + measures JSONB DEFAULT '[]', + approved_by VARCHAR(255), + approved_at TIMESTAMPTZ, + created_by VARCHAR(255) DEFAULT 'system', + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); +``` + +--- + +## Datei-Übersicht + +| Datei | Beschreibung | +|-------|--------------| +| `backend-compliance/migrations/024_dsfa.sql` | DB-Migration | +| `backend-compliance/compliance/api/dsfa_routes.py` | FastAPI-Router (8 Endpoints) | +| `admin-compliance/app/api/sdk/v1/dsfa/[[...path]]/route.ts` | Next.js Proxy | +| `admin-compliance/app/sdk/dsfa/page.tsx` | Frontend (vollständig API-verdrahtet) | +| `backend-compliance/tests/test_dsfa_routes.py` | 52 Unit-Tests | + +--- + +## Tests + +```bash +# DSFA-Tests (52 Tests) +cd backend-compliance && python3 -m pytest tests/test_dsfa_routes.py -v + +# Vollständiger Lauf +python3 -m pytest tests/ -v --ignore=tests/test_company_profile_routes.py +# → 680 Tests, alle grün +``` + +**Test-Klassen:** + +| Klasse | Tests | Thema | +|--------|-------|-------| +| `TestDSFACreate` | 6 | Schema-Defaults, Pflichtfelder, Arrays | +| `TestDSFAUpdate` | 5 | Partial update, exclude_none | +| `TestDSFAStatusUpdate` | 4 | Status + approved_by | +| `TestGetTenantId` | 4 | Tenant-ID Fallback | +| `TestDsfaToResponse` | 9 | Helper: null-safety, JSONB, ISO-Datum | +| `TestValidStatusValues` | 6 | Erlaubte/verbotene Status-Werte | +| `TestValidRiskLevels` | 6 | Erlaubte/verbotene Risiko-Stufen | +| `TestDSFAStatsResponse` | 5 | Felder, Typen, Zähler | +| `TestAuditLogEntry` | 4 | Schema, Null-Felder | +| `TestDSFARouterConfig` | 3 | Prefix, Tags, Registrierung | + +--- + +## Compliance-Kontext + +Die DSFA ist ein **REQUIRED**-Modul (Checkpoint CP-DSFA) — Bestandteil der Dokumentationsphase +zusammen mit VVT (CP-VVT), Löschfristen (CP-LOSCH) und Einwilligungen (CP-CONS). + +Eine abgeschlossene DSFA liefert Evidence für: + +- **TOM-Modul:** Schutzmaßnahmen aus DSFA.measures → TOM-Einträge +- **Audit Checklist:** DSFA-Abschluss ist Prüfpunkt im Audit +- **Obligations:** Verpflichtung zur DSFA nach Art. 35 DSGVO +- **VVT:** `dpia_required`-Flag in Verarbeitungstätigkeiten verweist auf DSFA-Einträge + +```mermaid +graph LR + VVT["VVT (Art. 30)"] -->|dpia_required| DSFA["DSFA (Art. 35)"] + DSFA --> TOM["TOM (Art. 32)"] + DSFA --> Audit["Audit Checklist"] + DSFA --> Obligation["Obligations"] +``` diff --git a/mkdocs.yml b/mkdocs.yml index d1cefeb..dbd5e0e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -67,6 +67,7 @@ nav: - SDK Module: - Analyse-Module (Paket 2): services/sdk-modules/analyse-module.md - 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 - Academy: services/sdk-modules/academy.md - Whistleblower: services/sdk-modules/whistleblower.md