feat: Template-Spec v1 Phase C — IF-Renderer + HOSTING/FEATURES + 4 neue DE-Templates
All checks were successful
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-ai-compliance (push) Successful in 36s
CI / test-python-backend-compliance (push) Successful in 32s
CI / test-python-document-crawler (push) Successful in 22s
CI / test-python-dsms-gateway (push) Successful in 18s

- contextBridge.ts: HostingCtx + FeaturesCtx (35 Felder), ~50 neue Platzhalter-Aliases
- ruleEngine.ts: buildBoolContext() + applyConditionalBlocks() (IF/IF_NOT/IF_ANY)
- ruleEngine.test.ts: 67 Tests (+18 für Phase C), alle grün
- page.tsx: IF-Renderer in Pipeline, HOSTING+FEATURES Formular-Sections, erweiterter SDK-Prefill
- scripts/apply_templates_023.py: 4 neue DE-Templates (Cookie v2, DSE, AGB, Impressum)
- migrations/023_new_templates_de.sql: Dokumentation + Verifikations-Query

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-03-04 14:35:56 +01:00
parent 7f3bf93cd6
commit e0f7f2134e
6 changed files with 1208 additions and 10 deletions

View File

@@ -0,0 +1,683 @@
#!/usr/bin/env python3
"""
Migration 023: Insert 4 new DE document templates with {{#IF}} block syntax.
Templates:
- cookie_banner_texts_de → Cookie-Banner Texte v2 (DSGVO/TDDDG, mit IF-Blöcken)
- privacy_policy_de → Datenschutzerklärung (DSGVO-konform, mit IF-Blöcken)
- terms_and_conditions_de → AGB SaaS/Cloud DE (B2B/B2C, mit IF-Blöcken)
- imprint_de → Impressum DE (DDG § 5, mit IF-Blöcken)
Usage:
docker cp apply_templates_023.py bp-compliance-backend:/tmp/
docker exec bp-compliance-backend python3 /tmp/apply_templates_023.py
"""
import os
import sys
import uuid
sys.path.insert(0, '/app')
from sqlalchemy import create_engine, text
DATABASE_URL = os.environ.get(
'DATABASE_URL',
'postgresql://compliance_user:compliance_pass@bp-core-postgres:5432/breakpilot_db'
)
engine = create_engine(DATABASE_URL)
# ─────────────────────────────────────────────────────────────────────────────
# Template definitions
# ─────────────────────────────────────────────────────────────────────────────
TEMPLATES = [
{
'document_type': 'cookie_banner',
'language': 'de',
'title': 'Cookie-Banner Texte v2 (DSGVO/TDDDG-konform, IF-Blöcke)',
'description': 'Vollständige Cookie-Banner Texte mit optionalen Analyse-, Marketing- und Funktional-Blöcken. Unterstützt {{#IF}} Syntax.',
'jurisdiction': 'DE',
'license_id': 'mit',
'license_name': 'MIT License',
'is_complete_document': True,
'attribution_required': False,
'source_name': 'BreakPilot Compliance',
'content': """\
# Cookie-Banner Texte
**Website:** {{WEBSITE_NAME}}
**Links:** [Cookie-Richtlinie]({{COOKIE_POLICY_URL}}) | [Datenschutzerklärung]({{PRIVACY_POLICY_URL}})
**Kontakt:** {{COMPANY_LEGAL_NAME}} · {{CONTACT_EMAIL}}
*Rechtsgrundlage: § 25 TDDDG zzgl. DSGVO-Rechtsgrundlage je Zweck.*
---
## 1) Erstlayer (Banner)
**Titel:** Cookie-Einstellungen
**Kurztext:**
Wir verwenden Cookies und ähnliche Technologien, um {{WEBSITE_NAME}} technisch bereitzustellen und Ihnen eine sichere Nutzung zu ermöglichen. Mit Ihrer Einwilligung setzen wir zusätzlich Cookies für Statistik/Analyse und Marketing ein. Sie können Ihre Auswahl jederzeit unter {{CONSENT_WITHDRAWAL_PATH}} ändern.
**Links im Banner:**
Mehr Informationen: [Cookie-Richtlinie]({{COOKIE_POLICY_URL}}) · [Datenschutzerklärung]({{PRIVACY_POLICY_URL}})
**Buttons:**
- „Alle akzeptieren"
- „Nur notwendige"
- „Einstellungen"
*Ihre Einwilligung ist freiwillig und kann jederzeit mit Wirkung für die Zukunft widerrufen werden.*
---
## 2) Zweitlayer (Einstellungen)
**Einleitung:**
Hier können Sie auswählen, welche Cookies wir verwenden dürfen. Notwendige Cookies sind für den Betrieb erforderlich und können nicht deaktiviert werden.
**Buttons:**
- „Auswahl bestätigen"
- „Alle akzeptieren"
- „Ablehnen"
- „Zurück"
---
## 3) Kategorien
### Notwendig (immer aktiv)
Diese Cookies sind für den Betrieb von {{WEBSITE_NAME}} zwingend erforderlich. Sie ermöglichen grundlegende Funktionen wie Seitennavigation, Session-Verwaltung und Sicherheitsfunktionen (z. B. CSRF-Schutz). Ohne diese Cookies kann die Website nicht ordnungsgemäß funktionieren.
**Rechtsgrundlage:** Technische Erforderlichkeit (§ 25 Abs. 2 TDDDG). Details: {{COOKIE_POLICY_URL}}.
### Funktional (optional)
{{#IF FUNCTIONAL_ENABLED}}
Funktionale Cookies ermöglichen erweiterte Funktionen und Personalisierung, z. B. das Merken Ihrer Spracheinstellungen oder Darstellungsvorlieben. Wir setzen diese Cookies nur mit Ihrer Einwilligung ein.
{{/IF}}
### Statistik/Analyse (optional)
{{#IF ANALYTICS_ENABLED}}
Analyse-Cookies helfen uns zu verstehen, wie Besucher {{WEBSITE_NAME}} nutzen. Wir setzen diese Cookies nur mit Ihrer Einwilligung ein.
**Eingesetzte Tools:** {{ANALYTICS_TOOLS_LIST}}
{{#IF THIRD_COUNTRY_POSSIBLE}}
**Hinweis Drittlandübermittlung:** Bei einzelnen Analyse-Tools kann eine Verarbeitung außerhalb EU/EWR nicht ausgeschlossen werden. Geeignete Garantien ({{TRANSFER_GUARDS}}) sind vereinbart. Details: {{PRIVACY_POLICY_URL}}.
{{/IF}}
{{/IF}}
### Marketing (optional)
{{#IF MARKETING_ENABLED}}
Marketing-Cookies ermöglichen personalisierte Werbung und Kampagnenmessung. Wir setzen diese Cookies nur mit Ihrer Einwilligung ein.
**Partner/Tools:** {{MARKETING_PARTNERS_LIST}}
{{#IF THIRD_COUNTRY_POSSIBLE}}
**Hinweis Drittlandübermittlung:** Bei Marketing-Tools kann eine Verarbeitung außerhalb EU/EWR nicht ausgeschlossen werden. Geeignete Garantien ({{TRANSFER_GUARDS}}) werden genutzt. Details: {{PRIVACY_POLICY_URL}}.
{{/IF}}
{{/IF}}
---
## 4) Widerruf / Änderung
Sie können Ihre Einwilligung jederzeit widerrufen oder ändern: {{CONSENT_WITHDRAWAL_PATH}}. Die Rechtmäßigkeit der Verarbeitung bis zum Widerruf bleibt unberührt.
---
## 5) Consent-Protokoll
{{#IF CMP_LOGS_CONSENTS}}
Wir protokollieren Ihre Einwilligungsentscheidung (Zeitpunkt, Auswahl{{#IF CMP_NAME}}, verwaltet via {{CMP_NAME}}{{/IF}}), um diese nachweisen zu können. Details: {{PRIVACY_POLICY_URL}}.
{{/IF}}
""",
},
{
'document_type': 'privacy_policy',
'language': 'de',
'title': 'Datenschutzerklärung (DSGVO-konform, IF-Blöcke)',
'description': 'Vollständige Datenschutzerklärung nach DSGVO mit optionalen Abschnitten für Analytics, Marketing, Newsletter, Account, Payments, Support, Social Media und Drittlandübermittlungen.',
'jurisdiction': 'DE',
'license_id': 'mit',
'license_name': 'MIT License',
'is_complete_document': True,
'attribution_required': False,
'source_name': 'BreakPilot Compliance',
'content': """\
# Datenschutzerklärung
**Stand:** {{VERSION_DATE}}
**Gültig für:** {{WEBSITE_URL}}
---
## 1. Verantwortlicher
Verantwortlicher im Sinne der DSGVO:
**{{COMPANY_LEGAL_NAME}} {{COMPANY_LEGAL_FORM}}**
{{COMPANY_ADDRESS_LINE}}
{{COMPANY_POSTAL_CODE}} {{COMPANY_CITY}}
{{COMPANY_COUNTRY}}
E-Mail: {{CONTACT_EMAIL}}
{{#IF CONTACT_PHONE}}Telefon: {{CONTACT_PHONE}}{{/IF}}
---
## 2. Datenschutzbeauftragter
{{#IF HAS_DPO}}
Unser Datenschutzbeauftragter:
**{{DPO_NAME}}** · E-Mail: {{DPO_EMAIL}}
{{/IF}}
{{#IF_NOT HAS_DPO}}
Wir haben keinen Datenschutzbeauftragten bestellt. Bei Fragen zum Datenschutz: {{CONTACT_EMAIL}}
{{/IF_NOT}}
---
## 3. Grundsätze der Verarbeitung
Wir verarbeiten personenbezogene Daten ausschließlich im Einklang mit der DSGVO. Wir beachten Zweckbindung, Datenminimierung, Richtigkeit, Speicherbegrenzung, Integrität/Vertraulichkeit und Transparenz.
---
## 4. Datenverarbeitung beim Website-Besuch (Server-Logfiles)
Beim Aufruf unserer Website werden Informationen in Server-Logfiles verarbeitet (IP-Adresse, Datum/Uhrzeit, abgerufene URL, Referrer, Browsertyp, Betriebssystem).
**Zweck:** Technische Bereitstellung, Sicherheit, Fehleranalyse.
**Rechtsgrundlage:** Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse).
**Speicherdauer:** {{LOG_RETENTION_DAYS}} Tage.
---
## 5. Hosting und Auftragsverarbeitung
{{WEBSITE_URL}} wird gehostet bei: **{{HOSTING_PROVIDER_NAME}}**, {{HOSTING_PROVIDER_COUNTRY}}.
Mit dem Hosting-Provider besteht ein Vertrag zur Auftragsverarbeitung (**{{HOSTING_PROVIDER_CONTRACT_TYPE}}**).
---
## 6. Kontaktaufnahme
Wenn Sie uns kontaktieren (E-Mail, Kontaktformular), verarbeiten wir Ihre Anfragedaten.
**Rechtsgrundlage:** Art. 6 Abs. 1 lit. b oder f DSGVO.
**Speicherdauer:** Bis zur abschließenden Bearbeitung; ggf. länger bei gesetzlichen Aufbewahrungsfristen.
---
## 7. Nutzerkonto / Registrierung
{{#IF HAS_ACCOUNT}}
Bei der Kontoerstellung verarbeiten wir Stammdaten (Name, E-Mail), Zugangsdaten (Passwort gehasht) und ggf. Abrechnungsdaten.
**Rechtsgrundlage:** Art. 6 Abs. 1 lit. b DSGVO.
**Speicherdauer:** Dauer der Vertragsbeziehung; anschließend Löschung, soweit keine Aufbewahrungspflichten bestehen.
{{/IF}}
{{#IF_NOT HAS_ACCOUNT}}
Wir bieten kein registrierungspflichtiges Nutzerkonto an.
{{/IF_NOT}}
---
## 8. Vertragsabwicklung und Zahlungen
{{#IF HAS_PAYMENTS}}
Für kostenpflichtige Leistungen verarbeiten wir Vertrags- und Abrechnungsdaten.
**Rechtsgrundlage:** Art. 6 Abs. 1 lit. b und c DSGVO.
**Details zu Zahlungsanbietern:**
{{PAYMENT_PROVIDER_DETAIL}}
{{/IF}}
---
## 9. Support
{{#IF HAS_SUPPORT}}
Bei Support-Anfragen verarbeiten wir Kontakt- und Inhaltsdaten sowie ggf. technische Diagnosedaten.
**Rechtsgrundlage:** Art. 6 Abs. 1 lit. b oder f DSGVO.
{{/IF}}
---
## 10. Cookies und Einwilligungsmanagement
Details zu Cookies, Speicherdauern und Tools: {{COOKIE_POLICY_URL}}.
Einwilligung verwalten/widerrufen: {{CONSENT_WITHDRAWAL_PATH}}.
---
## 11. Webanalyse
{{#IF HAS_ANALYTICS}}
Wir nutzen Webanalyse-Tools zur Verbesserung unserer Website.
**Rechtsgrundlage:** Art. 6 Abs. 1 lit. a DSGVO (Einwilligung).
**Details:**
{{ANALYTICS_TOOLS_DETAIL}}
{{#IF THIRD_COUNTRY_POSSIBLE}}
**Drittlandübermittlungen:** Eine Verarbeitung außerhalb EU/EWR kann nicht ausgeschlossen werden. Geeignete Garantien ({{TRANSFER_GUARDS}}) sind vereinbart.
{{/IF}}
{{/IF}}
{{#IF_NOT HAS_ANALYTICS}}
Wir setzen keine Webanalyse-Tools ein, die eine Einwilligung erfordern.
{{/IF_NOT}}
---
## 12. Marketing und Tracking
{{#IF HAS_MARKETING}}
Wir setzen Marketing-Tools ein, um Kampagnen zu messen und relevante Inhalte anzuzeigen.
**Rechtsgrundlage:** Art. 6 Abs. 1 lit. a DSGVO (Einwilligung).
**Details:**
{{MARKETING_TOOLS_DETAIL}}
{{#IF THIRD_COUNTRY_POSSIBLE}}
**Drittlandübermittlungen:** Geeignete Garantien ({{TRANSFER_GUARDS}}) werden genutzt.
{{/IF}}
{{/IF}}
{{#IF_NOT HAS_MARKETING}}
Wir setzen keine Marketing-Tools ein, die eine Einwilligung erfordern.
{{/IF_NOT}}
---
## 13. Newsletter
{{#IF HAS_NEWSLETTER}}
Für den Newsletter-Versand verarbeiten wir Ihre E-Mail-Adresse (Double-Opt-In-Verfahren).
**Rechtsgrundlage:** Art. 6 Abs. 1 lit. a DSGVO (Einwilligung).
**Widerruf:** Abmeldelink oder {{CONTACT_EMAIL}}.
**Details:**
{{NEWSLETTER_PROVIDER_DETAIL}}
{{/IF}}
---
## 14. Social Media
{{#IF HAS_SOCIAL_MEDIA}}
Wir unterhalten Präsenzen auf sozialen Netzwerken. Beim Besuch gelten die Datenschutzbestimmungen der jeweiligen Anbieter.
{{SOCIAL_MEDIA_DETAIL}}
{{/IF}}
---
## 15. Empfänger / Auftragsverarbeiter
Wir setzen Dienstleister ein, die Daten in unserem Auftrag verarbeiten und mit denen wir AVV-Verträge schließen. Eine Weitergabe an Dritte erfolgt nur bei Einwilligung, Vertragserfüllung, gesetzlicher Pflicht oder berechtigtem Interesse.
---
## 16. Drittlandübermittlungen
{{#IF THIRD_COUNTRY_POSSIBLE}}
Übermittlungen außerhalb EU/EWR können bei einzelnen Dienstleistern nicht ausgeschlossen werden. Wir stellen ein angemessenes Schutzniveau durch {{TRANSFER_GUARDS}} sicher.
{{/IF}}
{{#IF_NOT THIRD_COUNTRY_POSSIBLE}}
Übermittlungen in Drittländer außerhalb EU/EWR finden nicht statt.
{{/IF_NOT}}
---
## 17. Speicherdauer
Personenbezogene Daten werden nur so lange gespeichert, wie es für die jeweiligen Zwecke oder gesetzliche Aufbewahrungspflichten erforderlich ist.
---
## 18. Sicherheit
Wir setzen technische und organisatorische Maßnahmen ein: {{SECURITY_MEASURES_SUMMARY}}.
---
## 19. Ihre Rechte
- Auskunft (Art. 15 DSGVO)
- Berichtigung (Art. 16 DSGVO)
- Löschung (Art. 17 DSGVO)
- Einschränkung (Art. 18 DSGVO)
- Datenübertragbarkeit (Art. 20 DSGVO)
- Widerspruch (Art. 21 DSGVO)
- Widerruf einer Einwilligung (Art. 7 Abs. 3 DSGVO)
Zur Ausübung Ihrer Rechte: {{DATA_SUBJECT_REQUEST_CHANNEL}}
---
## 20. Beschwerderecht
**{{SUPERVISORY_AUTHORITY_NAME}}**
{{SUPERVISORY_AUTHORITY_ADDRESS}}
---
## 21. Änderungen
Wir können diese Datenschutzerklärung anpassen. Die aktuelle Version finden Sie unter {{WEBSITE_URL}}.
""",
},
{
'document_type': 'agb',
'language': 'de',
'title': 'AGB SaaS/Cloud DE (B2B/B2C steuerbar, IF-Blöcke)',
'description': 'Allgemeine Geschäftsbedingungen für SaaS/Cloud-Dienste. B2B/B2C über Conditions steuerbar. Optionale Abschnitte für Paid Plans, SLA, Widerruf, Datenexport.',
'jurisdiction': 'DE',
'license_id': 'mit',
'license_name': 'MIT License',
'is_complete_document': True,
'attribution_required': False,
'source_name': 'BreakPilot Compliance',
'content': """\
# Allgemeine Geschäftsbedingungen (AGB)
**{{COMPANY_LEGAL_NAME}}**
Stand: {{VERSION_DATE}}
---
## § 1 Geltungsbereich
(1) Diese AGB gelten für alle Verträge zwischen {{COMPANY_LEGAL_NAME}} („Anbieter") und Kunden über die Nutzung von **{{SERVICE_NAME}}**.
(2) Abweichende Kundenbedingungen werden nicht Vertragsbestandteil.
(3) Diese AGB gelten gegenüber Unternehmern und Verbrauchern, soweit nicht ausdrücklich unterschieden.
---
## § 2 Leistungsbeschreibung
(1) Der Anbieter stellt **{{SERVICE_NAME}}** zur Verfügung: {{SERVICE_DESCRIPTION_SHORT}}.
(2) Umfang und Systemvoraussetzungen ergeben sich aus der jeweils aktuellen Leistungsbeschreibung.
(3) Der Anbieter ist berechtigt, den Dienst weiterzuentwickeln, sofern Kernfunktionen im Wesentlichen erhalten bleiben.
---
## § 3 Vertragsschluss
(1) Die Darstellung des Dienstes ist kein verbindliches Angebot.
(2) Der Vertrag kommt durch Bestätigung der Bestellung oder Freischaltung des Dienstes zustande.
---
## § 4 Preise, Abrechnung, Zahlung
{{#IF HAS_PAID_PLANS}}
(1) Es gelten die bei Vertragsschluss vereinbarten Preise: {{PRICES_TEXT}}.
(2) Zahlungsbedingungen: {{PAYMENT_TERMS_TEXT}}.
(3) Preise gegenüber Verbrauchern inkl. gesetzl. USt.; gegenüber Unternehmern zzgl. USt.
(4) Bei Zahlungsverzug: gesetzliche Verzugszinsen; gegenüber Unternehmern 9 Prozentpunkte über Basiszinssatz (§ 288 Abs. 2 BGB).
{{/IF}}
{{#IF_NOT HAS_PAID_PLANS}}
(1) Der Dienst wird derzeit unentgeltlich angeboten. Der Anbieter behält sich vor, kostenpflichtige Leistungsstufen einzuführen.
{{/IF_NOT}}
---
## § 5 Pflichten des Kunden
(1) Der Kunde hat bei Registrierung richtige Angaben zu machen und diese aktuell zu halten.
(2) Zugangsdaten sind geheim zu halten.
(3) Der Dienst darf nur im Rahmen der geltenden Gesetze und dieser AGB genutzt werden.
(4) Der Kunde ist verantwortlich für eingestellte Inhalte/Daten und stellt sicher, dass Rechte Dritter nicht verletzt werden.
---
## § 6 Nutzungsrechte
(1) Der Anbieter räumt dem Kunden ein einfaches, nicht übertragbares, auf die Vertragsdauer beschränktes Nutzungsrecht ein.
(2) Überlassung an Dritte, Unterlizenzierung oder öffentliche Zugänglichmachung außerhalb der vorgesehenen Nutzung sind untersagt.
(3) Reverse Engineering und Umgehung von Sicherheitsmechanismen sind untersagt, soweit gesetzlich zulässig.
---
## § 7 Verfügbarkeit und Support
(1) Der Anbieter bemüht sich um hohe Verfügbarkeit.
{{#IF HAS_SLA}}
(2) Konkrete Verfügbarkeits- und Servicezusagen: {{SLA_URL}}.
{{/IF}}
(3) Support-Kanäle: {{SUPPORT_CHANNELS_TEXT}}.
---
## § 8 Datensicherung und Datenexport
(1) Der Anbieter trifft angemessene Maßnahmen zur Datensicherheit.
(2) Der Kunde ist verantwortlich für die Sicherung seiner Daten, soweit Export-Funktionen verfügbar sind.
{{#IF HAS_EXPORT_POLICY}}
(3) Datenexport/Löschung: {{EXPORT_POLICY_TEXT}}.
{{/IF}}
---
## § 9 Datenschutz
Die Verarbeitung personenbezogener Daten erfolgt gemäß Datenschutzerklärung: {{PRIVACY_POLICY_URL}}.
---
## § 10 Gewährleistung
{{#IF IS_B2B}}
(1) Gegenüber Unternehmern werden Mängel nach Wahl des Anbieters durch Nachbesserung oder Ersatzleistung behoben.
(2) Offensichtliche Mängel sind unverzüglich anzuzeigen.
{{/IF}}
{{#IF IS_B2C}}
(1) Gegenüber Verbrauchern gelten die gesetzlichen Gewährleistungsrechte.
{{/IF}}
---
## § 11 Haftung
(1) Der Anbieter haftet unbeschränkt bei Vorsatz, grober Fahrlässigkeit und Schäden aus Verletzung von Leib, Leben oder Gesundheit.
(2) Bei leicht fahrlässiger Verletzung wesentlicher Vertragspflichten ist die Haftung auf den typischen, vorhersehbaren Schaden begrenzt.
(3) Im Übrigen ist die Haftung ausgeschlossen, soweit gesetzlich zulässig.
(4) Für Datenverlust haftet der Anbieter nur, soweit der Schaden auch bei ordnungsgemäßer Datensicherung eingetreten wäre.
{{#IF IS_B2B}}
(5) Haftungsdeckel (B2B): {{LIMITATION_CAP_TEXT}}.
{{/IF}}
---
## § 12 Vertragslaufzeit und Kündigung
(1) {{CONTRACT_TERM_TEXT}}.
(2) Das Recht zur außerordentlichen Kündigung aus wichtigem Grund bleibt unberührt.
---
## § 13 Widerrufsrecht (nur Verbraucher)
{{#IF HAS_WITHDRAWAL}}
{{CONSUMER_WITHDRAWAL_TEXT}}
{{/IF}}
{{#IF_NOT HAS_WITHDRAWAL}}
Dieser Abschnitt ist nicht anwendbar (kein Verbrauchervertrag).
{{/IF_NOT}}
---
## § 14 Änderungen von Leistungen und AGB
(1) Der Anbieter kann diese AGB aus sachlichem Grund ändern (z. B. Gesetzesänderung).
(2) Änderungen werden in Textform mit angemessener Frist angekündigt.
(3) Ohne Widerspruch innerhalb der Frist gelten Änderungen als angenommen. Verbraucher werden auf ihr Widerspruchsrecht hingewiesen.
---
## § 15 Schlussbestimmungen
(1) Es gilt deutsches Recht unter Ausschluss des UN-Kaufrechts.
{{#IF IS_B2B}}
(2) Gerichtsstand gegenüber Kaufleuten/juristischen Personen: {{JURISDICTION_CITY}}.
{{/IF}}
(3) Sollten einzelne Bestimmungen unwirksam sein, bleibt die Wirksamkeit der übrigen Bestimmungen unberührt.
""",
},
{
'document_type': 'impressum',
'language': 'de',
'title': 'Impressum DE (DDG § 5, IF-Blöcke)',
'description': 'Impressum nach § 5 DDG (Digitale-Dienste-Gesetz) mit optionalen Abschnitten für Registereintrag, USt-ID, reglementierten Beruf, redaktionell Verantwortlichen und Streitbeilegung.',
'jurisdiction': 'DE',
'license_id': 'mit',
'license_name': 'MIT License',
'is_complete_document': True,
'attribution_required': False,
'source_name': 'BreakPilot Compliance',
'content': """\
# Impressum
Angaben gemäß § 5 DDG
---
**Anbieter:**
{{COMPANY_LEGAL_NAME}} ({{COMPANY_LEGAL_FORM}})
{{COMPANY_ADDRESS_LINE}}
{{COMPANY_POSTAL_CODE}} {{COMPANY_CITY}}
{{COMPANY_COUNTRY}}
**Vertreten durch:** {{REPRESENTED_BY_NAME}}
**Kontakt:**
{{#IF CONTACT_PHONE}}Telefon: {{CONTACT_PHONE}}
{{/IF}}E-Mail: {{CONTACT_EMAIL}}
Website: {{WEBSITE_URL}}
---
{{#IF HAS_REGISTER}}
**Registereintrag:**
Registergericht: {{REGISTER_COURT}}
Registernummer: {{REGISTER_NUMBER}}
---
{{/IF}}
{{#IF HAS_VAT_ID}}
**Umsatzsteuer-ID:**
USt-IdNr. gemäß § 27a UStG: {{VAT_ID}}
---
{{/IF}}
{{#IF HAS_REGULATED_PROFESSION}}
**Angaben zur reglementierten Tätigkeit / Berufsrecht:**
{{REGULATED_PROFESSION_TEXT}}
---
{{/IF}}
{{#IF HAS_EDITORIAL_RESPONSIBLE}}
**Verantwortlich für journalistisch-redaktionelle Inhalte (§ 18 Abs. 2 MStV):**
{{EDITORIAL_RESPONSIBLE_NAME}}
{{EDITORIAL_RESPONSIBLE_ADDRESS}}
---
{{/IF}}
{{#IF HAS_DISPUTE_RESOLUTION}}
**Verbraucherstreitbeilegung / Online-Streitbeilegung:**
{{DISPUTE_RESOLUTION_TEXT}}
---
{{/IF}}
## Haftung für Inhalte
Als Diensteanbieter sind wir gemäß den allgemeinen Gesetzen für eigene Inhalte auf diesen Seiten verantwortlich. Wir übernehmen jedoch keine Gewähr für die Richtigkeit, Vollständigkeit und Aktualität der bereitgestellten Inhalte, soweit gesetzlich zulässig.
## Haftung für Links
Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte keine Gewähr übernehmen. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.
## Urheberrecht
Die durch den Seitenbetreiber erstellten Inhalte auf diesen Seiten unterliegen dem deutschen Urheberrecht. Downloads und Kopien dieser Seite sind nur für den privaten Gebrauch gestattet, sofern nicht ausdrücklich anders angegeben.
""",
},
]
# ─────────────────────────────────────────────────────────────────────────────
# Main
# ─────────────────────────────────────────────────────────────────────────────
def main() -> None:
print('=== Migration 023: 4 neue DE-Templates ===\n')
with engine.begin() as conn:
for t in TEMPLATES:
# Check if title already exists
existing = conn.execute(
text('SELECT id FROM public.compliance_legal_templates WHERE title = :title'),
{'title': t['title']}
).fetchone()
if existing:
print(f'[SKIP] Bereits vorhanden: {t["title"]}')
continue
# Extract placeholders from content
import re
placeholders = sorted(set(re.findall(r'\{\{[A-Z_]+\}\}', t['content'])))
new_id = str(uuid.uuid4())
conn.execute(
text('''
INSERT INTO public.compliance_legal_templates
(id, title, document_type, language, jurisdiction,
content, description, license_id, license_name,
source_name, is_complete_document, attribution_required,
placeholders, created_at, updated_at)
VALUES
(:id, :title, :document_type, :language, :jurisdiction,
:content, :description, :license_id, :license_name,
:source_name, :is_complete_document, :attribution_required,
:placeholders, NOW(), NOW())
'''),
{
'id': new_id,
'title': t['title'],
'document_type': t['document_type'],
'language': t['language'],
'jurisdiction': t['jurisdiction'],
'content': t['content'],
'description': t['description'],
'license_id': t['license_id'],
'license_name': t['license_name'],
'source_name': t['source_name'],
'is_complete_document': t['is_complete_document'],
'attribution_required': t['attribution_required'],
'placeholders': placeholders,
}
)
print(f'[OK] {t["title"]} ({t["document_type"]}/{t["language"]}) — {len(placeholders)} Platzhalter')
print('\n=== Done ===')
if __name__ == '__main__':
main()