diff --git a/document-templates/README.md b/document-templates/README.md new file mode 100644 index 0000000..87e9371 --- /dev/null +++ b/document-templates/README.md @@ -0,0 +1,80 @@ +# Document Templates V2 + +Erweiterte Compliance-Vorlagen (DSFA, TOM, VVT, AVV) fuer den BreakPilot Document Generator. + +**Branch:** `feature/document-templates-v2` +**Ziel-Integration:** breakpilot-compliance (nach Abschluss des Refactoring) +**Datenbank:** `compliance.compliance_legal_templates` (shared PostgreSQL) + +## Inhalt + +### SQL Migrations (`migrations/`) + +| Datei | Typ | Beschreibung | +|-------|-----|--------------| +| `001_dsfa_template_v2.sql` | DSFA | Schwellwertanalyse (WP248), SDM-TOM, KI-Modul, ~60 Placeholders | +| `002_tom_sdm_template.sql` | TOM | 7 SDM-Gewaehrleistungsziele, Sektorbloecke, Compliance-Bewertung | +| `003_vvt_sector_templates.sql` | VVT | 6 Branchen-Muster (IT/SaaS, Gesundheit, Handel, Handwerk, Bildung, Beratung) | +| `004_avv_template.sql` | AVV | Auftragsverarbeitungsvertrag Art. 28, 12 Sections, TOM-Anlage | +| `005_additional_templates.sql` | Div. | Verpflichtungserklaerung + Art. 13/14 Informationspflichten | + +### Python Generators (`generators/`) + +| Datei | Beschreibung | +|-------|--------------| +| `dsfa_template.py` | DSFA-Generator mit Schwellwertanalyse, Bundesland-Mapping, SDM-TOM, Art. 36 | +| `tom_template.py` | TOM-Generator mit SDM-Struktur, NIS2/ISO27001/AI Act Erweiterungen, Sektoren | +| `vvt_template.py` | VVT-Generator mit 6 Branchen-Katalogen, Art. 30 Validierung | + +### Scripts (`scripts/`) + +| Datei | Beschreibung | +|-------|--------------| +| `cleanup_temp_vorlagen.py` | Loescht temporaere DPA-Vorlagen aus Qdrant (`temp_vorlagen=true`) | + +## Integration in breakpilot-compliance + +### 1. SQL Migrations ausfuehren + +```bash +# Migrations gegen die shared DB ausfuehren +# Auf dem Mac Mini: +ssh macmini "docker exec bp-core-postgres psql -U breakpilot -d breakpilot_db -f -" < migrations/001_dsfa_template_v2.sql +ssh macmini "docker exec bp-core-postgres psql -U breakpilot -d breakpilot_db -f -" < migrations/002_tom_sdm_template.sql +# ... usw. +``` + +### 2. Python Generators kopieren (bei Compliance-Integration) + +```bash +cp generators/*.py /path/to/breakpilot-compliance/backend-compliance/compliance/api/document_templates/ +``` + +### 3. Neue document_types registrieren + +In `breakpilot-compliance/backend-compliance/compliance/api/legal_template_routes.py`, +`VALID_DOCUMENT_TYPES` erweitern um: +- `verpflichtungserklaerung` +- `informationspflichten` + +### 4. Qdrant Cleanup ausfuehren + +```bash +# Vorschau +ssh macmini "python3 /path/to/cleanup_temp_vorlagen.py --dry-run" + +# Ausfuehren +ssh macmini "python3 /path/to/cleanup_temp_vorlagen.py" +``` + +## Template-Syntax + +- `{{PLACEHOLDER}}` — Wird durch Kontext-Wert ersetzt +- `{{#IF FELD}}...{{/IF}}` — Bedingter Block (wird nur angezeigt wenn Feld gesetzt) +- `{{#IF_NOT FELD}}...{{/IF_NOT}}` — Invertierter bedingter Block +- `[BLOCK:ID]...[/BLOCK:ID]` — Block der per Rule Engine entfernt werden kann + +## Lizenz + +Alle Templates: MIT License, BreakPilot Compliance. +Keine Texte aus DPA-Dokumenten uebernommen — alle Formulierungen eigenstaendig. diff --git a/document-templates/generators/dsfa_template.py b/document-templates/generators/dsfa_template.py new file mode 100644 index 0000000..d4c3682 --- /dev/null +++ b/document-templates/generators/dsfa_template.py @@ -0,0 +1,455 @@ +"""DSFA template generator V2 — creates DSFA skeleton from company profile. + +Enhanced with: +- Schwellwertanalyse (9 WP248 criteria) +- Bundesland-specific Muss-Listen references +- SDM-based TOM structure (7 Gewaehrleistungsziele) +- Structured risk assessment (ISO 29134 methodology) +- AI Act module (Section 8) +- Art. 36 consultation assessment +""" + +from typing import Optional + +# -- WP248 Kriterien -------------------------------------------------------- + +WP248_CRITERIA = [ + {"id": "K1", "label": "Bewertung oder Scoring (einschl. Profiling und Prognose)", + "ctx_keys": ["has_profiling", "has_scoring"]}, + {"id": "K2", "label": "Automatisierte Entscheidungsfindung mit Rechtswirkung", + "ctx_keys": ["has_automated_decisions"]}, + {"id": "K3", "label": "Systematische Ueberwachung von Personen", + "ctx_keys": ["has_surveillance", "has_employee_monitoring", "has_video_surveillance"]}, + {"id": "K4", "label": "Verarbeitung sensibler Daten (Art. 9/10 DS-GVO)", + "ctx_keys": ["processes_health_data", "processes_biometric_data", "processes_criminal_data"]}, + {"id": "K5", "label": "Datenverarbeitung in grossem Umfang", + "ctx_keys": ["large_scale_processing"]}, + {"id": "K6", "label": "Verknuepfung oder Zusammenfuehrung von Datenbestaenden", + "ctx_keys": ["data_matching", "data_combining"]}, + {"id": "K7", "label": "Daten zu schutzbeduerftigen Betroffenen", + "ctx_keys": ["processes_minors_data", "processes_employee_data", "processes_patient_data"]}, + {"id": "K8", "label": "Innovative Nutzung neuer technologischer Loesungen", + "ctx_keys": ["uses_ai", "uses_biometrics", "uses_iot"]}, + {"id": "K9", "label": "Verarbeitung hindert Betroffene an Rechtsausuebung", + "ctx_keys": ["blocks_service_access", "blocks_contract"]}, +] + +# -- Bundesland -> Aufsichtsbehoerde Mapping -------------------------------- + +BUNDESLAND_AUFSICHT = { + "baden-wuerttemberg": ("LfDI Baden-Wuerttemberg", "DSK Muss-Liste + BW-spezifische Liste (Art. 35 Abs. 4)"), + "bayern": ("BayLDA (nicht-oeffentlicher Bereich)", "BayLDA Muss-Liste (17.10.2018) + Fallbeispiel ISO 29134"), + "berlin": ("BlnBDI", "BlnBDI Muss-Liste nicht-oeffentlich / oeffentlich"), + "brandenburg": ("LDA Brandenburg", "LDA BB Muss-Liste allgemein / oeffentlich"), + "bremen": ("LfDI Bremen", "LfDI HB Muss-Liste"), + "hamburg": ("HmbBfDI", "HmbBfDI Muss-Liste nicht-oeffentlich / oeffentlich"), + "hessen": ("HBDI", "DSK Muss-Liste (HBDI uebernimmt DSK-Liste)"), + "mecklenburg-vorpommern": ("LfDI M-V", "LfDI M-V Muss-Liste"), + "niedersachsen": ("LfD Niedersachsen", "LfD NI Muss-Liste + Pruefschema"), + "nordrhein-westfalen": ("LDI NRW", "LDI NRW Muss-Liste nicht-oeffentlich / oeffentlich"), + "rheinland-pfalz": ("LfDI RLP", "LfDI RLP Muss-Liste allgemein / oeffentlich"), + "saarland": ("UDS Saarland", "DSK Muss-Liste (UDS uebernimmt DSK-Liste)"), + "sachsen": ("SDB Sachsen", "SDB Sachsen Muss-Liste"), + "sachsen-anhalt": ("LfD Sachsen-Anhalt", "LfD SA Muss-Liste allgemein / oeffentlich"), + "schleswig-holstein": ("ULD Schleswig-Holstein", "ULD Muss-Liste + Planspiel-DSFA"), + "thueringen": ("TLfDI", "TLfDI Muss-Liste (04.07.2018)"), + "bund": ("BfDI", "BfDI Muss-Liste / DSFA-Hinweise"), +} + +# -- SDM Gewaehrleistungsziele ----------------------------------------------- + +SDM_GOALS = [ + { + "id": "verfuegbarkeit", + "label": "Verfuegbarkeit", + "description": "Personenbezogene Daten stehen zeitgerecht zur Verfuegung und koennen ordnungsgemaess verarbeitet werden.", + "default_measures": [ + "Redundante Datenhaltung und regelmaessige Backups", + "Disaster-Recovery-Plan mit definierten RTO/RPO-Werten", + "USV und Notstromversorgung fuer kritische Systeme", + ], + }, + { + "id": "integritaet", + "label": "Integritaet", + "description": "Personenbezogene Daten bleiben waehrend der Verarbeitung unversehrt, vollstaendig und aktuell.", + "default_measures": [ + "Pruefsummen und digitale Signaturen fuer Datenuebertragungen", + "Eingabevalidierung und Plausibilitaetspruefungen", + "Versionierung und Change-Management-Verfahren", + ], + }, + { + "id": "vertraulichkeit", + "label": "Vertraulichkeit", + "description": "Nur befugte Personen koennen personenbezogene Daten zur Kenntnis nehmen.", + "default_measures": [ + "Verschluesselung: TLS 1.3 im Transit, AES-256 at Rest", + "Rollenbasiertes Zugriffskonzept (RBAC) mit Least-Privilege-Prinzip", + "Multi-Faktor-Authentifizierung fuer administrative Zugaenge", + ], + }, + { + "id": "nichtverkettung", + "label": "Nichtverkettung", + "description": "Personenbezogene Daten werden nur fuer den Zweck verarbeitet, zu dem sie erhoben wurden.", + "default_measures": [ + "Technische Zweckbindung durch Mandantentrennung", + "Pseudonymisierung wo fachlich moeglich", + "Getrennte Datenbanken / Schemata je Verarbeitungszweck", + ], + }, + { + "id": "transparenz", + "label": "Transparenz", + "description": "Betroffene, der Verantwortliche und die Aufsichtsbehoerde koennen die Verarbeitung nachvollziehen.", + "default_measures": [ + "Vollstaendiges Audit-Log aller Datenzugriffe und -aenderungen", + "Verzeichnis der Verarbeitungstaetigkeiten (Art. 30 DS-GVO)", + "Informationspflichten gemaess Art. 13/14 DS-GVO umgesetzt", + ], + }, + { + "id": "intervenierbarkeit", + "label": "Intervenierbarkeit", + "description": "Betroffenenrechte (Auskunft, Berichtigung, Loeschung, Widerspruch) koennen wirksam ausgeuebt werden.", + "default_measures": [ + "Self-Service-Portal oder dokumentierter Prozess fuer Betroffenenanfragen", + "Technische Loeschfaehigkeit mit Nachweis (Loeschprotokoll)", + "Datenexport in maschinenlesbarem Format (Art. 20 DS-GVO)", + ], + }, + { + "id": "datenminimierung", + "label": "Datenminimierung", + "description": "Die Verarbeitung beschraenkt sich auf das erforderliche Mass.", + "default_measures": [ + "Regelmaessige Pruefung der Erforderlichkeit erhobener Datenfelder", + "Automatisierte Loeschung nach Ablauf der Aufbewahrungsfrist", + "Anonymisierung / Aggregation fuer statistische Zwecke", + ], + }, +] + + +def generate_dsfa_draft(ctx: dict) -> dict: + """Generate a DSFA draft document from template context. + + Args: + ctx: Flat dict from company-profile/template-context endpoint. + + Returns: + Dict with DSFA fields ready for creation via POST /dsfa. + """ + company = ctx.get("company_name", "Unbekannt") + dpo = ctx.get("dpo_name", "") + dpo_email = ctx.get("dpo_email", "") + federal_state = ctx.get("federal_state", "").lower().replace(" ", "-") + + # --- Section 0: Schwellwertanalyse --- + schwellwert = _generate_schwellwertanalyse(ctx) + + # --- Section 1: Verarbeitungsbeschreibung --- + section_1 = _generate_section_1(ctx, company, dpo, dpo_email) + + # --- Section 2: Notwendigkeit --- + section_2 = _generate_section_2(ctx) + + # --- Section 3: Risikobewertung --- + section_3 = _generate_risk_assessment(ctx) + + # --- Section 4: Stakeholder-Konsultation --- + section_4 = _generate_section_4(ctx) + + # --- Section 5: TOM nach SDM --- + section_5 = _generate_sdm_tom_section(ctx) + + # --- Section 6: DSB-Stellungnahme --- + section_6 = _generate_section_6(ctx, dpo) + + # --- Section 7: Ergebnis --- + section_7 = _generate_section_7(ctx) + + # --- Section 8: KI-Modul --- + ai_systems = ctx.get("ai_systems", []) + involves_ai = len(ai_systems) > 0 + section_8 = _generate_ai_module(ctx) if involves_ai else None + + sections = { + "section_0": {"title": "Schwellwertanalyse", "content": schwellwert["content"]}, + "section_1": {"title": "Allgemeine Informationen und Verarbeitungsbeschreibung", "content": section_1}, + "section_2": {"title": "Notwendigkeit und Verhaeltnismaessigkeit", "content": section_2}, + "section_3": {"title": "Risikobewertung", "content": section_3}, + "section_4": {"title": "Konsultation der Betroffenen", "content": section_4}, + "section_5": {"title": "Technische und organisatorische Massnahmen (SDM)", "content": section_5}, + "section_6": {"title": "Stellungnahme des DSB", "content": section_6}, + "section_7": {"title": "Ergebnis und Ueberprufungsplan", "content": section_7}, + } + if section_8: + sections["section_8"] = {"title": "KI-spezifisches Modul (EU AI Act)", "content": section_8} + + # Assess Art. 36 consultation requirement + art36_required = _assess_art36_consultation(ctx, schwellwert) + + return { + "title": f"DSFA — {company}", + "description": f"Datenschutz-Folgenabschaetzung fuer {company}", + "status": "draft", + "risk_level": "high" if involves_ai or schwellwert["criteria_met"] >= 3 else "medium", + "involves_ai": involves_ai, + "dpo_name": dpo, + "federal_state": ctx.get("federal_state", ""), + "sections": sections, + "wp248_criteria_met": schwellwert["criteria_details"], + "art35_abs3_triggered": schwellwert["art35_abs3"], + "threshold_analysis": { + "criteria_met_count": schwellwert["criteria_met"], + "dsfa_required": schwellwert["dsfa_required"], + "muss_liste_ref": schwellwert.get("muss_liste_ref", ""), + }, + "consultation_requirement": { + "art36_required": art36_required, + "reason": "Restrisiko bleibt nach Massnahmen hoch" if art36_required else "Restrisiko akzeptabel", + }, + "processing_systems": [s.get("name", "") for s in ctx.get("processing_systems", [])], + "ai_systems_summary": [ + {"name": s.get("name"), "risk": s.get("risk_category", "unknown")} + for s in ai_systems + ], + } + + +# -- Internal helpers -------------------------------------------------------- + +def _generate_schwellwertanalyse(ctx: dict) -> dict: + """Evaluate 9 WP248 criteria against company profile.""" + criteria_details = [] + criteria_met = 0 + + for criterion in WP248_CRITERIA: + met = any(ctx.get(key) for key in criterion["ctx_keys"]) + criteria_details.append({ + "id": criterion["id"], + "label": criterion["label"], + "met": met, + }) + if met: + criteria_met += 1 + + # Art. 35 Abs. 3 specific triggers + art35_abs3 = [] + if ctx.get("has_profiling") and ctx.get("has_automated_decisions"): + art35_abs3.append("Art. 35 Abs. 3 lit. a: Profiling mit Rechtswirkung") + if any(ctx.get(k) for k in ["processes_health_data", "processes_biometric_data", "processes_criminal_data"]): + if ctx.get("large_scale_processing"): + art35_abs3.append("Art. 35 Abs. 3 lit. b: Umfangreiche Verarbeitung besonderer Kategorien") + if ctx.get("has_surveillance"): + art35_abs3.append("Art. 35 Abs. 3 lit. c: Systematische Ueberwachung oeffentlicher Bereiche") + + dsfa_required = criteria_met >= 2 or len(art35_abs3) > 0 + + # Bundesland reference + federal_state = ctx.get("federal_state", "").lower().replace(" ", "-") + aufsicht_info = BUNDESLAND_AUFSICHT.get(federal_state, ("Nicht zugeordnet", "DSK Muss-Liste (allgemein)")) + + met_labels = [c["label"] for c in criteria_details if c["met"]] + content_lines = [ + f"**Anzahl erfuellter WP248-Kriterien:** {criteria_met} von 9\n", + f"**Erfuellte Kriterien:** {', '.join(met_labels) if met_labels else 'Keine'}\n", + ] + if art35_abs3: + content_lines.append(f"**Art. 35 Abs. 3 DS-GVO direkt ausgeloest:** {'; '.join(art35_abs3)}\n") + content_lines.append( + f"\n**Ergebnis:** DSFA ist {'**erforderlich**' if dsfa_required else '**nicht erforderlich**'}." + ) + if dsfa_required and criteria_met < 2: + content_lines.append(" (Ausgeloest durch Art. 35 Abs. 3 DS-GVO)") + + return { + "content": "\n".join(content_lines), + "criteria_met": criteria_met, + "criteria_details": criteria_details, + "art35_abs3": art35_abs3, + "dsfa_required": dsfa_required, + "muss_liste_ref": aufsicht_info[1], + } + + +def _generate_section_1(ctx: dict, company: str, dpo: str, dpo_email: str) -> str: + federal_state = ctx.get("federal_state", "") + aufsicht = BUNDESLAND_AUFSICHT.get( + federal_state.lower().replace(" ", "-"), ("Nicht zugeordnet",) + )[0] + + lines = [ + f"**Verantwortlicher:** {company}", + f"**Datenschutzbeauftragter:** {dpo}" + (f" ({dpo_email})" if dpo_email else ""), + f"**Zustaendige Aufsichtsbehoerde:** {aufsicht}", + ] + + systems = ctx.get("processing_systems", []) + if systems: + lines.append("\n**Eingesetzte Verarbeitungssysteme:**") + for s in systems: + hosting = s.get("hosting", "") + lines.append(f"- {s.get('name', 'N/A')}" + (f" ({hosting})" if hosting else "")) + + return "\n".join(lines) + + +def _generate_section_2(ctx: dict) -> str: + lines = [ + "### Notwendigkeit\n", + "Die Verarbeitung ist zur Erreichung des beschriebenen Zwecks erforderlich. ", + "Alternative, weniger eingriffsintensive Massnahmen wurden geprueft.\n", + "### Datenminimierung\n", + "Die verarbeiteten Datenkategorien beschraenken sich auf das fuer den ", + "Verarbeitungszweck erforderliche Minimum (Art. 5 Abs. 1 lit. c DS-GVO).\n", + ] + return "".join(lines) + + +def _generate_risk_assessment(ctx: dict) -> str: + lines = ["## Risikoanalyse\n"] + + # Standard risks + risks = [ + ("Unbefugter Zugriff auf personenbezogene Daten", "mittel", "hoch", "hoch"), + ("Datenverlust durch technischen Ausfall", "niedrig", "hoch", "mittel"), + ("Fehlerhafte Verarbeitung / Datenqualitaet", "niedrig", "mittel", "niedrig"), + ("Zweckentfremdung erhobener Daten", "niedrig", "hoch", "mittel"), + ] + + if ctx.get("has_ai_systems") or ctx.get("uses_ai"): + risks.append(("Diskriminierung durch algorithmische Entscheidungen", "mittel", "hoch", "hoch")) + risks.append(("Mangelnde Erklaerbarkeit von KI-Entscheidungen", "mittel", "mittel", "mittel")) + + if ctx.get("processes_health_data"): + risks.append(("Offenlegung von Gesundheitsdaten", "niedrig", "gross", "hoch")) + + if any(ctx.get(k) for k in ["third_country_transfer", "processes_in_third_country"]): + risks.append(("Zugriff durch Behoerden in Drittlaendern", "mittel", "hoch", "hoch")) + + lines.append("| Risiko | Eintrittswahrscheinlichkeit | Schwere | Gesamt |") + lines.append("|--------|----------------------------|---------|--------|") + for risk_name, likelihood, severity, overall in risks: + lines.append(f"| {risk_name} | {likelihood} | {severity} | **{overall}** |") + + lines.append("") + + high_risks = sum(1 for _, _, _, o in risks if o == "hoch") + if high_risks > 0: + lines.append(f"\n**{high_risks} Risiken mit Stufe 'hoch' identifiziert.** " + "Massnahmen gemaess Abschnitt 5 reduzieren das Restrisiko.") + + return "\n".join(lines) + + +def _generate_section_4(ctx: dict) -> str: + lines = [] + if ctx.get("has_works_council"): + lines.append("Der Betriebsrat wurde informiert und angehoert.") + lines.append( + "Eine Konsultation der Betroffenen gemaess Art. 35 Abs. 9 DS-GVO " + "wird empfohlen, soweit verhaeltnismaessig und praktikabel." + ) + return "\n".join(lines) + + +def _generate_sdm_tom_section(ctx: dict) -> str: + """Generate TOM section structured by 7 SDM Gewaehrleistungsziele.""" + lines = [] + for goal in SDM_GOALS: + lines.append(f"**{goal['label']}** — {goal['description']}\n") + lines.append("| Massnahme | Typ | Status |") + lines.append("|-----------|-----|--------|") + for measure in goal["default_measures"]: + mtype = "technisch" if any( + kw in measure.lower() + for kw in ["verschluesselung", "backup", "redundanz", "tls", "aes", "rbac", "mfa", + "pruefsumm", "validierung", "loeschfaehigkeit", "export", "automatisiert"] + ) else "organisatorisch" + lines.append(f"| {measure} | {mtype} | geplant |") + lines.append("") + return "\n".join(lines) + + +def _generate_section_6(ctx: dict, dpo: str) -> str: + if dpo: + return ( + f"Der Datenschutzbeauftragte ({dpo}) wurde konsultiert. " + "Die Stellungnahme liegt bei bzw. wird nachgereicht." + ) + return ( + "Ein Datenschutzbeauftragter wurde noch nicht benannt. " + "Sofern eine Benennungspflicht besteht (Art. 37 DS-GVO), " + "ist dies vor Abschluss der DSFA nachzuholen." + ) + + +def _generate_section_7(ctx: dict) -> str: + review_months = ctx.get("review_cycle_months", 12) + lines = [ + "### Ergebnis\n", + "Die DSFA wurde gemaess Art. 35 DS-GVO durchgefuehrt. Die identifizierten Risiken ", + "wurden bewertet und durch geeignete Massnahmen auf ein akzeptables Niveau reduziert.\n", + "### Ueberprufungsplan\n", + f"- **Regelmaessige Ueberprufung:** alle {review_months} Monate\n", + "- **Trigger fuer ausserplanmaessige Ueberprufung:**\n", + " - Wesentliche Aenderung der Verarbeitungstaetigkeit\n", + " - Neue oder geaenderte Rechtsgrundlage\n", + " - Sicherheitsvorfall mit Bezug zur Verarbeitung\n", + " - Aenderung der eingesetzten Technologie oder Auftragsverarbeiter\n", + " - Neue Erkenntnisse zu Risiken oder Bedrohungen\n", + ] + return "".join(lines) + + +def _generate_ai_module(ctx: dict) -> str: + """Generate Section 8 for AI systems (EU AI Act).""" + lines = ["### Eingesetzte KI-Systeme\n"] + + ai_systems = ctx.get("ai_systems", []) + if ai_systems: + lines.append("| System | Zweck | Risikokategorie | Human Oversight |") + lines.append("|--------|-------|-----------------|-----------------|") + for s in ai_systems: + risk = s.get("risk_category", "unbekannt") + oversight = "Ja" if s.get("has_human_oversight") else "Nein" + lines.append(f"| {s.get('name', 'N/A')} | {s.get('purpose', 'N/A')} | {risk} | {oversight} |") + lines.append("") + + if ctx.get("subject_to_ai_act"): + lines.append( + "**Hinweis:** Das Unternehmen unterliegt dem EU AI Act (Verordnung (EU) 2024/1689). " + "Fuer Hochrisiko-KI-Systeme ist eine grundrechtliche Folgenabschaetzung " + "gemaess Art. 27 KI-VO durchzufuehren.\n" + ) + + high_risk = [s for s in ai_systems if s.get("risk_category") in ("high", "hoch")] + if high_risk: + lines.append("### Hochrisiko-KI-Systeme — Zusatzanforderungen\n") + lines.append("Fuer die folgenden Systeme gelten die Anforderungen aus Kapitel III KI-VO:\n") + for s in high_risk: + lines.append(f"- **{s.get('name', 'N/A')}**: Risikomanagement (Art. 9), " + f"Daten-Governance (Art. 10), Transparenz (Art. 13), " + f"Human Oversight (Art. 14)\n") + + return "\n".join(lines) + + +def _assess_art36_consultation(ctx: dict, schwellwert: dict) -> bool: + """Determine if Art. 36 DSGVO consultation with supervisory authority is required. + + Art. 36 requires prior consultation when the DSFA indicates that the processing + would result in a HIGH residual risk despite mitigation measures. + """ + if schwellwert["criteria_met"] >= 4: + return True + if len(schwellwert.get("art35_abs3", [])) >= 2: + return True + ai_systems = ctx.get("ai_systems", []) + high_risk_ai = [s for s in ai_systems if s.get("risk_category") in ("high", "hoch", "unacceptable")] + if len(high_risk_ai) >= 2: + return True + return False diff --git a/document-templates/generators/tom_template.py b/document-templates/generators/tom_template.py new file mode 100644 index 0000000..119e05b --- /dev/null +++ b/document-templates/generators/tom_template.py @@ -0,0 +1,285 @@ +"""TOM template generator V2 — SDM-structured TOM catalog. + +Replaces the flat 17-measure list with a hierarchical structure based on +the 7 SDM Gewaehrleistungsziele (Standard-Datenschutzmodell V3.1a). +""" + +# -- SDM-structured TOM catalog --------------------------------------------- + +SDM_TOM_CATALOG = { + "verfuegbarkeit": { + "label": "Verfuegbarkeit", + "sdm_baustein": "SDM-B11 (Aufbewahren)", + "measures": [ + {"name": "Redundante Datenhaltung", "description": "RAID, Replikation, Geo-Redundanz", "type": "technical"}, + {"name": "Backup-Strategie", "description": "Taeglich inkrementell, woechentlich voll, verschluesselt", "type": "technical"}, + {"name": "Disaster-Recovery-Plan", "description": "Dokumentierte RTO/RPO-Werte, jaehrliche Tests", "type": "organizational"}, + {"name": "USV / Notstromversorgung", "description": "Unterbrechungsfreie Stromversorgung fuer kritische Systeme", "type": "technical"}, + ], + }, + "integritaet": { + "label": "Integritaet", + "sdm_baustein": "SDM-B61 (Berichtigen)", + "measures": [ + {"name": "Pruefsummen und Signaturen", "description": "Digitale Signaturen fuer Datenuebertragungen", "type": "technical"}, + {"name": "Eingabevalidierung", "description": "Plausibilitaetspruefungen auf allen Eingabeschnittstellen", "type": "technical"}, + {"name": "Change Management", "description": "Dokumentierte Aenderungsverfahren mit Freigabeprozess", "type": "organizational"}, + {"name": "Versionierung", "description": "Versionierung von Datensaetzen und Konfigurationen", "type": "technical"}, + ], + }, + "vertraulichkeit": { + "label": "Vertraulichkeit", + "sdm_baustein": "SDM-B51 (Zugriffe regeln)", + "measures": [ + {"name": "Verschluesselung im Transit", "description": "TLS 1.3 fuer alle Verbindungen", "type": "technical"}, + {"name": "Verschluesselung at Rest", "description": "AES-256 fuer gespeicherte Daten", "type": "technical"}, + {"name": "Zugriffskonzept (RBAC)", "description": "Rollenbasiert, Least-Privilege-Prinzip, regelmaessige Reviews", "type": "technical"}, + {"name": "Multi-Faktor-Authentifizierung", "description": "MFA fuer alle administrativen Zugaenge", "type": "technical"}, + {"name": "Physische Zutrittskontrolle", "description": "Schluessel, Kartenleser, Besucherprotokoll", "type": "technical"}, + {"name": "Vertraulichkeitsverpflichtung", "description": "Schriftliche Verpflichtung aller Mitarbeitenden", "type": "organizational"}, + ], + }, + "nichtverkettung": { + "label": "Nichtverkettung", + "sdm_baustein": "SDM-B50 (Trennen)", + "measures": [ + {"name": "Mandantentrennung", "description": "Logische Datentrennung nach Mandanten/Zweck", "type": "technical"}, + {"name": "Pseudonymisierung", "description": "Wo fachlich moeglich, Einsatz von Pseudonymen", "type": "technical"}, + {"name": "Zweckbindungspruefung", "description": "Pruefung bei jeder neuen Datennutzung", "type": "organizational"}, + ], + }, + "transparenz": { + "label": "Transparenz", + "sdm_baustein": "SDM-B42 (Dokumentieren), SDM-B43 (Protokollieren)", + "measures": [ + {"name": "Verarbeitungsverzeichnis", "description": "Art. 30 DS-GVO konformes VVT", "type": "organizational"}, + {"name": "Audit-Logging", "description": "Vollstaendige Protokollierung aller Datenzugriffe", "type": "technical"}, + {"name": "Informationspflichten", "description": "Art. 13/14 DS-GVO Datenschutzerklaerung", "type": "organizational"}, + {"name": "Datenpannen-Prozess", "description": "Dokumentierter Meldeprozess Art. 33/34 DS-GVO", "type": "organizational"}, + ], + }, + "intervenierbarkeit": { + "label": "Intervenierbarkeit", + "sdm_baustein": "SDM-B60 (Loeschen), SDM-B61 (Berichtigen), SDM-B62 (Einschraenken)", + "measures": [ + {"name": "Betroffenenanfragen-Prozess", "description": "Auskunft, Loeschung, Berichtigung, Widerspruch", "type": "organizational"}, + {"name": "Technische Loeschfaehigkeit", "description": "Loeschung mit Nachweis (Loeschprotokoll)", "type": "technical"}, + {"name": "Datenportabilitaet", "description": "Export in maschinenlesbarem Format (Art. 20)", "type": "technical"}, + {"name": "Sperrfunktion", "description": "Einschraenkung der Verarbeitung moeglich", "type": "technical"}, + ], + }, + "datenminimierung": { + "label": "Datenminimierung", + "sdm_baustein": "SDM-B41 (Planen und Spezifizieren)", + "measures": [ + {"name": "Erforderlichkeitspruefung", "description": "Regelmaessige Pruefung der erhobenen Datenfelder", "type": "organizational"}, + {"name": "Automatisierte Loeschung", "description": "Fristgerechte Loeschung nach Aufbewahrungsfrist", "type": "technical"}, + {"name": "Anonymisierung", "description": "Anonymisierung/Aggregation fuer Statistik", "type": "technical"}, + {"name": "Privacy by Design", "description": "Datenschutz ab Entwurfsphase neuer Verarbeitungen", "type": "organizational"}, + ], + }, +} + +# -- Sector-specific extensions ---------------------------------------------- + +SECTOR_TOMS = { + "it_saas": { + "label": "IT / SaaS", + "measures": [ + {"name": "Container-Isolation", "description": "Workload-Isolation zwischen Mandanten (Kubernetes Namespaces)", "type": "technical", "sdm_goal": "nichtverkettung"}, + {"name": "API-Security", "description": "Rate Limiting, OAuth 2.0, API-Key-Rotation", "type": "technical", "sdm_goal": "vertraulichkeit"}, + {"name": "DevSecOps Pipeline", "description": "SAST/DAST in CI/CD, Dependency Scanning", "type": "technical", "sdm_goal": "integritaet"}, + {"name": "Secrets Management", "description": "Vault/KMS fuer Credentials, keine Hardcoded Secrets", "type": "technical", "sdm_goal": "vertraulichkeit"}, + ], + }, + "gesundheitswesen": { + "label": "Gesundheitswesen", + "measures": [ + {"name": "Patientenakten-Verschluesselung", "description": "Ende-zu-Ende-Verschluesselung fuer Gesundheitsdaten (Art. 9)", "type": "technical", "sdm_goal": "vertraulichkeit"}, + {"name": "Notfallzugriff", "description": "Break-the-Glass-Verfahren fuer medizinische Notfaelle", "type": "organizational", "sdm_goal": "verfuegbarkeit"}, + {"name": "Forschungsdaten-Anonymisierung", "description": "Vollstaendige Anonymisierung vor Forschungsnutzung", "type": "technical", "sdm_goal": "datenminimierung"}, + ], + }, + "finanzdienstleistungen": { + "label": "Finanzdienstleistungen", + "measures": [ + {"name": "Transaktions-Monitoring", "description": "Echtzeit-Ueberwachung auf Unregelmaessigkeiten (GwG)", "type": "technical", "sdm_goal": "integritaet"}, + {"name": "Aufbewahrungspflichten", "description": "10 Jahre Aufbewahrung gemaess AO/HGB, danach Loeschung", "type": "organizational", "sdm_goal": "datenminimierung"}, + {"name": "PCI-DSS Compliance", "description": "Payment Card Industry Standards fuer Kartendaten", "type": "technical", "sdm_goal": "vertraulichkeit"}, + ], + }, + "handel": { + "label": "Handel / E-Commerce", + "measures": [ + {"name": "Cookie-Consent-Management", "description": "TDDDG-konformes Einwilligungsmanagement", "type": "technical", "sdm_goal": "transparenz"}, + {"name": "Gastzugang-Option", "description": "Bestellung ohne Pflicht-Kundenkonto (Datenminimierung)", "type": "organizational", "sdm_goal": "datenminimierung"}, + {"name": "Zahlungsdaten-Tokenisierung", "description": "Keine direkte Speicherung von Zahlungsdaten", "type": "technical", "sdm_goal": "vertraulichkeit"}, + ], + }, + "handwerk": { + "label": "Handwerk", + "measures": [ + {"name": "Mobile-Device-Management", "description": "Absicherung mobiler Endgeraete auf Baustellen", "type": "technical", "sdm_goal": "vertraulichkeit"}, + {"name": "Papierakten-Sicherung", "description": "Verschlossene Schraenke fuer physische Kundenakten", "type": "technical", "sdm_goal": "vertraulichkeit"}, + ], + }, +} + +# -- NIS2 / ISO 27001 / AI Act extensions ----------------------------------- + +NIS2_TOMS = [ + {"name": "Incident-Response-Plan", "description": "NIS2-konformer Vorfallreaktionsplan (72h Meldepflicht an BSI)", "type": "organizational", "sdm_goal": "verfuegbarkeit"}, + {"name": "Supply-Chain-Security", "description": "Bewertung der Lieferkettensicherheit (BSIG 2025)", "type": "organizational", "sdm_goal": "integritaet"}, + {"name": "Vulnerability Management", "description": "Regelmaessige Schwachstellenscans, Patch-Management", "type": "technical", "sdm_goal": "integritaet"}, + {"name": "Security Awareness", "description": "Pflicht-Schulungen Cybersicherheit fuer Geschaeftsleitung", "type": "organizational", "sdm_goal": "vertraulichkeit"}, +] + +ISO27001_TOMS = [ + {"name": "ISMS Risikomanagement", "description": "ISO 27001 Anhang A — Informationssicherheits-Risikobewertung", "type": "organizational", "sdm_goal": "verfuegbarkeit"}, + {"name": "Dokumentenlenkung", "description": "Versionierte Sicherheitsrichtlinien und -verfahren", "type": "organizational", "sdm_goal": "transparenz"}, + {"name": "Management Review", "description": "Jaehrliche Ueberprufung des ISMS durch Geschaeftsleitung", "type": "organizational", "sdm_goal": "transparenz"}, +] + +AI_ACT_TOMS = [ + {"name": "KI-Risikoklassifizierung", "description": "Bewertung aller KI-Systeme nach EU AI Act Risikokategorien", "type": "organizational", "sdm_goal": "transparenz"}, + {"name": "Human Oversight", "description": "Menschliche Aufsicht fuer Hochrisiko-KI-Systeme (Art. 14 KI-VO)", "type": "organizational", "sdm_goal": "intervenierbarkeit"}, + {"name": "KI-Transparenz", "description": "Transparenzpflichten bei KI-Einsatz gegenueber Betroffenen (Art. 13 KI-VO)", "type": "organizational", "sdm_goal": "transparenz"}, + {"name": "KI-Bias-Monitoring", "description": "Ueberwachung auf diskriminierende Ergebnisse", "type": "technical", "sdm_goal": "integritaet"}, +] + + +def generate_tom_drafts(ctx: dict) -> list[dict]: + """Generate TOM measure drafts structured by SDM Gewaehrleistungsziele. + + Args: + ctx: Flat dict from company-profile/template-context. + + Returns: + List of TOM measure dicts with SDM goal assignment. + """ + measures = [] + control_counter = 0 + + # Base SDM measures + for goal_key, goal_data in SDM_TOM_CATALOG.items(): + for m in goal_data["measures"]: + control_counter += 1 + measures.append(_build_measure( + counter=control_counter, + measure=m, + sdm_goal=goal_key, + sdm_baustein=goal_data["sdm_baustein"], + category=goal_data["label"], + ctx=ctx, + )) + + # Regulatory extensions + if ctx.get("subject_to_nis2"): + for m in NIS2_TOMS: + control_counter += 1 + measures.append(_build_measure( + counter=control_counter, + measure=m, + sdm_goal=m["sdm_goal"], + sdm_baustein="NIS2 / BSIG 2025", + category="Cybersicherheit (NIS2)", + ctx=ctx, + )) + + if ctx.get("subject_to_iso27001"): + for m in ISO27001_TOMS: + control_counter += 1 + measures.append(_build_measure( + counter=control_counter, + measure=m, + sdm_goal=m["sdm_goal"], + sdm_baustein="ISO 27001 Anhang A", + category="ISMS (ISO 27001)", + ctx=ctx, + )) + + if ctx.get("subject_to_ai_act") or ctx.get("has_ai_systems"): + for m in AI_ACT_TOMS: + control_counter += 1 + measures.append(_build_measure( + counter=control_counter, + measure=m, + sdm_goal=m["sdm_goal"], + sdm_baustein="EU AI Act (2024/1689)", + category="KI-Compliance", + ctx=ctx, + )) + + # Sector-specific extensions + sector = _detect_sector(ctx) + if sector and sector in SECTOR_TOMS: + sector_data = SECTOR_TOMS[sector] + for m in sector_data["measures"]: + control_counter += 1 + measures.append(_build_measure( + counter=control_counter, + measure=m, + sdm_goal=m.get("sdm_goal", "vertraulichkeit"), + sdm_baustein=f"Sektor: {sector_data['label']}", + category=f"Sektor ({sector_data['label']})", + ctx=ctx, + )) + + return measures + + +def sdm_coverage_summary(measures: list[dict]) -> dict: + """Return coverage matrix: SDM goal -> measure count.""" + summary = {} + for goal_key in SDM_TOM_CATALOG: + count = sum(1 for m in measures if m.get("sdm_goal") == goal_key) + summary[goal_key] = { + "label": SDM_TOM_CATALOG[goal_key]["label"], + "count": count, + } + return summary + + +# -- Internal helpers -------------------------------------------------------- + +def _build_measure(counter: int, measure: dict, sdm_goal: str, + sdm_baustein: str, category: str, ctx: dict) -> dict: + return { + "control_id": f"TOM-SDM-{counter:03d}", + "name": measure["name"], + "description": measure["description"], + "category": category, + "type": measure.get("type", "organizational"), + "sdm_goal": sdm_goal, + "sdm_baustein_ref": sdm_baustein, + "implementation_status": "not_implemented", + "effectiveness_rating": "not_assessed", + "responsible_department": "IT-Sicherheit", + "priority": _assess_priority(measure, ctx), + "review_frequency": f"{ctx.get('review_cycle_months', 12)} Monate", + } + + +def _assess_priority(measure: dict, ctx: dict) -> str: + name_lower = measure.get("name", "").lower() + if any(kw in name_lower for kw in ["verschluesselung", "mfa", "incident", "ki-risiko"]): + return "high" + if any(kw in name_lower for kw in ["backup", "zugriff", "logging", "loeschung"]): + return "high" + return "medium" + + +def _detect_sector(ctx: dict) -> str | None: + """Map company industry to sector key.""" + industry = (ctx.get("industry") or "").lower() + mapping = { + "technologie": "it_saas", "it": "it_saas", "saas": "it_saas", "software": "it_saas", + "gesundheit": "gesundheitswesen", "pharma": "gesundheitswesen", "medizin": "gesundheitswesen", + "finanz": "finanzdienstleistungen", "bank": "finanzdienstleistungen", "versicherung": "finanzdienstleistungen", + "handel": "handel", "e-commerce": "handel", "einzelhandel": "handel", "shop": "handel", + "handwerk": "handwerk", "bau": "handwerk", "kfz": "handwerk", + } + for keyword, sector in mapping.items(): + if keyword in industry: + return sector + return None diff --git a/document-templates/generators/vvt_template.py b/document-templates/generators/vvt_template.py new file mode 100644 index 0000000..3a3b27c --- /dev/null +++ b/document-templates/generators/vvt_template.py @@ -0,0 +1,393 @@ +"""VVT template generator V2 — sector-specific VVT activity drafts. + +Generates Art. 30 DS-GVO compliant VVT entries with sector-specific +standard processing activities inspired by BayLDA patterns. +""" + +from typing import Optional + +# -- Sector activity catalogs ------------------------------------------------ + +SECTOR_ACTIVITIES = { + "it_saas": [ + { + "name": "SaaS-Plattformbetrieb", + "purposes": ["Bereitstellung und Betrieb der SaaS-Plattform"], + "legal_bases": ["Art. 6 Abs. 1 lit. b DS-GVO (Vertragserfullung)"], + "data_subject_categories": ["Kunden", "Endnutzer"], + "personal_data_categories": ["Stammdaten", "Nutzungsdaten", "Inhaltsdaten", "Logdaten"], + "recipient_categories": ["Hosting-Anbieter (AVV)", "Support-Dienstleister (AVV)"], + "retention_period": "90 Tage nach Vertragsende + gesetzl. Aufbewahrung", + "tom_description": "Mandantentrennung, Verschluesselung, RBAC", + "dpia_required": True, + }, + { + "name": "Kundenverwaltung / CRM", + "purposes": ["Verwaltung von Kundenbeziehungen, Vertragsmanagement"], + "legal_bases": ["Art. 6 Abs. 1 lit. b DS-GVO"], + "data_subject_categories": ["Kunden", "Ansprechpartner", "Interessenten"], + "personal_data_categories": ["Kontaktdaten", "Vertragsdaten", "Kommunikationshistorie"], + "recipient_categories": ["CRM-Anbieter (AVV)"], + "retention_period": "3 Jahre nach letztem Kontakt, 10 Jahre Rechnungsdaten", + "tom_description": "Zugriffsbeschraenkung Vertrieb/Support, Protokollierung", + }, + { + "name": "E-Mail-Marketing / Newsletter", + "purposes": ["Versand von Produkt-Updates und Marketing-Newsletter"], + "legal_bases": ["Art. 6 Abs. 1 lit. a DS-GVO (Einwilligung)", "UWG §7"], + "data_subject_categories": ["Newsletter-Abonnenten"], + "personal_data_categories": ["E-Mail-Adresse", "Name", "Oeffnungs-/Klickverhalten"], + "recipient_categories": ["E-Mail-Dienstleister (AVV)"], + "retention_period": "Unverzueglich nach Widerruf", + "tom_description": "Double-Opt-In, einfache Abmeldefunktion", + }, + { + "name": "Webanalyse", + "purposes": ["Analyse der Website-Nutzung zur Verbesserung"], + "legal_bases": ["Art. 6 Abs. 1 lit. a DS-GVO (Einwilligung via Cookie-Banner)"], + "data_subject_categories": ["Website-Besucher"], + "personal_data_categories": ["IP-Adresse (anonymisiert)", "Seitenaufrufe", "Geraeteinformationen"], + "recipient_categories": ["Analyse-Anbieter (AVV)"], + "retention_period": "14 Monate", + "tom_description": "IP-Anonymisierung, Cookie-Consent (TDDDG §25)", + }, + { + "name": "Bewerbermanagement", + "purposes": ["Bearbeitung von Bewerbungen"], + "legal_bases": ["Art. 6 Abs. 1 lit. b DS-GVO i.V.m. §26 BDSG"], + "data_subject_categories": ["Bewerber"], + "personal_data_categories": ["Kontaktdaten", "Lebenslauf", "Qualifikationen"], + "recipient_categories": ["Fachabteilung"], + "retention_period": "6 Monate nach Verfahrensabschluss (AGG)", + "tom_description": "Zugriffsschutz Bewerbungsportal, verschluesselte Uebertragung", + }, + { + "name": "Mitarbeiterverwaltung / HR", + "purposes": ["Personalverwaltung, Lohnabrechnung, Arbeitszeiterfassung"], + "legal_bases": ["Art. 6 Abs. 1 lit. b/c DS-GVO i.V.m. §26 BDSG"], + "data_subject_categories": ["Beschaeftigte"], + "personal_data_categories": ["Stammdaten", "Vertragsdaten", "Bankverbindung", "Arbeitszeiten"], + "recipient_categories": ["Lohnbuero (AVV)", "Finanzamt", "Sozialversicherungstraeger"], + "retention_period": "10 Jahre nach Austritt", + "tom_description": "Besonderer Zugriffsschutz (nur HR), verschluesselte Speicherung", + }, + { + "name": "Support-Ticketing", + "purposes": ["Bearbeitung von Kundenanfragen und Stoerungsmeldungen"], + "legal_bases": ["Art. 6 Abs. 1 lit. b DS-GVO"], + "data_subject_categories": ["Kunden", "Endnutzer"], + "personal_data_categories": ["Kontaktdaten", "Ticket-Inhalt", "Systemlogs"], + "recipient_categories": ["Support-Tool-Anbieter (AVV)"], + "retention_period": "2 Jahre nach Ticket-Schliessung", + "tom_description": "Rollenbasierter Zugriff, Pseudonymisierung in Reports", + }, + { + "name": "Logging und Monitoring", + "purposes": ["Sicherheitsueberwachung, Fehleranalyse"], + "legal_bases": ["Art. 6 Abs. 1 lit. f DS-GVO (berechtigtes Interesse: IT-Sicherheit)"], + "data_subject_categories": ["Plattform-Nutzer", "Administratoren"], + "personal_data_categories": ["IP-Adressen", "Zugriffszeitpunkte", "Fehlerprotokolle"], + "recipient_categories": ["Log-Management-Anbieter (AVV)"], + "retention_period": "30 Tage Anwendungslogs, 90 Tage Sicherheitslogs", + "tom_description": "Zugriffsschutz Logdaten, automatische Rotation", + }, + ], + "gesundheitswesen": [ + { + "name": "Patientenverwaltung", + "purposes": ["Patientenakte, Behandlungsdokumentation"], + "legal_bases": ["Art. 9 Abs. 2 lit. h DS-GVO i.V.m. §630f BGB"], + "data_subject_categories": ["Patienten"], + "personal_data_categories": ["Stammdaten", "Versicherung", "Diagnosen", "Befunde (Art. 9)"], + "recipient_categories": ["PVS-Anbieter (AVV)", "Labor (AVV)", "ueberweisende Aerzte"], + "retention_period": "10 Jahre nach letzter Behandlung (§630f BGB)", + "tom_description": "Verschluesselung Patientenakte, Notfallzugriff", + "dpia_required": True, + }, + { + "name": "Abrechnung (KV/PKV)", + "purposes": ["Abrechnung aerztlicher Leistungen"], + "legal_bases": ["Art. 6 Abs. 1 lit. c DS-GVO", "Art. 9 Abs. 2 lit. h"], + "data_subject_categories": ["Patienten"], + "personal_data_categories": ["Stammdaten", "Versicherung", "Diagnosen (ICD)", "Leistungsziffern"], + "recipient_categories": ["KV", "PKV", "Abrechnungsstelle (AVV)"], + "retention_period": "10 Jahre (AO)", + "tom_description": "Verschluesselte Uebermittlung (KV-Connect/KIM)", + }, + ], + "handel": [ + { + "name": "Bestellabwicklung", + "purposes": ["Bestellannahme, Versand, Rechnungsstellung"], + "legal_bases": ["Art. 6 Abs. 1 lit. b DS-GVO"], + "data_subject_categories": ["Kunden (Besteller)"], + "personal_data_categories": ["Kontaktdaten", "Lieferadresse", "Bestelldaten", "Rechnungsdaten"], + "recipient_categories": ["Versanddienstleister", "Zahlungsanbieter (AVV)"], + "retention_period": "10 Jahre Rechnungen, 3 Jahre Bestelldaten", + "tom_description": "Verschluesselte Uebertragung, Zugriffsschutz", + }, + { + "name": "Kundenkonto", + "purposes": ["Bereitstellung Kundenkonto (optional)"], + "legal_bases": ["Art. 6 Abs. 1 lit. a/b DS-GVO"], + "data_subject_categories": ["Registrierte Kunden"], + "personal_data_categories": ["Stammdaten", "Passwort (gehasht)", "Bestellhistorie"], + "recipient_categories": ["Shop-Plattform (AVV)"], + "retention_period": "Sofort nach Kontoloesch-Anfrage, Rechnungen 10 Jahre", + "tom_description": "MFA-Option, bcrypt Passwortspeicherung, Gastzugang-Alternative", + }, + { + "name": "Zahlungsabwicklung", + "purposes": ["Abwicklung von Zahlungsvorgaengen"], + "legal_bases": ["Art. 6 Abs. 1 lit. b DS-GVO"], + "data_subject_categories": ["Zahlende Kunden"], + "personal_data_categories": ["Zahlungsart", "Transaktionsdaten"], + "recipient_categories": ["Payment-Service-Provider"], + "retention_period": "10 Jahre (AO)", + "tom_description": "PCI-DSS, Tokenisierung, keine direkte Kartenspeicherung", + }, + ], + "handwerk": [ + { + "name": "Kundenauftraege und Angebotserstellung", + "purposes": ["Angebotserstellung, Auftragsabwicklung, Rechnungsstellung"], + "legal_bases": ["Art. 6 Abs. 1 lit. b DS-GVO"], + "data_subject_categories": ["Kunden (Privat/Gewerbe)"], + "personal_data_categories": ["Kontaktdaten", "Objektadresse", "Auftrag", "Rechnungsdaten"], + "recipient_categories": ["Steuerberater", "ggf. Subunternehmer"], + "retention_period": "10 Jahre Rechnungen, 5 Jahre Gewaehrleistung", + "tom_description": "Zugriffskontrolle Auftragssystem", + }, + { + "name": "Baustellendokumentation", + "purposes": ["Dokumentation Baufortschritt, Maengelprotokoll"], + "legal_bases": ["Art. 6 Abs. 1 lit. b/f DS-GVO"], + "data_subject_categories": ["Kunden", "Mitarbeitende"], + "personal_data_categories": ["Fotos", "Protokolle", "Abnahmedokumente"], + "recipient_categories": ["Auftraggeber", "Architekten"], + "retention_period": "5 Jahre nach Abnahme", + "tom_description": "Projektordner mit Zugriffsbeschraenkung", + }, + ], + "bildung": [ + { + "name": "Schueler-/Studierendenverwaltung", + "purposes": ["Verwaltung von Schueler-/Studierendendaten"], + "legal_bases": ["Art. 6 Abs. 1 lit. c/e DS-GVO i.V.m. Schulgesetz"], + "data_subject_categories": ["Schueler/Studierende (ggf. Minderjaehrige)", "Erziehungsberechtigte"], + "personal_data_categories": ["Stammdaten", "Kontaktdaten Erziehungsberechtigte"], + "recipient_categories": ["Schulverwaltungssoftware (AVV)", "Schulbehoerde"], + "retention_period": "Gemaess Schulgesetz (i.d.R. 5 Jahre nach Abgang)", + "tom_description": "Besonderer Zugriffsschutz, Einwilligung Erziehungsberechtigte", + "dpia_required": True, + }, + { + "name": "Notenverarbeitung", + "purposes": ["Leistungsbewertung, Zeugniserstellung"], + "legal_bases": ["Art. 6 Abs. 1 lit. c/e DS-GVO i.V.m. Schulgesetz"], + "data_subject_categories": ["Schueler/Studierende"], + "personal_data_categories": ["Noten", "Leistungsbewertungen", "Pruefungsergebnisse"], + "recipient_categories": ["Lehrkraefte", "Schulleitung"], + "retention_period": "Zeugniskopien 50 Jahre, Einzelnoten 2 Jahre", + "tom_description": "Zugriffsbeschraenkung auf Fachlehrkraft, verschluesselt", + }, + ], + "beratung": [ + { + "name": "Mandantenverwaltung", + "purposes": ["Verwaltung von Mandantenbeziehungen"], + "legal_bases": ["Art. 6 Abs. 1 lit. b DS-GVO"], + "data_subject_categories": ["Mandanten", "Ansprechpartner"], + "personal_data_categories": ["Kontaktdaten", "Vertragsdaten", "Korrespondenz"], + "recipient_categories": ["Kanzleisoftware (AVV)", "Steuerberater"], + "retention_period": "10 Jahre Rechnungen, 5 Jahre Handakten", + "tom_description": "Mandantengeheimnis, Need-to-know-Prinzip", + }, + { + "name": "Projektmanagement", + "purposes": ["Planung und Steuerung von Beratungsprojekten"], + "legal_bases": ["Art. 6 Abs. 1 lit. b/f DS-GVO"], + "data_subject_categories": ["Projektbeteiligte"], + "personal_data_categories": ["Projektdaten", "Aufgaben", "Zeiterfassung"], + "recipient_categories": ["PM-Tool (AVV)", "Mandant"], + "retention_period": "2 Jahre nach Projektabschluss", + "tom_description": "Projektspezifische Zugriffsrechte, Mandantentrennung", + }, + { + "name": "Zeiterfassung und Abrechnung", + "purposes": ["Stundenerfassung, Abrechnung gegenueber Mandanten"], + "legal_bases": ["Art. 6 Abs. 1 lit. b DS-GVO"], + "data_subject_categories": ["Berater/Mitarbeitende", "Mandanten"], + "personal_data_categories": ["Arbeitszeiten", "Taetigkeitsbeschreibungen", "Stundensaetze"], + "recipient_categories": ["Abrechnungssystem (AVV)", "Buchhaltung"], + "retention_period": "10 Jahre (AO)", + "tom_description": "Zugriff nur eigene Zeiten + Projektleitung", + }, + ], +} + +# Industry -> Sector mapping +INDUSTRY_SECTOR_MAP = { + "technologie": "it_saas", "it": "it_saas", "saas": "it_saas", "software": "it_saas", + "it dienstleistungen": "it_saas", + "gesundheit": "gesundheitswesen", "pharma": "gesundheitswesen", + "e-commerce": "handel", "handel": "handel", "einzelhandel": "handel", + "handwerk": "handwerk", "bau": "handwerk", "kfz": "handwerk", + "bildung": "bildung", "schule": "bildung", "hochschule": "bildung", + "beratung": "beratung", "consulting": "beratung", "kanzlei": "beratung", + "recht": "beratung", +} + + +def generate_vvt_drafts(ctx: dict) -> list[dict]: + """Generate VVT activity drafts, sector-specific if possible. + + Args: + ctx: Flat dict from company-profile/template-context. + + Returns: + List of VVT activity dicts ready for creation. + """ + company = ctx.get("company_name", "Unbekannt") + dpo = ctx.get("dpo_name", "") + sector = _detect_sector(ctx) + + # Use sector-specific activities if available, else generate from systems + if sector and sector in SECTOR_ACTIVITIES: + activities = _generate_sector_vvt(ctx, sector, company, dpo) + else: + activities = _generate_system_vvt(ctx, company, dpo) + + # Always add standard HR activity if not already present + has_hr = any("mitarbeiter" in a.get("name", "").lower() or "hr" in a.get("name", "").lower() + for a in activities) + if not has_hr and len(activities) > 0: + activities.append(_build_hr_activity(len(activities) + 1, company, dpo)) + + return activities + + +def _detect_sector(ctx: dict) -> Optional[str]: + industry = (ctx.get("industry") or "").lower().strip() + for keyword, sector in INDUSTRY_SECTOR_MAP.items(): + if keyword in industry: + return sector + return None + + +def _generate_sector_vvt(ctx: dict, sector: str, company: str, dpo: str) -> list[dict]: + activities = [] + sector_data = SECTOR_ACTIVITIES[sector] + + for i, template in enumerate(sector_data, 1): + activity = { + "vvt_id": f"VVT-{sector.upper()[:3]}-{i:03d}", + "name": template["name"], + "description": f"Automatisch generierter VVT-Eintrag: {template['name']}", + "purposes": template["purposes"], + "legal_bases": template["legal_bases"], + "data_subject_categories": template["data_subject_categories"], + "personal_data_categories": template["personal_data_categories"], + "recipient_categories": template["recipient_categories"], + "third_country_transfers": _assess_third_country(ctx), + "retention_period": {"default": template["retention_period"]}, + "tom_description": template["tom_description"], + "business_function": _infer_business_function(template["name"]), + "systems": [], + "protection_level": "HIGH" if template.get("dpia_required") else "MEDIUM", + "dpia_required": template.get("dpia_required", False), + "status": "DRAFT", + "responsible": dpo or company, + "source_sector": sector, + } + activities.append(activity) + + return activities + + +def _generate_system_vvt(ctx: dict, company: str, dpo: str) -> list[dict]: + """Fallback: generate VVT per processing system (original approach).""" + systems = ctx.get("processing_systems", []) + activities = [] + + for i, system in enumerate(systems, 1): + name = system.get("name", f"System {i}") + vendor = system.get("vendor", "") + hosting = system.get("hosting", "on-premise") + categories = system.get("personal_data_categories", []) + + activity = { + "vvt_id": f"VVT-SYS-{i:03d}", + "name": f"Verarbeitung in {name}", + "description": f"VVT-Eintrag fuer System '{name}'" + + (f" (Anbieter: {vendor})" if vendor else ""), + "purposes": [f"Datenverarbeitung via {name}"], + "legal_bases": ["Art. 6 Abs. 1 lit. b DS-GVO (Vertragserfullung)"], + "data_subject_categories": [], + "personal_data_categories": categories, + "recipient_categories": [vendor] if vendor else [], + "third_country_transfers": _assess_third_country_hosting(hosting), + "retention_period": {"default": "Gemaess Loeschfristenkatalog"}, + "tom_description": f"Siehe TOM-Katalog fuer {name}", + "business_function": "IT", + "systems": [name], + "deployment_model": hosting, + "protection_level": "HIGH" if len(categories) > 3 else "MEDIUM", + "dpia_required": len(categories) > 3, + "status": "DRAFT", + "responsible": dpo or company, + } + activities.append(activity) + + return activities + + +def _build_hr_activity(index: int, company: str, dpo: str) -> dict: + return { + "vvt_id": f"VVT-STD-{index:03d}", + "name": "Mitarbeiterverwaltung / HR", + "description": "Standard-Verarbeitungstaetigkeit Personalverwaltung", + "purposes": ["Personalverwaltung, Lohnabrechnung, Arbeitszeiterfassung"], + "legal_bases": ["Art. 6 Abs. 1 lit. b/c DS-GVO i.V.m. §26 BDSG"], + "data_subject_categories": ["Beschaeftigte"], + "personal_data_categories": ["Stammdaten", "Vertragsdaten", "Bankverbindung", "Arbeitszeiten"], + "recipient_categories": ["Lohnbuero (AVV)", "Finanzamt", "Sozialversicherungstraeger"], + "third_country_transfers": [], + "retention_period": {"default": "10 Jahre nach Austritt"}, + "tom_description": "Besonderer Zugriffsschutz (nur HR), verschluesselte Speicherung", + "business_function": "HR", + "systems": [], + "protection_level": "HIGH", + "dpia_required": False, + "status": "DRAFT", + "responsible": dpo or company, + } + + +def _assess_third_country(ctx: dict) -> list: + if ctx.get("third_country_transfer"): + return [{"country": "Abhaengig von Dienstleister", "mechanism": "Pruefung erforderlich"}] + return [] + + +def _assess_third_country_hosting(hosting: str) -> list: + if hosting in ("us-cloud", "international"): + return [{"country": "USA", "mechanism": "EU-US Data Privacy Framework"}] + return [] + + +def _infer_business_function(name: str) -> str: + name_lower = name.lower() + if any(kw in name_lower for kw in ["mitarbeiter", "hr", "personal", "bewerbung"]): + return "HR" + if any(kw in name_lower for kw in ["abrechnung", "rechnung", "zahlung", "buchhaltung"]): + return "Finanzen" + if any(kw in name_lower for kw in ["marketing", "newsletter", "webanalyse", "crm", "akquise"]): + return "Marketing/Vertrieb" + if any(kw in name_lower for kw in ["support", "ticket", "kundenservice"]): + return "Support" + if any(kw in name_lower for kw in ["patient", "befund", "labor", "termin"]): + return "Medizin" + if any(kw in name_lower for kw in ["schueler", "noten", "lernplattform"]): + return "Paedagogik" + return "IT" diff --git a/document-templates/migrations/001_dsfa_template_v2.sql b/document-templates/migrations/001_dsfa_template_v2.sql new file mode 100644 index 0000000..f80f798 --- /dev/null +++ b/document-templates/migrations/001_dsfa_template_v2.sql @@ -0,0 +1,405 @@ +-- Migration 001: DSFA Template V2 — Datenschutz-Folgenabschaetzung +-- Archiviert V1 (aus Migration 025) und fuegt erweiterte V2 ein. +-- Zielrepo: breakpilot-compliance (spaetere Integration) + +-- 1. Bestehende V1 archivieren +UPDATE compliance.compliance_legal_templates +SET status = 'archived', updated_at = NOW() +WHERE document_type = 'dsfa' + AND status = 'published'; + +-- 2. DSFA V2 einfuegen +INSERT INTO compliance.compliance_legal_templates ( + tenant_id, document_type, title, description, language, jurisdiction, + version, status, license_name, source_name, attribution_required, + is_complete_document, placeholders, content +) VALUES ( + '9282a473-5c95-4b3a-bf78-0ecc0ec71d3e'::uuid, + 'dsfa', + 'Datenschutz-Folgenabschaetzung (DSFA) gemaess Art. 35 DSGVO — V2', + 'Erweiterte Vorlage fuer eine Datenschutz-Folgenabschaetzung mit Schwellwertanalyse (WP248), SDM-basierter TOM-Struktur, strukturierter Risikobewertung nach ISO 29134 und KI-Modul (EU AI Act). Geeignet fuer alle Verarbeitungen, die einer DSFA beduerfen.', + 'de', + 'EU/DSGVO', + '2.0', + 'published', + 'MIT', + 'BreakPilot Compliance', + false, + true, + CAST('[ + "{{ORGANISATION_NAME}}", + "{{ORGANISATION_ADRESSE}}", + "{{DSB_NAME}}", + "{{DSB_KONTAKT}}", + "{{BUNDESLAND}}", + "{{AUFSICHTSBEHOERDE}}", + "{{ERSTELLT_VON}}", + "{{ERSTELLT_AM}}", + "{{GENEHMIGT_VON}}", + "{{GENEHMIGT_AM}}", + "{{WP248_K1_BEWERTUNG_SCORING}}", + "{{WP248_K2_AUTOMATISIERTE_ENTSCHEIDUNG}}", + "{{WP248_K3_SYSTEMATISCHE_UEBERWACHUNG}}", + "{{WP248_K4_SENSIBLE_DATEN}}", + "{{WP248_K5_GROSSER_UMFANG}}", + "{{WP248_K6_DATENVERKNUEPFUNG}}", + "{{WP248_K7_SCHUTZBEDUERFTIGE_BETROFFENE}}", + "{{WP248_K8_INNOVATIVE_TECHNOLOGIE}}", + "{{WP248_K9_RECHTSAUSUEBUNG_HINDERT}}", + "{{SCHWELLWERT_ERGEBNIS}}", + "{{MUSS_LISTEN_REFERENZ}}", + "{{VERARBEITUNG_TITEL}}", + "{{VERARBEITUNG_BESCHREIBUNG}}", + "{{VERARBEITUNG_UMFANG}}", + "{{VERARBEITUNG_KONTEXT}}", + "{{VERARBEITUNGSMITTEL}}", + "{{ZWECK_VERARBEITUNG}}", + "{{RECHTSGRUNDLAGE}}", + "{{RECHTSGRUNDLAGE_DETAILS}}", + "{{DATENKATEGORIEN}}", + "{{BETROFFENENGRUPPEN}}", + "{{EMPFAENGER}}", + "{{DRITTLANDTRANSFER}}", + "{{SPEICHERDAUER}}", + "{{GEMEINSAME_VERANTWORTUNG_DETAILS}}", + "{{AUFTRAGSVERARBEITER_DETAILS}}", + "{{NOTWENDIGKEIT_BEWERTUNG}}", + "{{VERHAELTNISMAESSIGKEIT_BEWERTUNG}}", + "{{DATENMINIMIERUNG_NACHWEIS}}", + "{{ALTERNATIVEN_GEPRUEFT}}", + "{{SPEICHERBEGRENZUNG_NACHWEIS}}", + "{{RISIKO_METHODIK}}", + "{{RISIKEN_TABELLE}}", + "{{GESAMT_RISIKO_NIVEAU}}", + "{{KONSULTATION_BETROFFENE}}", + "{{KONSULTATION_BETRIEBSRAT}}", + "{{TOM_VERFUEGBARKEIT}}", + "{{TOM_INTEGRITAET}}", + "{{TOM_VERTRAULICHKEIT}}", + "{{TOM_NICHTVERKETTUNG}}", + "{{TOM_TRANSPARENZ}}", + "{{TOM_INTERVENIERBARKEIT}}", + "{{TOM_DATENMINIMIERUNG}}", + "{{DSB_STELLUNGNAHME}}", + "{{DSB_DATUM}}", + "{{ART36_BEGRUENDUNG}}", + "{{DSFA_ERGEBNIS}}", + "{{RESTRISIKO_BEWERTUNG}}", + "{{UEBERPRUFUNGSINTERVALL}}", + "{{NAECHSTE_UEBERPRUFUNG}}", + "{{AENDERUNGSTRIGGER}}", + "{{KI_SYSTEME_DETAILS}}", + "{{KI_GRUNDRECHTSPRUEFUNG}}" + ]' AS jsonb), + $template$# Datenschutz-Folgenabschaetzung (DSFA) +**gemaess Art. 35 DS-GVO** + +--- + +## 0. Schwellwertanalyse + +Vor Durchfuehrung einer vollstaendigen DSFA ist zu pruefen, ob die geplante Verarbeitung eine solche erfordert. Die Pruefung erfolgt anhand der neun Kriterien der WP29/EDPB-Leitlinien (WP 248 rev.01) sowie der Muss-Liste der zustaendigen Aufsichtsbehoerde. + +### 0.1 WP248-Kriterien (Art. 29-Datenschutzgruppe) + +Sobald mindestens **zwei** der folgenden Kriterien zutreffen, ist eine DSFA in der Regel erforderlich. + +| Nr. | Kriterium | Zutreffend? | Begruendung | +|-----|-----------|-------------|-------------| +| K1 | Bewertung oder Scoring (einschl. Profiling und Prognose) | {{WP248_K1_BEWERTUNG_SCORING}} | | +| K2 | Automatisierte Entscheidungsfindung mit Rechtswirkung oder aehnlich erheblicher Wirkung | {{WP248_K2_AUTOMATISIERTE_ENTSCHEIDUNG}} | | +| K3 | Systematische Ueberwachung von Personen | {{WP248_K3_SYSTEMATISCHE_UEBERWACHUNG}} | | +| K4 | Verarbeitung sensibler Daten oder hoechst persoenlicher Daten (Art. 9, 10 DS-GVO) | {{WP248_K4_SENSIBLE_DATEN}} | | +| K5 | Datenverarbeitung in grossem Umfang | {{WP248_K5_GROSSER_UMFANG}} | | +| K6 | Verknuepfung oder Zusammenfuehrung von Datenbestaenden | {{WP248_K6_DATENVERKNUEPFUNG}} | | +| K7 | Daten zu schutzbeduerftigen Betroffenen (Kinder, Beschaeftigte, Patienten) | {{WP248_K7_SCHUTZBEDUERFTIGE_BETROFFENE}} | | +| K8 | Innovative Nutzung oder Anwendung neuer technologischer Loesungen | {{WP248_K8_INNOVATIVE_TECHNOLOGIE}} | | +| K9 | Verarbeitung, die Betroffene an der Ausuebung eines Rechts oder der Nutzung einer Dienstleistung hindert | {{WP248_K9_RECHTSAUSUEBUNG_HINDERT}} | | + +### 0.2 Muss-Liste der Aufsichtsbehoerde + +**Bundesland:** {{BUNDESLAND}} +**Zustaendige Aufsichtsbehoerde:** {{AUFSICHTSBEHOERDE}} +**Referenz:** {{MUSS_LISTEN_REFERENZ}} + +### 0.3 Ergebnis der Schwellwertanalyse + +{{SCHWELLWERT_ERGEBNIS}} + +--- + +## 1. Allgemeine Informationen und Verarbeitungsbeschreibung + +| Feld | Inhalt | +|------|--------| +| **Organisation** | {{ORGANISATION_NAME}} | +| **Adresse** | {{ORGANISATION_ADRESSE}} | +| **Datenschutzbeauftragter** | {{DSB_NAME}} | +| **DSB-Kontakt** | {{DSB_KONTAKT}} | +| **Erstellt von** | {{ERSTELLT_VON}} | +| **Erstellt am** | {{ERSTELLT_AM}} | +{{#IF GENEHMIGT_VON}}| **Genehmigt von** | {{GENEHMIGT_VON}} | +| **Genehmigt am** | {{GENEHMIGT_AM}} | +{{/IF}} + +### 1.1 Bezeichnung der Verarbeitungstaetigkeit + +**{{VERARBEITUNG_TITEL}}** + +### 1.2 Beschreibung der Verarbeitung + +{{VERARBEITUNG_BESCHREIBUNG}} + +### 1.3 Umfang und Kontext + +| Aspekt | Beschreibung | +|--------|--------------| +| **Umfang** | {{VERARBEITUNG_UMFANG}} | +| **Kontext** | {{VERARBEITUNG_KONTEXT}} | +| **Eingesetzte Verarbeitungsmittel** | {{VERARBEITUNGSMITTEL}} | + +### 1.4 Zweck der Verarbeitung + +{{ZWECK_VERARBEITUNG}} + +### 1.5 Rechtsgrundlage + +**Rechtsgrundlage:** {{RECHTSGRUNDLAGE}} + +{{#IF RECHTSGRUNDLAGE_DETAILS}} +**Erlaeuterung:** {{RECHTSGRUNDLAGE_DETAILS}} +{{/IF}} + +### 1.6 Verarbeitete Datenkategorien + +{{DATENKATEGORIEN}} + +### 1.7 Betroffene Personengruppen + +{{BETROFFENENGRUPPEN}} + +### 1.8 Empfaenger und Auftragsverarbeiter + +{{EMPFAENGER}} + +{{#IF DRITTLANDTRANSFER}} +### 1.9 Uebermittlung in Drittlaender + +{{DRITTLANDTRANSFER}} +{{/IF}} + +### 1.10 Speicherdauer und Loeschfristen + +{{SPEICHERDAUER}} + +{{#IF GEMEINSAME_VERANTWORTUNG_DETAILS}} +### 1.11 Gemeinsame Verantwortlichkeit (Art. 26 DS-GVO) + +{{GEMEINSAME_VERANTWORTUNG_DETAILS}} +{{/IF}} + +{{#IF AUFTRAGSVERARBEITER_DETAILS}} +### 1.12 Auftragsverarbeitung (Art. 28 DS-GVO) + +{{AUFTRAGSVERARBEITER_DETAILS}} +{{/IF}} + +--- + +## 2. Notwendigkeit und Verhaeltnismaessigkeit + +### 2.1 Notwendigkeit der Verarbeitung + +{{NOTWENDIGKEIT_BEWERTUNG}} + +### 2.2 Verhaeltnismaessigkeit + +{{VERHAELTNISMAESSIGKEIT_BEWERTUNG}} + +### 2.3 Pruefung der Grundsaetze (Art. 5 DS-GVO) + +| Grundsatz | Einhaltung | Nachweis | +|-----------|------------|----------| +| **Zweckbindung** (Art. 5 Abs. 1 lit. b) | Die Verarbeitung erfolgt ausschliesslich fuer die angegebenen Zwecke. | Siehe Abschnitt 1.4 | +| **Datenminimierung** (Art. 5 Abs. 1 lit. c) | {{DATENMINIMIERUNG_NACHWEIS}} | | +| **Richtigkeit** (Art. 5 Abs. 1 lit. d) | Verfahren zur Sicherstellung der Datenqualitaet sind implementiert. | | +| **Speicherbegrenzung** (Art. 5 Abs. 1 lit. e) | {{SPEICHERBEGRENZUNG_NACHWEIS}} | | +| **Integritaet und Vertraulichkeit** (Art. 5 Abs. 1 lit. f) | Technische und organisatorische Massnahmen gemaess Abschnitt 5 umgesetzt. | Siehe Abschnitt 5 | + +### 2.4 Pruefung alternativer Verarbeitungsmoeglichkeiten + +{{ALTERNATIVEN_GEPRUEFT}} + +--- + +## 3. Risikobewertung + +### 3.1 Methodik + +{{RISIKO_METHODIK}} + +Die Risikobewertung erfolgt anhand zweier Dimensionen: +- **Schwere des Schadens** fuer die Betroffenen (gering / ueberschaubar / substanziell / gross) +- **Eintrittswahrscheinlichkeit** (gering / mittel / hoch / sehr hoch) + +| | Schwere: Gering | Schwere: Ueberschaubar | Schwere: Substanziell | Schwere: Gross | +|---|---|---|---|---| +| **Wahrscheinlichkeit: Sehr hoch** | Mittel | Hoch | Sehr hoch | Sehr hoch | +| **Wahrscheinlichkeit: Hoch** | Niedrig | Mittel | Hoch | Sehr hoch | +| **Wahrscheinlichkeit: Mittel** | Niedrig | Niedrig | Mittel | Hoch | +| **Wahrscheinlichkeit: Gering** | Niedrig | Niedrig | Niedrig | Mittel | + +### 3.2 Identifizierte Risiken + +{{RISIKEN_TABELLE}} + +### 3.3 Gesamtrisikobewertung + +{{GESAMT_RISIKO_NIVEAU}} + +--- + +## 4. Konsultation der Betroffenen und Interessentraeger + +### 4.1 Konsultation der Betroffenen (Art. 35 Abs. 9 DS-GVO) + +{{#IF KONSULTATION_BETROFFENE}} +{{KONSULTATION_BETROFFENE}} +{{/IF}} +{{#IF_NOT KONSULTATION_BETROFFENE}} +Eine Konsultation der Betroffenen wurde nicht durchgefuehrt. Begruendung: [Bitte ergaenzen — z. B. Unverhaeltnismaessigkeit, Geheimhaltungsinteressen, fehlende Praktikabilitaet]. +{{/IF_NOT}} + +{{#IF KONSULTATION_BETRIEBSRAT}} +### 4.2 Beteiligung der Arbeitnehmervertretung + +{{KONSULTATION_BETRIEBSRAT}} +{{/IF}} + +--- + +## 5. Technische und organisatorische Massnahmen (TOM) + +Die Massnahmen sind nach den sieben Gewaehrleistungszielen des Standard-Datenschutzmodells (SDM V3.1a) strukturiert. + +### 5.1 Verfuegbarkeit + +Ziel: Personenbezogene Daten stehen zeitgerecht zur Verfuegung und koennen ordnungsgemaess verarbeitet werden. + +{{TOM_VERFUEGBARKEIT}} + +### 5.2 Integritaet + +Ziel: Personenbezogene Daten bleiben waehrend der Verarbeitung unversehrt, vollstaendig und aktuell. + +{{TOM_INTEGRITAET}} + +### 5.3 Vertraulichkeit + +Ziel: Nur befugte Personen koennen personenbezogene Daten zur Kenntnis nehmen. + +{{TOM_VERTRAULICHKEIT}} + +### 5.4 Nichtverkettung + +Ziel: Personenbezogene Daten werden nur fuer den Zweck verarbeitet, zu dem sie erhoben wurden. + +{{TOM_NICHTVERKETTUNG}} + +### 5.5 Transparenz + +Ziel: Betroffene, der Verantwortliche und die Aufsichtsbehoerde koennen die Verarbeitung nachvollziehen. + +{{TOM_TRANSPARENZ}} + +### 5.6 Intervenierbarkeit + +Ziel: Betroffenenrechte (Auskunft, Berichtigung, Loeschung, Widerspruch) koennen wirksam ausgeuebt werden. + +{{TOM_INTERVENIERBARKEIT}} + +### 5.7 Datenminimierung + +Ziel: Die Verarbeitung beschraenkt sich auf das erforderliche Mass. + +{{TOM_DATENMINIMIERUNG}} + +--- + +## 6. Stellungnahme des Datenschutzbeauftragten + +### 6.1 Konsultation des DSB + +{{DSB_STELLUNGNAHME}} + +{{#IF DSB_DATUM}} +**Datum der Stellungnahme:** {{DSB_DATUM}} +{{/IF}} + +### 6.2 Pruefung der Konsultationspflicht (Art. 36 DS-GVO) + +Sofern das Restrisiko nach Umsetzung aller Massnahmen **hoch** bleibt, ist vor Beginn der Verarbeitung die zustaendige Aufsichtsbehoerde zu konsultieren (Art. 36 Abs. 1 DS-GVO). + +{{#IF ART36_BEGRUENDUNG}} +{{ART36_BEGRUENDUNG}} +{{/IF}} +{{#IF_NOT ART36_BEGRUENDUNG}} +Nach Umsetzung der beschriebenen Massnahmen wird das Restrisiko als akzeptabel eingestuft. Eine Konsultation der Aufsichtsbehoerde ist nicht erforderlich. +{{/IF_NOT}} + +--- + +## 7. Ergebnis und Ueberprufungsplan + +### 7.1 Ergebnis der DSFA + +{{DSFA_ERGEBNIS}} + +### 7.2 Restrisikobewertung + +{{RESTRISIKO_BEWERTUNG}} + +### 7.3 Ueberprufungsplan + +| Aspekt | Festlegung | +|--------|------------| +| **Regelmaessiges Ueberprufungsintervall** | {{UEBERPRUFUNGSINTERVALL}} | +| **Naechste geplante Ueberprufung** | {{NAECHSTE_UEBERPRUFUNG}} | + +### 7.4 Trigger fuer ausserplanmaessige Ueberprufung + +{{AENDERUNGSTRIGGER}} + +--- + +{{#IF KI_SYSTEME_DETAILS}} +## 8. KI-spezifisches Modul (EU AI Act) + +Dieses Kapitel ist relevant, da KI-Systeme in der beschriebenen Verarbeitung eingesetzt werden. + +### 8.1 Eingesetzte KI-Systeme + +{{KI_SYSTEME_DETAILS}} + +### 8.2 Grundrechtliche Folgenabschaetzung (Art. 27 KI-VO) + +{{KI_GRUNDRECHTSPRUEFUNG}} + +{{/IF}} + +--- + +## Unterschriften + +| Rolle | Name | Datum | Unterschrift | +|-------|------|-------|--------------| +| Erstellt von | {{ERSTELLT_VON}} | {{ERSTELLT_AM}} | _________________ | +{{#IF GENEHMIGT_VON}}| Datenschutzbeauftragter | {{GENEHMIGT_VON}} | {{GENEHMIGT_AM}} | _________________ | +{{/IF}} +| Verantwortlicher | | | _________________ | + +--- + +*Erstellt mit BreakPilot Compliance. Dieses Dokument ist vertraulich und nur fuer den internen Gebrauch bestimmt.* +$template$ +) ON CONFLICT DO NOTHING; diff --git a/document-templates/migrations/002_tom_sdm_template.sql b/document-templates/migrations/002_tom_sdm_template.sql new file mode 100644 index 0000000..a4555e9 --- /dev/null +++ b/document-templates/migrations/002_tom_sdm_template.sql @@ -0,0 +1,247 @@ +-- Migration 002: TOM Template V2 — nach SDM-Gewaehrleistungszielen +-- Archiviert V1 und fuegt SDM-strukturierte TOM-Dokumentation ein. + +-- 1. Bestehende V1 archivieren +UPDATE compliance.compliance_legal_templates +SET status = 'archived', updated_at = NOW() +WHERE document_type = 'tom_documentation' + AND status = 'published'; + +-- 2. TOM V2 einfuegen +INSERT INTO compliance.compliance_legal_templates ( + tenant_id, document_type, title, description, language, jurisdiction, + version, status, license_name, source_name, attribution_required, + is_complete_document, placeholders, content +) VALUES ( + '9282a473-5c95-4b3a-bf78-0ecc0ec71d3e'::uuid, + 'tom_documentation', + 'Technische und Organisatorische Massnahmen (TOM) nach SDM V3.1a', + 'TOM-Dokumentation strukturiert nach den sieben Gewaehrleistungszielen des Standard-Datenschutzmodells (SDM V3.1a). Mit sektorspezifischen Ergaenzungen und Compliance-Bewertung.', + 'de', + 'EU/DSGVO', + '2.0', + 'published', + 'MIT', + 'BreakPilot Compliance', + false, + true, + CAST('[ + "{{ORGANISATION_NAME}}", + "{{ORGANISATION_ADRESSE}}", + "{{DSB_NAME}}", + "{{DSB_KONTAKT}}", + "{{ERSTELLT_VON}}", + "{{ERSTELLT_AM}}", + "{{VERSION}}", + "{{GELTUNGSBEREICH}}", + "{{SCHUTZBEDARF_VERTRAULICHKEIT}}", + "{{SCHUTZBEDARF_INTEGRITAET}}", + "{{SCHUTZBEDARF_VERFUEGBARKEIT}}", + "{{GESAMTSCHUTZNIVEAU}}", + "{{TOM_VERFUEGBARKEIT}}", + "{{TOM_INTEGRITAET}}", + "{{TOM_VERTRAULICHKEIT}}", + "{{TOM_NICHTVERKETTUNG}}", + "{{TOM_TRANSPARENZ}}", + "{{TOM_INTERVENIERBARKEIT}}", + "{{TOM_DATENMINIMIERUNG}}", + "{{TOM_SEKTOR_ERGAENZUNGEN}}", + "{{COMPLIANCE_BEWERTUNG}}", + "{{NAECHSTE_UEBERPRUFUNG}}", + "{{UEBERPRUFUNGSINTERVALL}}" + ]' AS jsonb), + $template$# Technische und Organisatorische Massnahmen (TOM) +**gemaess Art. 32 DS-GVO — strukturiert nach SDM V3.1a** + +--- + +## 1. Allgemeine Informationen + +| Feld | Inhalt | +|------|--------| +| **Organisation** | {{ORGANISATION_NAME}} | +| **Adresse** | {{ORGANISATION_ADRESSE}} | +| **Datenschutzbeauftragter** | {{DSB_NAME}} ({{DSB_KONTAKT}}) | +| **Erstellt von** | {{ERSTELLT_VON}} | +| **Erstellt am** | {{ERSTELLT_AM}} | +| **Version** | {{VERSION}} | + +### 1.1 Geltungsbereich + +{{GELTUNGSBEREICH}} + +--- + +## 2. Schutzbedarfsanalyse + +Die Schutzbedarfsanalyse bildet die Grundlage fuer die Auswahl angemessener Massnahmen. Der Schutzbedarf wird fuer die drei klassischen Schutzziele bewertet. + +| Schutzziel | Schutzbedarf | Begruendung | +|------------|-------------|-------------| +| **Vertraulichkeit** | {{SCHUTZBEDARF_VERTRAULICHKEIT}} | | +| **Integritaet** | {{SCHUTZBEDARF_INTEGRITAET}} | | +| **Verfuegbarkeit** | {{SCHUTZBEDARF_VERFUEGBARKEIT}} | | + +**Gesamtschutzniveau:** {{GESAMTSCHUTZNIVEAU}} + +*Bewertungsskala: normal / hoch / sehr hoch* + +--- + +## 3. Massnahmen nach SDM-Gewaehrleistungszielen + +Die folgende Struktur folgt den sieben Gewaehrleistungszielen des Standard-Datenschutzmodells (SDM V3.1a) der Datenschutzkonferenz. + +### 3.1 Verfuegbarkeit + +**Ziel:** Personenbezogene Daten stehen zeitgerecht zur Verfuegung und koennen ordnungsgemaess verarbeitet werden. + +**Referenz:** SDM-Baustein 11 (Aufbewahren) + +{{TOM_VERFUEGBARKEIT}} + +| Massnahme | Typ | Status | Verantwortlich | Pruefintervall | +|-----------|-----|--------|----------------|----------------| +| Redundante Datenhaltung (RAID, Replikation) | technisch | | IT-Betrieb | 12 Monate | +| Regelmaessige Backups (taeglich inkrementell, woechentlich voll) | technisch | | IT-Betrieb | 6 Monate | +| Disaster-Recovery-Plan mit dokumentierten RTO/RPO | organisatorisch | | IT-Sicherheit | 12 Monate | +| USV und Notstromversorgung | technisch | | Facility Mgmt | 12 Monate | +| Wiederherstellungstests (mind. jaehrlich) | organisatorisch | | IT-Betrieb | 12 Monate | + +### 3.2 Integritaet + +**Ziel:** Personenbezogene Daten bleiben waehrend der Verarbeitung unversehrt, vollstaendig und aktuell. + +**Referenz:** SDM-Baustein 61 (Berichtigen) + +{{TOM_INTEGRITAET}} + +| Massnahme | Typ | Status | Verantwortlich | Pruefintervall | +|-----------|-----|--------|----------------|----------------| +| Pruefsummen und digitale Signaturen | technisch | | IT-Entwicklung | 12 Monate | +| Eingabevalidierung und Plausibilitaetspruefungen | technisch | | IT-Entwicklung | bei Release | +| Change-Management-Verfahren | organisatorisch | | IT-Betrieb | 12 Monate | +| Versionierung von Datensaetzen | technisch | | IT-Entwicklung | 12 Monate | + +### 3.3 Vertraulichkeit + +**Ziel:** Nur befugte Personen koennen personenbezogene Daten zur Kenntnis nehmen. + +**Referenz:** SDM-Baustein 51 (Zugriffe regeln) + +{{TOM_VERTRAULICHKEIT}} + +| Massnahme | Typ | Status | Verantwortlich | Pruefintervall | +|-----------|-----|--------|----------------|----------------| +| Verschluesselung im Transit (TLS 1.3) | technisch | | IT-Sicherheit | 12 Monate | +| Verschluesselung at Rest (AES-256) | technisch | | IT-Sicherheit | 12 Monate | +| Rollenbasiertes Zugriffskonzept (RBAC, Least Privilege) | technisch | | IT-Sicherheit | 6 Monate | +| Multi-Faktor-Authentifizierung (MFA) | technisch | | IT-Sicherheit | 12 Monate | +| Physische Zutrittskontrolle (Schluessel, Kartenleser) | technisch | | Facility Mgmt | 12 Monate | +| Vertraulichkeitsverpflichtung Mitarbeitende | organisatorisch | | HR / DSB | bei Eintritt | +| Passwortrichtlinie (Komplexitaet, Ablauf, Historie) | organisatorisch | | IT-Sicherheit | 12 Monate | + +### 3.4 Nichtverkettung + +**Ziel:** Personenbezogene Daten werden nur fuer den Zweck verarbeitet, zu dem sie erhoben wurden. + +**Referenz:** SDM-Baustein 50 (Trennen) + +{{TOM_NICHTVERKETTUNG}} + +| Massnahme | Typ | Status | Verantwortlich | Pruefintervall | +|-----------|-----|--------|----------------|----------------| +| Mandantentrennung (logisch oder physisch) | technisch | | IT-Architektur | 12 Monate | +| Pseudonymisierung wo fachlich moeglich | technisch | | IT-Entwicklung | 12 Monate | +| Zweckbindungspruefung bei neuen Datennutzungen | organisatorisch | | DSB | bei Bedarf | +| Getrennte Datenbanken je Verarbeitungszweck | technisch | | IT-Architektur | 12 Monate | + +### 3.5 Transparenz + +**Ziel:** Betroffene, der Verantwortliche und die Aufsichtsbehoerde koennen die Verarbeitung nachvollziehen. + +**Referenz:** SDM-Baustein 42 (Dokumentieren), SDM-Baustein 43 (Protokollieren) + +{{TOM_TRANSPARENZ}} + +| Massnahme | Typ | Status | Verantwortlich | Pruefintervall | +|-----------|-----|--------|----------------|----------------| +| Verzeichnis der Verarbeitungstaetigkeiten (Art. 30) | organisatorisch | | DSB | 12 Monate | +| Vollstaendiges Audit-Log aller Datenzugriffe | technisch | | IT-Betrieb | 6 Monate | +| Datenschutzerklaerung (Art. 13/14 DS-GVO) | organisatorisch | | DSB / Recht | bei Aenderung | +| Dokumentierte Prozesse fuer Datenpannen-Meldung | organisatorisch | | DSB | 12 Monate | + +### 3.6 Intervenierbarkeit + +**Ziel:** Betroffenenrechte (Auskunft, Berichtigung, Loeschung, Widerspruch) koennen wirksam ausgeuebt werden. + +**Referenz:** SDM-Baustein 60 (Loeschen), SDM-Baustein 61 (Berichtigen), SDM-Baustein 62 (Einschraenken) + +{{TOM_INTERVENIERBARKEIT}} + +| Massnahme | Typ | Status | Verantwortlich | Pruefintervall | +|-----------|-----|--------|----------------|----------------| +| Prozess fuer Betroffenenanfragen (Auskunft, Loeschung, Berichtigung) | organisatorisch | | DSB | 12 Monate | +| Technische Loeschfaehigkeit mit Nachweis | technisch | | IT-Entwicklung | 12 Monate | +| Datenexport in maschinenlesbarem Format (Art. 20) | technisch | | IT-Entwicklung | 12 Monate | +| Sperrfunktion (Einschraenkung der Verarbeitung) | technisch | | IT-Entwicklung | 12 Monate | +| Widerspruchsmoeglichkeit gegen Verarbeitung | organisatorisch | | DSB | 12 Monate | + +### 3.7 Datenminimierung + +**Ziel:** Die Verarbeitung beschraenkt sich auf das erforderliche Mass. + +**Referenz:** SDM-Baustein 41 (Planen und Spezifizieren) + +{{TOM_DATENMINIMIERUNG}} + +| Massnahme | Typ | Status | Verantwortlich | Pruefintervall | +|-----------|-----|--------|----------------|----------------| +| Regelmaessige Pruefung der Erforderlichkeit | organisatorisch | | DSB | 12 Monate | +| Automatisierte Loeschung nach Fristablauf | technisch | | IT-Entwicklung | 6 Monate | +| Anonymisierung fuer statistische Zwecke | technisch | | IT-Entwicklung | bei Bedarf | +| Privacy by Design bei neuen Verarbeitungen | organisatorisch | | IT-Architektur / DSB | bei Bedarf | +| Loeschfristenkatalog (dokumentiert) | organisatorisch | | DSB / Recht | 12 Monate | + +--- + +## 4. Sektorspezifische Ergaenzungen + +{{#IF TOM_SEKTOR_ERGAENZUNGEN}} +{{TOM_SEKTOR_ERGAENZUNGEN}} +{{/IF}} +{{#IF_NOT TOM_SEKTOR_ERGAENZUNGEN}} +Keine sektorspezifischen Ergaenzungen erforderlich. +{{/IF_NOT}} + +--- + +## 5. Compliance-Bewertung + +{{#IF COMPLIANCE_BEWERTUNG}} +{{COMPLIANCE_BEWERTUNG}} +{{/IF}} +{{#IF_NOT COMPLIANCE_BEWERTUNG}} +Die Compliance-Bewertung erfolgt nach erstmaliger Implementierung aller Massnahmen. +{{/IF_NOT}} + +--- + +## 6. Ueberprufungsplan + +| Aspekt | Festlegung | +|--------|------------| +| **Regelmaessige Ueberprufung** | {{UEBERPRUFUNGSINTERVALL}} | +| **Naechste geplante Ueberprufung** | {{NAECHSTE_UEBERPRUFUNG}} | + +**Trigger fuer ausserplanmaessige Ueberprufung:** +- Sicherheitsvorfall oder Datenpanne +- Wesentliche Aenderung der Verarbeitungssysteme +- Neue regulatorische Anforderungen (z. B. NIS2, AI Act) +- Ergebnisse interner oder externer Audits + +--- + +*Erstellt mit BreakPilot Compliance. Struktur basiert auf dem Standard-Datenschutzmodell (SDM V3.1a) der Datenschutzkonferenz.* +$template$ +) ON CONFLICT DO NOTHING; diff --git a/document-templates/migrations/003_vvt_sector_templates.sql b/document-templates/migrations/003_vvt_sector_templates.sql new file mode 100644 index 0000000..33c0887 --- /dev/null +++ b/document-templates/migrations/003_vvt_sector_templates.sql @@ -0,0 +1,663 @@ +-- Migration 003: VVT Sector Templates — Branchenspezifische Verarbeitungsverzeichnisse +-- 6 Branchen-Muster + 1 allgemeine V2-Vorlage + +-- 1. Bestehende V1 archivieren +UPDATE compliance.compliance_legal_templates +SET status = 'archived', updated_at = NOW() +WHERE document_type = 'vvt_register' + AND status = 'published'; + +-- 2. Allgemeine VVT V2 Vorlage (branchenuebergreifend) +INSERT INTO compliance.compliance_legal_templates ( + tenant_id, document_type, title, description, language, jurisdiction, + version, status, license_name, source_name, attribution_required, + is_complete_document, placeholders, content +) VALUES ( + '9282a473-5c95-4b3a-bf78-0ecc0ec71d3e'::uuid, + 'vvt_register', + 'Verzeichnis von Verarbeitungstaetigkeiten (VVT) gemaess Art. 30 DS-GVO — V2', + 'Erweiterte VVT-Vorlage mit vollstaendiger Art. 30 Struktur, Loeschfristen-Integration und DSFA-Verweis. Branchenuebergreifend einsetzbar.', + 'de', + 'EU/DSGVO', + '2.0', + 'published', + 'MIT', + 'BreakPilot Compliance', + false, + true, + CAST('[ + "{{ORGANISATION_NAME}}", + "{{ORGANISATION_ADRESSE}}", + "{{VERTRETER_NAME}}", + "{{DSB_NAME}}", + "{{DSB_KONTAKT}}", + "{{ERSTELLT_AM}}", + "{{VERSION}}", + "{{VVT_NR}}", + "{{VERARBEITUNG_NAME}}", + "{{VERARBEITUNG_BESCHREIBUNG}}", + "{{ZWECKE}}", + "{{RECHTSGRUNDLAGEN}}", + "{{BETROFFENE}}", + "{{DATENKATEGORIEN}}", + "{{EMPFAENGER}}", + "{{DRITTLAND}}", + "{{DRITTLAND_GARANTIEN}}", + "{{LOESCHFRISTEN}}", + "{{TOM_REFERENZ}}", + "{{SYSTEME}}", + "{{VERANTWORTLICHER}}", + "{{RISIKOBEWERTUNG}}", + "{{DSFA_ERFORDERLICH}}", + "{{LETZTE_PRUEFUNG}}", + "{{NAECHSTE_PRUEFUNG}}", + "{{STATUS}}" + ]' AS jsonb), + $template$# Verzeichnis von Verarbeitungstaetigkeiten (VVT) +**gemaess Art. 30 DS-GVO** + +--- + +## Angaben zum Verantwortlichen + +| Feld | Inhalt | +|------|--------| +| **Name / Firma** | {{ORGANISATION_NAME}} | +| **Adresse** | {{ORGANISATION_ADRESSE}} | +| **Vertreter des Verantwortlichen** | {{VERTRETER_NAME}} | +| **Datenschutzbeauftragter** | {{DSB_NAME}} ({{DSB_KONTAKT}}) | +| **Stand** | {{ERSTELLT_AM}} | +| **Version** | {{VERSION}} | + +--- + +## Verarbeitungstaetigkeit + +### Stammdaten + +| Pflichtfeld (Art. 30) | Inhalt | +|------------------------|--------| +| **VVT-Nr.** | {{VVT_NR}} | +| **Bezeichnung** | {{VERARBEITUNG_NAME}} | +| **Beschreibung** | {{VERARBEITUNG_BESCHREIBUNG}} | + +### Zweck und Rechtsgrundlage + +| Pflichtfeld | Inhalt | +|-------------|--------| +| **Zweck(e) der Verarbeitung** | {{ZWECKE}} | +| **Rechtsgrundlage(n)** | {{RECHTSGRUNDLAGEN}} | + +### Betroffene und Daten + +| Pflichtfeld | Inhalt | +|-------------|--------| +| **Kategorien betroffener Personen** | {{BETROFFENE}} | +| **Kategorien personenbezogener Daten** | {{DATENKATEGORIEN}} | + +### Empfaenger und Uebermittlung + +| Pflichtfeld | Inhalt | +|-------------|--------| +| **Kategorien von Empfaengern** | {{EMPFAENGER}} | + +{{#IF DRITTLAND}} +| **Uebermittlung in Drittlaender** | {{DRITTLAND}} | +| **Geeignete Garantien (Art. 46)** | {{DRITTLAND_GARANTIEN}} | +{{/IF}} + +### Fristen und Schutzmassnahmen + +| Pflichtfeld | Inhalt | +|-------------|--------| +| **Loeschfristen** | {{LOESCHFRISTEN}} | +| **TOM-Beschreibung (Art. 32)** | {{TOM_REFERENZ}} | + +### Zusaetzliche Angaben (empfohlen) + +| Feld | Inhalt | +|------|--------| +| **Eingesetzte Systeme** | {{SYSTEME}} | +| **Verantwortliche Abteilung** | {{VERANTWORTLICHER}} | +| **Risikobewertung** | {{RISIKOBEWERTUNG}} | +| **DSFA erforderlich?** | {{DSFA_ERFORDERLICH}} | +| **Letzte Pruefung** | {{LETZTE_PRUEFUNG}} | +| **Naechste Pruefung** | {{NAECHSTE_PRUEFUNG}} | +| **Status** | {{STATUS}} | + +--- + +*Erstellt mit BreakPilot Compliance. Struktur entspricht Art. 30 Abs. 1 DS-GVO.* +$template$ +) ON CONFLICT DO NOTHING; + +-- 3. VVT Branchenvorlage: IT / SaaS +INSERT INTO compliance.compliance_legal_templates ( + tenant_id, document_type, title, description, language, jurisdiction, + version, status, license_name, source_name, attribution_required, + is_complete_document, placeholders, content +) VALUES ( + '9282a473-5c95-4b3a-bf78-0ecc0ec71d3e'::uuid, + 'vvt_register', + 'VVT Branchenvorlage: IT / SaaS-Unternehmen', + 'Vorbefuelltes Verarbeitungsverzeichnis mit typischen Verarbeitungstaetigkeiten eines IT- oder SaaS-Unternehmens. Enthalt 8 Standard-Verarbeitungen.', + 'de', 'EU/DSGVO', '2.0', 'published', 'MIT', 'BreakPilot Compliance', false, true, + '[]'::jsonb, + $template$# VVT Branchenvorlage: IT / SaaS-Unternehmen + +Die folgenden Verarbeitungstaetigkeiten sind typisch fuer IT- und SaaS-Unternehmen. Bitte pruefen und an Ihre konkrete Situation anpassen. + +--- + +## VVT-001: SaaS-Plattformbetrieb + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Bereitstellung und Betrieb der SaaS-Plattform fuer Kunden | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. b DS-GVO (Vertragserfullung) | +| **Betroffene** | Kunden, Endnutzer der Plattform | +| **Datenkategorien** | Stammdaten, Nutzungsdaten, Inhaltsdaten, technische Logdaten | +| **Empfaenger** | Hosting-Anbieter (AVV), Support-Dienstleister (AVV) | +| **Loeschfrist** | 90 Tage nach Vertragsende + gesetzliche Aufbewahrungsfristen | +| **TOM** | Siehe TOM-Dokumentation: Mandantentrennung, Verschluesselung, RBAC | +| **DSFA erforderlich?** | Abhaengig von Art und Umfang der verarbeiteten Daten | + +## VVT-002: Kundenverwaltung / CRM + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Verwaltung von Kundenbeziehungen, Vertragsmanagement | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. b DS-GVO (Vertragserfullung) | +| **Betroffene** | Kunden, Ansprechpartner, Interessenten | +| **Datenkategorien** | Kontaktdaten, Vertragsdaten, Kommunikationshistorie | +| **Empfaenger** | CRM-Anbieter (AVV), ggf. Vertriebspartner | +| **Loeschfrist** | 3 Jahre nach letztem Kontakt (Verjaeherung), 10 Jahre Rechnungsdaten (HGB/AO) | +| **TOM** | Zugriffsbeschraenkung auf Vertrieb/Support, Protokollierung | + +## VVT-003: E-Mail-Marketing / Newsletter + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Versand von Produkt-Updates, Marketing-Newsletter | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. a DS-GVO (Einwilligung) + UWG §7 | +| **Betroffene** | Newsletter-Abonnenten | +| **Datenkategorien** | E-Mail-Adresse, Name, Oeffnungs-/Klickverhalten | +| **Empfaenger** | E-Mail-Dienstleister (AVV) | +| **Loeschfrist** | Unverzueglich nach Widerruf der Einwilligung | +| **TOM** | Double-Opt-In, einfache Abmeldefunktion | + +## VVT-004: Webanalyse + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Analyse der Website-Nutzung zur Verbesserung des Angebots | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. a DS-GVO (Einwilligung via Cookie-Banner) | +| **Betroffene** | Website-Besucher | +| **Datenkategorien** | IP-Adresse (anonymisiert), Seitenaufrufe, Verweildauer, Geraeteinformationen | +| **Empfaenger** | Analyse-Anbieter (AVV) | +| **Loeschfrist** | 14 Monate (max. Cookie-Laufzeit) | +| **TOM** | IP-Anonymisierung, Cookie-Consent-Management (TDDDG §25) | + +## VVT-005: Bewerbermanagement + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Bearbeitung von Bewerbungen, Auswahlverfahren | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. b DS-GVO i.V.m. §26 BDSG (Beschaeftigungsverhaeltnis) | +| **Betroffene** | Bewerberinnen und Bewerber | +| **Datenkategorien** | Kontaktdaten, Lebenslauf, Qualifikationen, Bewerbungsunterlagen | +| **Empfaenger** | Fachabteilung, ggf. Personaldienstleister (AVV) | +| **Loeschfrist** | 6 Monate nach Abschluss des Verfahrens (AGG-Frist) | +| **TOM** | Zugriffsschutz auf Bewerbungsportal, verschluesselte Uebertragung | + +## VVT-006: Mitarbeiterverwaltung / HR + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Personalverwaltung, Lohn-/Gehaltsabrechnung, Arbeitszeiterfassung | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. b/c DS-GVO i.V.m. §26 BDSG | +| **Betroffene** | Beschaeftigte | +| **Datenkategorien** | Stammdaten, Vertragsdaten, Bankverbindung, Sozialversicherung, Arbeitszeitdaten | +| **Empfaenger** | Lohnbuero (AVV), Finanzamt, Sozialversicherungstraeger | +| **Loeschfrist** | 10 Jahre nach Austritt (steuerliche Aufbewahrung), Personalakte 3 Jahre | +| **TOM** | Besonderer Zugriffsschutz (nur HR), verschluesselte Speicherung | + +## VVT-007: Support-Ticketing + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Bearbeitung von Kundenanfragen und Stoerungsmeldungen | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. b DS-GVO (Vertragserfullung) | +| **Betroffene** | Kunden, Endnutzer | +| **Datenkategorien** | Kontaktdaten, Ticket-Inhalt, Screenshots, Systemlogs | +| **Empfaenger** | Support-Tool-Anbieter (AVV), ggf. Entwicklungsteam | +| **Loeschfrist** | 2 Jahre nach Ticket-Schliessung | +| **TOM** | Rollenbasierter Zugriff, Pseudonymisierung in internen Reports | + +## VVT-008: Logging und Monitoring + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Sicherheitsueberwachung, Fehleranalyse, Leistungsoptimierung | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. f DS-GVO (berechtigtes Interesse: IT-Sicherheit) | +| **Betroffene** | Nutzer der Plattform, Administratoren | +| **Datenkategorien** | IP-Adressen, Zugriffszeitpunkte, Fehlerprotokolle, Performance-Metriken | +| **Empfaenger** | Log-Management-Anbieter (AVV) | +| **Loeschfrist** | 30 Tage Anwendungslogs, 90 Tage Sicherheitslogs | +| **TOM** | Zugriffsschutz auf Logdaten, automatische Rotation | + +--- + +*Erstellt mit BreakPilot Compliance. Branchenvorlage IT / SaaS.* +$template$ +) ON CONFLICT DO NOTHING; + +-- 4. VVT Branchenvorlage: Gesundheitswesen +INSERT INTO compliance.compliance_legal_templates ( + tenant_id, document_type, title, description, language, jurisdiction, + version, status, license_name, source_name, attribution_required, + is_complete_document, placeholders, content +) VALUES ( + '9282a473-5c95-4b3a-bf78-0ecc0ec71d3e'::uuid, + 'vvt_register', + 'VVT Branchenvorlage: Gesundheitswesen', + 'Vorbefuelltes Verarbeitungsverzeichnis mit typischen Verarbeitungen im Gesundheitswesen (Arztpraxis, MVZ, Klinik). Beruecksichtigt Art. 9 DS-GVO besondere Kategorien.', + 'de', 'EU/DSGVO', '2.0', 'published', 'MIT', 'BreakPilot Compliance', false, true, + '[]'::jsonb, + $template$# VVT Branchenvorlage: Gesundheitswesen + +Typische Verarbeitungstaetigkeiten fuer Arztpraxen, MVZ und Kliniken. **Besonderheit:** Verarbeitung besonderer Kategorien personenbezogener Daten (Art. 9 DS-GVO — Gesundheitsdaten). + +--- + +## VVT-G01: Patientenverwaltung + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Fuehrung der Patientenakte, Behandlungsdokumentation | +| **Rechtsgrundlage** | Art. 9 Abs. 2 lit. h DS-GVO i.V.m. §630f BGB (Dokumentationspflicht) | +| **Betroffene** | Patienten | +| **Datenkategorien** | Stammdaten, Versicherungsdaten, Diagnosen, Befunde, Behandlungsverlaeufe (Art. 9) | +| **Empfaenger** | Praxisverwaltungssystem-Anbieter (AVV), Labor (AVV), ueberweisende Aerzte | +| **Loeschfrist** | 10 Jahre nach letzter Behandlung (§630f Abs. 3 BGB), Strahlenpass 30 Jahre | +| **TOM** | Verschluesselung Patientenakte, Zugriffsschutz (nur behandelnde Aerzte), Notfallzugriff | +| **DSFA erforderlich?** | Ja (umfangreiche Verarbeitung Art. 9 Daten) | + +## VVT-G02: Terminmanagement + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Organisation und Verwaltung von Patienten-Terminen | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. b DS-GVO (Behandlungsvertrag) | +| **Betroffene** | Patienten | +| **Datenkategorien** | Name, Kontaktdaten, Terminwunsch, ggf. Behandlungsgrund | +| **Empfaenger** | Online-Terminbuchungs-Anbieter (AVV) | +| **Loeschfrist** | 6 Monate nach Termin (sofern nicht zur Patientenakte) | +| **TOM** | Verschluesselte Uebertragung, Zugriffsschutz Terminkalender | + +## VVT-G03: Abrechnung (KV / PKV) + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Abrechnung aerztlicher Leistungen gegenueber Krankenkassen / Privatpatienten | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. c DS-GVO (gesetzliche Pflicht), Art. 9 Abs. 2 lit. h | +| **Betroffene** | Patienten | +| **Datenkategorien** | Stammdaten, Versicherungsdaten, Diagnosen (ICD), Leistungsziffern (EBM/GOAe) | +| **Empfaenger** | KV (Kassenaerztliche Vereinigung), PKV, Abrechnungsstelle (AVV) | +| **Loeschfrist** | 10 Jahre (steuerliche Aufbewahrung AO) | +| **TOM** | Verschluesselte Datenuebermittlung (KV-Connect/KIM), Zugriffskontrolle | + +## VVT-G04: Laborbefunde + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Beauftragung und Empfang von Laboruntersuchungen | +| **Rechtsgrundlage** | Art. 9 Abs. 2 lit. h DS-GVO | +| **Betroffene** | Patienten | +| **Datenkategorien** | Proben-ID, Untersuchungsparameter, Befundergebnisse (Art. 9) | +| **Empfaenger** | Labordienstleister (AVV) | +| **Loeschfrist** | 10 Jahre (Dokumentationspflicht) | +| **TOM** | Pseudonymisierung der Proben, verschluesselte Uebertragung | + +## VVT-G05: Mitarbeiterverwaltung + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Personalverwaltung, Dienstplanung, Lohnabrechnung | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. b/c DS-GVO i.V.m. §26 BDSG | +| **Betroffene** | Beschaeftigte (Aerzte, MFA, Verwaltung) | +| **Datenkategorien** | Stammdaten, Vertragsdaten, Bankverbindung, Dienstzeiten | +| **Empfaenger** | Lohnbuero (AVV), Finanzamt, Sozialversicherungstraeger | +| **Loeschfrist** | 10 Jahre nach Austritt | +| **TOM** | Zugriffsschutz (nur HR/Praxisleitung) | + +--- + +*Erstellt mit BreakPilot Compliance. Branchenvorlage Gesundheitswesen.* +$template$ +) ON CONFLICT DO NOTHING; + +-- 5. VVT Branchenvorlage: Handel / E-Commerce +INSERT INTO compliance.compliance_legal_templates ( + tenant_id, document_type, title, description, language, jurisdiction, + version, status, license_name, source_name, attribution_required, + is_complete_document, placeholders, content +) VALUES ( + '9282a473-5c95-4b3a-bf78-0ecc0ec71d3e'::uuid, + 'vvt_register', + 'VVT Branchenvorlage: Handel / E-Commerce', + 'Vorbefuelltes Verarbeitungsverzeichnis fuer Online-Shops und Einzelhaendler. Beruecksichtigt TDDDG, Fernabsatzrecht und Zahlungsdienste.', + 'de', 'EU/DSGVO', '2.0', 'published', 'MIT', 'BreakPilot Compliance', false, true, + '[]'::jsonb, + $template$# VVT Branchenvorlage: Handel / E-Commerce + +Typische Verarbeitungstaetigkeiten fuer Online-Shops und Einzelhandel. + +--- + +## VVT-H01: Bestellabwicklung + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Bestellannahme, Versand, Rechnungsstellung | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. b DS-GVO (Vertragserfullung) | +| **Betroffene** | Kunden (Besteller) | +| **Datenkategorien** | Kontaktdaten, Lieferadresse, Bestelldaten, Rechnungsdaten | +| **Empfaenger** | Versanddienstleister, Zahlungsanbieter (AVV), Warenwirtschaft | +| **Loeschfrist** | 10 Jahre Rechnungsdaten (AO/HGB), 3 Jahre Bestelldaten (Verjaeherung) | +| **TOM** | Verschluesselte Uebertragung, Zugriffsschutz Bestellsystem | + +## VVT-H02: Kundenkonto + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Bereitstellung eines Kundenkontos (optional, nicht Pflicht) | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. a/b DS-GVO | +| **Betroffene** | Registrierte Kunden | +| **Datenkategorien** | Stammdaten, Passwort (gehasht), Bestellhistorie, Wunschliste | +| **Empfaenger** | Shop-Plattform-Anbieter (AVV) | +| **Loeschfrist** | Unverzueglich nach Kontoloesch-Anfrage, Rechnungsdaten 10 Jahre | +| **TOM** | MFA-Option, sichere Passwortspeicherung (bcrypt), Gastzugang-Alternative | + +## VVT-H03: Zahlungsabwicklung + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Abwicklung von Zahlungsvorgaengen | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. b DS-GVO | +| **Betroffene** | Zahlende Kunden | +| **Datenkategorien** | Zahlungsart, Transaktionsdaten (keine Kartennummern bei Tokenisierung) | +| **Empfaenger** | Payment-Service-Provider (eigene Verantwortung oder AVV) | +| **Loeschfrist** | 10 Jahre (steuerliche Aufbewahrung) | +| **TOM** | PCI-DSS Compliance, Tokenisierung, keine direkte Kartenspeicherung | + +## VVT-H04: Newsletter / E-Mail-Marketing + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Versand von Angeboten und Produktneuheiten | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. a DS-GVO (Einwilligung) + UWG §7 Abs. 3 (Bestandskunden) | +| **Betroffene** | Newsletter-Abonnenten | +| **Datenkategorien** | E-Mail-Adresse, Name, Kaufhistorie (Bestandskunden), Oeffnungsraten | +| **Empfaenger** | Newsletter-Dienstleister (AVV) | +| **Loeschfrist** | Sofort nach Abmeldung | +| **TOM** | Double-Opt-In, Abmeldelink in jeder E-Mail | + +## VVT-H05: Webanalyse und Tracking + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Analyse des Nutzerverhaltens im Shop, Conversion-Optimierung | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. a DS-GVO (Einwilligung, TDDDG §25) | +| **Betroffene** | Website-Besucher | +| **Datenkategorien** | Anonymisierte IP, Seitenaufrufe, Klickpfade, Warenkorbdaten | +| **Empfaenger** | Analyse-Anbieter (AVV) | +| **Loeschfrist** | 14 Monate | +| **TOM** | IP-Anonymisierung, Cookie-Consent-Management, Opt-Out | + +## VVT-H06: Retouren und Widerruf + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Bearbeitung von Retouren und Widerrufen (Fernabsatzrecht) | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. b/c DS-GVO | +| **Betroffene** | Kunden (Verbraucher) | +| **Datenkategorien** | Bestelldaten, Retourengrund, Erstattungsdaten | +| **Empfaenger** | Logistikdienstleister, Zahlungsanbieter | +| **Loeschfrist** | 3 Jahre (Verjaeherung), Buchhaltung 10 Jahre | +| **TOM** | Nachvollziehbare Retourenprozesse, Zugriffsbeschraenkung | + +--- + +*Erstellt mit BreakPilot Compliance. Branchenvorlage Handel / E-Commerce.* +$template$ +) ON CONFLICT DO NOTHING; + +-- 6. VVT Branchenvorlage: Handwerk +INSERT INTO compliance.compliance_legal_templates ( + tenant_id, document_type, title, description, language, jurisdiction, + version, status, license_name, source_name, attribution_required, + is_complete_document, placeholders, content +) VALUES ( + '9282a473-5c95-4b3a-bf78-0ecc0ec71d3e'::uuid, + 'vvt_register', + 'VVT Branchenvorlage: Handwerksbetrieb', + 'Vorbefuelltes Verarbeitungsverzeichnis fuer Handwerksbetriebe (Bau, Kfz, Elektro, etc.).', + 'de', 'EU/DSGVO', '2.0', 'published', 'MIT', 'BreakPilot Compliance', false, true, + '[]'::jsonb, + $template$# VVT Branchenvorlage: Handwerksbetrieb + +Typische Verarbeitungstaetigkeiten fuer Handwerksbetriebe. + +--- + +## VVT-HW01: Kundenauftraege und Angebotserstellung + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Angebotserstellung, Auftragsabwicklung, Rechnungsstellung | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. b DS-GVO (Vertragserfullung) | +| **Betroffene** | Kunden (Privat und Gewerbe) | +| **Datenkategorien** | Kontaktdaten, Objektadresse, Auftragsbeschreibung, Rechnungsdaten | +| **Empfaenger** | Buchhaltung, Steuerberater, ggf. Subunternehmer | +| **Loeschfrist** | 10 Jahre Rechnungen (AO/HGB), 5 Jahre Gewaehrleistung (BGB) | +| **TOM** | Zugriffskontrolle Auftragssystem, verschluesselte Speicherung | + +## VVT-HW02: Mitarbeiterverwaltung + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Personalverwaltung, Lohnabrechnung, Arbeitszeiterfassung | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. b/c DS-GVO i.V.m. §26 BDSG | +| **Betroffene** | Beschaeftigte, Auszubildende | +| **Datenkategorien** | Stammdaten, Vertragsdaten, Bankverbindung, Arbeitszeiten, Gesundheitszeugnisse | +| **Empfaenger** | Lohnbuero (AVV), Finanzamt, Berufsgenossenschaft | +| **Loeschfrist** | 10 Jahre nach Austritt | +| **TOM** | Verschlossene Personalakte, Zugriffsschutz | + +## VVT-HW03: Baustellendokumentation + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Dokumentation von Baufortschritt, Maengelprotokoll | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. b/f DS-GVO (Vertrag + berechtigtes Interesse) | +| **Betroffene** | Kunden, Mitarbeitende auf der Baustelle | +| **Datenkategorien** | Fotos (ggf. mit Personen), Protokolle, Abnahmedokumente | +| **Empfaenger** | Auftraggeber, Architekten, Baugutachter | +| **Loeschfrist** | 5 Jahre nach Abnahme (Verjaeherung), Fotos nach Projektabschluss | +| **TOM** | Beschraenkter Zugriff auf Projektordner, keine oeffentliche Cloud ohne AVV | + +## VVT-HW04: Materialwirtschaft + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Materialbeschaffung, Lagerverwaltung, Lieferantenmanagement | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. b DS-GVO | +| **Betroffene** | Lieferanten (Ansprechpartner) | +| **Datenkategorien** | Firmendaten, Ansprechpartner, Bestellhistorie, Konditionen | +| **Empfaenger** | Grosshandel, Buchhaltung | +| **Loeschfrist** | 6 Jahre (Handelsbriefe HGB), 10 Jahre Rechnungen | +| **TOM** | Zugriffskontrolle ERP/Warenwirtschaft | + +--- + +*Erstellt mit BreakPilot Compliance. Branchenvorlage Handwerksbetrieb.* +$template$ +) ON CONFLICT DO NOTHING; + +-- 7. VVT Branchenvorlage: Bildung +INSERT INTO compliance.compliance_legal_templates ( + tenant_id, document_type, title, description, language, jurisdiction, + version, status, license_name, source_name, attribution_required, + is_complete_document, placeholders, content +) VALUES ( + '9282a473-5c95-4b3a-bf78-0ecc0ec71d3e'::uuid, + 'vvt_register', + 'VVT Branchenvorlage: Bildungseinrichtung', + 'Vorbefuelltes Verarbeitungsverzeichnis fuer Schulen, Hochschulen und Bildungstraeger. Beruecksichtigt Schueler-/Studentendaten als schutzbeduerftige Betroffene.', + 'de', 'EU/DSGVO', '2.0', 'published', 'MIT', 'BreakPilot Compliance', false, true, + '[]'::jsonb, + $template$# VVT Branchenvorlage: Bildungseinrichtung + +Typische Verarbeitungstaetigkeiten fuer Schulen, Hochschulen und Bildungstraeger. + +--- + +## VVT-B01: Schueler-/Studierendenverwaltung + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Verwaltung von Schueler-/Studierendendaten, Anmeldung, Klassenzuordnung | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. c/e DS-GVO i.V.m. Landesschulgesetz | +| **Betroffene** | Schueler/Studierende (ggf. Minderjaehrige — besonders schutzbeduerftig), Erziehungsberechtigte | +| **Datenkategorien** | Stammdaten, Kontaktdaten Erziehungsberechtigte, Klassenzuordnung | +| **Empfaenger** | Schulverwaltungssoftware-Anbieter (AVV), Schulbehoerde | +| **Loeschfrist** | Gemaess Landesschulgesetz (i.d.R. 5 Jahre nach Abgang) | +| **TOM** | Besonderer Zugriffsschutz, Altersverifizierung, Einwilligung Erziehungsberechtigte | +| **DSFA erforderlich?** | Ja (schutzbeduerftige Betroffene, ggf. grosser Umfang) | + +## VVT-B02: Notenverarbeitung und Zeugniserstellung + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Leistungsbewertung, Zeugnis- und Notenverwaltung | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. c/e DS-GVO i.V.m. Schulgesetz | +| **Betroffene** | Schueler/Studierende | +| **Datenkategorien** | Noten, Leistungsbewertungen, Pruefungsergebnisse | +| **Empfaenger** | Lehrkraefte, Schulleitung, Pruefungsamt | +| **Loeschfrist** | Zeugniskopien: 50 Jahre (Nachweispflicht), Einzelnoten: 2 Jahre | +| **TOM** | Zugriffsbeschraenkung auf Fachlehrkraft, verschluesselte Speicherung | + +## VVT-B03: Lernplattform / LMS + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Digitaler Unterricht, Aufgabenverteilung, Kommunikation | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. e DS-GVO (oeffentliches Interesse) / lit. a (Einwilligung bei Minderjaehrigen) | +| **Betroffene** | Schueler/Studierende, Lehrkraefte | +| **Datenkategorien** | Nutzungsdaten, eingereichte Aufgaben, Chat-Nachrichten | +| **Empfaenger** | LMS-Anbieter (AVV), Hosting-Provider (AVV) | +| **Loeschfrist** | Kursende + 1 Schuljahr | +| **TOM** | Datensparsamkeit, keine Lernanalytics ohne Einwilligung, Hosting in EU | + +## VVT-B04: Elternkommunikation + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Information und Kommunikation mit Erziehungsberechtigten | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. e DS-GVO | +| **Betroffene** | Erziehungsberechtigte | +| **Datenkategorien** | Kontaktdaten, Nachrichteninhalt | +| **Empfaenger** | Kommunikationsplattform-Anbieter (AVV) | +| **Loeschfrist** | Ende des Schuljahres bzw. Abgang des Kindes | +| **TOM** | Verschluesselte Kommunikation, kein WhatsApp/Social Media | + +--- + +*Erstellt mit BreakPilot Compliance. Branchenvorlage Bildungseinrichtung.* +$template$ +) ON CONFLICT DO NOTHING; + +-- 8. VVT Branchenvorlage: Beratung / Dienstleistung +INSERT INTO compliance.compliance_legal_templates ( + tenant_id, document_type, title, description, language, jurisdiction, + version, status, license_name, source_name, attribution_required, + is_complete_document, placeholders, content +) VALUES ( + '9282a473-5c95-4b3a-bf78-0ecc0ec71d3e'::uuid, + 'vvt_register', + 'VVT Branchenvorlage: Beratung / Dienstleistung', + 'Vorbefuelltes Verarbeitungsverzeichnis fuer Beratungsunternehmen, Kanzleien und Dienstleister.', + 'de', 'EU/DSGVO', '2.0', 'published', 'MIT', 'BreakPilot Compliance', false, true, + '[]'::jsonb, + $template$# VVT Branchenvorlage: Beratung / Dienstleistung + +Typische Verarbeitungstaetigkeiten fuer Beratungsunternehmen, Kanzleien und professionelle Dienstleister. + +--- + +## VVT-D01: Mandantenverwaltung + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Verwaltung von Mandanten-/Kundenbeziehungen, Vertragsdokumentation | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. b DS-GVO (Vertragserfullung) | +| **Betroffene** | Mandanten, Ansprechpartner | +| **Datenkategorien** | Kontaktdaten, Vertragsdaten, Korrespondenz, Rechnungsdaten | +| **Empfaenger** | Kanzleisoftware-Anbieter (AVV), Steuerberater | +| **Loeschfrist** | 10 Jahre Rechnungen, 5 Jahre Handakten (Berufsrecht), 3 Jahre sonstige | +| **TOM** | Mandantengeheimnis, verschluesselte Speicherung, Need-to-know-Prinzip | + +## VVT-D02: Projektmanagement + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Planung und Steuerung von Beratungsprojekten | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. b/f DS-GVO | +| **Betroffene** | Projektbeteiligte (Mandant + intern) | +| **Datenkategorien** | Projektdaten, Aufgaben, Zeiterfassung, Ergebnisdokumente | +| **Empfaenger** | Projektmanagement-Tool (AVV), Mandant | +| **Loeschfrist** | 2 Jahre nach Projektabschluss | +| **TOM** | Projektspezifische Zugriffsrechte, Mandantentrennung | + +## VVT-D03: Zeiterfassung und Abrechnung + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Erfassung geleisteter Stunden, Abrechnung gegenueber Mandanten | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. b DS-GVO | +| **Betroffene** | Berater/Mitarbeitende, Mandanten | +| **Datenkategorien** | Arbeitszeiten, Taetigkeitsbeschreibungen, Stundensaetze | +| **Empfaenger** | Abrechnungssystem (AVV), Buchhaltung | +| **Loeschfrist** | 10 Jahre (steuerliche Aufbewahrung) | +| **TOM** | Zugriffsbeschraenkung (nur eigene Zeiten + Projektleitung) | + +## VVT-D04: Dokumentenmanagement + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Verwaltung und Archivierung von Mandantendokumenten | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. b/c DS-GVO | +| **Betroffene** | Mandanten, ggf. Dritte in Dokumenten | +| **Datenkategorien** | Vertraege, Gutachten, Korrespondenz, Berichte | +| **Empfaenger** | DMS-Anbieter (AVV), Cloud-Speicher (AVV) | +| **Loeschfrist** | Gemaess Berufsrecht und Mandatsvereinbarung | +| **TOM** | Dokumentenklassifizierung, Versionierung, Zugriffsprotokollierung | + +## VVT-D05: CRM und Akquise + +| Feld | Inhalt | +|------|--------| +| **Zweck** | Kontaktpflege, Akquise, Beziehungsmanagement | +| **Rechtsgrundlage** | Art. 6 Abs. 1 lit. f DS-GVO (berechtigtes Interesse: Geschaeftsanbahnung) | +| **Betroffene** | Interessenten, Geschaeftskontakte | +| **Datenkategorien** | Kontaktdaten, Firma, Branche, Gespraechsnotizen | +| **Empfaenger** | CRM-Anbieter (AVV) | +| **Loeschfrist** | 3 Jahre nach letztem Kontakt | +| **TOM** | Widerspruchsmoeglichkeit, Datenminimierung | + +--- + +*Erstellt mit BreakPilot Compliance. Branchenvorlage Beratung / Dienstleistung.* +$template$ +) ON CONFLICT DO NOTHING; diff --git a/document-templates/migrations/004_avv_template.sql b/document-templates/migrations/004_avv_template.sql new file mode 100644 index 0000000..52b0f40 --- /dev/null +++ b/document-templates/migrations/004_avv_template.sql @@ -0,0 +1,212 @@ +-- Migration 004: AVV Template — Auftragsverarbeitungsvertrag (Art. 28 DS-GVO) +-- Deutsche AVV-Vorlage mit allen Pflichtinhalten. + +INSERT INTO compliance.compliance_legal_templates ( + tenant_id, document_type, title, description, language, jurisdiction, + version, status, license_name, source_name, attribution_required, + is_complete_document, placeholders, content +) VALUES ( + '9282a473-5c95-4b3a-bf78-0ecc0ec71d3e'::uuid, + 'dpa', + 'Auftragsverarbeitungsvertrag (AVV) gemaess Art. 28 DS-GVO', + 'Vollstaendiger Auftragsverarbeitungsvertrag mit allen Pflichtinhalten nach Art. 28 Abs. 3 DS-GVO. Inkl. TOM-Anlage und Drittlandtransfer-Klausel.', + 'de', + 'EU/DSGVO', + '2.0', + 'published', + 'MIT', + 'BreakPilot Compliance', + false, + true, + CAST('[ + "{{VERANTWORTLICHER_NAME}}", + "{{VERANTWORTLICHER_ADRESSE}}", + "{{VERANTWORTLICHER_VERTRETER}}", + "{{AUFTRAGSVERARBEITER_NAME}}", + "{{AUFTRAGSVERARBEITER_ADRESSE}}", + "{{AUFTRAGSVERARBEITER_VERTRETER}}", + "{{VERTRAGSGEGENSTAND}}", + "{{VERTRAGSDAUER}}", + "{{VERARBEITUNGSZWECK}}", + "{{ART_DER_VERARBEITUNG}}", + "{{DATENKATEGORIEN}}", + "{{BETROFFENE}}", + "{{UNTERAUFTRAGSVERARBEITER_LISTE}}", + "{{TOM_ANLAGE}}", + "{{DRITTLANDTRANSFER_DETAILS}}", + "{{ORT_DATUM}}", + "{{WEISUNGSBERECHTIGTER}}", + "{{KONTAKT_DATENSCHUTZ_AV}}" + ]' AS jsonb), + $template$# Auftragsverarbeitungsvertrag (AVV) +**gemaess Art. 28 Abs. 3 DS-GVO** + +--- + +## Vertragsparteien + +**Verantwortlicher (Auftraggeber):** +{{VERANTWORTLICHER_NAME}} +{{VERANTWORTLICHER_ADRESSE}} +Vertreten durch: {{VERANTWORTLICHER_VERTRETER}} + +**Auftragsverarbeiter (Auftragnehmer):** +{{AUFTRAGSVERARBEITER_NAME}} +{{AUFTRAGSVERARBEITER_ADRESSE}} +Vertreten durch: {{AUFTRAGSVERARBEITER_VERTRETER}} + +--- + +## §1 Gegenstand und Dauer + +(1) Der Auftragsverarbeiter verarbeitet personenbezogene Daten im Auftrag des Verantwortlichen. Gegenstand der Auftragsverarbeitung ist: + +{{VERTRAGSGEGENSTAND}} + +(2) Die Dauer der Verarbeitung entspricht der Laufzeit des Hauptvertrags: {{VERTRAGSDAUER}}. + +--- + +## §2 Art und Zweck der Verarbeitung + +(1) **Zweck:** {{VERARBEITUNGSZWECK}} + +(2) **Art der Verarbeitung:** {{ART_DER_VERARBEITUNG}} + +--- + +## §3 Art der personenbezogenen Daten + +{{DATENKATEGORIEN}} + +--- + +## §4 Kategorien betroffener Personen + +{{BETROFFENE}} + +--- + +## §5 Pflichten des Verantwortlichen + +(1) Der Verantwortliche ist fuer die Rechtmaessigkeit der Datenverarbeitung verantwortlich. + +(2) Der Verantwortliche erteilt Weisungen zur Datenverarbeitung. Weisungsberechtigt ist: {{WEISUNGSBERECHTIGTER}}. + +(3) Der Verantwortliche informiert den Auftragsverarbeiter unverzueglich, wenn er Fehler oder Unregelmaessigkeiten feststellt. + +(4) Der Verantwortliche ist verpflichtet, alle im Rahmen des Vertragsverhaeltnisses erlangten Kenntnisse vertraulich zu behandeln. + +--- + +## §6 Pflichten des Auftragsverarbeiters + +(1) Der Auftragsverarbeiter verarbeitet die Daten ausschliesslich auf dokumentierte Weisung des Verantwortlichen (Art. 28 Abs. 3 lit. a DS-GVO), es sei denn, er ist durch Unionsrecht oder nationales Recht hierzu verpflichtet. + +(2) Der Auftragsverarbeiter gewaehrleistet, dass sich die zur Verarbeitung befugten Personen zur Vertraulichkeit verpflichtet haben oder einer angemessenen gesetzlichen Verschwiegenheitspflicht unterliegen (Art. 28 Abs. 3 lit. b). + +(3) Der Auftragsverarbeiter trifft alle erforderlichen technischen und organisatorischen Massnahmen gemaess Art. 32 DS-GVO (siehe Anlage 1: TOM). + +(4) Der Auftragsverarbeiter beachtet die Bedingungen fuer die Inanspruchnahme von Unterauftragsverarbeitern (§7 dieses Vertrags). + +(5) Der Auftragsverarbeiter unterstuetzt den Verantwortlichen bei der Erfuellung der Betroffenenrechte (Art. 15-22 DS-GVO) durch geeignete technische und organisatorische Massnahmen (Art. 28 Abs. 3 lit. e). + +(6) Der Auftragsverarbeiter unterstuetzt den Verantwortlichen bei der Einhaltung der Pflichten aus Art. 32-36 DS-GVO (Sicherheit, Meldepflichten, DSFA, Konsultation). + +(7) Der Auftragsverarbeiter loescht oder gibt nach Wahl des Verantwortlichen alle personenbezogenen Daten nach Beendigung der Auftragsverarbeitung zurueck und loescht vorhandene Kopien, es sei denn, eine Aufbewahrungspflicht besteht (Art. 28 Abs. 3 lit. g). + +(8) Der Auftragsverarbeiter stellt dem Verantwortlichen alle erforderlichen Informationen zum Nachweis der Einhaltung der Pflichten zur Verfuegung und ermoeglicht Ueberpruefungen/Audits (Art. 28 Abs. 3 lit. h). + +(9) Der Auftragsverarbeiter informiert den Verantwortlichen unverzueglich, wenn eine Weisung nach seiner Auffassung gegen datenschutzrechtliche Vorschriften verstoesst. + +(10) Der Auftragsverarbeiter benennt einen Ansprechpartner fuer den Datenschutz: {{KONTAKT_DATENSCHUTZ_AV}}. + +--- + +## §7 Unterauftragsverarbeitung + +(1) Der Auftragsverarbeiter darf Unterauftragsverarbeiter nur mit vorheriger schriftlicher Genehmigung des Verantwortlichen einsetzen. Es wird eine allgemeine Genehmigung erteilt, wobei der Auftragsverarbeiter den Verantwortlichen ueber beabsichtigte Aenderungen mindestens 14 Tage im Voraus informiert. Der Verantwortliche kann Einspruch erheben. + +(2) Aktuelle Unterauftragsverarbeiter: + +{{UNTERAUFTRAGSVERARBEITER_LISTE}} + +(3) Der Auftragsverarbeiter stellt vertraglich sicher, dass die Unterauftragsverarbeiter dieselben Datenschutzpflichten einhalten. + +{{#IF DRITTLANDTRANSFER_DETAILS}} +--- + +## §8 Uebermittlung in Drittlaender + +(1) Eine Uebermittlung personenbezogener Daten in Drittlaender erfolgt nur unter Einhaltung der Voraussetzungen der Art. 44-49 DS-GVO. + +(2) Details: + +{{DRITTLANDTRANSFER_DETAILS}} +{{/IF}} + +--- + +## §9 Kontrollrechte und Audits + +(1) Der Verantwortliche hat das Recht, die Einhaltung der Vorschriften durch den Auftragsverarbeiter zu ueberpruefen. Dies umfasst Inspektionen vor Ort, Dokumentenpruefungen und die Einholung von Auskuenften. + +(2) Der Auftragsverarbeiter unterstuetzt den Verantwortlichen bei der Durchfuehrung und gewaehrt Zugang zu relevanten Raeumlichkeiten und Systemen mit angemessener Vorankuendigung (in der Regel 14 Tage). + +(3) Alternativ kann der Auftragsverarbeiter aktuelle Zertifizierungen (z. B. ISO 27001, SOC 2) oder Auditberichte unabhaengiger Pruefervorlegen. + +--- + +## §10 Meldung von Datenpannen + +(1) Der Auftragsverarbeiter informiert den Verantwortlichen unverzueglich (in der Regel innerhalb von 24 Stunden) nach Kenntniserlangung ueber eine Verletzung des Schutzes personenbezogener Daten (Art. 33 Abs. 2 DS-GVO). + +(2) Die Meldung umfasst mindestens die Art der Datenpanne, die betroffenen Kategorien und ungefaehre Anzahl der Betroffenen, die wahrscheinlichen Folgen und die ergriffenen Gegenmassnahmen. + +--- + +## §11 Haftung + +Die Haftung richtet sich nach Art. 82 DS-GVO. Der Auftragsverarbeiter haftet fuer Schaeden, die durch eine nicht den Vorgaben der DS-GVO entsprechende Verarbeitung oder durch Handeln entgegen den Weisungen des Verantwortlichen verursacht wurden. + +--- + +## §12 Laufzeit und Kuendigung + +(1) Dieser AVV tritt mit Unterzeichnung in Kraft und endet automatisch mit Beendigung des Hauptvertrags. + +(2) Eine ausserordentliche Kuendigung ist bei schwerem Verstoss gegen diesen Vertrag oder datenschutzrechtliche Vorschriften moeglich. + +(3) Nach Vertragsende hat der Auftragsverarbeiter alle personenbezogenen Daten gemaess §6 Abs. 7 zu loeschen oder zurueckzugeben. + +--- + +## §13 Schlussbestimmungen + +(1) Aenderungen dieses Vertrags beduerfen der Schriftform. + +(2) Sollten einzelne Bestimmungen unwirksam sein, bleibt die Wirksamkeit des uebrigen Vertrags unberuehrt. + +(3) Es gilt das Recht der Bundesrepublik Deutschland. + +--- + +## Anlage 1: Technische und Organisatorische Massnahmen (TOM) + +{{TOM_ANLAGE}} + +--- + +## Unterschriften + +| | Verantwortlicher | Auftragsverarbeiter | +|---|---|---| +| **Ort, Datum** | {{ORT_DATUM}} | {{ORT_DATUM}} | +| **Name** | {{VERANTWORTLICHER_VERTRETER}} | {{AUFTRAGSVERARBEITER_VERTRETER}} | +| **Unterschrift** | _________________ | _________________ | + +--- + +*Erstellt mit BreakPilot Compliance. Lizenz: MIT.* +$template$ +) ON CONFLICT DO NOTHING; diff --git a/document-templates/migrations/005_additional_templates.sql b/document-templates/migrations/005_additional_templates.sql new file mode 100644 index 0000000..2a08e4d --- /dev/null +++ b/document-templates/migrations/005_additional_templates.sql @@ -0,0 +1,249 @@ +-- Migration 005: Zusaetzliche Templates — Verpflichtungserklaerung + Art. 13/14 + +-- 1. Verpflichtungserklaerung (Vertraulichkeit Mitarbeitende) +INSERT INTO compliance.compliance_legal_templates ( + tenant_id, document_type, title, description, language, jurisdiction, + version, status, license_name, source_name, attribution_required, + is_complete_document, placeholders, content +) VALUES ( + '9282a473-5c95-4b3a-bf78-0ecc0ec71d3e'::uuid, + 'verpflichtungserklaerung', + 'Verpflichtungserklaerung auf das Datengeheimnis', + 'Vorlage zur Verpflichtung von Mitarbeitenden auf die Vertraulichkeit und das Datengeheimnis gemaess DS-GVO. Fuer Onboarding-Prozesse.', + 'de', + 'DE', + '1.0', + 'published', + 'MIT', + 'BreakPilot Compliance', + false, + true, + CAST('[ + "{{UNTERNEHMEN_NAME}}", + "{{UNTERNEHMEN_ADRESSE}}", + "{{MITARBEITER_NAME}}", + "{{MITARBEITER_ABTEILUNG}}", + "{{DSB_NAME}}", + "{{DSB_KONTAKT}}", + "{{ORT_DATUM}}", + "{{SCHULUNGSDATUM}}" + ]' AS jsonb), + $template$# Verpflichtung auf das Datengeheimnis +**gemaess Art. 28 Abs. 3 lit. b, Art. 29, Art. 32 Abs. 4 DS-GVO** + +--- + +## 1. Verpflichtung + +Ich, **{{MITARBEITER_NAME}}**, Abteilung **{{MITARBEITER_ABTEILUNG}}**, werde hiermit auf die Vertraulichkeit im Umgang mit personenbezogenen Daten verpflichtet. + +**Arbeitgeber:** {{UNTERNEHMEN_NAME}}, {{UNTERNEHMEN_ADRESSE}} + +Ich verpflichte mich, personenbezogene Daten, die mir im Rahmen meiner Taetigkeit bekannt werden, nur gemaess den erteilten Weisungen zu verarbeiten. Diese Verpflichtung gilt auch nach Beendigung des Beschaeftigungsverhaeltnisses fort. + +--- + +## 2. Pflichten im Einzelnen + +Mir ist bekannt, dass ich verpflichtet bin: + +- Personenbezogene Daten nur im Rahmen meiner Aufgaben und nach Weisung des Verantwortlichen zu verarbeiten. +- Die Vertraulichkeit personenbezogener Daten zu wahren und diese nicht unbefugt an Dritte weiterzugeben. +- Personenbezogene Daten vor unbefugtem Zugriff, Verlust und Missbrauch zu schuetzen. +- Den Datenschutzbeauftragten unverzueglich ueber Datenschutzvorfaelle oder -verletzungen zu informieren. +- Keine personenbezogenen Daten fuer private Zwecke zu verwenden. +- Mobile Datentraeger und Zugangsmedien sorgfaeltig aufzubewahren. +- Passwoerter nicht weiterzugeben und regelmaessig zu aendern. + +--- + +## 3. Rechtsfolgen bei Verstoss + +Ein Verstoss gegen das Datengeheimnis kann folgende Konsequenzen haben: + +- **Arbeitsrechtliche Massnahmen** bis hin zur fristlosen Kuendigung +- **Schadensersatzansprueche** des Arbeitgebers oder der Betroffenen (Art. 82 DS-GVO) +- **Ordnungswidrigkeiten oder Straftaten** nach BDSG und StGB (§§ 42, 43 BDSG; §§ 201-206 StGB) + +--- + +## 4. Datenschutzschulung + +{{#IF SCHULUNGSDATUM}} +Ich habe am **{{SCHULUNGSDATUM}}** eine Datenschutzschulung erhalten und wurde ueber die wesentlichen Grundsaetze der DS-GVO unterrichtet. +{{/IF}} +{{#IF_NOT SCHULUNGSDATUM}} +Eine Datenschutzschulung wird im Rahmen des Onboarding durchgefuehrt. +{{/IF_NOT}} + +--- + +## 5. Ansprechpartner + +Bei Fragen zum Datenschutz wende ich mich an den Datenschutzbeauftragten: +**{{DSB_NAME}}** — {{DSB_KONTAKT}} + +--- + +## 6. Bestaetigung + +Ich habe diese Verpflichtungserklaerung gelesen und verstanden. Ich bin mir meiner Pflichten bewusst. + +| | Mitarbeitende/r | Arbeitgeber | +|---|---|---| +| **Ort, Datum** | {{ORT_DATUM}} | {{ORT_DATUM}} | +| **Name** | {{MITARBEITER_NAME}} | | +| **Unterschrift** | _________________ | _________________ | + +--- + +*Erstellt mit BreakPilot Compliance. Lizenz: MIT.* +$template$ +) ON CONFLICT DO NOTHING; + +-- 2. Art. 13/14 Informationspflichten-Muster +INSERT INTO compliance.compliance_legal_templates ( + tenant_id, document_type, title, description, language, jurisdiction, + version, status, license_name, source_name, attribution_required, + is_complete_document, placeholders, content +) VALUES ( + '9282a473-5c95-4b3a-bf78-0ecc0ec71d3e'::uuid, + 'informationspflichten', + 'Informationspflichten gemaess Art. 13/14 DS-GVO', + 'Mustertext fuer Datenschutzhinweise nach Art. 13 (Direkterhebung) und Art. 14 (Dritterhebung) DS-GVO. Mit bedingten Bloecken fuer beide Varianten.', + 'de', + 'EU/DSGVO', + '1.0', + 'published', + 'MIT', + 'BreakPilot Compliance', + false, + true, + CAST('[ + "{{VERANTWORTLICHER_NAME}}", + "{{VERANTWORTLICHER_ADRESSE}}", + "{{VERANTWORTLICHER_KONTAKT}}", + "{{DSB_NAME}}", + "{{DSB_KONTAKT}}", + "{{VERARBEITUNGSZWECK}}", + "{{RECHTSGRUNDLAGE}}", + "{{BERECHTIGTES_INTERESSE}}", + "{{DATENKATEGORIEN}}", + "{{DATENQUELLE}}", + "{{EMPFAENGER}}", + "{{DRITTLANDTRANSFER}}", + "{{SPEICHERDAUER}}", + "{{AUFSICHTSBEHOERDE}}", + "{{AUTOMATISIERTE_ENTSCHEIDUNG}}", + "{{PFLICHT_ODER_FREIWILLIG}}" + ]' AS jsonb), + $template$# Datenschutzhinweise +**gemaess Art. 13 und Art. 14 der Datenschutz-Grundverordnung (DS-GVO)** + +--- + +## 1. Verantwortlicher + +{{VERANTWORTLICHER_NAME}} +{{VERANTWORTLICHER_ADRESSE}} +Kontakt: {{VERANTWORTLICHER_KONTAKT}} + +{{#IF DSB_NAME}} +## 2. Datenschutzbeauftragter + +{{DSB_NAME}} +{{DSB_KONTAKT}} +{{/IF}} + +--- + +## 3. Zweck und Rechtsgrundlage der Verarbeitung + +Wir verarbeiten Ihre personenbezogenen Daten zu folgenden Zwecken: + +{{VERARBEITUNGSZWECK}} + +**Rechtsgrundlage:** {{RECHTSGRUNDLAGE}} + +{{#IF BERECHTIGTES_INTERESSE}} +**Berechtigtes Interesse (Art. 6 Abs. 1 lit. f DS-GVO):** {{BERECHTIGTES_INTERESSE}} +{{/IF}} + +--- + +## 4. Kategorien personenbezogener Daten + +{{DATENKATEGORIEN}} + +{{#IF DATENQUELLE}} +## 5. Herkunft der Daten (Art. 14 DS-GVO) + +Die Daten wurden nicht bei Ihnen direkt erhoben, sondern stammen aus folgender Quelle: + +{{DATENQUELLE}} +{{/IF}} + +--- + +## 6. Empfaenger und Uebermittlung + +Ihre Daten werden an folgende Empfaenger bzw. Kategorien von Empfaengern uebermittelt: + +{{EMPFAENGER}} + +{{#IF DRITTLANDTRANSFER}} +### Uebermittlung in Drittlaender + +{{DRITTLANDTRANSFER}} +{{/IF}} + +--- + +## 7. Speicherdauer + +{{SPEICHERDAUER}} + +--- + +## 8. Ihre Rechte + +Sie haben gegenueber dem Verantwortlichen folgende Rechte hinsichtlich Ihrer personenbezogenen Daten: + +- **Auskunftsrecht** (Art. 15 DS-GVO): Sie koennen Auskunft ueber die gespeicherten Daten verlangen. +- **Berichtigungsrecht** (Art. 16 DS-GVO): Sie koennen die Berichtigung unrichtiger Daten verlangen. +- **Loeschungsrecht** (Art. 17 DS-GVO): Sie koennen die Loeschung Ihrer Daten verlangen, sofern keine Aufbewahrungspflicht besteht. +- **Einschraenkung** (Art. 18 DS-GVO): Sie koennen die Einschraenkung der Verarbeitung verlangen. +- **Datenuebert ragbarkeit** (Art. 20 DS-GVO): Sie koennen Ihre Daten in einem strukturierten, maschinenlesbaren Format erhalten. +- **Widerspruchsrecht** (Art. 21 DS-GVO): Sie koennen der Verarbeitung widersprechen, insbesondere bei Direktwerbung. + +{{#IF RECHTSGRUNDLAGE}} +- **Widerrufsrecht** (Art. 7 Abs. 3 DS-GVO): Sofern die Verarbeitung auf Einwilligung beruht, koennen Sie diese jederzeit widerrufen, ohne dass die Rechtmaessigkeit der bis dahin erfolgten Verarbeitung beruehrt wird. +{{/IF}} + +--- + +## 9. Beschwerderecht + +Sie haben das Recht, sich bei einer Aufsichtsbehoerde zu beschweren: + +{{AUFSICHTSBEHOERDE}} + +--- + +{{#IF AUTOMATISIERTE_ENTSCHEIDUNG}} +## 10. Automatisierte Entscheidungsfindung (Art. 22 DS-GVO) + +{{AUTOMATISIERTE_ENTSCHEIDUNG}} +{{/IF}} + +{{#IF PFLICHT_ODER_FREIWILLIG}} +## 11. Bereitstellung der Daten + +{{PFLICHT_ODER_FREIWILLIG}} +{{/IF}} + +--- + +*Stand: Siehe Versionsdatum des Dokuments. Erstellt mit BreakPilot Compliance. Lizenz: MIT.* +$template$ +) ON CONFLICT DO NOTHING; diff --git a/document-templates/scripts/cleanup_temp_vorlagen.py b/document-templates/scripts/cleanup_temp_vorlagen.py new file mode 100644 index 0000000..cdeac8a --- /dev/null +++ b/document-templates/scripts/cleanup_temp_vorlagen.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python3 +"""Cleanup script: Delete temporary DPA template documents from Qdrant. + +Removes all points with payload field `temp_vorlagen=true` from +the bp_compliance_datenschutz collection. + +Usage: + python cleanup_temp_vorlagen.py --dry-run # Preview only + python cleanup_temp_vorlagen.py # Execute deletion + python cleanup_temp_vorlagen.py --qdrant-url http://localhost:6333 +""" + +import argparse +import json +import sys +from typing import Optional +from urllib.request import Request, urlopen +from urllib.error import URLError + + +def qdrant_request(base_url: str, method: str, path: str, body: Optional[dict] = None) -> dict: + url = f"{base_url}{path}" + data = json.dumps(body).encode() if body else None + headers = {"Content-Type": "application/json"} if data else {} + req = Request(url, data=data, headers=headers, method=method) + with urlopen(req, timeout=30) as resp: + return json.loads(resp.read()) + + +def count_temp_vorlagen(base_url: str, collection: str) -> int: + """Count points with temp_vorlagen=true.""" + body = { + "filter": { + "must": [ + {"key": "temp_vorlagen", "match": {"value": True}} + ] + }, + "limit": 0, + "exact": True, + } + result = qdrant_request(base_url, "POST", f"/collections/{collection}/points/count", body) + return result.get("result", {}).get("count", 0) + + +def list_temp_regulation_ids(base_url: str, collection: str) -> list[str]: + """Get distinct regulation_ids of temp documents.""" + body = { + "filter": { + "must": [ + {"key": "temp_vorlagen", "match": {"value": True}} + ] + }, + "limit": 500, + "with_payload": ["regulation_id", "title", "source"], + } + result = qdrant_request(base_url, "POST", f"/collections/{collection}/points/scroll", body) + points = result.get("result", {}).get("points", []) + + seen = {} + for p in points: + payload = p.get("payload", {}) + rid = payload.get("regulation_id", "unknown") + if rid not in seen: + seen[rid] = { + "regulation_id": rid, + "title": payload.get("title", ""), + "source": payload.get("source", ""), + } + return list(seen.values()) + + +def delete_temp_vorlagen(base_url: str, collection: str) -> int: + """Delete all points with temp_vorlagen=true.""" + body = { + "filter": { + "must": [ + {"key": "temp_vorlagen", "match": {"value": True}} + ] + } + } + result = qdrant_request(base_url, "POST", f"/collections/{collection}/points/delete", body) + status = result.get("status", "unknown") + return status + + +def main(): + parser = argparse.ArgumentParser(description="Delete temp DPA templates from Qdrant") + parser.add_argument("--qdrant-url", default="http://localhost:6333", + help="Qdrant URL (default: http://localhost:6333)") + parser.add_argument("--collection", default="bp_compliance_datenschutz", + help="Qdrant collection name") + parser.add_argument("--dry-run", action="store_true", + help="Only count and list, do not delete") + args = parser.parse_args() + + print(f"Qdrant URL: {args.qdrant_url}") + print(f"Collection: {args.collection}") + print() + + try: + count = count_temp_vorlagen(args.qdrant_url, args.collection) + except URLError as e: + print(f"ERROR: Cannot connect to Qdrant at {args.qdrant_url}: {e}") + sys.exit(1) + + print(f"Gefundene Punkte mit temp_vorlagen=true: {count}") + + if count == 0: + print("Nichts zu loeschen.") + return + + docs = list_temp_regulation_ids(args.qdrant_url, args.collection) + print(f"\nBetroffene Dokumente ({len(docs)}):") + for doc in sorted(docs, key=lambda d: d["regulation_id"]): + source = f" [{doc['source']}]" if doc.get("source") else "" + title = f" — {doc['title']}" if doc.get("title") else "" + print(f" - {doc['regulation_id']}{title}{source}") + + if args.dry_run: + print(f"\n[DRY-RUN] Wuerde {count} Punkte loeschen. Keine Aenderung durchgefuehrt.") + return + + print(f"\nLoesche {count} Punkte ...") + status = delete_temp_vorlagen(args.qdrant_url, args.collection) + print(f"Status: {status}") + + remaining = count_temp_vorlagen(args.qdrant_url, args.collection) + print(f"Verbleibende temp_vorlagen Punkte: {remaining}") + + if remaining == 0: + print("Cleanup erfolgreich abgeschlossen.") + else: + print(f"WARNUNG: {remaining} Punkte konnten nicht geloescht werden.") + + +if __name__ == "__main__": + main()