""" GF-freundliche Action-Texte fuer fehlende Pflichtangaben. Ausgelagert aus agent_doc_check_report.py (LOC-Cap). Wandelt einen fehlgeschlagenen DocCheck in eine kurze Handlungsanweisung um, die ein Geschaeftsfuehrer ohne juristisches Vorwissen versteht. P66: Cookie-spezifische Findings unterscheiden zwischen Service-Zweck (Anbieter-Beschreibung wie "Akamai = Bot-Schutz") und Cookie-Zweck (welches Cookie wozu) — eine haeufige Verwechslung bei Marketing-Managern. """ from __future__ import annotations def _cookie_finding_action(doc_label: str, check_label: str) -> str | None: """P66 — Cookie-spezifische Mappings.""" label_lower = check_label.lower() if "zwecke der cookies" in label_lower or label_lower == "zwecke": return (f"{doc_label}: Zwecke pro Cookie ergaenzen " f"— nicht pro Anbieter. Service-Beschreibungen ('Akamai = " f"Bot-Schutz') beantworten nicht, was das einzelne Cookie " f"tut. Pflicht: pro Cookie (z.B. _abck) den " f"konkreten Zweck angeben ('Bot-Detection-Token, gueltig " f"24h'). DSK-OH Telemedien 2024 §3.2.") if "speicherdauer" in label_lower: return (f"{doc_label}: Speicherdauer pro Cookie " f"angeben — nicht pauschal 'siehe Anbieter'. Pflicht: " f"konkreter Wert (z.B. '_ga: 2 Jahre', '_gid: 24h', " f"'PHPSESSID: Session'). Werte aus DevTools > " f"Application > Cookies pruefen, Anbieter-Doku ist " f"oft veraltet. Art. 13 Abs. 2 lit. a DSGVO.") if "anbieter" in label_lower or "providers_named" in label_lower: return (f"{doc_label}: Konkrete Firmen mit Sitz " f"benennen — nicht 'Drittanbieter' oder 'Marketing-Partner'. " f"Pflicht: voller Firmenname + Rechtsform + Land (z.B. " f"'Google Ireland Limited, Dublin'). Art. 13 Abs. 1 lit. e " f"DSGVO (Empfaenger-Pflicht).") if "cookie-tabelle" in label_lower or "cookie_list" in label_lower: return (f"{doc_label}: Tabellarische Cookie-Liste " f"mit Name, Anbieter, Zweck und Speicherdauer ergaenzen. " f"Reine Anbieter-Beschreibung ohne Cookie-Namen reicht " f"nicht — Nutzer muss nachvollziehen, welches einzelne " f"Cookie was tut. DSK-OH 2024.") if "drittland" in label_lower or "schrems" in label_lower: return (f"{doc_label}: Pro US-Anbieter (Google, " f"Meta, AWS, Akamai) klaeren: SCC (Art. 46 DSGVO) oder " f"DPF-Zertifizierung — und in der Cookie-Richtlinie " f"explizit nennen. Pauschales 'Anbieter ausserhalb EU' " f"reicht nicht. EuGH Schrems II.") return None def check_to_action(doc_label: str, check_label: str, hint: str) -> str: """Convert a failed check into a plain-language action item.""" label_lower = check_label.lower() if "datenschutzbeauftragter" in label_lower or "dsb" in label_lower: return (f"{doc_label}: Ihren Datenschutzbeauftragten " f"mit Kontaktdaten erwaehnen. Pflicht ab 20 Mitarbeitern.") if "beschwerderecht" in label_lower or "art. 77" in label_lower: return (f"{doc_label}: Hinweis auf das Beschwerderecht " f"bei der Aufsichtsbehoerde ergaenzen (Name + Kontakt der Behoerde).") if "betroffenenrechte" in label_lower: return (f"{doc_label}: Alle Betroffenenrechte " f"(Auskunft, Berichtigung, Loeschung, etc.) einzeln auffuehren.") if "verantwortlicher" in label_lower: return (f"{doc_label}: Vollstaendige Firmenbezeichnung " f"mit Rechtsform, Adresse, E-Mail und Telefon eintragen.") if "interessenabwaegung" in label_lower: return (f"{doc_label}: Bei 'berechtigtem Interesse' " f"die Abwaegung dokumentieren. Aufgabe fuer den DSB/Rechtsanwalt.") if "widerrufsbelehrung" in label_lower or "widerruf" in label_lower: return (f"{doc_label}: Gesetzliche Widerrufsbelehrung " f"mit 14-Tage-Frist und Musterformular bereitstellen.") if "loeschkonzept" in label_lower: return (f"{doc_label}: Loeschfristen und -prozess " f"dokumentieren. Aufgabe fuer den DSB.") if "profiling" in label_lower or "art. 22" in label_lower: return (f"{doc_label}: Hinweis ergaenzen ob " f"automatisierte Entscheidungen stattfinden oder nicht.") if "nicht im eingereichten text" in label_lower: return (f"{doc_label}: Das eingereichte Dokument " f"enthaelt nicht den erwarteten Inhalt. Bitte korrekte URL pruefen.") if any(w in label_lower for w in ("rechtswidrig", "illegal", "haftungsausschluss", "disclaimer")): return (f"{doc_label}: '{check_label}' muss entfernt " f"werden (Anti-Pattern, rechtlich wirkungslos).") mapped = _cookie_finding_action(doc_label, check_label) if mapped: return mapped if hint and len(hint) < 300: return f"{doc_label}: {hint[:280]}" return f"{doc_label}: '{check_label}' muss ergaenzt werden."