feat(sdk): VVT master libraries, process templates, Loeschfristen profiling + document
VVT: Master library tables (7 catalogs), 500+ seed entries, process templates with instantiation, library API endpoints + 18 tests. Loeschfristen: Baseline catalog, compliance checks, profiling engine, HTML document generator, MkDocs documentation. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
292
docs-src/services/sdk-modules/loeschfristen.md
Normal file
292
docs-src/services/sdk-modules/loeschfristen.md
Normal file
@@ -0,0 +1,292 @@
|
||||
# Loeschfristen — Loeschkonzept (Art. 5/17/30 DSGVO)
|
||||
|
||||
## Uebersicht
|
||||
|
||||
Das Loeschfristen-Modul implementiert ein vollstaendiges, auditfaehiges Loeschkonzept gemaess DSGVO Art. 5 Abs. 1 lit. e (Speicherbegrenzung), Art. 17 (Recht auf Loeschung) und Art. 30 (Dokumentation der Loeschfristen im VVT).
|
||||
|
||||
**Kernfunktionen:**
|
||||
|
||||
- 3-Level-Loeschlogik (Zweckende → Aufbewahrungspflicht → Legal Hold)
|
||||
- 25 vordefinierte Baseline-Templates fuer gaengige Datenobjekte
|
||||
- 4-Schritt-Profiling-Wizard zur automatischen Policy-Generierung
|
||||
- 11 automatisierte Compliance-Checks
|
||||
- Druckfertiges Loeschkonzept-Dokument mit 11 Sektionen
|
||||
- JSON/CSV/Markdown-Export
|
||||
|
||||
## 3-Level Loeschlogik
|
||||
|
||||
Die Loeschung personenbezogener Daten folgt einer dreistufigen Priorisierung:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[Daten erhoben] --> B{Zweck erfuellt?}
|
||||
B -->|Ja| C{Aufbewahrungspflicht?}
|
||||
B -->|Nein| D[Weiter speichern]
|
||||
C -->|Ja| E{Frist abgelaufen?}
|
||||
C -->|Nein| F{Legal Hold?}
|
||||
E -->|Ja| F
|
||||
E -->|Nein| G[Aufbewahren bis Fristende]
|
||||
F -->|Ja| H[Speichern bis Legal Hold endet]
|
||||
F -->|Nein| I[Loeschung durchfuehren]
|
||||
```
|
||||
|
||||
| Level | Trigger | Beschreibung |
|
||||
|-------|---------|--------------|
|
||||
| 1 | **Zweckende** | Daten werden geloescht, wenn der Verarbeitungszweck entfaellt |
|
||||
| 2 | **Aufbewahrungspflicht** | Gesetzliche Aufbewahrungsfristen verlaengern die Speicherung |
|
||||
| 3 | **Legal Hold** | Aktive Legal Holds setzen die Loeschung aus |
|
||||
|
||||
## Frontend — 5-Tab-Aufbau
|
||||
|
||||
### Tab 1: Uebersicht
|
||||
|
||||
Statistik-Dashboard mit Filterung und Suche:
|
||||
|
||||
- Gesamtanzahl Policies, Status-Verteilung, ueberfaellige Pruefungen
|
||||
- Suche nach Datenobjekt, Tags und Status
|
||||
- Schnellaktionen: Bearbeiten, Klonen, Archivieren
|
||||
|
||||
### Tab 2: Editor
|
||||
|
||||
Vollstaendiges Bearbeitungsformular mit 35+ Feldern:
|
||||
|
||||
- Stammdaten (Datenobjekt, Beschreibung, Betroffenengruppen, Datenkategorien)
|
||||
- 3-Level-Loeschlogik (Trigger, Aufbewahrungstreiber, Frist, Startereignis)
|
||||
- Loeschmethode und -details
|
||||
- Speicherorte (Typ, Provider, Backup-Kennzeichnung)
|
||||
- Legal Hold Management (Hinzufuegen, Aktivieren, Aufheben)
|
||||
- Verantwortlichkeiten und VVT-Verknuepfung
|
||||
- Status-Workflow (Entwurf → Aktiv → Pruefung erforderlich → Archiviert)
|
||||
|
||||
### Tab 3: Generator
|
||||
|
||||
4-Schritt-Profiling-Wizard mit 16 Fragen:
|
||||
|
||||
1. **Organisation** (4 Fragen): Branche, Mitarbeiterzahl, Geschaeftsmodell, Website
|
||||
2. **Datenkategorien** (5 Fragen): HR, Buchhaltung, Vertraege, Marketing, Video
|
||||
3. **Systeme** (4 Fragen): Cloud, Backup, ERP/CRM, Zutrittskontrolle
|
||||
4. **Spezielle Anforderungen** (3 Fragen): Legal Hold, Langzeitarchivierung, Gesundheitsdaten
|
||||
|
||||
Der Wizard generiert automatisch passende Policies aus dem Baseline-Katalog.
|
||||
|
||||
### Tab 4: Export & Compliance
|
||||
|
||||
- **JSON-Export**: Vollstaendiger Policy-Export als JSON
|
||||
- **CSV-Export**: Excel-kompatibel mit BOM und Semikolon-Trennung
|
||||
- **Compliance-Bericht**: Markdown-formatierter Bericht mit Score und Empfehlungen
|
||||
- **11 Compliance-Checks**: Automatisierte Pruefung aller Policies
|
||||
|
||||
### Tab 5: Loeschkonzept-Dokument
|
||||
|
||||
Druckfertiges Loeschkonzept mit 11 Sektionen:
|
||||
|
||||
| # | Sektion | Inhalt |
|
||||
|---|---------|--------|
|
||||
| 0 | Deckblatt | Organisation, DSB, Version, Datum |
|
||||
| — | Inhaltsverzeichnis | Auto-generiert |
|
||||
| 1 | Ziel und Zweck | DSGVO Art. 5/17/30 Bezug |
|
||||
| 2 | Geltungsbereich | Systeme, Speicherorte |
|
||||
| 3 | Grundprinzipien | 5 Kernprinzipien |
|
||||
| 4 | Loeschregeln-Uebersicht | Tabelle aller Policies |
|
||||
| 5 | Detaillierte Loeschregeln | Pro Policy: Alle Felder |
|
||||
| 6 | VVT-Verknuepfung | Cross-Referenz-Tabelle |
|
||||
| 7 | Legal Hold Verfahren | Prozedur + aktive Holds |
|
||||
| 8 | Verantwortlichkeiten | Rollenmatrix |
|
||||
| 9 | Pruef-/Revisionszyklus | Review-Zeitplan |
|
||||
| 10 | Compliance-Status | Score, Issues |
|
||||
| 11 | Aenderungshistorie | Versionstabelle |
|
||||
|
||||
**Ausgabe:** HTML-Download oder PDF-Druck via Browser.
|
||||
|
||||
## Backend API (7 Endpoints)
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `GET` | `/api/v1/compliance/loeschfristen` | Alle Policies abrufen (mit Pagination) |
|
||||
| `POST` | `/api/v1/compliance/loeschfristen` | Neue Policy erstellen |
|
||||
| `GET` | `/api/v1/compliance/loeschfristen/{id}` | Einzelne Policy abrufen |
|
||||
| `PUT` | `/api/v1/compliance/loeschfristen/{id}` | Policy aktualisieren |
|
||||
| `DELETE` | `/api/v1/compliance/loeschfristen/{id}` | Policy loeschen |
|
||||
| `GET` | `/api/v1/compliance/loeschfristen/stats` | Statistik-Uebersicht |
|
||||
| `PATCH` | `/api/v1/compliance/loeschfristen/{id}/status` | Status aendern |
|
||||
|
||||
## Datenbank-Schema
|
||||
|
||||
Tabelle: `compliance_loeschfristen`
|
||||
|
||||
| Spalte | Typ | Beschreibung |
|
||||
|--------|-----|--------------|
|
||||
| `id` | UUID (PK) | Datenbank-ID |
|
||||
| `tenant_id` | UUID | Mandant |
|
||||
| `project_id` | UUID | Projekt |
|
||||
| `policy_id` | VARCHAR | Display-ID (LF-2026-001) |
|
||||
| `data_object_name` | VARCHAR | Datenobjekt |
|
||||
| `description` | TEXT | Beschreibung |
|
||||
| `affected_groups` | JSONB | Betroffenengruppen |
|
||||
| `data_categories` | JSONB | Datenkategorien |
|
||||
| `primary_purpose` | TEXT | Verarbeitungszweck |
|
||||
| `deletion_trigger` | VARCHAR | Loeschtrigger |
|
||||
| `retention_driver` | VARCHAR | Aufbewahrungstreiber |
|
||||
| `retention_driver_detail` | TEXT | Detail zum Treiber |
|
||||
| `retention_duration` | INTEGER | Aufbewahrungsdauer |
|
||||
| `retention_unit` | VARCHAR | Einheit (DAYS/MONTHS/YEARS) |
|
||||
| `retention_description` | TEXT | Beschreibung der Frist |
|
||||
| `start_event` | VARCHAR | Startereignis |
|
||||
| `has_active_legal_hold` | BOOLEAN | Legal Hold aktiv? |
|
||||
| `legal_holds` | JSONB | Legal Holds (Array) |
|
||||
| `storage_locations` | JSONB | Speicherorte (Array) |
|
||||
| `deletion_method` | VARCHAR | Loeschmethode |
|
||||
| `deletion_method_detail` | TEXT | Detail zur Methode |
|
||||
| `responsible_role` | VARCHAR | Verantwortliche Rolle |
|
||||
| `responsible_person` | VARCHAR | Verantwortliche Person |
|
||||
| `release_process` | TEXT | Freigabeprozess |
|
||||
| `linked_vvt_activity_ids` | JSONB | VVT-Verknuepfungen |
|
||||
| `status` | VARCHAR | Status |
|
||||
| `last_review_date` | TIMESTAMP | Letzte Pruefung |
|
||||
| `next_review_date` | TIMESTAMP | Naechste Pruefung |
|
||||
| `review_interval` | VARCHAR | Pruefintervall |
|
||||
| `tags` | JSONB | Tags |
|
||||
| `created_at` | TIMESTAMP | Erstellt am |
|
||||
| `updated_at` | TIMESTAMP | Geaendert am |
|
||||
|
||||
Migration: `backend-compliance/migrations/017_loeschfristen.sql`
|
||||
|
||||
## Baseline-Katalog (25 Templates)
|
||||
|
||||
| # | Template-ID | Datenobjekt | Treiber | Frist | Trigger |
|
||||
|---|-------------|-------------|---------|-------|---------|
|
||||
| 1 | `personal-akten` | Personalakten | AO 147 | 10 Jahre | Aufbewahrungspflicht |
|
||||
| 2 | `buchhaltungsbelege` | Buchhaltungsbelege | HGB 257 | 10 Jahre | Aufbewahrungspflicht |
|
||||
| 3 | `rechnungen` | Rechnungen | UStG 14b | 10 Jahre | Aufbewahrungspflicht |
|
||||
| 4 | `geschaeftsbriefe` | Geschaeftsbriefe | HGB 257 | 6 Jahre | Aufbewahrungspflicht |
|
||||
| 5 | `bewerbungsunterlagen` | Bewerbungsunterlagen | AGG 15 | 6 Monate | Aufbewahrungspflicht |
|
||||
| 6 | `kundenstammdaten` | Kundenstammdaten | BGB 195 | 3 Jahre | Aufbewahrungspflicht |
|
||||
| 7 | `newsletter-einwilligungen` | Newsletter-Einwilligungen | — | Bis Widerruf | Zweckende |
|
||||
| 8 | `webserver-logs` | Webserver-Logs | BSIG | 7 Tage | Aufbewahrungspflicht |
|
||||
| 9 | `videoueberwachung` | Videoueberwachung | BDSG 35 | 2 Tage | Aufbewahrungspflicht |
|
||||
| 10 | `gehaltsabrechnungen` | Gehaltsabrechnungen | AO 147 | 10 Jahre | Aufbewahrungspflicht |
|
||||
| 11 | `vertraege` | Vertraege | HGB 257 | 10 Jahre | Aufbewahrungspflicht |
|
||||
| 12 | `zeiterfassung` | Zeiterfassungsdaten | ArbZG 16 | 2 Jahre | Aufbewahrungspflicht |
|
||||
| 13 | `krankmeldungen` | Krankmeldungen | BGB 195 | 3 Jahre | Aufbewahrungspflicht |
|
||||
| 14 | `steuererklaerungen` | Steuererklaerungen | AO 147 | 10 Jahre | Aufbewahrungspflicht |
|
||||
| 15 | `protokolle-gesellschafter` | Gesellschafterprotokolle | HGB 257 | 10 Jahre | Aufbewahrungspflicht |
|
||||
| 16 | `crm-kontakthistorie` | CRM-Kontakthistorie | BGB 195 | 3 Jahre | Aufbewahrungspflicht |
|
||||
| 17 | `backup-daten` | Backup-Daten | BSIG | 90 Tage | Aufbewahrungspflicht |
|
||||
| 18 | `cookie-consent-logs` | Cookie-Consent-Nachweise | BGB 195 | 3 Jahre | Aufbewahrungspflicht |
|
||||
| 19 | `email-archivierung` | E-Mail-Archivierung | HGB 257 | 6 Jahre | Aufbewahrungspflicht |
|
||||
| 20 | `zutrittsprotokolle` | Zutrittsprotokolle | BSIG | 90 Tage | Aufbewahrungspflicht |
|
||||
| 21 | `schulungsnachweise` | Schulungsnachweise | Individuell | 3 Jahre | Aufbewahrungspflicht |
|
||||
| 22 | `betriebsarzt-doku` | Betriebsarzt-Dokumentation | Individuell | 40 Jahre | Aufbewahrungspflicht |
|
||||
| 23 | `kundenreklamationen` | Kundenreklamationen | BGB 195 | 3 Jahre | Aufbewahrungspflicht |
|
||||
| 24 | `lieferantenbewertungen` | Lieferantenbewertungen | HGB 257 | 6 Jahre | Aufbewahrungspflicht |
|
||||
| 25 | `social-media-daten` | Social-Media-Marketingdaten | — | Bis Zweckende | Zweckende |
|
||||
|
||||
## 9 Aufbewahrungstreiber
|
||||
|
||||
| Treiber | Gesetz | Standard-Frist | Beschreibung |
|
||||
|---------|--------|----------------|--------------|
|
||||
| `AO_147` | 147 AO | 10 Jahre | Steuerrelevante Unterlagen |
|
||||
| `HGB_257` | 257 HGB | 10/6 Jahre | Handelsbuecher, -briefe |
|
||||
| `USTG_14B` | 14b UStG | 10 Jahre | Rechnungen |
|
||||
| `BGB_195` | 195 BGB | 3 Jahre | Regelmaessige Verjaehrung |
|
||||
| `ARBZG_16` | 16 Abs. 2 ArbZG | 2 Jahre | Arbeitszeitaufzeichnungen |
|
||||
| `AGG_15` | 15 Abs. 4 AGG | 6 Monate | Entschaedigungsansprueche |
|
||||
| `BDSG_35` | 35 BDSG / Art. 17 DSGVO | Unverzueglich | Zweckwegfall |
|
||||
| `BSIG` | BSIG / IT-SiG 2.0 | 90 Tage | Sicherheitslogs |
|
||||
| `CUSTOM` | Individuell | — | Benutzerdefiniert |
|
||||
|
||||
## 6 Loeschmethoden
|
||||
|
||||
| Methode | Beschreibung |
|
||||
|---------|--------------|
|
||||
| `AUTO_DELETE` | Automatische Loeschung durch System-Job |
|
||||
| `MANUAL_REVIEW_DELETE` | Manuelle Pruefung vor Loeschung |
|
||||
| `ANONYMIZATION` | Anonymisierung (Statistik bleibt erhalten) |
|
||||
| `AGGREGATION` | Statistische Verdichtung |
|
||||
| `CRYPTO_ERASE` | Kryptographische Loeschung (Key Destruction) |
|
||||
| `PHYSICAL_DESTROY` | Physische Vernichtung (DIN 66399) |
|
||||
|
||||
## Profiling Wizard (4 Schritte, 16 Fragen)
|
||||
|
||||
Der Profiling-Wizard generiert automatisch passende Loeschrichtlinien basierend auf dem Unternehmensprofil.
|
||||
|
||||
| Schritt | Titel | Fragen | Inhalt |
|
||||
|---------|-------|--------|--------|
|
||||
| 1 | Organisation | 4 | Branche, Groesse, Geschaeftsmodell, Website |
|
||||
| 2 | Datenkategorien | 5 | HR, Buchhaltung, Vertraege, Marketing, Video |
|
||||
| 3 | Systeme & Infrastruktur | 4 | Cloud, Backup, ERP/CRM, Zutrittskontrolle |
|
||||
| 4 | Spezielle Anforderungen | 3 | Legal Hold, Archivierung, Gesundheitsdaten |
|
||||
|
||||
**Regelbeispiele:**
|
||||
|
||||
- `data-hr = true` → Personalakten, Gehaltsabrechnungen, Zeiterfassung, Bewerbungen, Krankmeldungen, Schulungsnachweise
|
||||
- `data-buchhaltung = true` → Buchhaltungsbelege, Rechnungen, Steuererklaerungen
|
||||
- `data-vertraege = true` → Vertraege, Geschaeftsbriefe, Kundenstammdaten, Kundenreklamationen, Lieferantenbewertungen
|
||||
- `data-marketing = true` → Newsletter, CRM-Kontakthistorie, Cookie-Consent, Social-Media-Daten
|
||||
- `sys-zutritt = true` → Zutrittsprotokolle
|
||||
- `sys-cloud = true` → E-Mail-Archivierung
|
||||
- `special-gesundheit = true` → Krankmeldungen, Betriebsarzt-Dokumentation
|
||||
|
||||
## Compliance Checker (11 Pruefungen)
|
||||
|
||||
| # | Check-Typ | Schweregrad | Ausloeser |
|
||||
|---|-----------|-------------|-----------|
|
||||
| 1 | `MISSING_TRIGGER` | HIGH | Policy ohne Loeschtrigger |
|
||||
| 2 | `MISSING_LEGAL_BASIS` | HIGH | Aufbewahrungspflicht ohne Rechtsgrundlage |
|
||||
| 3 | `OVERDUE_REVIEW` | MEDIUM | Ueberfaellige Pruefung |
|
||||
| 4 | `NO_RESPONSIBLE` | MEDIUM | Keine Verantwortliche Person/Rolle |
|
||||
| 5 | `LEGAL_HOLD_CONFLICT` | CRITICAL | Legal Hold + Auto-Delete aktiv |
|
||||
| 6 | `STALE_DRAFT` | LOW | Entwurf aelter als 90 Tage |
|
||||
| 7 | `UNCOVERED_VVT_CATEGORY` | MEDIUM | VVT-Datenkategorie ohne Loeschfrist |
|
||||
| 8 | `MISSING_DELETION_METHOD` | MEDIUM | Aktive Policy ohne Loeschmethoden-Detail |
|
||||
| 9 | `MISSING_STORAGE_LOCATIONS` | MEDIUM | Aktive Policy ohne Speicherorte |
|
||||
| 10 | `EXCESSIVE_RETENTION` | HIGH | Frist > 2x gesetzliches Maximum |
|
||||
| 11 | `MISSING_DATA_CATEGORIES` | LOW | Nicht-Entwurf ohne Datenkategorien |
|
||||
|
||||
**Score-Berechnung:** `100 - (CRITICAL*15 + HIGH*10 + MEDIUM*5 + LOW*2)`
|
||||
|
||||
## Cross-Modul-Integration
|
||||
|
||||
### VVT-Verknuepfung
|
||||
|
||||
Jede Loeschregel kann mit Verarbeitungstaetigkeiten aus dem VVT verknuepft werden (`linked_vvt_activity_ids`). Das Loeschkonzept-Dokument generiert automatisch eine Cross-Referenz-Tabelle (Sektion 6).
|
||||
|
||||
### Scope Engine Prefill
|
||||
|
||||
Der Profiling-Wizard kann Antworten aus der Compliance Scope Engine uebernehmen. 12 Fragen werden automatisch vorausgefuellt:
|
||||
|
||||
- `org-branche`, `org-mitarbeiter`, `org-geschaeftsmodell`, `org-website`
|
||||
- `data-hr`, `data-buchhaltung`, `data-vertraege`, `data-marketing`, `data-video`
|
||||
- `sys-cloud`, `sys-erp`
|
||||
|
||||
### Document Generator Template
|
||||
|
||||
Das Loeschkonzept kann als eigenstaendiges Template im Document Generator genutzt werden (Template-Typ: `loeschkonzept`).
|
||||
|
||||
## Audit-Faehigkeit
|
||||
|
||||
Das Loeschkonzept erfuellt folgende Audit-Kriterien:
|
||||
|
||||
1. **Vollstaendigkeit:** Alle Datenobjekte mit Loeschfristen, Rechtsgrundlagen und Methoden dokumentiert
|
||||
2. **Nachvollziehbarkeit:** Aenderungshistorie mit Versionsnummern und Autoren
|
||||
3. **Aktualitaet:** Definiertes Pruefintervall mit automatischer Ueberfaelligkeits-Erkennung
|
||||
4. **Verantwortlichkeit:** Rollenmatrix mit klaren Zustaendigkeiten
|
||||
5. **Cross-Referenz:** Verknuepfung mit VVT (Art. 30 DSGVO)
|
||||
6. **Compliance-Nachweis:** Automatisierte 11-Punkt-Pruefung mit Score und Befundprotokoll
|
||||
7. **Druckfertigkeit:** PDF-taugliches Dokument mit Deckblatt, Inhaltsverzeichnis und rechtlichen Verweisen
|
||||
|
||||
## Datei-Uebersicht
|
||||
|
||||
| Datei | Beschreibung |
|
||||
|-------|--------------|
|
||||
| `admin-compliance/app/sdk/loeschfristen/page.tsx` | Frontend-Seite (5 Tabs) |
|
||||
| `admin-compliance/lib/sdk/loeschfristen-types.ts` | TypeScript-Typen und Konstanten |
|
||||
| `admin-compliance/lib/sdk/loeschfristen-baseline-catalog.ts` | 25 Baseline-Templates |
|
||||
| `admin-compliance/lib/sdk/loeschfristen-profiling.ts` | 4-Schritt-Profiling-Wizard |
|
||||
| `admin-compliance/lib/sdk/loeschfristen-compliance.ts` | 11 Compliance-Checks |
|
||||
| `admin-compliance/lib/sdk/loeschfristen-export.ts` | JSON/CSV/Markdown-Export |
|
||||
| `admin-compliance/lib/sdk/loeschfristen-document.ts` | Loeschkonzept-Dokument-Generator |
|
||||
| `backend-compliance/compliance/api/loeschfristen_routes.py` | Backend API-Routen |
|
||||
| `backend-compliance/compliance/db/loeschfristen_models.py` | SQLAlchemy-Modelle |
|
||||
| `backend-compliance/migrations/017_loeschfristen.sql` | Datenbank-Migration |
|
||||
| `backend-compliance/tests/test_loeschfristen_routes.py` | Backend-Tests (58+) |
|
||||
759
docs-src/services/sdk-modules/vvt.md
Normal file
759
docs-src/services/sdk-modules/vvt.md
Normal file
@@ -0,0 +1,759 @@
|
||||
# VVT — Verzeichnis von Verarbeitungstaetigkeiten (Art. 30 DSGVO)
|
||||
|
||||
Das VVT-Modul implementiert das Verarbeitungsverzeichnis gemaess Art. 30 DSGVO mit einer
|
||||
3-Schichten-Architektur: **Master-Libraries** (globale Stammdaten) + **Prozess-Templates**
|
||||
(vorgefertigte Verarbeitungsvorlagen) + **Tenant-Instanzen** (individuelle Verarbeitungstaetigkeiten).
|
||||
|
||||
**Route:** `/sdk/vvt` | **Backend:** `backend-compliance:8002` | **Migrationen:** `006`, `033`, `035`, `064`-`067`
|
||||
|
||||
---
|
||||
|
||||
## Uebersicht
|
||||
|
||||
| Checkpoint | Reviewer | Rechtsgrundlage | Status |
|
||||
|-----------|----------|-----------------|--------|
|
||||
| CP-VVT (REQUIRED) | DSB | Art. 30 DSGVO | Phase 1 abgeschlossen |
|
||||
|
||||
**Wann ist ein VVT Pflicht?**
|
||||
|
||||
Jeder Verantwortliche und jeder Auftragsverarbeiter muss ein Verzeichnis aller
|
||||
Verarbeitungstaetigkeiten fuehren (Art. 30 Abs. 1 und Abs. 2 DSGVO). Ausnahmen gelten
|
||||
nur fuer Unternehmen mit weniger als 250 Beschaeftigten — und auch nur dann, wenn die
|
||||
Verarbeitung kein Risiko birgt, nur gelegentlich erfolgt und keine besonderen Datenkategorien
|
||||
(Art. 9/10 DSGVO) betroffen sind. In der Praxis entfaellt die Ausnahme fast nie.
|
||||
|
||||
---
|
||||
|
||||
## 3-Schichten-Architektur
|
||||
|
||||
Das VVT-Modul arbeitet mit drei Abstraktionsebenen:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[Ebene A: Master-Libraries] -->|IDs referenzieren| B[Ebene B: Prozess-Templates]
|
||||
B -->|Instanziierung| C[Ebene C: Tenant-Aktivitaeten]
|
||||
A -->|Direkte Auswahl| C
|
||||
```
|
||||
|
||||
### Ebene A — Master-Libraries (Global)
|
||||
|
||||
8 globale Referenztabellen, die **ohne `tenant_id`** arbeiten und allen Mandanten zur Verfuegung stehen:
|
||||
|
||||
| Library | Tabelle | Eintraege | Beschreibung |
|
||||
|---------|---------|-----------|-------------|
|
||||
| Betroffenenkategorien | `vvt_lib_data_subjects` | 15 | Mitarbeiter, Kunden, Bewerber, ... |
|
||||
| Datenkategorien | `vvt_lib_data_categories` | 35 | Hierarchisch mit Parent/Child (9 Oberkategorien + 26 Unterkategorien) |
|
||||
| Empfaenger | `vvt_lib_recipients` | 15 | Intern, Auftragsverarbeiter, Behoerden |
|
||||
| Rechtsgrundlagen | `vvt_lib_legal_bases` | 12 | Art. 6, Art. 9, BDSG, UWG |
|
||||
| Loeschfristen | `vvt_lib_retention_rules` | 12 | HGB 10J, AO 6J/10J, AGG 6M, ... |
|
||||
| Transfermechanismen | `vvt_lib_transfer_mechanisms` | 8 | Angemessenheit, SCC, BCR, DPF, ... |
|
||||
| Verarbeitungszwecke | `vvt_lib_purposes` | 20 | Personalverwaltung, CRM, Analytics, ... |
|
||||
| TOMs | `vvt_lib_toms` | 20 | RBAC, MFA, Verschluesselung, Backup, ... |
|
||||
|
||||
#### Datenkategorien-Hierarchie
|
||||
|
||||
Die Datenkategorien sind zweistufig organisiert:
|
||||
|
||||
| Oberkategorie | Unterkategorien | Art. 9 |
|
||||
|--------------|----------------|--------|
|
||||
| Identifikationsdaten | Name, Geburtsdatum, Ausweisnummer, SV-Nummer | Nein |
|
||||
| Kontaktdaten | Anschrift, Kontaktinformationen | Nein |
|
||||
| Finanzdaten | Steuer-ID, Bankverbindung, Zahlungsdaten, Gehaltsdaten | Nein |
|
||||
| Beschaeftigungsdaten | Arbeitsvertragsdaten, Ausbildungsdaten | Nein |
|
||||
| Digitale Identitaet | IP-Adresse, Geraete-ID, Zugangsdaten, Nutzungsdaten | Nein |
|
||||
| Kommunikationsdaten | Korrespondenz, Vertragsdaten | Nein |
|
||||
| Medien- und Standortdaten | Bild/Video, Standortdaten | Nein |
|
||||
| Besondere Kategorien (Art. 9) | Gesundheit, Genetik, Biometrie, Ethnische Herkunft, Politische Meinungen, Religion, Gewerkschaft, Sexualleben | **Ja** |
|
||||
| Strafrechtliche Daten (Art. 10) | Verurteilungen, Straftaten | Art. 10 |
|
||||
|
||||
### Ebene B — Prozess-Templates (System + Tenant)
|
||||
|
||||
18 vorgefertigte Prozess-Templates, die Library-IDs referenzieren und mit einem Klick
|
||||
in eine VVT-Aktivitaet instanziiert werden koennen:
|
||||
|
||||
| Template-ID | Name | Business Function | Loeschfrist |
|
||||
|-------------|------|-------------------|-------------|
|
||||
| `hr-mitarbeiterverwaltung` | Mitarbeiterverwaltung | Personal | 10 Jahre (HGB) |
|
||||
| `hr-gehaltsabrechnung` | Gehaltsabrechnung | Personal | 10 Jahre (AO) |
|
||||
| `hr-bewerbermanagement` | Bewerbermanagement | Personal | 6 Monate (AGG) |
|
||||
| `hr-zeiterfassung` | Zeiterfassung | Personal | 2 Jahre (ArbZG) |
|
||||
| `finance-buchhaltung` | Buchhaltung | Finanzen | 10 Jahre (HGB) |
|
||||
| `finance-zahlungsverkehr` | Zahlungsverkehr | Finanzen | 10 Jahre (HGB) |
|
||||
| `sales-kundenverwaltung` | Kundenverwaltung | Vertrieb | 3 Jahre (BGB) |
|
||||
| `sales-vertriebssteuerung` | Vertriebssteuerung | Vertrieb | 3 Jahre (BGB) |
|
||||
| `marketing-newsletter` | Newsletter-Versand | Marketing | Bis Widerruf |
|
||||
| `marketing-website-analytics` | Website-Analyse | Marketing | 14 Monate |
|
||||
| `marketing-social-media` | Social-Media-Marketing | Marketing | Bis Zweckerfuellung |
|
||||
| `support-ticketsystem` | Ticketsystem | Support | 3 Jahre (BGB) |
|
||||
| `it-systemadministration` | IT-Systemadministration | IT | 90 Tage |
|
||||
| `it-backup` | Datensicherung | IT | 90 Tage |
|
||||
| `it-logging` | Logging und Ueberwachung | IT | 90 Tage |
|
||||
| `it-iam` | Identitaetsmanagement | IT | 6 Monate (AGG) |
|
||||
| `other-videokonferenz` | Videokonferenz | Sonstiges | Bis Zweckerfuellung |
|
||||
| `other-besuchermanagement` | Besuchermanagement | Sonstiges | 30 Tage |
|
||||
|
||||
### Ebene C — Tenant-Aktivitaeten
|
||||
|
||||
Individuelle Verarbeitungstaetigkeiten pro Mandant. Jede Aktivitaet kann sowohl
|
||||
**Freitext-Felder** (bestehendes Schema) als auch **Library-Referenzen** (neue `*_refs`-Felder)
|
||||
enthalten. Beide existieren parallel — die Library-Referenzen ergaenzen die Freitext-Felder
|
||||
fuer strukturierte Auswertungen und Cross-Modul-Verknuepfungen.
|
||||
|
||||
---
|
||||
|
||||
## Funktionen
|
||||
|
||||
- **CRUD-Operationen:** Anlegen, Lesen, Aktualisieren, Loeschen von VVT-Aktivitaeten
|
||||
- **Organisations-Header:** DSB-Kontakt, VVT-Version, Pruefintervall
|
||||
- **Template-Instanziierung:** Neue Aktivitaet aus Prozess-Template erstellen (inkl. automatischer Freitext-Befuellung)
|
||||
- **Library-Referenzen:** Strukturierte Auswahl aus 8 Master-Libraries (parallel zu Freitext)
|
||||
- **Art. 30 Completeness-Check:** Automatische Bewertung der Pflichtfelder-Vollstaendigkeit
|
||||
- **Scope-basierte Generierung:** Automatische Erstellung von Aktivitaeten aus Compliance-Scope-Antworten
|
||||
- **Status-Workflow:** `DRAFT` -> `REVIEW` -> `APPROVED` / `ARCHIVED`
|
||||
- **Export:** JSON und CSV (Excel-kompatibel mit BOM, Semikolon-getrennt)
|
||||
- **Audit-Log:** Protokollierung aller Aktionen (CREATE / UPDATE / DELETE / EXPORT)
|
||||
- **Statistiken:** Zaehler nach Status, Geschaeftsbereich, DSFA-Pflicht, Drittlandtransfers
|
||||
- **Cross-Modul-Links:** Verknuepfung zu Loeschfristen und TOM-Massnahmen (Phase 2)
|
||||
|
||||
---
|
||||
|
||||
## API-Endpoints
|
||||
|
||||
### Aktivitaeten (CRUD)
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `GET` | `/vvt/activities` | Liste (Filter: status, business_function, search, review_overdue) |
|
||||
| `POST` | `/vvt/activities` | Neue Aktivitaet anlegen -> HTTP 201 |
|
||||
| `GET` | `/vvt/activities/{id}` | Einzelne Aktivitaet abrufen |
|
||||
| `PUT` | `/vvt/activities/{id}` | Aktivitaet aktualisieren |
|
||||
| `DELETE` | `/vvt/activities/{id}` | Aktivitaet loeschen |
|
||||
| `GET` | `/vvt/activities/{id}/completeness` | Art. 30 Vollstaendigkeits-Check |
|
||||
| `GET` | `/vvt/activities/{id}/versions` | Versionshistorie |
|
||||
|
||||
### Organisation
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `GET` | `/vvt/organization` | Organisations-Header laden |
|
||||
| `PUT` | `/vvt/organization` | Organisations-Header speichern (Upsert) |
|
||||
|
||||
### Export & Statistik
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `GET` | `/vvt/export?format=json` | JSON-Export aller Aktivitaeten |
|
||||
| `GET` | `/vvt/export?format=csv` | CSV-Export (Semikolon, UTF-8 BOM) |
|
||||
| `GET` | `/vvt/stats` | Statistik-Zusammenfassung |
|
||||
| `GET` | `/vvt/audit-log` | Audit-Trail (limit, offset) |
|
||||
|
||||
### Master-Libraries (read-only, global)
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `GET` | `/vvt/libraries` | Uebersicht: alle 8 Library-Typen mit Anzahl |
|
||||
| `GET` | `/vvt/libraries/data-subjects` | Betroffenenkategorien (Filter: `typical_for`) |
|
||||
| `GET` | `/vvt/libraries/data-categories` | Datenkategorien — hierarchisch oder `?flat=true` (Filter: `parent_id`, `is_art9`) |
|
||||
| `GET` | `/vvt/libraries/recipients` | Empfaenger (Filter: `type`) |
|
||||
| `GET` | `/vvt/libraries/legal-bases` | Rechtsgrundlagen (Filter: `is_art9`, `type`) |
|
||||
| `GET` | `/vvt/libraries/retention-rules` | Loeschfristen mit Dauer, Einheit, Rechtsgrundlage |
|
||||
| `GET` | `/vvt/libraries/transfer-mechanisms` | Uebermittlungsmechanismen |
|
||||
| `GET` | `/vvt/libraries/purposes` | Verarbeitungszwecke (Filter: `typical_for`) |
|
||||
| `GET` | `/vvt/libraries/toms` | Technisch-Organisatorische Massnahmen (Filter: `category`) |
|
||||
|
||||
### Prozess-Templates
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `GET` | `/vvt/templates` | Alle Templates (Filter: `business_function`, `search`) |
|
||||
| `GET` | `/vvt/templates/{id}` | Einzelnes Template mit aufgeloesten Library-Labels |
|
||||
| `POST` | `/vvt/templates/{id}/instantiate` | VVT-Aktivitaet aus Template erstellen -> HTTP 201 |
|
||||
|
||||
!!! info "Proxy-Route (Frontend)"
|
||||
Das Admin-Frontend ruft die Endpoints ueber den Next.js-Proxy auf:
|
||||
`/api/sdk/v1/compliance/vvt/**` -> `backend-compliance:8002/api/compliance/vvt/**`
|
||||
|
||||
---
|
||||
|
||||
## Datenfluss: Template-Instanziierung
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant F as Frontend
|
||||
participant B as Backend
|
||||
participant DB as PostgreSQL
|
||||
|
||||
F->>B: POST /vvt/templates/hr-mitarbeiterverwaltung/instantiate
|
||||
B->>DB: SELECT FROM vvt_process_templates WHERE id = 'hr-mitarbeiterverwaltung'
|
||||
DB-->>B: Template mit Library-Referenzen
|
||||
|
||||
Note over B: Fuer jeden ref-Typ:<br/>Library-IDs -> Labels aufloesen
|
||||
|
||||
B->>DB: SELECT FROM vvt_lib_purposes WHERE id IN ('EMPLOYMENT_ADMIN', 'PAYROLL')
|
||||
DB-->>B: Labels: "Personalverwaltung", "Gehaltsabrechnung"
|
||||
|
||||
B->>DB: SELECT FROM vvt_lib_retention_rules WHERE id = 'HGB_257_10Y'
|
||||
DB-->>B: "10 Jahre (HGB § 257)"
|
||||
|
||||
Note over B: Neue VVT-Aktivitaet erstellen:<br/>- Freitext-Felder mit Labels befuellt<br/>- *_refs-Felder mit Library-IDs
|
||||
|
||||
B->>DB: INSERT INTO compliance_vvt_activities (...)
|
||||
B->>DB: INSERT INTO compliance_vvt_audit_log (action='CREATE', ...)
|
||||
DB-->>B: Neue Aktivitaet mit UUID
|
||||
|
||||
B-->>F: 201 Created + VVTActivityResponse
|
||||
F->>F: Wechsel zu Editor-Tab
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Datenmodell
|
||||
|
||||
### VVT-Aktivitaet (Response) — vollstaendig
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "uuid",
|
||||
"vvt_id": "VVT-0001",
|
||||
"name": "Mitarbeiterverwaltung",
|
||||
"description": "Verwaltung des Beschaeftigungsverhaeltnisses",
|
||||
"status": "DRAFT",
|
||||
"business_function": "hr",
|
||||
|
||||
"purposes": ["Personalverwaltung", "Gehaltsabrechnung"],
|
||||
"legal_bases": [{"type": "BDSG_26", "description": "Beschaeftigtenverhaeltnis"}],
|
||||
"data_subject_categories": ["Beschaeftigte"],
|
||||
"personal_data_categories": ["Name", "Geburtsdatum", "Bankverbindung"],
|
||||
"recipient_categories": [{"type": "INTERNAL", "name": "Personalabteilung"}],
|
||||
"third_country_transfers": [],
|
||||
"retention_period": {
|
||||
"description": "10 Jahre (HGB § 257)",
|
||||
"legalBasis": "HGB § 257",
|
||||
"deletionProcedure": "Vernichtung",
|
||||
"duration": 10,
|
||||
"durationUnit": "YEARS"
|
||||
},
|
||||
"tom_description": "Rollenbasierte Zugriffskontrolle, Verschluesselung",
|
||||
"structured_toms": {
|
||||
"accessControl": ["RBAC", "Need-to-Know"],
|
||||
"confidentiality": ["Verschluesselung ruhender Daten"],
|
||||
"integrity": ["Audit-Logging"],
|
||||
"availability": [],
|
||||
"separation": ["Mandantentrennung"]
|
||||
},
|
||||
|
||||
"systems": [{"systemId": "HR-Software", "name": "HR-Software"}],
|
||||
"deployment_model": "cloud",
|
||||
"protection_level": "HIGH",
|
||||
"dpia_required": true,
|
||||
"responsible": "Max Mustermann",
|
||||
"owner": "Personalabteilung",
|
||||
|
||||
"purpose_refs": ["EMPLOYMENT_ADMIN", "PAYROLL"],
|
||||
"legal_basis_refs": ["BDSG_26", "ART6_1B"],
|
||||
"data_subject_refs": ["EMPLOYEES"],
|
||||
"data_category_refs": ["NAME", "DOB", "ADDRESS", "BANK_ACCOUNT", "EMPLOYMENT_DATA"],
|
||||
"recipient_refs": ["INTERNAL_HR", "INTERNAL_FINANCE", "PROCESSOR_PAYROLL"],
|
||||
"retention_rule_ref": "HGB_257_10Y",
|
||||
"transfer_mechanism_refs": null,
|
||||
"tom_refs": ["AC_RBAC", "AC_NEED_TO_KNOW", "CONF_ENCRYPTION_REST", "INT_AUDIT_LOG"],
|
||||
"source_template_id": "hr-mitarbeiterverwaltung",
|
||||
"risk_score": 3,
|
||||
"linked_loeschfristen_ids": null,
|
||||
"linked_tom_measure_ids": null,
|
||||
"art30_completeness": {
|
||||
"score": 90,
|
||||
"missing": ["responsible"],
|
||||
"warnings": [],
|
||||
"passed": 9,
|
||||
"total": 10
|
||||
},
|
||||
|
||||
"created_at": "2026-03-19T10:00:00Z",
|
||||
"updated_at": "2026-03-19T12:30:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
!!! warning "Dual-Schema: Freitext + Library-Referenzen"
|
||||
Jede Aktivitaet hat **zwei parallele Repraesentationen** fuer Datenkategorien,
|
||||
Betroffene, Zwecke etc.: Die bestehenden Freitext-Felder (`purposes`, `legal_bases`, ...)
|
||||
und die neuen Library-Referenz-Felder (`purpose_refs`, `legal_basis_refs`, ...).
|
||||
Beide existieren parallel. Bei Template-Instanziierung werden beide automatisch befuellt.
|
||||
Bestehende Aktivitaeten ohne `*_refs` bleiben voll funktionsfaehig.
|
||||
|
||||
### Art. 30 Completeness-Check
|
||||
|
||||
Der Completeness-Endpoint prueft 10 Pflichtfelder nach Art. 30 Abs. 1 DSGVO:
|
||||
|
||||
| Nr. | Pruefung | Quelle |
|
||||
|-----|---------|--------|
|
||||
| 1 | Name der Verarbeitung | `name` |
|
||||
| 2 | Verarbeitungszweck(e) | `purposes` ODER `purpose_refs` |
|
||||
| 3 | Rechtsgrundlage | `legal_bases` ODER `legal_basis_refs` |
|
||||
| 4 | Betroffenenkategorien | `data_subject_categories` ODER `data_subject_refs` |
|
||||
| 5 | Datenkategorien | `personal_data_categories` ODER `data_category_refs` |
|
||||
| 6 | Empfaenger | `recipient_categories` ODER `recipient_refs` |
|
||||
| 7 | Drittland-Uebermittlung | Immer bestanden (kein Transfer ist valide) |
|
||||
| 8 | Loeschfristen | `retention_period.description` ODER `retention_rule_ref` |
|
||||
| 9 | TOM-Beschreibung | `tom_description` ODER `tom_refs` ODER `structured_toms` |
|
||||
| 10 | Verantwortlicher | `responsible` |
|
||||
|
||||
**Warnings** (nicht im Score, aber angezeigt):
|
||||
|
||||
- `dpia_required_but_no_dsfa_linked` — DSFA erforderlich, aber keine DSFA verknuepft
|
||||
- `third_country_transfer_without_mechanism` — Drittlandtransfer ohne Transfermechanismus
|
||||
|
||||
```json
|
||||
{
|
||||
"score": 80,
|
||||
"missing": ["retention_period", "responsible"],
|
||||
"warnings": ["dpia_required_but_no_dsfa_linked"],
|
||||
"passed": 8,
|
||||
"total": 10
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Library-Datenmodell
|
||||
|
||||
### Master-Library-Eintrag (allgemein)
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "EMPLOYEES",
|
||||
"label_de": "Beschaeftigte",
|
||||
"description_de": "Aktuelle Mitarbeiterinnen und Mitarbeiter",
|
||||
"sort_order": 1
|
||||
}
|
||||
```
|
||||
|
||||
### Datenkategorie (hierarchisch)
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "IDENTIFICATION",
|
||||
"label_de": "Identifikationsdaten",
|
||||
"children": [
|
||||
{
|
||||
"id": "NAME",
|
||||
"parent_id": "IDENTIFICATION",
|
||||
"label_de": "Name",
|
||||
"is_art9": false,
|
||||
"risk_weight": 1
|
||||
},
|
||||
{
|
||||
"id": "DOB",
|
||||
"parent_id": "IDENTIFICATION",
|
||||
"label_de": "Geburtsdatum",
|
||||
"is_art9": false,
|
||||
"risk_weight": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Loeschfrist (Retention Rule)
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "HGB_257_10Y",
|
||||
"label_de": "10 Jahre (HGB § 257)",
|
||||
"legal_basis": "HGB § 257",
|
||||
"duration": 10,
|
||||
"duration_unit": "YEARS",
|
||||
"start_event": "Ende des Kalenderjahres",
|
||||
"deletion_procedure": "Vernichtung nach Ablauf der Aufbewahrungsfrist"
|
||||
}
|
||||
```
|
||||
|
||||
### Prozess-Template
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "hr-mitarbeiterverwaltung",
|
||||
"name": "Mitarbeiterverwaltung",
|
||||
"business_function": "hr",
|
||||
"purpose_refs": ["EMPLOYMENT_ADMIN", "PAYROLL"],
|
||||
"legal_basis_refs": ["BDSG_26", "ART6_1B"],
|
||||
"data_subject_refs": ["EMPLOYEES"],
|
||||
"data_category_refs": ["NAME", "DOB", "ADDRESS", "CONTACT", "SOCIAL_SECURITY", "BANK_ACCOUNT", "EMPLOYMENT_DATA", "HEALTH_DATA"],
|
||||
"recipient_refs": ["INTERNAL_HR", "INTERNAL_FINANCE", "PROCESSOR_PAYROLL"],
|
||||
"tom_refs": ["AC_RBAC", "AC_NEED_TO_KNOW", "CONF_ENCRYPTION_REST", "INT_AUDIT_LOG"],
|
||||
"retention_rule_ref": "HGB_257_10Y",
|
||||
"typical_systems": ["HR-Software", "Personalakte (digital)"],
|
||||
"protection_level": "HIGH",
|
||||
"dpia_required": true,
|
||||
"risk_score": 3,
|
||||
"tags": ["personal", "pflicht"]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Status-Workflow
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> DRAFT : Neue Aktivitaet
|
||||
DRAFT --> REVIEW : Zur Pruefung
|
||||
REVIEW --> APPROVED : Genehmigt
|
||||
REVIEW --> DRAFT : Zurueck zu Entwurf
|
||||
APPROVED --> REVIEW : Erneute Pruefung
|
||||
APPROVED --> ARCHIVED : Archivieren
|
||||
ARCHIVED --> DRAFT : Reaktivieren
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## DB-Tabellen
|
||||
|
||||
### Migrationshistorie
|
||||
|
||||
| Migration | Datei | Inhalt |
|
||||
|-----------|-------|--------|
|
||||
| 006 | `006_vvt.sql` | Initiale VVT-Tabellen (organization, activities, audit_log) |
|
||||
| 033 | `033_vvt_consolidation.sql` | Schema-Konsolidierung |
|
||||
| 035 | `035_vvt_tenant_isolation.sql` | Tenant-Isolation |
|
||||
| **064** | `064_vvt_master_libraries.sql` | 8 Library-Tabellen (global) |
|
||||
| **065** | `065_vvt_library_seed.sql` | Seed-Daten (~150 Eintraege) |
|
||||
| **066** | `066_vvt_process_templates.sql` | Template-Tabelle + 13 neue Spalten auf `compliance_vvt_activities` |
|
||||
| **067** | `067_vvt_process_templates_seed.sql` | 18 Prozess-Templates |
|
||||
|
||||
### Tabellen-Uebersicht
|
||||
|
||||
| Tabelle | Typ | Tenant-scoped | Eintraege |
|
||||
|---------|-----|--------------|-----------|
|
||||
| `compliance_vvt_organization` | Daten | Ja | 1 pro Tenant |
|
||||
| `compliance_vvt_activities` | Daten | Ja | n pro Tenant |
|
||||
| `compliance_vvt_audit_log` | Audit | Ja | Unbegrenzt |
|
||||
| `vvt_lib_data_subjects` | Library | **Nein** (global) | 15 |
|
||||
| `vvt_lib_data_categories` | Library | **Nein** (global) | 35 |
|
||||
| `vvt_lib_recipients` | Library | **Nein** (global) | 15 |
|
||||
| `vvt_lib_legal_bases` | Library | **Nein** (global) | 12 |
|
||||
| `vvt_lib_retention_rules` | Library | **Nein** (global) | 12 |
|
||||
| `vvt_lib_transfer_mechanisms` | Library | **Nein** (global) | 8 |
|
||||
| `vvt_lib_purposes` | Library | **Nein** (global) | 20 |
|
||||
| `vvt_lib_toms` | Library | **Nein** (global) | 20 |
|
||||
| `vvt_process_templates` | Hybrid | System + Tenant | 18 (System) |
|
||||
|
||||
---
|
||||
|
||||
## Datei-Uebersicht
|
||||
|
||||
### Backend
|
||||
|
||||
| Datei | Beschreibung |
|
||||
|-------|-------------|
|
||||
| `compliance/db/vvt_models.py` | SQLAlchemy Models: Organization, Activity, AuditLog |
|
||||
| `compliance/db/vvt_library_models.py` | SQLAlchemy Models: 8 Libraries + ProcessTemplate |
|
||||
| `compliance/api/vvt_routes.py` | Activity CRUD, Export, Stats, Completeness |
|
||||
| `compliance/api/vvt_library_routes.py` | Library GET-Endpoints, Template CRUD + Instantiate |
|
||||
| `compliance/api/schemas.py` | Pydantic Schemas (VVTActivityCreate/Update/Response) |
|
||||
|
||||
### Frontend
|
||||
|
||||
| Datei | Beschreibung |
|
||||
|-------|-------------|
|
||||
| `admin-compliance/app/sdk/vvt/page.tsx` | VVT-Seite (3 Tabs: Verzeichnis, Editor, Export) |
|
||||
| `admin-compliance/lib/sdk/vvt-types.ts` | TypeScript-Typen, Library-Interfaces, Helper |
|
||||
| `admin-compliance/lib/sdk/vvt-profiling.ts` | Scope-basierte Generierung |
|
||||
|
||||
### Migrationen
|
||||
|
||||
| Datei | Beschreibung |
|
||||
|-------|-------------|
|
||||
| `migrations/064_vvt_master_libraries.sql` | 8 Library-Tabellen |
|
||||
| `migrations/065_vvt_library_seed.sql` | Seed: ~150 Eintraege |
|
||||
| `migrations/066_vvt_process_templates.sql` | Template-Tabelle + 13 Spalten auf Activities |
|
||||
| `migrations/067_vvt_process_templates_seed.sql` | Seed: 18 Prozess-Templates |
|
||||
|
||||
---
|
||||
|
||||
## Tests
|
||||
|
||||
```bash
|
||||
# Backend: Alle VVT-Tests (Library + Routes)
|
||||
cd backend-compliance && python3 -m pytest tests/test_vvt_library_routes.py tests/test_vvt_routes.py -v
|
||||
|
||||
# Backend: Nur Library-Tests (54 Tests)
|
||||
python3 -m pytest tests/test_vvt_library_routes.py -v
|
||||
|
||||
# Backend: Nur bestehende VVT-Tests (49 Tests)
|
||||
python3 -m pytest tests/test_vvt_routes.py -v
|
||||
|
||||
# Frontend: Scope → VVT Integration (35 Tests)
|
||||
cd admin-compliance && npx vitest run lib/sdk/__tests__/vvt-scope-integration.test.ts
|
||||
```
|
||||
|
||||
### Testabdeckung
|
||||
|
||||
| Testdatei | Tests | Abdeckung |
|
||||
|-----------|-------|-----------|
|
||||
| `test_vvt_library_routes.py` | 54 | Models, Helpers, Endpoints, Completeness, Schema-Compat |
|
||||
| `test_vvt_routes.py` | 49 | CRUD, Export, Stats, Audit, Organization |
|
||||
| `vvt-scope-integration.test.ts` | 35 | Profile→Scope Prefill, Scope→VVT Export, Generator, Full Pipeline, Dept. Data Categories, Block 9 Mapping |
|
||||
| **Gesamt** | **138** | |
|
||||
|
||||
---
|
||||
|
||||
## Frontend: 5-Tab-Aufbau
|
||||
|
||||
### Tab 1: Verzeichnis
|
||||
|
||||
- **Statistik-Kacheln:** Gesamt, Genehmigt, Entwurf, Drittland, Art. 9
|
||||
- **Filter:** Status, Drittland, Art. 9
|
||||
- **Suche:** VVT-ID, Name, Beschreibung
|
||||
- **Sortierung:** Name, Datum, Status
|
||||
- **"Aus Vorlage erstellen":** Template-Picker-Modal mit 18 Templates, filterbar nach Geschaeftsbereich
|
||||
- **"Neue Verarbeitung":** Leere Aktivitaet erstellen
|
||||
- **"Aus Scope generieren":** Automatische Generierung aus Compliance-Scope-Antworten
|
||||
|
||||
### Tab 2: Editor
|
||||
|
||||
- **Formular-Sections:** Grunddaten, Zwecke, Rechtsgrundlagen, Betroffene, Datenkategorien, Empfaenger, Drittlandtransfers, Loeschfristen, TOMs, Systeme, Datenquellen, Datenfluesse
|
||||
- **Library-Unterstuetzung:** Dropdown-Auswahl aus Master-Libraries fuer alle strukturierten Felder
|
||||
- **Freitext-Fallback:** Manuelle Eingabe bleibt immer moeglich
|
||||
|
||||
### Tab 3: Export & Compliance
|
||||
|
||||
- **Compliance-Check:** Pruefung aller Pflichtfelder nach Art. 30 DSGVO
|
||||
- **Art. 30 Vollstaendigkeit:** Pro-Aktivitaet-Fortschrittsbalken
|
||||
- **Organisations-Header:** DSB-Kontakt, Version, Pruefintervall
|
||||
- **JSON-Export:** Vollstaendiger Export aller Aktivitaeten + Metadaten
|
||||
- **CSV-Export:** Excel-kompatibel (Semikolon, UTF-8 BOM)
|
||||
- **Statistik:** Zaehler nach Geschaeftsbereichen und Datenkategorien
|
||||
|
||||
### Tab 4: VVT-Dokument (Druckansicht)
|
||||
|
||||
Generiert ein vollstaendiges, druckbares VVT-Dokument gemaess Art. 30 Abs. 1 DSGVO:
|
||||
|
||||
- **Deckblatt:** Organisation, DSB-Kontakt, Versionierung, Pruefintervall, Erstellungsdatum
|
||||
- **Inhaltsverzeichnis:** Automatisch nummerierte Eintraege aller Verarbeitungstaetigkeiten
|
||||
- **Aktivitaeten-Tabellen:** Pro Aktivitaet eine zweispaltige Tabelle mit allen Pflichtfeldern:
|
||||
- Zweck der Verarbeitung, Rechtsgrundlagen, Betroffene Personen
|
||||
- Datenkategorien (mit Art. 9/10 Kennzeichnung), Empfaengerkategorien
|
||||
- Drittlandtransfers mit Transfermechanismus
|
||||
- Loeschfristen, TOMs, Systeme, Schutzbedarfsstufe
|
||||
- **Library-Aufloesung:** IDs werden automatisch zu deutschen Labels aufgeloest (DATA_SUBJECT_CATEGORY_META, PERSONAL_DATA_CATEGORY_META, LEGAL_BASIS_META, TRANSFER_MECHANISM_META)
|
||||
- **PDF-Druck:** Via `window.open()` + `window.print()` — eigenstaendiges HTML mit Inline-CSS und `@media print`-Regeln fuer Seitenumbrueche
|
||||
- **HTML-Download:** Vollstaendiges Dokument als HTML-Datei speicherbar
|
||||
|
||||
### Tab 5: Auftragsverarbeiter (Art. 30 Abs. 2)
|
||||
|
||||
Eigenstaendiges Verzeichnis fuer Auftragsverarbeiter-Taetigkeiten gemaess Art. 30 Abs. 2 DSGVO:
|
||||
|
||||
- **Pflichtfelder (Art. 30 Abs. 2):**
|
||||
- Name und Kontakt des Auftragsverarbeiters
|
||||
- Kategorien der Verarbeitungen (fuer jeden Verantwortlichen)
|
||||
- Unterauftragsverarbeiter-Kette (Name, Zweck, Land, Drittland-Kennzeichnung)
|
||||
- Drittlandtransfers mit Transfermechanismen
|
||||
- Technisch-Organisatorische Massnahmen (TOMs)
|
||||
- **Editor:** Vollstaendiges Formular mit FormSection/FormField-Komponenten
|
||||
- **Listenansicht:** Karten mit Auftraggeber, Anzahl Kategorien, Unterauftragnehmer, Status-Badge
|
||||
- **Status-Workflow:** DRAFT → REVIEW → APPROVED → ARCHIVED
|
||||
- **PDF-Druck:** Eigene Druckfunktion fuer das Auftragsverarbeiter-Verzeichnis
|
||||
- **Rechtshinweis:** Infobox mit Erlaeuterung der Art. 30 Abs. 2 Anforderungen
|
||||
|
||||
!!! note "Datenhaltung"
|
||||
Auftragsverarbeiter-Eintraege werden aktuell im Frontend-State verwaltet.
|
||||
Backend-Persistenz (eigene DB-Tabelle + API-Endpoints) ist fuer Phase 2 geplant.
|
||||
|
||||
---
|
||||
|
||||
## Compliance-Kontext
|
||||
|
||||
| Verknuepftes Modul | Beziehung |
|
||||
|-------------------|-----------|
|
||||
| **Company Profile** | Stammdaten (DSB, Branche, Mitarbeiter, Angebote) fliessen via Scope in VVT |
|
||||
| **Compliance Scope** | Scope-Antworten (Block 8+9) generieren VVT-Aktivitaeten per Knopfdruck |
|
||||
| **DSFA** (Art. 35) | VVT-Aktivitaet referenziert DSFA ueber `dsfa_id` |
|
||||
| **Loeschfristen** | Cross-Modul-Link ueber `linked_loeschfristen_ids` (Phase 2) |
|
||||
| **TOM** (Art. 32) | Cross-Modul-Link ueber `linked_tom_measure_ids` (Phase 2) |
|
||||
|
||||
---
|
||||
|
||||
## Datenfluss: Company Profile → Compliance Scope → VVT Generator
|
||||
|
||||
Das VVT-Modul bezieht seine Daten aus einer **3-stufigen Pipeline**, in der keine Daten doppelt
|
||||
abgefragt werden. Das Company Profile (`/sdk/company-profile`) dient als Single Source of Truth
|
||||
fuer Stammdaten. Der Compliance Scope (`/sdk/compliance-scope`) fungiert als impliziter
|
||||
**Daten-Verteilungs-Agent** — jede Scope-Frage deklariert per `mapsToVVTQuestion`-Eigenschaft,
|
||||
welche VVT-Frage sie befuellt.
|
||||
|
||||
### Gesamtablauf
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant CP as Company Profile
|
||||
participant SE as Compliance Scope<br/>(Block 1-9)
|
||||
participant VG as VVT Generator
|
||||
participant DB as PostgreSQL
|
||||
|
||||
Note over CP: Stammdaten:<br/>DSB, Branche, Mitarbeiter,<br/>Angebote, Geschaeftsmodell
|
||||
|
||||
CP->>SE: prefillFromCompanyProfile(profile)<br/>+ getAutoFilledScoringAnswers(profile)
|
||||
Note over SE: Auto-Prefill:<br/>dpoName → org_has_dsb<br/>offerings → prod_type<br/>employeeCount → org_employee_count
|
||||
|
||||
SE->>SE: Block 8: Abteilungswahl<br/>(personal, finanzen, marketing, ...)
|
||||
SE->>SE: Block 9: Datenkategorien pro Abteilung<br/>(dk_dept_hr → NAME, SALARY_DATA, ...)
|
||||
|
||||
SE->>VG: exportToVVTAnswers(scopeAnswers)<br/>→ mapsToVVTQuestion-Mapping
|
||||
Note over VG: prefillFromScopeAnswers():<br/>Scope-Antworten → ProfilingAnswers
|
||||
|
||||
VG->>VG: generateActivities(profilingAnswers)<br/>→ Template-Triggering + Enrichment
|
||||
|
||||
VG->>DB: POST /vvt/activities (je Aktivitaet)
|
||||
Note over DB: VVT-Aktivitaeten gespeichert<br/>mit Library-Refs + Freitext
|
||||
```
|
||||
|
||||
### Stufe 1: Company Profile → Scope (automatisches Prefill)
|
||||
|
||||
Beim Oeffnen des Compliance-Scope-Moduls werden Stammdaten aus dem Company Profile automatisch
|
||||
in Scope-Antworten ueberfuehrt — der Nutzer muss diese Daten nicht erneut eingeben.
|
||||
|
||||
**Funktion:** `prefillFromCompanyProfile()` (`compliance-scope-profiling.ts:764`)
|
||||
|
||||
| Company Profile Feld | Scope-Frage | Mapping |
|
||||
|----------------------|-------------|---------|
|
||||
| `dpoName` (nicht leer) | `org_has_dsb` | `true` |
|
||||
| `offerings` (WebApp) | `prod_type` | `['webapp']` |
|
||||
| `offerings` (SaaS) | `prod_type` | `['saas']` |
|
||||
| `offerings` (Webshop) | `prod_webshop` | `true` |
|
||||
|
||||
**Funktion:** `getAutoFilledScoringAnswers()` (`compliance-scope-profiling.ts:844`)
|
||||
|
||||
| Company Profile Feld | Scope-Frage | Zweck |
|
||||
|----------------------|-------------|-------|
|
||||
| `employeeCount` | `org_employee_count` | Scoring + Art. 30 Abs. 5 Pruefung |
|
||||
| `annualRevenue` | `org_annual_revenue` | Scoring |
|
||||
| `industry` | `org_industry` | Scoring + Branchenkontext |
|
||||
| `businessModel` | `org_business_model` | Scoring |
|
||||
|
||||
### Stufe 2: Compliance Scope — Block 8 + Block 9
|
||||
|
||||
#### Block 8: Verarbeitungstaetigkeiten (Abteilungswahl)
|
||||
|
||||
Die Frage `vvt_departments` (Multi-Choice) bestimmt, welche Abteilungen personenbezogene Daten verarbeiten:
|
||||
|
||||
| Auswahl-Wert | Department-Key(s) | Beschreibung |
|
||||
|--------------|-------------------|-------------|
|
||||
| `personal` | `dept_hr`, `dept_recruiting` | Personal + Bewerbermanagement |
|
||||
| `finanzen` | `dept_finance` | Finanzen & Buchhaltung |
|
||||
| `vertrieb` | `dept_sales` | Vertrieb & CRM |
|
||||
| `marketing` | `dept_marketing` | Marketing |
|
||||
| `it` | `dept_it` | IT / Administration |
|
||||
| `recht` | `dept_recht` | Recht / Compliance |
|
||||
| `kundenservice` | `dept_support` | Kundenservice / Support |
|
||||
| `produktion` | `dept_produktion` | Produktion / Fertigung |
|
||||
| `logistik` | `dept_logistik` | Logistik / Versand |
|
||||
| `einkauf` | `dept_einkauf` | Einkauf / Beschaffung |
|
||||
| `facility` | `dept_facility` | Facility Management |
|
||||
|
||||
Das Mapping erfolgt in `ScopeWizardTab.tsx` ueber `DEPT_VALUE_TO_KEY`.
|
||||
|
||||
#### Block 9: Datenkategorien pro Abteilung
|
||||
|
||||
Fuer jede in Block 8 gewaehlte Abteilung wird eine eigene Frage mit spezifischen Datenkategorien angezeigt.
|
||||
Die Datenkategorien stammen aus `DEPARTMENT_DATA_CATEGORIES` (`vvt-profiling.ts:306`).
|
||||
|
||||
**12 Abteilungen mit insgesamt ~80 Datenkategorien:**
|
||||
|
||||
| Abteilung | Scope-Frage | VVT-Mapping | Kategorien (Auswahl) | Art. 9 |
|
||||
|-----------|-------------|-------------|---------------------|--------|
|
||||
| Personal (HR) | `dk_dept_hr` | `dept_hr_categories` | Stammdaten, Gehalt, SV-Nr., Bankverbindung, Gesundheit, Religion | Gesundheit, Religion |
|
||||
| Recruiting | `dk_dept_recruiting` | `dept_recruiting_categories` | Bewerberstammdaten, Bewerbungsunterlagen, Qualifikationen | Gesundheit |
|
||||
| Finanzen | `dk_dept_finance` | `dept_finance_categories` | Kunden-/Lieferantendaten, Bankverbindungen, Steuer-IDs, Rechnungen | — |
|
||||
| Vertrieb | `dk_dept_sales` | `dept_sales_categories` | Kontaktdaten, CRM-Daten, Kommunikation, Vertragsdaten | — |
|
||||
| Marketing | `dk_dept_marketing` | `dept_marketing_categories` | E-Mail, Tracking, Consent, Social-Media, Interessenprofil | — |
|
||||
| Support | `dk_dept_support` | `dept_support_categories` | Kundenstammdaten, Tickets, Kommunikation, Vertragsdaten | — |
|
||||
| IT | `dk_dept_it` | `dept_it_categories` | Benutzerkonten, Logs, Geraete, Netzwerk, E-Mail, Backups | — |
|
||||
| Recht | `dk_dept_recht` | `dept_recht_categories` | Vertraege, Compliance-Daten, Vorfaelle, Strafrechtliche Daten | Strafrechtlich |
|
||||
| Produktion | `dk_dept_produktion` | `dept_produktion_categories` | Schichtplaene, Mitarbeiterdaten, Arbeitsschutz, Zugang | Gesundheit |
|
||||
| Logistik | `dk_dept_logistik` | `dept_logistik_categories` | Empfaenger, Versandadressen, Sendungsverfolgung, Fahrer | — |
|
||||
| Einkauf | `dk_dept_einkauf` | `dept_einkauf_categories` | Lieferantenkontakte, Vertraege, Bankverbindungen | — |
|
||||
| Facility | `dk_dept_facility` | `dept_facility_categories` | Zutrittsdaten, Dienstleister, Videoueberwachung, Besucher | Gesundheit |
|
||||
|
||||
**Smart Auto-Prefill:** Beim erstmaligen Aufklappen einer Abteilungskarte werden automatisch
|
||||
alle Kategorien mit `isTypical: true` vorausgewaehlt. Art.-9-Kategorien werden orange hervorgehoben.
|
||||
|
||||
### Stufe 3: Scope → VVT Generator
|
||||
|
||||
**Funktion:** `exportToVVTAnswers()` (`compliance-scope-profiling.ts:987`)
|
||||
|
||||
Jede Scope-Frage, die ein `mapsToVVTQuestion`-Attribut traegt, wird in das VVT-Antwort-Format
|
||||
ueberfuehrt. Das Mapping ist **deklarativ** — kein imperativer Verteilungscode.
|
||||
|
||||
**Funktion:** `generateActivities()` (`vvt-profiling.ts:459`)
|
||||
|
||||
1. **Template-Triggering:** Jede VVT-Profiling-Frage hat ein `triggersTemplates`-Array. Wird eine Boolean-Frage mit `true` beantwortet, werden alle referenzierten Templates aktiviert.
|
||||
2. **IT-Baseline:** Die 4 IT-Templates (Systemadministration, Backup, Logging, IAM) werden **immer** generiert.
|
||||
3. **Enrichment:** `enrichActivityFromAnswers()` reichert Aktivitaeten an:
|
||||
- `transfer_cloud_us = true` → US-Drittlandtransfer mit SCC + TIA auf jede Aktivitaet
|
||||
- `data_health = true` → `HEALTH_DATA` + Art. 9 Rechtsgrundlage auf HR-Aktivitaeten
|
||||
- `data_minors = true` → `MINORS` als Betroffenenkategorie auf Support/Engineering
|
||||
- `special_ai / special_video_surveillance` → `dpiaRequired = true`
|
||||
4. **Art. 30 Abs. 5 Pruefung:** `< 250 Mitarbeiter UND keine besonderen Kategorien → Ausnahme moeglich`
|
||||
|
||||
### 16 vorbefuellte Fragen (SCOPE_PREFILLED_VVT_QUESTIONS)
|
||||
|
||||
Diese VVT-Profiling-Fragen werden automatisch aus Scope-Antworten befuellt,
|
||||
sodass der Nutzer sie nicht doppelt beantworten muss:
|
||||
|
||||
| VVT-Frage | Quelle (Scope-Block) |
|
||||
|-----------|---------------------|
|
||||
| `org_industry` | Block 1 (Organisation) |
|
||||
| `org_employees` | Company Profile |
|
||||
| `org_b2b_b2c` | Block 1 |
|
||||
| `dept_hr` | Block 2/8 (Abteilungen) |
|
||||
| `dept_finance` | Block 2/8 |
|
||||
| `dept_marketing` | Block 2/8 |
|
||||
| `data_health` | Block 2/4 (Datenkategorien) |
|
||||
| `data_minors` | Block 2/4 |
|
||||
| `data_biometric` | Block 2/4 |
|
||||
| `data_criminal` | Block 2/4 |
|
||||
| `special_ai` | Block 3/7 (Besondere Verarbeitungen) |
|
||||
| `special_video_surveillance` | Block 3/4 |
|
||||
| `special_tracking` | Block 3/4 |
|
||||
| `transfer_cloud_us` | Block 4 (Drittland) |
|
||||
| `transfer_subprocessor` | Block 4 |
|
||||
| `transfer_support_non_eu` | Block 4 |
|
||||
|
||||
### Cross-Modul-Datenverteilung
|
||||
|
||||
Dasselbe deklarative Muster wird auch fuer andere Module verwendet:
|
||||
|
||||
| Modul | Export-Funktion | Mapping-Attribut |
|
||||
|-------|----------------|-----------------|
|
||||
| VVT | `exportToVVTAnswers()` | `mapsToVVTQuestion` |
|
||||
| Loeschfristen | `exportToLoeschfristenAnswers()` | `mapsToLFQuestion` |
|
||||
| TOM Generator | `exportToTOMProfile()` | (direkte Ableitung) |
|
||||
|
||||
**Bidirektionale Mappings:** `prefillFromVVTAnswers()` und `prefillFromLoeschfristenAnswers()`
|
||||
ermoeglichen auch den Rueckfluss: Wenn ein Nutzer zuerst das VVT-Modul verwendet, koennen
|
||||
diese Antworten in den Scope uebernommen werden.
|
||||
|
||||
---
|
||||
|
||||
## Datei-Uebersicht: Scope-Integration
|
||||
|
||||
| Datei | Beschreibung |
|
||||
|-------|-------------|
|
||||
| `lib/sdk/compliance-scope-profiling.ts` | Scope Engine: 9 Bloecke, Export-Funktionen, Company-Profile-Prefill |
|
||||
| `lib/sdk/vvt-profiling.ts` | VVT-Profiling: 25 Fragen, 12 Abteilungs-Datenkategorien, Generator |
|
||||
| `lib/sdk/vvt-baseline-catalog.ts` | 18 Baseline-Templates mit Freitext-Feldern |
|
||||
| `components/sdk/compliance-scope/ScopeWizardTab.tsx` | Block-9-UI: Accordion, Auto-Prefill, Art.-9-Badges |
|
||||
| `lib/sdk/__tests__/vvt-scope-integration.test.ts` | 35 Integrationstests fuer die gesamte Pipeline |
|
||||
|
||||
---
|
||||
|
||||
## Phase 2 — Geplante Erweiterungen
|
||||
|
||||
| Feature | Beschreibung |
|
||||
|---------|-------------|
|
||||
| Processor Records Backend | DB-Tabelle + API-Endpoints fuer Art. 30 Abs. 2 Auftragsverarbeiter |
|
||||
| Link-Tabellen | M:N-Verknuepfungen VVT <-> Loeschfristen und VVT <-> TOM |
|
||||
| Bidirektionaler Sync | Link-Operation aktualisiert auch Ziel-Modul |
|
||||
| VVT Generator Service | Backend-basierte Auto-Fill Engine mit Company Profile + Templates |
|
||||
| LibraryAutocomplete-Komponente | Wiederverwendbare Frontend-Komponente fuer alle Library-Felder |
|
||||
| Word/DOCX-Export | Ergaenzung des PDF-Drucks um nativen Word-Export |
|
||||
Reference in New Issue
Block a user