feat(consent+report): P56-P67 Mercedes-Audit-Cycle (Anti-Audit, Phase G Vendors, Cookie-Behavior-Validator + 5 Mail-Polish-Items) [migration-approved]
CI / detect-changes (push) Successful in 11s
CI / branch-name (push) Has been skipped
CI / nodejs-build (push) Successful in 2m19s
CI / test-go (push) Has been skipped
CI / test-python-document-crawler (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / validate-canonical-controls (push) Successful in 16s
CI / loc-budget (push) Failing after 15s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / iace-gt-coverage (push) Has been skipped
CI / test-python-backend (push) Successful in 37s
CI / detect-changes (push) Successful in 11s
CI / branch-name (push) Has been skipped
CI / nodejs-build (push) Successful in 2m19s
CI / test-go (push) Has been skipped
CI / test-python-document-crawler (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / validate-canonical-controls (push) Successful in 16s
CI / loc-budget (push) Failing after 15s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / iace-gt-coverage (push) Has been skipped
CI / test-python-backend (push) Successful in 37s
P56 Anti-Auditing-Detection als constructive Compliance-Finding (Audit-API-
Empfehlung statt Anklage, weil Mercedes berechtigt Bots blockiert)
P57 Phase G vendor_details Union mit cmp_vendors -> 42 Anbieter sichtbar
P58 Anti-Audit-Detection robuster (Script-Domain-Check + Settings-spezifisch)
P59 Cookie-Behavior-Validator (4 Layer, 3-Tier-Severity: MEDIUM=Kategorie-
Mismatch / HIGH=Zweck-Mismatch / CRITICAL=beide=Vorsatz-Indiz)
+ Open Cookie Database (CC0) als Library-Seed (2264 Cookies)
P59b Cookie-Behavior in Banner-Check verdrahtet + Mail-Block (BUGFIX:
SessionLocal selbst oeffnen, db war im Background-Task nicht im Scope)
Mail-Polish nach Mercedes-Review:
P63 Banner-Footer-Links auch im wb7-link/role=link erkennen (Shadow-DOM-
Walker label-based statt nur <a href>)
P64 Re-Access-Severity: MEDIUM statt HIGH, wenn Footer "Einstellungen" oder
Mercedes-typisch existiert; OEM-Footer-Detection (wb7-footer)
P65 Text-Truncation: Word-Boundary statt Zeichen-Cut (kein "einfa"-Bruch
mehr in Sofortmassnahmen)
P66 GF-Aktionen: Service-Zweck vs Cookie-Zweck explizit erklaert
(haeufige Verwechslung Marketing/GF: "Akamai-Beschreibung" != Cookie-
Zweck pro DSK-OH 2024)
P67 Stirring-Finding mit "Verlust-Framing"-Erklaerung + Alt-vs-Neutral-
Beispiel, statt nur EDPB-Fachbegriff
Compliance-Advisor FAQ (admin agent-core/soul):
+ CNIL/EDPB Top-Bussgelder (Google 100M, Meta 60M, Amazon 35M)
+ Deutsche Praezedenz (LG Muenchen Google Fonts, EuGH Planet49, BGH I ZR 7/16)
+ 4 Risiko-Pfade (Bussgeld/Abmahnung/Sammelklage/NOYB) + Berechnungs-Methodik
Document-Generator Templates: AGB-DE (142), Impressum (140), Widerrufs-
formular-Anlage (143), DSR-Process-Dedup (139), Cookie-Library (144).
Architektur: doc_action_mappings.py + banner_dom_walkers.py +
cookie_behavior_validator.py + vendor_detail_extractor.py rausgezogen,
um die 500-LOC-Caps in agent_doc_check_report.py und
banner_text_checker.py einzuhalten.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
-- Migration 139: DSR-Process-Templates Deduplication (P46)
|
||||
--
|
||||
-- Migrations 020 + 138 inserted dsr_process_art15..art21 templates
|
||||
-- twice (once 2026-04-28, again 2026-05-04). Identical content,
|
||||
-- identical version, identical source. Keep the oldest, delete the
|
||||
-- newer duplicates.
|
||||
--
|
||||
-- Safety:
|
||||
-- - Idempotent: WHERE rn > 1 only deletes from groups with >1 rows
|
||||
-- - Restricted to dsr_process_* document types only
|
||||
-- - Tested locally before applying to production
|
||||
|
||||
BEGIN;
|
||||
|
||||
WITH ranked AS (
|
||||
SELECT id,
|
||||
ROW_NUMBER() OVER (
|
||||
PARTITION BY document_type, language, tenant_id
|
||||
ORDER BY created_at
|
||||
) AS rn
|
||||
FROM compliance.compliance_legal_templates
|
||||
WHERE document_type LIKE 'dsr_process_%'
|
||||
)
|
||||
DELETE FROM compliance.compliance_legal_templates
|
||||
WHERE id IN (SELECT id FROM ranked WHERE rn > 1);
|
||||
|
||||
COMMIT;
|
||||
@@ -0,0 +1,131 @@
|
||||
-- Migration 140: Impressum-Template DE (P43)
|
||||
--
|
||||
-- Impressum doc_type fehlte komplett in compliance_legal_templates.
|
||||
-- Im Frontend gelistet aber 0 Templates -> 404 bei Auswahl.
|
||||
-- Enthaelt alle §5 TMG + §18 MStV Pflichtangaben.
|
||||
|
||||
BEGIN;
|
||||
|
||||
INSERT INTO compliance.compliance_legal_templates (
|
||||
id, tenant_id, document_type, title, description, content,
|
||||
placeholders, language, jurisdiction, license_name,
|
||||
attribution_required, is_complete_document, version, status,
|
||||
source_name
|
||||
)
|
||||
SELECT
|
||||
gen_random_uuid(),
|
||||
'9282a473-5c95-4b3a-bf78-0ecc0ec71d3e'::uuid,
|
||||
'impressum',
|
||||
'Impressum (§5 TMG, §18 MStV, §27a UStG, DL-InfoV)',
|
||||
'Pflichtangaben-Vorlage fuer Websites + Telemedien. Modular mit IF-Bloecken fuer juristische Person, Berufsgruppen, journalistisch-redaktionelle Angebote, kuenstliche Intelligenz-Kennzeichnung.',
|
||||
'# Impressum
|
||||
|
||||
## Angaben gemaess §5 Telemediengesetz (TMG)
|
||||
|
||||
**{{company_legal_name}}**
|
||||
{{company_address}}
|
||||
{{company_postal}} {{company_city}}
|
||||
{{company_country}}
|
||||
|
||||
## Vertretungsberechtigte/r (§5(1) Nr.1 TMG)
|
||||
|
||||
{{representative_role}}: {{representative_name}}
|
||||
|
||||
## Kontakt (§5(1) Nr.2 TMG)
|
||||
|
||||
Telefon: {{company_phone}}
|
||||
E-Mail: {{company_email}}
|
||||
{{#IF HAS_FAX}}Fax: {{company_fax}}{{/IF}}
|
||||
|
||||
## Handelsregister (§5(1) Nr.4 TMG)
|
||||
|
||||
Registergericht: {{register_court}}
|
||||
Registernummer: {{register_number}}
|
||||
|
||||
{{#IF HAS_VAT_ID}}
|
||||
## Umsatzsteuer-Identifikationsnummer (§5(1) Nr.6 TMG)
|
||||
|
||||
USt-IdNr. gemaess §27a Umsatzsteuergesetz: {{vat_id}}
|
||||
{{/IF}}
|
||||
|
||||
{{#IF HAS_WIRTSCHAFTS_ID}}
|
||||
## Wirtschafts-Identifikationsnummer
|
||||
|
||||
Wirtschafts-ID gemaess §139c Abgabenordnung: {{wirtschafts_id}}
|
||||
{{/IF}}
|
||||
|
||||
{{#IF IS_REGULATED_PROFESSION}}
|
||||
## Berufsrechtliche Angaben (§5(1) Nr.5 TMG)
|
||||
|
||||
- Berufsbezeichnung: {{profession_title}}
|
||||
- Zustaendige Kammer: {{chamber_name}}, {{chamber_address}}
|
||||
- Verliehen in: {{profession_country}}
|
||||
- Berufsrechtliche Regelungen: {{profession_regulations}}
|
||||
- Regelungen einsehbar unter: {{profession_regulations_url}}
|
||||
{{/IF}}
|
||||
|
||||
{{#IF HAS_LIABILITY_INSURANCE}}
|
||||
## Berufshaftpflichtversicherung (DL-InfoV §2(1) Nr.11)
|
||||
|
||||
- Versicherer: {{insurance_name}}
|
||||
- Anschrift: {{insurance_address}}
|
||||
- Geltungsraum: {{insurance_scope}}
|
||||
{{/IF}}
|
||||
|
||||
{{#IF IS_JOURNALISTIC}}
|
||||
## Verantwortlich fuer den Inhalt nach §18(2) MStV
|
||||
|
||||
{{editor_name}}
|
||||
{{editor_address}}
|
||||
{{editor_postal}} {{editor_city}}
|
||||
{{/IF}}
|
||||
|
||||
{{#IF HAS_SUPERVISION}}
|
||||
## Aufsichtsbehoerde
|
||||
|
||||
{{supervision_authority}}
|
||||
{{supervision_address}}
|
||||
{{/IF}}
|
||||
|
||||
## Streitschlichtung
|
||||
|
||||
Die Europaeische Kommission stellt eine Plattform zur Online-Streitbeilegung (OS) bereit: https://ec.europa.eu/consumers/odr/
|
||||
|
||||
Unsere E-Mail-Adresse finden Sie oben im Impressum.
|
||||
|
||||
{{#IF VSBG_PARTICIPATION}}
|
||||
Wir sind {{vsbg_willing}} bereit oder verpflichtet, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.
|
||||
|
||||
{{#IF VSBG_WILLING}}
|
||||
Zustaendige Verbraucherschlichtungsstelle:
|
||||
{{vsbg_name}}
|
||||
{{vsbg_address}}
|
||||
{{vsbg_url}}
|
||||
{{/IF}}
|
||||
{{/IF}}
|
||||
|
||||
## Haftungsausschluss
|
||||
|
||||
### Haftung fuer Inhalte
|
||||
|
||||
Als Diensteanbieter sind wir gemaess §7 Abs.1 TMG fuer eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, uebermittelte oder gespeicherte fremde Informationen zu ueberwachen oder nach Umstaenden zu forschen, die auf eine rechtswidrige Taetigkeit hinweisen.
|
||||
|
||||
Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberuehrt. Eine diesbezuegliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung moeglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.
|
||||
|
||||
### Haftung fuer Links
|
||||
|
||||
Unser Angebot enthaelt Links zu externen Websites Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb koennen wir fuer diese fremden Inhalte auch keine Gewaehr uebernehmen. Fuer die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich.
|
||||
|
||||
### Urheberrecht
|
||||
|
||||
Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfaeltigung, Bearbeitung, Verbreitung und jede Art der Verwertung ausserhalb der Grenzen des Urheberrechtes beduerfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers.
|
||||
|
||||
---
|
||||
|
||||
*Stand: {{date}} - Version: {{version}}*',
|
||||
'[{"name": "company_legal_name", "label": "Firma (mit Rechtsform)", "required": true}, {"name": "company_address", "label": "Anschrift", "required": true}, {"name": "company_postal", "label": "PLZ", "required": true}, {"name": "company_city", "label": "Ort", "required": true}, {"name": "company_country", "label": "Land", "required": true}, {"name": "representative_role", "label": "Funktion (z.B. Geschaeftsfuehrerin)", "required": true}, {"name": "representative_name", "label": "Name", "required": true}, {"name": "company_phone", "label": "Telefon", "required": true}, {"name": "company_email", "label": "E-Mail", "required": true}, {"name": "register_court", "label": "Registergericht", "required": true}, {"name": "register_number", "label": "Registernummer", "required": true}, {"name": "vat_id", "label": "USt-IdNr.", "required": false}]'::jsonb,
|
||||
'de', 'DE', 'MIT', false, true, '1.0.0', 'published',
|
||||
'BreakPilot Compliance'
|
||||
;
|
||||
|
||||
COMMIT;
|
||||
@@ -0,0 +1,16 @@
|
||||
-- Migration 141: Promote 'active' templates to 'published' (P43)
|
||||
--
|
||||
-- Three legacy templates (cookie_banner, impressum, privacy_policy)
|
||||
-- were stored with status='active' from a March-2026 seed. The
|
||||
-- list-templates API filters status='published' by default, so they
|
||||
-- never appeared in the document-generator UI even though the data
|
||||
-- was fine. Promoting them so users can see + use them.
|
||||
|
||||
BEGIN;
|
||||
|
||||
UPDATE compliance.compliance_legal_templates
|
||||
SET status = 'published', updated_at = now()
|
||||
WHERE status = 'active'
|
||||
AND document_type IN ('cookie_banner', 'impressum', 'privacy_policy');
|
||||
|
||||
COMMIT;
|
||||
@@ -0,0 +1,139 @@
|
||||
-- Migration 142: AGB DE-Variante (P44)
|
||||
--
|
||||
-- compliance_legal_templates hatte nur agb (en) "Terms and Conditions".
|
||||
-- Deutsche AGB fuer SaaS/E-Commerce fehlte. Diese Vorlage erfuellt alle
|
||||
-- L1-Pflichtangaben (§§305ff BGB, §312i, §475 BGB, §309 BGB) und ist
|
||||
-- modular fuer B2C/B2B/Mixed konfigurierbar.
|
||||
|
||||
BEGIN;
|
||||
|
||||
INSERT INTO compliance.compliance_legal_templates (
|
||||
id, tenant_id, document_type, title, description, content,
|
||||
placeholders, language, jurisdiction, license_name,
|
||||
attribution_required, is_complete_document, version, status,
|
||||
source_name
|
||||
)
|
||||
SELECT
|
||||
gen_random_uuid(),
|
||||
'9282a473-5c95-4b3a-bf78-0ecc0ec71d3e'::uuid,
|
||||
'agb',
|
||||
'Allgemeine Geschaeftsbedingungen (AGB) — DE (SaaS/Shop)',
|
||||
'AGB-Vorlage fuer SaaS und E-Commerce, modular fuer B2C/B2B/Mixed. Enthaelt alle Pflichtangaben nach §§305ff BGB, Vertragsschluss-Regelung §312i BGB, Liefer-/Leistungsfristen §475 BGB, BGH-konforme Aenderungsklausel + Erhaltungsklausel statt unwirksamer Salvatorischer.',
|
||||
'# Allgemeine Geschaeftsbedingungen (AGB)
|
||||
|
||||
**{{company_legal_name}}**
|
||||
Stand: {{date}} - Version: {{version}}
|
||||
|
||||
## §1 Geltungsbereich
|
||||
|
||||
(1) Diese Allgemeinen Geschaeftsbedingungen (im Folgenden AGB) gelten fuer alle Vertraege zwischen {{company_legal_name}} (im Folgenden Anbieter) und dem Kunden ueber die Bereitstellung des Dienstes {{service_name}} bzw. den Bezug von Waren ueber den Online-Shop {{shop_url}}.
|
||||
|
||||
(2) Abweichende, entgegenstehende oder ergaenzende Allgemeine Geschaeftsbedingungen des Kunden werden nur dann und insoweit Vertragsbestandteil, als der Anbieter ihrer Geltung ausdruecklich schriftlich zugestimmt hat.
|
||||
|
||||
{{#IF IS_B2C_MIXED}}
|
||||
(3) Verbraucher im Sinne dieser AGB ist jede natuerliche Person, die ein Rechtsgeschaeft zu Zwecken abschliesst, die ueberwiegend weder ihrer gewerblichen noch ihrer selbststaendigen beruflichen Taetigkeit zugerechnet werden koennen (§13 BGB). Unternehmer ist jede natuerliche oder juristische Person oder eine rechtsfaehige Personengesellschaft, die bei Abschluss eines Rechtsgeschaefts in Ausuebung ihrer gewerblichen oder selbststaendigen beruflichen Taetigkeit handelt (§14 BGB).
|
||||
{{/IF}}
|
||||
|
||||
## §2 Leistungsbeschreibung und Lieferung
|
||||
|
||||
(1) Der Anbieter erbringt folgende Leistungen: {{service_description}}
|
||||
|
||||
{{#IF IS_SAAS}}
|
||||
(2) Die Bereitstellung des Software-as-a-Service erfolgt mit einer Verfuegbarkeit von {{sla_uptime}}% im Jahresmittel, ausgenommen geplante Wartungsfenster.
|
||||
{{/IF}}
|
||||
|
||||
{{#IF IS_SHOP}}
|
||||
(2) Die Lieferung der bestellten Waren erfolgt innerhalb von {{delivery_days}} Werktagen nach Vertragsschluss (§475 Abs. 1 BGB: spaetestens 30 Tage). Bei nicht verfuegbaren Artikeln wird der Kunde unverzueglich informiert; bereits geleistete Zahlungen werden zurueckerstattet.
|
||||
{{/IF}}
|
||||
|
||||
## §3 Vertragsschluss
|
||||
|
||||
(1) Die Darstellung der Dienste/Produkte auf der Website stellt kein bindendes Angebot dar, sondern eine Aufforderung zur Abgabe eines Angebots (invitatio ad offerendum).
|
||||
|
||||
(2) Mit der Bestellung gibt der Kunde ein verbindliches Angebot zum Abschluss eines Vertrages ab.
|
||||
|
||||
(3) Der Anbieter bestaetigt den Eingang der Bestellung unverzueglich per E-Mail (Eingangsbestaetigung nach §312i BGB). Diese Eingangsbestaetigung stellt noch keine Vertragsannahme dar.
|
||||
|
||||
(4) Der Vertrag kommt erst durch ausdrueckliche Auftragsbestaetigung oder durch Lieferung der Ware/Bereitstellung der Dienstleistung zustande (Angebot und Annahme).
|
||||
|
||||
## §4 Preise und Zahlungsbedingungen
|
||||
|
||||
(1) Es gelten die zum Zeitpunkt der Bestellung auf der Website angegebenen Preise.
|
||||
|
||||
{{#IF IS_B2C_MIXED}}
|
||||
(2) Alle Preise gegenueber Verbrauchern verstehen sich inklusive der gesetzlichen Mehrwertsteuer.
|
||||
{{/IF}}
|
||||
|
||||
(3) Zahlbar sind die Preise wie folgt: {{payment_terms}}
|
||||
|
||||
## §5 Kundenpflichten
|
||||
|
||||
(1) Der Kunde ist verpflichtet, bei der Bestellung wahrheitsgemaesse Angaben zu machen.
|
||||
|
||||
{{#IF IS_SAAS}}
|
||||
(2) Der Kunde ist fuer die sichere Aufbewahrung seiner Zugangsdaten verantwortlich.
|
||||
|
||||
(3) Der Kunde darf den Dienst nicht missbraeuchlich nutzen, insbesondere keine rechtswidrigen Inhalte einstellen.
|
||||
{{/IF}}
|
||||
|
||||
{{#IF IS_B2C_MIXED}}
|
||||
## §6 Widerrufsrecht fuer Verbraucher
|
||||
|
||||
Verbraucher haben ein gesetzliches Widerrufsrecht. Die Einzelheiten ergeben sich aus der Widerrufsbelehrung, die dem Kunden vor Vertragsschluss zur Verfuegung gestellt wird.
|
||||
{{/IF}}
|
||||
|
||||
## §7 Gewaehrleistung und Haftung
|
||||
|
||||
(1) Es gelten die gesetzlichen Gewaehrleistungsrechte.
|
||||
|
||||
(2) Der Anbieter haftet unbeschraenkt fuer Vorsatz und grobe Fahrlaessigkeit sowie bei der Verletzung von Leben, Koerper oder Gesundheit.
|
||||
|
||||
(3) Bei leichter Fahrlaessigkeit haftet der Anbieter nur bei Verletzung wesentlicher Vertragspflichten (Kardinalpflichten) und begrenzt auf den vorhersehbaren, vertragstypischen Schaden.
|
||||
|
||||
(4) Die gesetzlichen Verbraucherrechte nach §309 BGB werden durch diese AGB nicht eingeschraenkt; insbesondere Haftungsausschluesse bei Koerperschaeden (§309 Nr. 7a BGB), pauschalierter Schadensersatz ohne Gegenbeweismoeglichkeit (§309 Nr. 5b BGB) und Schriftformerfordernisse fuer Kuendigungen (§309 Nr. 13 BGB) sind ausgeschlossen.
|
||||
|
||||
## §8 Datenschutz
|
||||
|
||||
Die Verarbeitung personenbezogener Daten erfolgt nach den Bestimmungen unserer Datenschutzerklaerung, abrufbar unter {{privacy_url}}. AGB und Datenschutzerklaerung sind rechtlich getrennte Dokumente; die DSE enthaelt alle Pflichtangaben nach Art. 13 DSGVO.
|
||||
|
||||
{{#IF IS_SAAS}}
|
||||
## §9 Laufzeit und Kuendigung
|
||||
|
||||
(1) Der Vertrag laeuft auf unbestimmte Zeit und kann von beiden Seiten mit einer Frist von {{notice_period}} zum Monatsende gekuendigt werden.
|
||||
|
||||
{{#IF IS_B2C_MIXED}}
|
||||
(2) Verbraucher koennen den Vertrag jederzeit ueber den Kuendigungsbutton "Vertraege hier kuendigen" online beenden (§312k BGB).
|
||||
{{/IF}}
|
||||
{{/IF}}
|
||||
|
||||
## §10 Aenderungen dieser AGB
|
||||
|
||||
(1) Der Anbieter behaelt sich vor, diese AGB zu aendern, wenn dies zur Anpassung an geaenderte Rechtslage, hoehrichterliche Rechtsprechung oder veraenderte Marktverhaeltnisse notwendig wird.
|
||||
|
||||
(2) Aenderungen werden dem Kunden mindestens 6 Wochen vor Inkrafttreten in Textform mitgeteilt.
|
||||
|
||||
{{#IF IS_B2C_MIXED}}
|
||||
(3) Verbraucher koennen den geaenderten AGB innerhalb von 6 Wochen widersprechen. Im Widerspruchsfall steht beiden Seiten ein Sonderkuendigungsrecht zu. Bei ausbleibendem Widerspruch nach Ablauf der Frist gelten die geaenderten AGB als angenommen, sofern der Kunde auf diese Rechtsfolge hingewiesen wurde (BGH XI ZR 388/10).
|
||||
{{/IF}}
|
||||
|
||||
## §11 Schlussbestimmungen
|
||||
|
||||
(1) Es gilt deutsches Recht unter Ausschluss des UN-Kaufrechts.
|
||||
|
||||
{{#IF IS_B2B_ONLY}}
|
||||
(2) Ausschliesslicher Gerichtsstand fuer alle Streitigkeiten ist {{jurisdiction_city}}.
|
||||
{{/IF}}
|
||||
|
||||
(3) Sollten einzelne Bestimmungen dieser AGB unwirksam oder undurchfuehrbar sein, so bleibt die Wirksamkeit der uebrigen Bestimmungen unberuehrt (Erhaltungsklausel). Die unwirksame Bestimmung wird durch die gesetzliche Regelung ersetzt.
|
||||
|
||||
(4) Aenderungen oder Ergaenzungen dieses Vertrages beduerfen der Textform.
|
||||
|
||||
---
|
||||
|
||||
*{{company_legal_name}} - Stand: {{date}}*',
|
||||
'[{"name":"company_legal_name","label":"Firma","required":true},{"name":"service_name","label":"Dienst-Name","required":true},{"name":"service_description","label":"Leistungsbeschreibung","required":true},{"name":"payment_terms","label":"Zahlungsbedingungen","required":true},{"name":"privacy_url","label":"URL zur DSE","required":true},{"name":"notice_period","label":"Kuendigungsfrist","required":false},{"name":"jurisdiction_city","label":"Gerichtsstand","required":false}]'::jsonb,
|
||||
'de', 'DE', 'MIT', false, true, '1.0.0', 'published',
|
||||
'BreakPilot Compliance'
|
||||
;
|
||||
|
||||
COMMIT;
|
||||
@@ -0,0 +1,95 @@
|
||||
-- Migration 143: Muster-Widerrufsformular (P45)
|
||||
--
|
||||
-- Die Widerrufsbelehrung (doc_type=widerruf) ist da, aber das separate
|
||||
-- Muster-Widerrufsformular nach Anlage 2 zu Art. 246a §1 Abs. 2 EGBGB
|
||||
-- fehlte. Das ist eine Pflichtanlage zur Widerrufsbelehrung —
|
||||
-- ausfuellbares Standard-Formular, das jeder B2C-Anbieter beilegen muss.
|
||||
|
||||
BEGIN;
|
||||
|
||||
INSERT INTO compliance.compliance_legal_templates (
|
||||
id, tenant_id, document_type, title, description, content,
|
||||
placeholders, language, jurisdiction, license_name,
|
||||
attribution_required, is_complete_document, version, status,
|
||||
source_name
|
||||
)
|
||||
SELECT
|
||||
gen_random_uuid(),
|
||||
'9282a473-5c95-4b3a-bf78-0ecc0ec71d3e'::uuid,
|
||||
'widerrufsformular',
|
||||
'Muster-Widerrufsformular (Anlage 2 zu Art. 246a §1(2) EGBGB)',
|
||||
'Standard-Widerrufsformular nach gesetzlicher Vorlage (Anlage 2 zu Art. 246a §1 Abs. 2 EGBGB). Pflicht-Anlage zur Widerrufsbelehrung im B2C-Online-Handel. Ausfuellbares Formular mit allen gesetzlich vorgesehenen Feldern.',
|
||||
'# Muster-Widerrufsformular
|
||||
|
||||
*Wenn Sie den Vertrag widerrufen wollen, dann fuellen Sie bitte dieses Formular aus und senden Sie es zurueck.*
|
||||
|
||||
---
|
||||
|
||||
**An:**
|
||||
|
||||
{{company_legal_name}}
|
||||
{{company_address}}
|
||||
{{company_postal}} {{company_city}}
|
||||
{{company_country}}
|
||||
|
||||
Telefax: {{company_fax}}
|
||||
E-Mail: {{company_email}}
|
||||
|
||||
---
|
||||
|
||||
Hiermit widerrufe(n) ich/wir (*) den von mir/uns (*) abgeschlossenen Vertrag ueber den Kauf der folgenden Waren (*) / die Erbringung der folgenden Dienstleistung (*):
|
||||
|
||||
___________________________________________________________________
|
||||
|
||||
___________________________________________________________________
|
||||
|
||||
**Bestellt am (*):** _______________________
|
||||
|
||||
**Erhalten am (*):** _______________________
|
||||
|
||||
**Bestellnummer (falls vorhanden):** _______________________
|
||||
|
||||
**Name des/der Verbraucher(s):**
|
||||
|
||||
___________________________________________________________________
|
||||
|
||||
**Anschrift des/der Verbraucher(s):**
|
||||
|
||||
___________________________________________________________________
|
||||
|
||||
___________________________________________________________________
|
||||
|
||||
**Datum:** _______________________
|
||||
|
||||
**Unterschrift des/der Verbraucher(s) (nur bei Mitteilung auf Papier):**
|
||||
|
||||
___________________________________________________________________
|
||||
|
||||
---
|
||||
|
||||
(*) Unzutreffendes streichen.
|
||||
|
||||
---
|
||||
|
||||
## Hinweise zur Verwendung
|
||||
|
||||
- Dieses Formular muss dem Verbraucher **vor Vertragsschluss** zur Verfuegung gestellt werden (§312d Abs. 1 BGB i.V.m. Art. 246a §1 Abs. 2 Nr. 1 EGBGB).
|
||||
- Der Verbraucher ist **nicht verpflichtet**, dieses Formular zu nutzen — der Widerruf kann formfrei erklaert werden (z.B. per E-Mail, Brief, Fax).
|
||||
- Bei Online-Vertrieb sollte das Formular ueber einen klar gekennzeichneten Link **direkt von der Widerrufsbelehrung aus erreichbar** sein.
|
||||
- Bei Bereitstellung einer Online-Widerrufsfunktion (Kuendigungsbutton-aehnlich nach §312k BGB) muss der Anbieter den Eingang unverzueglich auf einem dauerhaften Datentraeger bestaetigen.
|
||||
|
||||
## Rechtsgrundlage
|
||||
|
||||
- **Art. 246a §1 Abs. 2 Nr. 1 EGBGB**: Pflicht zur Beifuegung des Muster-Widerrufsformulars als Anlage 2.
|
||||
- **§312g BGB**: Widerrufsrecht des Verbrauchers bei Fernabsatzvertraegen.
|
||||
- **§355 BGB**: Allgemeine Regelung zum Widerruf, Frist 14 Tage ab Erhalt der Ware.
|
||||
|
||||
---
|
||||
|
||||
*Anbieter: {{company_legal_name}} - Stand: {{date}}*',
|
||||
'[{"name":"company_legal_name","label":"Firma","required":true},{"name":"company_address","label":"Anschrift","required":true},{"name":"company_postal","label":"PLZ","required":true},{"name":"company_city","label":"Ort","required":true},{"name":"company_country","label":"Land","required":true},{"name":"company_email","label":"E-Mail","required":true},{"name":"company_fax","label":"Fax (optional)","required":false}]'::jsonb,
|
||||
'de', 'DE', 'MIT', false, true, '1.0.0', 'published',
|
||||
'BreakPilot Compliance (Anlage 2 zu Art. 246a §1(2) EGBGB)'
|
||||
;
|
||||
|
||||
COMMIT;
|
||||
@@ -0,0 +1,82 @@
|
||||
-- Migration 144: Cookie-Library für P59 — Behavior-Validator
|
||||
--
|
||||
-- Eigene Cookie-Wissensbasis: Name+Domain → tatsächliche Kategorie,
|
||||
-- Zweck, typische Werte-Patterns, Datenempfänger. Basis für Findings
|
||||
-- "Cookie als X deklariert, tatsächlich Y" nach Art. 5(1)(b) DSGVO.
|
||||
--
|
||||
-- Quellen:
|
||||
-- - Open Cookie Database (CC0, github.com/jkwakman/Open-Cookie-Database)
|
||||
-- - Cookiepedia (kommerziell, nur Referenz nicht ingestiert)
|
||||
-- - Manuelle BreakPilot-Recherche (OEM-Cookies)
|
||||
|
||||
BEGIN;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS compliance.cookie_library (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
cookie_name TEXT NOT NULL,
|
||||
-- Domain pattern: exact ".example.com" or wildcard "*.googletagmanager.com"
|
||||
domain_pattern TEXT NOT NULL,
|
||||
-- Vendor / processing company
|
||||
vendor_name TEXT NOT NULL,
|
||||
vendor_country TEXT, -- ISO-2 (DE/IE/US)
|
||||
vendor_privacy_url TEXT,
|
||||
vendor_opt_out_url TEXT,
|
||||
-- Behavioural classification (truth, not declaration)
|
||||
actual_category TEXT NOT NULL CHECK (actual_category IN
|
||||
('essential', 'functional', 'statistics', 'marketing',
|
||||
'social_media', 'unknown')),
|
||||
purpose_de TEXT, -- "Cross-Site-Tracking ueber 80% der dt. Sites"
|
||||
purpose_en TEXT,
|
||||
-- Typical value pattern (regex) — used for value-mismatch findings
|
||||
value_pattern TEXT, -- e.g. ^[a-f0-9]{32}$ (Hash-ID)
|
||||
typical_max_age_seconds BIGINT, -- Lebensdauer typ. Wert
|
||||
-- Receiver-domains (XHR/img to which the cookie value flows)
|
||||
data_receivers TEXT[], -- ["google-analytics.com", "doubleclick.net"]
|
||||
-- Cross-site usage signal (~ how widespread)
|
||||
cross_site_count INTEGER, -- ca. wie viele Sites verwenden ihn
|
||||
is_pii BOOLEAN DEFAULT FALSE, -- enthält Personenbezug direkt
|
||||
-- Provenance + trust
|
||||
source_name TEXT NOT NULL, -- "Open Cookie Database" / "BreakPilot Research"
|
||||
source_url TEXT,
|
||||
source_license TEXT, -- "CC0", "MIT" — was wir nutzen duerfen
|
||||
confidence NUMERIC(3,2) DEFAULT 0.80, -- 0..1
|
||||
last_verified TIMESTAMPTZ DEFAULT now(),
|
||||
notes TEXT,
|
||||
created_at TIMESTAMPTZ DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ DEFAULT now()
|
||||
);
|
||||
|
||||
-- Index for fast lookup by name + domain
|
||||
CREATE INDEX IF NOT EXISTS idx_cookie_lib_name
|
||||
ON compliance.cookie_library (cookie_name);
|
||||
CREATE INDEX IF NOT EXISTS idx_cookie_lib_domain
|
||||
ON compliance.cookie_library (domain_pattern);
|
||||
|
||||
-- Cookie behavior audit log — was haben wir bei welcher Site beobachtet
|
||||
CREATE TABLE IF NOT EXISTS compliance.cookie_behavior_audits (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
check_id TEXT, -- compliance-check ID
|
||||
site_url TEXT NOT NULL,
|
||||
cookie_name TEXT NOT NULL,
|
||||
cookie_domain TEXT,
|
||||
-- Observed
|
||||
observed_value_sample TEXT, -- truncated 200 chars
|
||||
observed_max_age_seconds BIGINT,
|
||||
declared_category TEXT, -- was die Site behauptet
|
||||
-- Library match
|
||||
library_id UUID REFERENCES compliance.cookie_library(id),
|
||||
matched_actual_category TEXT,
|
||||
mismatch_severity TEXT, -- "HIGH" / "MEDIUM" / "LOW" / NULL
|
||||
mismatch_reason TEXT,
|
||||
-- Network observations
|
||||
observed_receivers TEXT[],
|
||||
third_party_transfer BOOLEAN DEFAULT FALSE,
|
||||
created_at TIMESTAMPTZ DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_cba_check
|
||||
ON compliance.cookie_behavior_audits (check_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_cba_site
|
||||
ON compliance.cookie_behavior_audits (site_url);
|
||||
|
||||
COMMIT;
|
||||
Reference in New Issue
Block a user