"""DSFA template generator — creates DSFA skeleton from company profile.""" 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 """ company = ctx.get("company_name", "Unbekannt") dpo = ctx.get("dpo_name", "") dpo_email = ctx.get("dpo_email", "") sections = { "section_1": { "title": "Beschreibung der Verarbeitung", "content": f"Die {company} führt eine Datenschutz-Folgenabschätzung gemäß Art. 35 DSGVO durch.\n\n" f"**Verantwortlicher:** {company}\n" f"**Datenschutzbeauftragter:** {dpo} ({dpo_email})\n" f"**Zuständige Aufsichtsbehörde:** {ctx.get('supervisory_authority', 'Nicht angegeben')}", }, "section_2": { "title": "Notwendigkeit und Verhältnismäßigkeit", "content": "Die Verarbeitung ist zur Erreichung des beschriebenen Zwecks erforderlich. " "Alternative, weniger eingriffsintensive Maßnahmen wurden geprüft.", }, "section_3": { "title": "Risiken für die Rechte und Freiheiten", "content": _generate_risk_section(ctx), }, "section_6": { "title": "Stellungnahme des DSB", "content": f"Der Datenschutzbeauftragte ({dpo}) wurde konsultiert." if dpo else "Ein Datenschutzbeauftragter wurde noch nicht benannt.", }, } ai_systems = ctx.get("ai_systems", []) involves_ai = len(ai_systems) > 0 return { "title": f"DSFA — {company}", "description": f"Automatisch generierte Datenschutz-Folgenabschätzung für {company}", "status": "draft", "risk_level": "high" if involves_ai else "medium", "involves_ai": involves_ai, "dpo_name": dpo, "sections": sections, "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 ], } def _generate_risk_section(ctx: dict) -> str: lines = ["## Risikoanalyse\n"] if ctx.get("has_ai_systems"): lines.append("### KI-Systeme\n") for s in ctx.get("ai_systems", []): risk = s.get("risk_category", "unbekannt") lines.append(f"- **{s.get('name', 'N/A')}**: Zweck: {s.get('purpose', 'N/A')}, " f"Risiko: {risk}, Human Oversight: {'Ja' if s.get('has_human_oversight') else 'Nein'}") lines.append("") if ctx.get("subject_to_ai_act"): lines.append("**Hinweis:** Das Unternehmen unterliegt dem EU AI Act. " "KI-spezifische Risiken müssen gemäß der KI-Verordnung bewertet werden.\n") if ctx.get("subject_to_nis2"): lines.append("**Hinweis:** NIS2-Richtlinie ist anwendbar. " "Cybersicherheitsrisiken sind zusätzlich zu bewerten.\n") if not ctx.get("has_ai_systems") and not ctx.get("subject_to_nis2"): lines.append("Standardrisiken der Datenverarbeitung sind zu bewerten.\n") return "\n".join(lines)