Files
breakpilot-compliance/backend-compliance/compliance/services/doc_checks/agb_checks.py
T
Benjamin Admin 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
feat: Add actionable hints to all 138 compliance checks
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>
2026-05-07 14:05:01 +02:00

283 lines
13 KiB
Python

"""
AGB checks — §305ff BGB.
Level 1: Pflichtangabe erwaehnt?
Level 2: Pflichtangabe korrekt/vollstaendig?
"""
AGB_CHECKLIST = [
# ── L1: Geltungsbereich ───────────────────────────────────────────
{
"id": "scope",
"label": "Geltungsbereich",
"level": 1, "parent": None,
"patterns": [
r"geltungsbereich", r"geltung", r"scope",
r"diese\s+(?:agb|bedingungen)\s+gelten",
],
"severity": "HIGH",
"hint": "Ihre AGB enthalten keinen Geltungsbereich. Ergaenzen Sie einen Abschnitt, der festlegt, fuer welche Vertraege und Parteien die AGB gelten.",
},
{
"id": "incorporation_clause",
"label": "Einbeziehungsklausel (§305 BGB)",
"level": 2, "parent": "scope",
"patterns": [
r"einbezieh", r"bestandteil\s+des\s+vertrag",
r"(?:mit|durch)\s+(?:der\s+)?bestellung.*(?:anerkennen|akzeptieren|zustimm)",
r"§\s*305",
],
"severity": "MEDIUM",
"hint": "Es fehlt eine Einbeziehungsklausel gemaess §305 BGB. Stellen Sie klar, dass der Kunde vor Vertragsschluss auf die AGB hingewiesen wird und ihnen zustimmt.",
},
# ── L1: Vertragsschluss ───────────────────────────────────────────
{
"id": "contract",
"label": "Vertragsschluss",
"level": 1, "parent": None,
"patterns": [
r"vertragsschluss", r"zustandekommen",
r"contract\s+formation", r"angebot\s+und\s+annahme",
],
"severity": "HIGH",
"hint": "Die AGB beschreiben nicht, wie ein Vertrag zustande kommt. Ergaenzen Sie eine Regelung zu Angebot und Annahme (z.B. Bestellung als Angebot, Bestaetigung als Annahme).",
},
# ── L1: Haftung ───────────────────────────────────────────────────
{
"id": "liability",
"label": "Haftung / Haftungsbeschraenkung",
"level": 1, "parent": None,
"patterns": [
r"haftung", r"liability",
r"schadensersatz", r"haftungsbeschr(?:ae|ä)nkung",
],
"severity": "HIGH",
"hint": "Es fehlt eine Haftungsregelung. Nehmen Sie einen Abschnitt auf, der die Haftung regelt und dabei die gesetzlichen Mindestrechte (Vorsatz, grobe Fahrlaessigkeit, Personenschaeden) unberuehrt laesst.",
},
# ── L1: Gerichtsstand / Anwendbares Recht ─────────────────────────
{
"id": "jurisdiction",
"label": "Gerichtsstand / Anwendbares Recht",
"level": 1, "parent": None,
"patterns": [
r"gerichtsstand", r"anwendbares\s+recht",
r"jurisdiction", r"governing\s+law",
],
"severity": "MEDIUM",
"hint": "Die AGB enthalten keine Angabe zum anwendbaren Recht oder Gerichtsstand. Benennen Sie das geltende Recht (z.B. deutsches Recht) und ggf. den Gerichtsstand.",
},
{
"id": "dispute_odr_link",
"label": "ODR-Plattform-Link (EU-Verordnung 524/2013)",
"level": 2, "parent": "jurisdiction",
"patterns": [
r"ec\.europa\.eu.*odr",
r"(?:os|odr)[\-\s]plattform",
r"(?:online[\-\s]?streitbeilegung|online\s+dispute\s+resolution)",
],
"severity": "MEDIUM",
"hint": "Der Link zur EU-Online-Streitbeilegungsplattform (https://ec.europa.eu/consumers/odr) fehlt. Dieser ist fuer Online-Haendler nach EU-Verordnung 524/2013 Pflicht.",
},
{
"id": "choice_of_law_specific",
"label": "Konkretes Recht benannt (z.B. deutsches Recht)",
"level": 2, "parent": "jurisdiction",
"patterns": [
r"(?:deutsches|(?:oe|ö)sterreichisches|schweizerisches)\s+recht",
r"recht\s+der\s+bundesrepublik",
r"german\s+law|law\s+of\s+germany",
r"un[\-\s]kaufrecht.*(?:ausgeschlossen|findet\s+keine\s+anwendung)",
],
"severity": "LOW",
"hint": "Es wird kein konkretes anwendbares Recht benannt. Geben Sie explizit an, welches Recht gilt (z.B. 'Es gilt das Recht der Bundesrepublik Deutschland') und ob das UN-Kaufrecht ausgeschlossen ist.",
},
# ── L1: Zahlungsbedingungen ───────────────────────────────────────
{
"id": "payment",
"label": "Zahlungsbedingungen",
"level": 1, "parent": None,
"patterns": [
r"zahlungsbedingung", r"payment\s+terms",
r"(?:preis|kosten|entgelt|verg(?:ue|ü)tung)",
r"zahlungsweise", r"rechnungsstellung",
],
"severity": "MEDIUM",
"hint": "Die AGB enthalten keine Zahlungsbedingungen. Ergaenzen Sie Angaben zu Preisen, Zahlungsarten und Faelligkeit.",
},
{
"id": "payment_methods",
"label": "Konkrete Zahlungsarten benannt",
"level": 2, "parent": "payment",
"patterns": [
r"(?:vorkasse|nachnahme|lastschrift|sepa|(?:ue|ü)berweisung|kreditkarte|paypal|sofort(?:ue|ü)berweisung|klarna|rechnung|giropay|apple\s*pay|google\s*pay)",
],
"severity": "LOW",
"hint": "Es werden keine konkreten Zahlungsarten aufgefuehrt. Listen Sie die akzeptierten Zahlungsmethoden auf (z.B. Kreditkarte, PayPal, SEPA-Lastschrift, Ueberweisung).",
},
{
"id": "payment_due_date",
"label": "Faelligkeit/Zahlungsziel angegeben",
"level": 2, "parent": "payment",
"patterns": [
r"(?:f(?:ae|ä)llig|zahlbar|zahlungsziel)\s+(?:sofort|innerhalb|nach|bei|mit)",
r"(?:netto|brutto)\s*\d+\s+tage",
r"zahlungsfrist",
],
"severity": "LOW",
"hint": "Es fehlt eine Angabe zur Faelligkeit der Zahlung. Geben Sie an, wann die Zahlung faellig ist (z.B. 'sofort nach Rechnungsstellung' oder 'innerhalb von 14 Tagen').",
},
# ── L1: Lieferung ─────────────────────────────────────────────────
{
"id": "delivery",
"label": "Lieferung / Leistungserbringung",
"level": 1, "parent": None,
"patterns": [
r"lieferung", r"leistungserbringung", r"delivery",
r"lieferfrist", r"bereitstellung",
r"(?:zugang|zugriff).*(?:dienst|leistung)",
],
"severity": "MEDIUM",
"hint": "Die AGB regeln nicht die Lieferung oder Leistungserbringung. Ergaenzen Sie Angaben zu Liefergebiet, Versandart und Lieferfristen.",
},
{
"id": "delivery_timeframe",
"label": "Konkrete Lieferzeit/Frist angegeben",
"level": 2, "parent": "delivery",
"patterns": [
r"(?:lieferzeit|lieferfrist|versanddauer)\s*(?:betr(?:ae|ä)gt|von|ca\.?|circa)",
r"\d+[\-\s]+(?:\d+\s+)?(?:werk)?tage.*(?:liefer|versand)",
r"(?:liefer|versand).*\d+[\-\s]+(?:\d+\s+)?(?:werk)?tage",
],
"severity": "LOW",
"hint": "Es wird keine konkrete Lieferzeit angegeben. Nennen Sie die voraussichtliche Lieferfrist (z.B. '3-5 Werktage nach Zahlungseingang').",
},
# ── L1: Gewaehrleistung ───────────────────────────────────────────
{
"id": "warranty",
"label": "Gewaehrleistung / Maengelrechte",
"level": 1, "parent": None,
"patterns": [
r"gew(?:ae|ä)hrleistung", r"m(?:ae|ä)ngelrecht",
r"warranty", r"sachm(?:ae|ä)ngel",
r"gew(?:ae|ä)hrleistungsfrist",
],
"severity": "MEDIUM",
"hint": "Die AGB enthalten keine Gewaehrleistungsregelung. Nehmen Sie einen Abschnitt zu Maengelrechten auf, der die gesetzlichen Gewaehrleistungsansprueche beschreibt.",
},
{
"id": "warranty_period",
"label": "Gewaehrleistungsfrist angegeben",
"level": 2, "parent": "warranty",
"patterns": [
r"(?:gew(?:ae|ä)hrleistungsfrist|verj(?:ae|ä)hrungsfrist)\s*(?:betr(?:ae|ä)gt|von|:)",
r"(?:2|zwei)\s+jahre.*(?:gew(?:ae|ä)hrleistung|m(?:ae|ä)ngel|verj(?:ae|ä)hrung)",
r"(?:gew(?:ae|ä)hrleistung|m(?:ae|ä)ngel|verj(?:ae|ä)hrung).*(?:2|zwei)\s+jahre",
],
"severity": "LOW",
"hint": "Die Gewaehrleistungsfrist wird nicht genannt. Geben Sie die Frist an (gesetzlich: 2 Jahre bei Neuware, 1 Jahr bei Gebrauchtwaren gegenueber Verbrauchern moeglich).",
},
# ── L1: Kuendigung ────────────────────────────────────────────────
{
"id": "termination",
"label": "Kuendigung / Vertragsbeendigung",
"level": 1, "parent": None,
"patterns": [
r"k(?:ue|ü)ndigung", r"vertragsbeendigung",
r"termination", r"laufzeit.*(?:vertrag|abo)",
r"k(?:ue|ü)ndigungsfrist",
],
"severity": "MEDIUM",
"hint": "Es fehlt eine Kuendigungsregelung. Beschreiben Sie, wie und unter welchen Bedingungen der Vertrag gekuendigt werden kann.",
},
{
"id": "termination_period",
"label": "Kuendigungsfrist angegeben",
"level": 2, "parent": "termination",
"patterns": [
r"k(?:ue|ü)ndigungsfrist\s+(?:von|betr(?:ae|ä)gt)",
r"\d+\s+(?:tage?|wochen?|monate?).*(?:k(?:ue|ü)ndig|frist)",
r"(?:k(?:ue|ü)ndig|frist).*\d+\s+(?:tage?|wochen?|monate?)",
],
"severity": "LOW",
"hint": "Es wird keine konkrete Kuendigungsfrist angegeben. Nennen Sie die Frist (z.B. '4 Wochen zum Monatsende') und den Zeitpunkt, ab dem sie gilt.",
},
{
"id": "termination_form",
"label": "Formvorschrift fuer Kuendigung",
"level": 2, "parent": "termination",
"patterns": [
r"k(?:ue|ü)ndigung.*(?:schriftlich|textform|per\s+(?:brief|e-?mail|fax))",
r"(?:schriftlich|textform).*k(?:ue|ü)ndigung",
],
"severity": "LOW",
"hint": "Die Formvorschrift fuer Kuendigungen fehlt. Geben Sie an, in welcher Form eine Kuendigung erfolgen muss (z.B. Textform per E-Mail oder schriftlich per Post).",
},
# ── L1: Datenschutzhinweis in AGB ─────────────────────────────────
{
"id": "data_protection",
"label": "Datenschutzhinweis in AGB",
"level": 1, "parent": None,
"patterns": [
r"datenschutz.*(?:agb|bedingung)",
r"(?:agb|bedingung).*datenschutz",
r"personenbezogen.*daten.*(?:agb|vertrag)",
r"dsgvo.*(?:agb|vertrag)",
],
"severity": "LOW",
"hint": "Die AGB enthalten keinen Verweis auf den Datenschutz. Ergaenzen Sie einen Hinweis, dass personenbezogene Daten gemaess Ihrer Datenschutzerklaerung verarbeitet werden, und verlinken Sie diese.",
},
# ── Neue L1: Salvatorische Klausel ────────────────────────────────
{
"id": "salvatory_clause",
"label": "Salvatorische Klausel",
"level": 1, "parent": None,
"patterns": [
r"salvatorische",
r"(?:unwirksamkeit|nichtigkeit)\s+(?:einer|einzelner)\s+(?:bestimmung|klausel|regelung)",
r"(?:sollte|sofern).*(?:bestimmung|klausel).*(?:unwirksam|nichtig)",
r"(?:uebrigen|übrigen)\s+bestimmungen.*(?:unberuehrt|unberührt|wirksam|bestehen)",
],
"severity": "LOW",
"hint": "Es fehlt eine salvatorische Klausel. Ergaenzen Sie eine Regelung, dass die uebrigen Bestimmungen wirksam bleiben, falls einzelne Klauseln unwirksam sein sollten.",
},
# ── Neue L1: Aenderungsklausel ────────────────────────────────────
{
"id": "amendment_clause",
"label": "Aenderungsklausel fuer AGB",
"level": 1, "parent": None,
"patterns": [
r"(?:ae|ä)nderung.*(?:agb|bedingung)",
r"(?:agb|bedingung).*(?:ae|ä)nder",
r"(?:anpassung|aktualisierung).*(?:agb|bedingung|geschaeftsbedingung|geschäftsbedingung)",
r"(?:neue\s+fassung|neufassung).*(?:agb|bedingung)",
],
"severity": "LOW",
"hint": "Die AGB enthalten keine Aenderungsklausel. Beschreiben Sie, wie und wann die AGB geaendert werden koennen und wie Kunden ueber Aenderungen informiert werden.",
},
# ── Neue L1: Verbraucherrechte §309 ───────────────────────────────
{
"id": "consumer_rights",
"label": "Verbraucherrechte nicht eingeschraenkt (§309 BGB)",
"level": 1, "parent": None,
"patterns": [
r"§\s*309",
r"verbraucherrecht",
r"(?:gesetzlich|zwingende)\w*\s+recht\w*.*(?:unberuehrt|unberührt|bestehen\s+bleiben)",
r"(?:verbrauch|konsument).*(?:recht|anspruch|schutz)",
],
"severity": "LOW",
"hint": "Es fehlt ein Hinweis, dass zwingende Verbraucherrechte (§309 BGB) unberuehrt bleiben. Stellen Sie klar, dass gesetzliche Verbraucherrechte durch die AGB nicht eingeschraenkt werden.",
},
]