From 338e03d3b0c8561d31a0d8a00d75ada391af81bf Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Thu, 21 May 2026 16:51:34 +0200 Subject: [PATCH] =?UTF-8?q?feat(audit):=20P34=20Exec-Summary=20Score-Einor?= =?UTF-8?q?dnung=20=E2=80=94=20'wo=20Sie=20stehen=20sollten'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _score_band_explanation: vier Baender (Sehr gut/Akzeptabel/Handlungs- bedarf/Erhoehtes Risiko) liefern Label + erwartete Handlung. Wird als neue Zeile unter den KPIs in der Exec-Summary gerendert (mit score-farbiger Linkmark). Sachlicher Ton — kein 'Vorstand muss sofort handeln', sondern realistische Empfehlung (z.B. '70-84: Branchen-Median, einmaliges Aufraeumen + Halbjahres-Check'). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../api/agent_doc_check_exec_summary.py | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/backend-compliance/compliance/api/agent_doc_check_exec_summary.py b/backend-compliance/compliance/api/agent_doc_check_exec_summary.py index 08a90874..8ee634c0 100644 --- a/backend-compliance/compliance/api/agent_doc_check_exec_summary.py +++ b/backend-compliance/compliance/api/agent_doc_check_exec_summary.py @@ -26,6 +26,47 @@ def _fmt_eur_range(low: int, high: int) -> str: return f"{low:,}–{high:,} €".replace(",", ".") +def _build_score_band_block(pct: int, color: str) -> list[str]: + """P34 — eine Zeile unter den KPIs: Score-Einordnung.""" + band, hint = _score_band_explanation(pct) + return [ + f'
' + f'
' + f'{band} ({pct}%) — {hint}' + f'
', + ] + + +def _score_band_explanation(pct: int) -> tuple[str, str]: + """P34 — Was bedeutet der Score: wo MUESSTE man stehen. + + Returns (label, what_to_expect).""" + if pct >= 85: + return ( + "Sehr gut", "Praxis-uebliche DSGVO-Risikolage. " + "Standard-Pflege reicht — jaehrliche Pruefung empfohlen.", + ) + if pct >= 70: + return ( + "Akzeptabel", "Branchen-Median. Verbleibende Findings sind " + "meist Formalia — Empfehlung: einmaliges Aufraeumen, dann " + "Halbjahres-Check.", + ) + if pct >= 50: + return ( + "Handlungsbedarf", "Mehrere wesentliche Themen offen. " + "Empfehlung: priorisierte Abarbeitung der HIGH-Findings " + "binnen 4-8 Wochen mit DSB + Web-Team.", + ) + return ( + "Erhoehtes Risiko", "Mehrere Kern-Pflichten fehlen oder sind " + "veraltet. Empfehlung: kurzfristiger Termin mit DSB / Rechtsabteilung " + "und Web-Team zur Priorisierung.", + ) + + def build_exec_summary_html( scorecard: dict | None, previous_scorecard: dict | None, @@ -117,6 +158,9 @@ def build_exec_summary_html( '', + # P34 — Score-Einordnung "wer wo stehen muss" + *(_build_score_band_block(pct, score_color) if scorecard else []), + # CTAs '
',