293c58d0dd
Build + Deploy / build-admin-compliance (push) Successful in 1m40s
Build + Deploy / build-backend-compliance (push) Successful in 7s
Build + Deploy / build-ai-sdk (push) Successful in 35s
Build + Deploy / build-developer-portal (push) Successful in 8s
Build + Deploy / build-tts (push) Successful in 7s
Build + Deploy / build-document-crawler (push) Successful in 8s
Build + Deploy / build-dsms-gateway (push) Successful in 7s
Build + Deploy / build-dsms-node (push) Successful in 8s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / loc-budget (push) Failing after 16s
CI / secret-scan (push) Has been skipped
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Successful in 2m50s
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / test-go (push) Failing after 40s
CI / test-python-backend (push) Successful in 37s
CI / test-python-document-crawler (push) Successful in 25s
CI / test-python-dsms-gateway (push) Successful in 23s
CI / validate-canonical-controls (push) Successful in 15s
Build + Deploy / trigger-orca (push) Successful in 2m28s
Each check now has a "hint" field explaining what is missing and what the customer should do to fix it. Hints are shown in the frontend below failed checks in red text. Examples: - "Bei Verarbeitung auf Basis von Art. 6(1)(f) muss dokumentiert werden, warum Ihr berechtigtes Interesse die Rechte der Betroffenen ueberwiegt." - "Die ladungsfaehige Anschrift fehlt. Erforderlich: Strasse, Hausnummer, PLZ und Ort." Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
200 lines
9.5 KiB
Python
200 lines
9.5 KiB
Python
"""
|
|
Widerrufsbelehrung checks — §355 BGB, §312g BGB.
|
|
|
|
Level 1: Pflichtangabe erwaehnt?
|
|
Level 2: Pflichtangabe korrekt/vollstaendig?
|
|
"""
|
|
|
|
WIDERRUF_CHECKLIST = [
|
|
# ── L1: Belehrung ueber Widerrufsrecht ────────────────────────────
|
|
{
|
|
"id": "right_info",
|
|
"label": "Belehrung ueber Widerrufsrecht",
|
|
"level": 1, "parent": None,
|
|
"patterns": [
|
|
r"widerrufsrecht",
|
|
r"right\s+of\s+withdrawal",
|
|
r"recht\s+(?:zum|auf)\s+widerruf",
|
|
],
|
|
"severity": "HIGH",
|
|
"hint": "Die Widerrufsbelehrung muss ausdruecklich ueber das Bestehen eines Widerrufsrechts informieren. Ergaenzen Sie einen Abschnitt, der den Verbraucher klar auf sein Widerrufsrecht hinweist.",
|
|
},
|
|
|
|
# ── L1: Widerrufsfrist ────────────────────────────────────────────
|
|
{
|
|
"id": "deadline",
|
|
"label": "Widerrufsfrist (14 Tage)",
|
|
"level": 1, "parent": None,
|
|
"patterns": [
|
|
r"14\s+tage", r"vierzehn\s+tage",
|
|
r"14\s+days", r"fourteen\s+days",
|
|
],
|
|
"severity": "HIGH",
|
|
"hint": "Die gesetzliche Widerrufsfrist von 14 Tagen muss explizit genannt werden. Fuegen Sie die Angabe '14 Tage' oder 'vierzehn Tage' in Ihre Widerrufsbelehrung ein.",
|
|
},
|
|
{
|
|
"id": "deadline_calendar_days",
|
|
"label": "Kalendertage explizit angegeben",
|
|
"level": 2, "parent": "deadline",
|
|
"patterns": [
|
|
r"14\s+kalendertage|vierzehn\s+kalendertage",
|
|
r"14\s+calendar\s+days",
|
|
],
|
|
"severity": "LOW",
|
|
"hint": "Zur Klarstellung sollte 'Kalendertage' statt nur 'Tage' angegeben werden. Aendern Sie die Formulierung zu '14 Kalendertage', um Missverstaendnisse auszuschliessen.",
|
|
},
|
|
{
|
|
"id": "deadline_receipt_trigger",
|
|
"label": "Fristbeginn bei Zugang/Erhalt definiert",
|
|
"level": 2, "parent": "deadline",
|
|
"patterns": [
|
|
r"frist\s+beginnt.*(?:zugang|erhalt|empfang|tag\s+nach)",
|
|
r"ab\s+(?:dem\s+)?(?:tag|zeitpunkt).*(?:zugang|erhalt|empfang|lieferung)",
|
|
r"beginnt\s+(?:mit|ab)\s+(?:dem\s+)?(?:zugang|erhalt)",
|
|
],
|
|
"severity": "MEDIUM",
|
|
"hint": "Der Fristbeginn muss klar definiert sein (z.B. ab Erhalt der Ware oder ab Vertragsschluss). Ergaenzen Sie eine Angabe wie 'Die Frist beginnt ab dem Tag des Erhalts der Ware'.",
|
|
},
|
|
|
|
# ── L1: Form des Widerrufs ────────────────────────────────────────
|
|
{
|
|
"id": "form",
|
|
"label": "Form des Widerrufs",
|
|
"level": 1, "parent": None,
|
|
"patterns": [
|
|
r"widerrufsformular", r"muster.?widerruf",
|
|
r"withdrawal\s+form", r"formular",
|
|
],
|
|
"severity": "MEDIUM",
|
|
"hint": "Die Widerrufsbelehrung muss ueber die Form des Widerrufs informieren und auf das Muster-Widerrufsformular hinweisen. Fuegen Sie einen entsprechenden Abschnitt mit Verweis auf das Formular hinzu.",
|
|
},
|
|
{
|
|
"id": "form_text_required",
|
|
"label": "Textform-Anforderung (Brief, E-Mail, Fax)",
|
|
"level": 2, "parent": "form",
|
|
"patterns": [
|
|
r"(?:textform|schriftlich|per\s+(?:brief|e-?mail|fax|post))",
|
|
r"(?:mittels|durch)\s+(?:einer?\s+)?(?:eindeutige|klare)\w*\s+erkl(?:ae|ä)rung",
|
|
],
|
|
"severity": "LOW",
|
|
"hint": "Es sollte klargestellt werden, dass der Widerruf in Textform (z.B. per Brief, E-Mail oder Fax) erfolgen kann. Nennen Sie die zulaessigen Kommunikationswege ausdruecklich.",
|
|
},
|
|
{
|
|
"id": "model_form",
|
|
"label": "Muster-Widerrufsformular beigefuegt/verlinkt",
|
|
"level": 2, "parent": "form",
|
|
"patterns": [
|
|
r"muster[\-\s]?widerrufsformular",
|
|
r"(?:beigef(?:ue|ü)gt|anlage|anhang|formular).*widerruf",
|
|
r"widerruf.*(?:beigef(?:ue|ü)gt|anlage|anhang|formular)",
|
|
],
|
|
"severity": "LOW",
|
|
"hint": "Das gesetzliche Muster-Widerrufsformular muss beigefuegt oder verlinkt sein. Fuegen Sie das Formular als Anlage bei oder verlinken Sie es direkt in der Belehrung.",
|
|
},
|
|
|
|
# ── L1: Folgen des Widerrufs ──────────────────────────────────────
|
|
{
|
|
"id": "consequences",
|
|
"label": "Folgen des Widerrufs",
|
|
"level": 1, "parent": None,
|
|
"patterns": [
|
|
r"folgen\s+des\s+widerrufs",
|
|
r"consequences\s+of\s+withdrawal",
|
|
r"r(?:ue|ü)ckerstattung",
|
|
],
|
|
"severity": "MEDIUM",
|
|
"hint": "Die Folgen des Widerrufs (insbesondere die Rueckerstattungspflicht) muessen erlaeutert werden. Ergaenzen Sie einen Abschnitt 'Folgen des Widerrufs' mit Angaben zur Rueckabwicklung.",
|
|
},
|
|
{
|
|
"id": "refund_timeline",
|
|
"label": "Rueckerstattung innerhalb von 14 Tagen",
|
|
"level": 2, "parent": "consequences",
|
|
"patterns": [
|
|
r"(?:r(?:ue|ü)ckerstattung|r(?:ue|ü)ckzahlung|erstatten).*14\s+tage",
|
|
r"14\s+tage.*(?:r(?:ue|ü)ckerstatt|r(?:ue|ü)ckzahl|erstatt)",
|
|
r"(?:unverz(?:ue|ü)glich|sp(?:ae|ä)testens).*(?:r(?:ue|ü)ck|erstatt)",
|
|
],
|
|
"severity": "MEDIUM",
|
|
"hint": "Die Rueckerstattung muss innerhalb von 14 Tagen nach Eingang des Widerrufs erfolgen. Geben Sie an, dass die Rueckzahlung spaetestens 14 Tage nach Zugang des Widerrufs erfolgt.",
|
|
},
|
|
{
|
|
"id": "return_costs",
|
|
"label": "Ruecksendekosten-Regelung",
|
|
"level": 2, "parent": "consequences",
|
|
"patterns": [
|
|
r"(?:r(?:ue|ü)cksende|versand|porto)kosten",
|
|
r"kosten\s+(?:der|fuer|für)\s+r(?:ue|ü)cksendung",
|
|
r"(?:tragen|uebernehmen|übernehmen)\s+(?:die\s+)?(?:kosten|r(?:ue|ü)cksende)",
|
|
],
|
|
"severity": "LOW",
|
|
"hint": "Es muss angegeben werden, wer die Kosten der Ruecksendung traegt. Stellen Sie klar, ob der Verbraucher oder der Unternehmer die Ruecksendekosten uebernimmt.",
|
|
},
|
|
|
|
# ── L1: Empfaenger des Widerrufs ──────────────────────────────────
|
|
{
|
|
"id": "recipient",
|
|
"label": "Empfaenger des Widerrufs (Name + Anschrift)",
|
|
"level": 1, "parent": None,
|
|
"patterns": [
|
|
r"widerruf.*(?:richten|senden|erkl(?:ae|ä)ren)\s+(?:an|gegen(?:ue|ü)ber)",
|
|
r"(?:name|firma|anschrift).*widerruf",
|
|
r"widerruf.*(?:per|via|an)",
|
|
],
|
|
"severity": "MEDIUM",
|
|
"hint": "Name und Anschrift des Widerrufsempfaengers muessen angegeben werden. Fuegen Sie den vollstaendigen Firmennamen und die Postanschrift hinzu, an die der Widerruf zu richten ist.",
|
|
},
|
|
{
|
|
"id": "recipient_full_address",
|
|
"label": "Vollstaendige Adresse des Empfaengers",
|
|
"level": 2, "parent": "recipient",
|
|
"patterns": [
|
|
r"widerruf.*(?:d[\-\s]?)?\d{5}\s+[a-z\u00c0-\u017e]",
|
|
r"(?:d[\-\s]?)?\d{5}\s+[a-z\u00c0-\u017e]\w+.*widerruf",
|
|
],
|
|
"severity": "LOW",
|
|
"hint": "Die vollstaendige Postanschrift mit Postleitzahl und Ort fehlt beim Widerrufsempfaenger. Ergaenzen Sie Strasse, PLZ und Ort des Unternehmens in der Widerrufsbelehrung.",
|
|
},
|
|
|
|
# ── L1: Hinweis kein Grund erforderlich ───────────────────────────
|
|
{
|
|
"id": "no_reason",
|
|
"label": "Hinweis: kein Grund erforderlich",
|
|
"level": 1, "parent": None,
|
|
"patterns": [
|
|
r"ohne\s+(?:angabe|nennung).*(?:grund|gr(?:ue|ü)nde)",
|
|
r"(?:kein|keine).*(?:begr(?:ue|ü)ndung|grund).*(?:erforderlich|n(?:oe|ö)tig)",
|
|
],
|
|
"severity": "LOW",
|
|
"hint": "Der Verbraucher muss darauf hingewiesen werden, dass er keinen Grund fuer den Widerruf angeben muss. Ergaenzen Sie den Satz 'Der Widerruf muss nicht begruendet werden'.",
|
|
},
|
|
|
|
# ── L1: Online-Kuendigungsbutton ──────────────────────────────────
|
|
{
|
|
"id": "digital_button",
|
|
"label": "Online-Kuendigungsbutton (§312k BGB)",
|
|
"level": 1, "parent": None,
|
|
"patterns": [
|
|
r"k(?:ue|ü)ndigungsbutton", r"§\s*312k",
|
|
r"online.*k(?:ue|ü)ndig",
|
|
r"k(?:ue|ü)ndigung.*(?:button|link|formular|online)",
|
|
],
|
|
"severity": "MEDIUM",
|
|
"hint": "Seit Juli 2022 ist ein Online-Kuendigungsbutton fuer Dauerschuldverhaeltnisse Pflicht (§312k BGB). Stellen Sie auf Ihrer Website einen gut sichtbaren Kuendigungsbutton bereit.",
|
|
},
|
|
|
|
# ── Neue L1: Ausnahme digitale Inhalte ────────────────────────────
|
|
{
|
|
"id": "digital_content_exception",
|
|
"label": "Ausnahme fuer digitale Inhalte (§356 BGB)",
|
|
"level": 1, "parent": None,
|
|
"patterns": [
|
|
r"§\s*356",
|
|
r"digital\w*\s+(?:inhalte?|g(?:ue|ü)ter|dienstleistung)",
|
|
r"(?:erlischt|verl(?:ue|ü)st|kein\s+widerrufsrecht).*digital",
|
|
r"(?:ausnahme|ausschluss).*widerruf.*digital",
|
|
],
|
|
"severity": "LOW",
|
|
"hint": "Falls Sie digitale Inhalte verkaufen, muss auf den moeglichen Verlust des Widerrufsrechts nach §356 BGB hingewiesen werden. Ergaenzen Sie eine Belehrung ueber die Ausnahme fuer digitale Inhalte.",
|
|
},
|
|
]
|