From 076cdd587d7cc90f3b4c5c28435e03924ca0ac36 Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Wed, 4 Mar 2026 12:36:40 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20DocumentGenerator=20=E2=80=94=20Templat?= =?UTF-8?q?e-Spec=20v1=20Phase=20A=20(Kontext-Formular=20+=20Beispiele)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - page.tsx: Generator-Section nutzt jetzt strukturiertes Kontext-Formular statt einzelner Platzhalter-Inputs - 10 Sections (Anbieter, Kunde, Dienst, Rechtliches, Datenschutz, SLA, Zahlungskonditionen, Sicherheit, NDA, Cookie/Einwilligung) - Nur für die Vorlage relevante Sections werden angezeigt (getRelevantSections) - Collapsible Sections mit Auto-Expand beim Template-Wechsel - Uncovered Placeholders als separate manuelle Eingaben - Validierungs-Badge zeigt fehlende Pflichtfelder - Grüne Bestätigung wenn alle Felder ausgefüllt - 11 Beispiel-Contexts für alle doc_types (nda_de, nda_en, sla_de, aup_en, community_de, copyright_de, cloud_contract_de, data_usage_clause_de, cookie_banner_de, agb_de, liability_clause_en) Co-Authored-By: Claude Opus 4.6 --- .../examples/acceptable_use_en.json | 71 +++ .../document-generator/examples/agb_de.json | 77 +++ .../examples/cloud_contract_de.json | 85 ++++ .../examples/community_de.json | 71 +++ .../examples/cookie_banner_de.json | 73 +++ .../examples/copyright_de.json | 71 +++ .../examples/data_usage_clause_de.json | 73 +++ .../examples/liability_clause_en.json | 73 +++ .../document-generator/examples/nda_de.json | 85 ++++ .../document-generator/examples/nda_en.json | 82 ++++ .../document-generator/examples/sla_de.json | 76 +++ .../app/sdk/document-generator/page.tsx | 437 +++++++++++++++--- 12 files changed, 1212 insertions(+), 62 deletions(-) create mode 100644 admin-compliance/app/sdk/document-generator/examples/acceptable_use_en.json create mode 100644 admin-compliance/app/sdk/document-generator/examples/agb_de.json create mode 100644 admin-compliance/app/sdk/document-generator/examples/cloud_contract_de.json create mode 100644 admin-compliance/app/sdk/document-generator/examples/community_de.json create mode 100644 admin-compliance/app/sdk/document-generator/examples/cookie_banner_de.json create mode 100644 admin-compliance/app/sdk/document-generator/examples/copyright_de.json create mode 100644 admin-compliance/app/sdk/document-generator/examples/data_usage_clause_de.json create mode 100644 admin-compliance/app/sdk/document-generator/examples/liability_clause_en.json create mode 100644 admin-compliance/app/sdk/document-generator/examples/nda_de.json create mode 100644 admin-compliance/app/sdk/document-generator/examples/nda_en.json create mode 100644 admin-compliance/app/sdk/document-generator/examples/sla_de.json diff --git a/admin-compliance/app/sdk/document-generator/examples/acceptable_use_en.json b/admin-compliance/app/sdk/document-generator/examples/acceptable_use_en.json new file mode 100644 index 0000000..56fc79e --- /dev/null +++ b/admin-compliance/app/sdk/document-generator/examples/acceptable_use_en.json @@ -0,0 +1,71 @@ +{ + "spec_version": "1.0.0", + "doc_type": "acceptable_use_en", + "render": { "lang": "en", "variant": "b2b", "format": "markdown", "strict": true }, + "context": { + "PROVIDER": { + "LEGAL_NAME": "BreakPilot GmbH", + "LEGAL_FORM": "GmbH", + "ADDRESS_LINE": "Musterstraße 1", + "POSTAL_CODE": "10115", + "CITY": "Berlin", + "COUNTRY": "DE", + "EMAIL": "contact@breakpilot.de", + "WEBSITE_URL": "https://breakpilot.de" + }, + "CUSTOMER": { + "LEGAL_NAME": "Platform User", + "EMAIL": "user@example.com", + "IS_CONSUMER": false, + "IS_BUSINESS": true + }, + "SERVICE": { + "NAME": "BreakPilot Compliance SDK", + "DESCRIPTION": "GDPR and AI-Act compliance platform", + "MODEL": "SaaS", + "TIER": "Standard", + "DATA_LOCATION": "Germany (Frankfurt)" + }, + "LEGAL": { + "GOVERNING_LAW": "Germany", + "JURISDICTION_CITY": "Berlin", + "VERSION_DATE": "2026-01-01", + "EFFECTIVE_DATE": "2026-01-01", + "LANG": "en" + }, + "PRIVACY": { + "CONTACT_EMAIL": "privacy@breakpilot.de", + "DPO_NAME": "Max Mustermann", + "DPO_EMAIL": "dpo@breakpilot.de", + "PRIVACY_POLICY_URL": "https://breakpilot.de/privacy" + }, + "SLA": { + "AVAILABILITY_PERCENT": 99.5, + "MAINTENANCE_NOTICE_HOURS": 72, + "SUPPORT_EMAIL": "abuse@breakpilot.de", + "SUPPORT_HOURS": "Mon–Fri 09:00–18:00 CET", + "RESPONSE_CRITICAL_H": 2, "RESOLUTION_CRITICAL_H": 8, + "RESPONSE_HIGH_H": 4, "RESOLUTION_HIGH_H": 24, + "RESPONSE_MEDIUM_H": 24, "RESOLUTION_MEDIUM_H": 120, + "RESPONSE_LOW_H": 72 + }, + "PAYMENTS": { + "MONTHLY_FEE_EUR": 0, + "PAYMENT_DUE_DAY": 1, + "PAYMENT_METHOD": "Invoice", + "PAYMENT_DAYS": 30 + }, + "SECURITY": { + "INCIDENT_NOTICE_HOURS": 24, + "LOG_RETENTION_DAYS": 7, + "SECURITY_LOG_RETENTION_DAYS": 30 + }, + "NDA": { "PURPOSE": "", "DURATION_YEARS": 5, "PENALTY_AMOUNT_EUR": null }, + "CONSENT": { + "WEBSITE_NAME": "breakpilot.de", + "ANALYTICS_TOOLS": null, + "MARKETING_PARTNERS": null + } + }, + "modules": { "enabled": [] } +} diff --git a/admin-compliance/app/sdk/document-generator/examples/agb_de.json b/admin-compliance/app/sdk/document-generator/examples/agb_de.json new file mode 100644 index 0000000..641d165 --- /dev/null +++ b/admin-compliance/app/sdk/document-generator/examples/agb_de.json @@ -0,0 +1,77 @@ +{ + "spec_version": "1.0.0", + "doc_type": "agb_de", + "render": { "lang": "de", "variant": "b2b", "format": "markdown", "strict": true }, + "context": { + "PROVIDER": { + "LEGAL_NAME": "BreakPilot GmbH", + "LEGAL_FORM": "GmbH", + "ADDRESS_LINE": "Musterstraße 1", + "POSTAL_CODE": "10115", + "CITY": "Berlin", + "COUNTRY": "DE", + "EMAIL": "kontakt@breakpilot.de", + "WEBSITE_URL": "https://breakpilot.de", + "CEO_NAME": "Max Mustermann", + "REGISTER_COURT": "Amtsgericht Berlin", + "REGISTER_NUMBER": "HRB 123456", + "VAT_ID": "DE123456789" + }, + "CUSTOMER": { + "LEGAL_NAME": "Kunde", + "EMAIL": "kunde@example.com", + "IS_CONSUMER": false, + "IS_BUSINESS": true + }, + "SERVICE": { + "NAME": "BreakPilot Compliance SDK", + "DESCRIPTION": "DSGVO- und AI-Act-Compliance-Plattform für SaaS-Anbieter", + "MODEL": "SaaS", + "TIER": "Professional", + "DATA_LOCATION": "Deutschland (Frankfurt)", + "MIN_TERM_MONTHS": 12, + "TERMINATION_NOTICE_DAYS": 30 + }, + "LEGAL": { + "GOVERNING_LAW": "Deutschland", + "JURISDICTION_CITY": "Berlin", + "VERSION_DATE": "2026-01-01", + "EFFECTIVE_DATE": "2026-01-01", + "LANG": "de" + }, + "PRIVACY": { + "CONTACT_EMAIL": "datenschutz@breakpilot.de", + "DPO_NAME": "Max Mustermann", + "DPO_EMAIL": "dsb@breakpilot.de", + "PRIVACY_POLICY_URL": "https://breakpilot.de/datenschutz" + }, + "SLA": { + "AVAILABILITY_PERCENT": 99.5, + "MAINTENANCE_NOTICE_HOURS": 72, + "SUPPORT_EMAIL": "support@breakpilot.de", + "SUPPORT_HOURS": "Mo–Fr 09:00–18:00 CET", + "RESPONSE_CRITICAL_H": 2, "RESOLUTION_CRITICAL_H": 8, + "RESPONSE_HIGH_H": 4, "RESOLUTION_HIGH_H": 24, + "RESPONSE_MEDIUM_H": 24, "RESOLUTION_MEDIUM_H": 120, + "RESPONSE_LOW_H": 72 + }, + "PAYMENTS": { + "MONTHLY_FEE_EUR": 199, + "PAYMENT_DUE_DAY": 1, + "PAYMENT_METHOD": "Rechnung", + "PAYMENT_DAYS": 14 + }, + "SECURITY": { + "INCIDENT_NOTICE_HOURS": 24, + "LOG_RETENTION_DAYS": 7, + "SECURITY_LOG_RETENTION_DAYS": 30 + }, + "NDA": { "PURPOSE": "", "DURATION_YEARS": 5, "PENALTY_AMOUNT_EUR": null }, + "CONSENT": { + "WEBSITE_NAME": "breakpilot.de", + "ANALYTICS_TOOLS": null, + "MARKETING_PARTNERS": null + } + }, + "modules": { "enabled": ["B2C_WITHDRAWAL_DE"] } +} diff --git a/admin-compliance/app/sdk/document-generator/examples/cloud_contract_de.json b/admin-compliance/app/sdk/document-generator/examples/cloud_contract_de.json new file mode 100644 index 0000000..a81f332 --- /dev/null +++ b/admin-compliance/app/sdk/document-generator/examples/cloud_contract_de.json @@ -0,0 +1,85 @@ +{ + "spec_version": "1.0.0", + "doc_type": "cloud_contract_de", + "render": { "lang": "de", "variant": "b2b", "format": "markdown", "strict": true }, + "context": { + "PROVIDER": { + "LEGAL_NAME": "BreakPilot GmbH", + "LEGAL_FORM": "GmbH", + "ADDRESS_LINE": "Musterstraße 1", + "POSTAL_CODE": "10115", + "CITY": "Berlin", + "COUNTRY": "DE", + "EMAIL": "kontakt@breakpilot.de", + "WEBSITE_URL": "https://breakpilot.de", + "CEO_NAME": "Max Mustermann", + "REGISTER_COURT": "Amtsgericht Berlin", + "REGISTER_NUMBER": "HRB 123456", + "VAT_ID": "DE123456789" + }, + "CUSTOMER": { + "LEGAL_NAME": "Beispiel AG", + "ADDRESS_LINE": "Hauptstraße 10", + "POSTAL_CODE": "80331", + "CITY": "München", + "COUNTRY": "DE", + "CONTACT_NAME": "Erika Musterfrau", + "EMAIL": "erika@beispiel-ag.de", + "IS_CONSUMER": false, + "IS_BUSINESS": true + }, + "SERVICE": { + "NAME": "BreakPilot Compliance SDK", + "DESCRIPTION": "DSGVO- und AI-Act-Compliance-Plattform für SaaS-Anbieter", + "MODEL": "SaaS", + "TIER": "Professional", + "DATA_LOCATION": "Deutschland (Frankfurt, eu-central-1)", + "EXPORT_FORMATS": ["JSON", "CSV", "PDF"], + "EXPORT_WINDOW_DAYS": 30, + "MIN_TERM_MONTHS": 12, + "TERMINATION_NOTICE_DAYS": 30 + }, + "LEGAL": { + "GOVERNING_LAW": "Deutschland", + "JURISDICTION_CITY": "Berlin", + "VERSION_DATE": "2026-01-01", + "EFFECTIVE_DATE": "2026-01-01", + "LANG": "de" + }, + "PRIVACY": { + "CONTACT_EMAIL": "datenschutz@breakpilot.de", + "DPO_NAME": "Max Mustermann", + "DPO_EMAIL": "dsb@breakpilot.de", + "PRIVACY_POLICY_URL": "https://breakpilot.de/datenschutz" + }, + "SLA": { + "AVAILABILITY_PERCENT": 99.5, + "MAINTENANCE_NOTICE_HOURS": 72, + "SUPPORT_EMAIL": "support@breakpilot.de", + "SUPPORT_PHONE": "+49 30 12345678", + "SUPPORT_HOURS": "Mo–Fr 09:00–18:00 CET", + "RESPONSE_CRITICAL_H": 2, "RESOLUTION_CRITICAL_H": 8, + "RESPONSE_HIGH_H": 4, "RESOLUTION_HIGH_H": 24, + "RESPONSE_MEDIUM_H": 24, "RESOLUTION_MEDIUM_H": 120, + "RESPONSE_LOW_H": 72 + }, + "PAYMENTS": { + "MONTHLY_FEE_EUR": 199, + "PAYMENT_DUE_DAY": 1, + "PAYMENT_METHOD": "Rechnung (SEPA-Überweisung)", + "PAYMENT_DAYS": 14 + }, + "SECURITY": { + "INCIDENT_NOTICE_HOURS": 24, + "LOG_RETENTION_DAYS": 7, + "SECURITY_LOG_RETENTION_DAYS": 30 + }, + "NDA": { "PURPOSE": "", "DURATION_YEARS": 5, "PENALTY_AMOUNT_EUR": null }, + "CONSENT": { + "WEBSITE_NAME": "breakpilot.de", + "ANALYTICS_TOOLS": null, + "MARKETING_PARTNERS": null + } + }, + "modules": { "enabled": ["CLOUD_EXPORT_DELETE_DE"] } +} diff --git a/admin-compliance/app/sdk/document-generator/examples/community_de.json b/admin-compliance/app/sdk/document-generator/examples/community_de.json new file mode 100644 index 0000000..07c2bf3 --- /dev/null +++ b/admin-compliance/app/sdk/document-generator/examples/community_de.json @@ -0,0 +1,71 @@ +{ + "spec_version": "1.0.0", + "doc_type": "community_de", + "render": { "lang": "de", "variant": "standard", "format": "markdown", "strict": true }, + "context": { + "PROVIDER": { + "LEGAL_NAME": "BreakPilot GmbH", + "LEGAL_FORM": "GmbH", + "ADDRESS_LINE": "Musterstraße 1", + "POSTAL_CODE": "10115", + "CITY": "Berlin", + "COUNTRY": "DE", + "EMAIL": "kontakt@breakpilot.de", + "WEBSITE_URL": "https://breakpilot.de" + }, + "CUSTOMER": { + "LEGAL_NAME": "Community-Mitglied", + "EMAIL": "community@example.com", + "IS_CONSUMER": true, + "IS_BUSINESS": false + }, + "SERVICE": { + "NAME": "BreakPilot Community", + "DESCRIPTION": "Online-Community für Compliance-Professionals", + "MODEL": "SaaS", + "TIER": "Free", + "DATA_LOCATION": "Deutschland" + }, + "LEGAL": { + "GOVERNING_LAW": "Deutschland", + "JURISDICTION_CITY": "Berlin", + "VERSION_DATE": "2026-01-01", + "EFFECTIVE_DATE": "2026-01-01", + "LANG": "de" + }, + "PRIVACY": { + "CONTACT_EMAIL": "datenschutz@breakpilot.de", + "DPO_NAME": "Max Mustermann", + "DPO_EMAIL": "dsb@breakpilot.de", + "PRIVACY_POLICY_URL": "https://breakpilot.de/datenschutz" + }, + "SLA": { + "AVAILABILITY_PERCENT": 99.0, + "MAINTENANCE_NOTICE_HOURS": 48, + "SUPPORT_EMAIL": "community@breakpilot.de", + "SUPPORT_HOURS": "Mo–Fr 09:00–17:00 CET", + "RESPONSE_CRITICAL_H": 4, "RESOLUTION_CRITICAL_H": 24, + "RESPONSE_HIGH_H": 8, "RESOLUTION_HIGH_H": 48, + "RESPONSE_MEDIUM_H": 48, "RESOLUTION_MEDIUM_H": 168, + "RESPONSE_LOW_H": 120 + }, + "PAYMENTS": { + "MONTHLY_FEE_EUR": 0, + "PAYMENT_DUE_DAY": 1, + "PAYMENT_METHOD": "kostenlos", + "PAYMENT_DAYS": 0 + }, + "SECURITY": { + "INCIDENT_NOTICE_HOURS": 72, + "LOG_RETENTION_DAYS": 7, + "SECURITY_LOG_RETENTION_DAYS": 30 + }, + "NDA": { "PURPOSE": "", "DURATION_YEARS": 2, "PENALTY_AMOUNT_EUR": null }, + "CONSENT": { + "WEBSITE_NAME": "community.breakpilot.de", + "ANALYTICS_TOOLS": null, + "MARKETING_PARTNERS": null + } + }, + "modules": { "enabled": [] } +} diff --git a/admin-compliance/app/sdk/document-generator/examples/cookie_banner_de.json b/admin-compliance/app/sdk/document-generator/examples/cookie_banner_de.json new file mode 100644 index 0000000..c926d63 --- /dev/null +++ b/admin-compliance/app/sdk/document-generator/examples/cookie_banner_de.json @@ -0,0 +1,73 @@ +{ + "spec_version": "1.0.0", + "doc_type": "cookie_banner_de", + "render": { "lang": "de", "variant": "b2c", "format": "markdown", "strict": true }, + "context": { + "PROVIDER": { + "LEGAL_NAME": "BreakPilot GmbH", + "LEGAL_FORM": "GmbH", + "ADDRESS_LINE": "Musterstraße 1", + "POSTAL_CODE": "10115", + "CITY": "Berlin", + "COUNTRY": "DE", + "EMAIL": "kontakt@breakpilot.de", + "WEBSITE_URL": "https://breakpilot.de" + }, + "CUSTOMER": { + "LEGAL_NAME": "Website-Besucher", + "EMAIL": "besucher@example.com", + "IS_CONSUMER": true, + "IS_BUSINESS": false + }, + "SERVICE": { + "NAME": "breakpilot.de", + "DESCRIPTION": "DSGVO- und AI-Act-Compliance-Plattform Website", + "MODEL": "SaaS", + "TIER": "Standard", + "DATA_LOCATION": "Deutschland" + }, + "LEGAL": { + "GOVERNING_LAW": "Deutschland", + "JURISDICTION_CITY": "Berlin", + "VERSION_DATE": "2026-01-01", + "EFFECTIVE_DATE": "2026-01-01", + "LANG": "de" + }, + "PRIVACY": { + "CONTACT_EMAIL": "datenschutz@breakpilot.de", + "DPO_NAME": "Max Mustermann", + "DPO_EMAIL": "dsb@breakpilot.de", + "PRIVACY_POLICY_URL": "https://breakpilot.de/datenschutz", + "COOKIE_POLICY_URL": "https://breakpilot.de/cookies", + "ANALYTICS_RETENTION_MONTHS": 13 + }, + "SLA": { + "AVAILABILITY_PERCENT": 99.0, + "MAINTENANCE_NOTICE_HOURS": 48, + "SUPPORT_EMAIL": "support@breakpilot.de", + "SUPPORT_HOURS": "Mo–Fr 09:00–18:00 CET", + "RESPONSE_CRITICAL_H": 4, "RESOLUTION_CRITICAL_H": 24, + "RESPONSE_HIGH_H": 8, "RESOLUTION_HIGH_H": 48, + "RESPONSE_MEDIUM_H": 48, "RESOLUTION_MEDIUM_H": 168, + "RESPONSE_LOW_H": 120 + }, + "PAYMENTS": { + "MONTHLY_FEE_EUR": 0, + "PAYMENT_DUE_DAY": 1, + "PAYMENT_METHOD": "kostenlos", + "PAYMENT_DAYS": 0 + }, + "SECURITY": { + "INCIDENT_NOTICE_HOURS": 72, + "LOG_RETENTION_DAYS": 7, + "SECURITY_LOG_RETENTION_DAYS": 30 + }, + "NDA": { "PURPOSE": "", "DURATION_YEARS": 2, "PENALTY_AMOUNT_EUR": null }, + "CONSENT": { + "WEBSITE_NAME": "breakpilot.de", + "ANALYTICS_TOOLS": "Google Analytics 4, Matomo", + "MARKETING_PARTNERS": "LinkedIn Insight Tag" + } + }, + "modules": { "enabled": [] } +} diff --git a/admin-compliance/app/sdk/document-generator/examples/copyright_de.json b/admin-compliance/app/sdk/document-generator/examples/copyright_de.json new file mode 100644 index 0000000..ccb34aa --- /dev/null +++ b/admin-compliance/app/sdk/document-generator/examples/copyright_de.json @@ -0,0 +1,71 @@ +{ + "spec_version": "1.0.0", + "doc_type": "copyright_de", + "render": { "lang": "de", "variant": "standard", "format": "markdown", "strict": true }, + "context": { + "PROVIDER": { + "LEGAL_NAME": "BreakPilot GmbH", + "LEGAL_FORM": "GmbH", + "ADDRESS_LINE": "Musterstraße 1", + "POSTAL_CODE": "10115", + "CITY": "Berlin", + "COUNTRY": "DE", + "EMAIL": "kontakt@breakpilot.de", + "WEBSITE_URL": "https://breakpilot.de" + }, + "CUSTOMER": { + "LEGAL_NAME": "Nutzer", + "EMAIL": "nutzer@example.com", + "IS_CONSUMER": true, + "IS_BUSINESS": false + }, + "SERVICE": { + "NAME": "BreakPilot Compliance SDK", + "DESCRIPTION": "DSGVO- und AI-Act-Compliance-Plattform", + "MODEL": "SaaS", + "TIER": "Standard", + "DATA_LOCATION": "Deutschland" + }, + "LEGAL": { + "GOVERNING_LAW": "Deutschland", + "JURISDICTION_CITY": "Berlin", + "VERSION_DATE": "2026-01-01", + "EFFECTIVE_DATE": "2026-01-01", + "LANG": "de" + }, + "PRIVACY": { + "CONTACT_EMAIL": "copyright@breakpilot.de", + "DPO_NAME": "Max Mustermann", + "DPO_EMAIL": "dsb@breakpilot.de", + "PRIVACY_POLICY_URL": "https://breakpilot.de/datenschutz" + }, + "SLA": { + "AVAILABILITY_PERCENT": 99.0, + "MAINTENANCE_NOTICE_HOURS": 48, + "SUPPORT_EMAIL": "support@breakpilot.de", + "SUPPORT_HOURS": "Mo–Fr 09:00–18:00 CET", + "RESPONSE_CRITICAL_H": 4, "RESOLUTION_CRITICAL_H": 24, + "RESPONSE_HIGH_H": 8, "RESOLUTION_HIGH_H": 48, + "RESPONSE_MEDIUM_H": 48, "RESOLUTION_MEDIUM_H": 168, + "RESPONSE_LOW_H": 120 + }, + "PAYMENTS": { + "MONTHLY_FEE_EUR": 0, + "PAYMENT_DUE_DAY": 1, + "PAYMENT_METHOD": "Rechnung", + "PAYMENT_DAYS": 14 + }, + "SECURITY": { + "INCIDENT_NOTICE_HOURS": 72, + "LOG_RETENTION_DAYS": 7, + "SECURITY_LOG_RETENTION_DAYS": 30 + }, + "NDA": { "PURPOSE": "", "DURATION_YEARS": 3, "PENALTY_AMOUNT_EUR": null }, + "CONSENT": { + "WEBSITE_NAME": "breakpilot.de", + "ANALYTICS_TOOLS": null, + "MARKETING_PARTNERS": null + } + }, + "modules": { "enabled": [] } +} diff --git a/admin-compliance/app/sdk/document-generator/examples/data_usage_clause_de.json b/admin-compliance/app/sdk/document-generator/examples/data_usage_clause_de.json new file mode 100644 index 0000000..cb33201 --- /dev/null +++ b/admin-compliance/app/sdk/document-generator/examples/data_usage_clause_de.json @@ -0,0 +1,73 @@ +{ + "spec_version": "1.0.0", + "doc_type": "data_usage_clause_de", + "render": { "lang": "de", "variant": "b2b", "format": "markdown", "strict": true }, + "context": { + "PROVIDER": { + "LEGAL_NAME": "BreakPilot GmbH", + "LEGAL_FORM": "GmbH", + "ADDRESS_LINE": "Musterstraße 1", + "POSTAL_CODE": "10115", + "CITY": "Berlin", + "COUNTRY": "DE", + "EMAIL": "kontakt@breakpilot.de", + "WEBSITE_URL": "https://breakpilot.de" + }, + "CUSTOMER": { + "LEGAL_NAME": "Beispiel AG", + "EMAIL": "datenschutz@beispiel-ag.de", + "IS_CONSUMER": false, + "IS_BUSINESS": true + }, + "SERVICE": { + "NAME": "BreakPilot Compliance SDK", + "DESCRIPTION": "DSGVO- und AI-Act-Compliance-Plattform", + "MODEL": "SaaS", + "TIER": "Professional", + "DATA_LOCATION": "Deutschland (Frankfurt)" + }, + "LEGAL": { + "GOVERNING_LAW": "Deutschland", + "JURISDICTION_CITY": "Berlin", + "VERSION_DATE": "2026-01-01", + "EFFECTIVE_DATE": "2026-01-01", + "LANG": "de" + }, + "PRIVACY": { + "CONTACT_EMAIL": "datenschutz@breakpilot.de", + "DPO_NAME": "Max Mustermann", + "DPO_EMAIL": "dsb@breakpilot.de", + "PRIVACY_POLICY_URL": "https://breakpilot.de/datenschutz", + "ANALYTICS_RETENTION_MONTHS": 13, + "DATA_TRANSFER_THIRD_COUNTRIES": "nicht statt" + }, + "SLA": { + "AVAILABILITY_PERCENT": 99.5, + "MAINTENANCE_NOTICE_HOURS": 72, + "SUPPORT_EMAIL": "support@breakpilot.de", + "SUPPORT_HOURS": "Mo–Fr 09:00–18:00 CET", + "RESPONSE_CRITICAL_H": 2, "RESOLUTION_CRITICAL_H": 8, + "RESPONSE_HIGH_H": 4, "RESOLUTION_HIGH_H": 24, + "RESPONSE_MEDIUM_H": 24, "RESOLUTION_MEDIUM_H": 120, + "RESPONSE_LOW_H": 72 + }, + "PAYMENTS": { + "MONTHLY_FEE_EUR": 199, + "PAYMENT_DUE_DAY": 1, + "PAYMENT_METHOD": "Rechnung", + "PAYMENT_DAYS": 14 + }, + "SECURITY": { + "INCIDENT_NOTICE_HOURS": 24, + "LOG_RETENTION_DAYS": 7, + "SECURITY_LOG_RETENTION_DAYS": 30 + }, + "NDA": { "PURPOSE": "", "DURATION_YEARS": 5, "PENALTY_AMOUNT_EUR": null }, + "CONSENT": { + "WEBSITE_NAME": "breakpilot.de", + "ANALYTICS_TOOLS": null, + "MARKETING_PARTNERS": null + } + }, + "modules": { "enabled": [] } +} diff --git a/admin-compliance/app/sdk/document-generator/examples/liability_clause_en.json b/admin-compliance/app/sdk/document-generator/examples/liability_clause_en.json new file mode 100644 index 0000000..96d8dac --- /dev/null +++ b/admin-compliance/app/sdk/document-generator/examples/liability_clause_en.json @@ -0,0 +1,73 @@ +{ + "spec_version": "1.0.0", + "doc_type": "liability_clause_en", + "render": { "lang": "en", "variant": "b2b", "format": "markdown", "strict": true }, + "context": { + "PROVIDER": { + "LEGAL_NAME": "BreakPilot GmbH", + "LEGAL_FORM": "GmbH", + "ADDRESS_LINE": "Musterstraße 1", + "POSTAL_CODE": "10115", + "CITY": "Berlin", + "COUNTRY": "DE", + "EMAIL": "contact@breakpilot.de", + "WEBSITE_URL": "https://breakpilot.de" + }, + "CUSTOMER": { + "LEGAL_NAME": "Acme Corp Ltd.", + "EMAIL": "legal@acme.example", + "IS_CONSUMER": false, + "IS_BUSINESS": true + }, + "SERVICE": { + "NAME": "BreakPilot Compliance SDK", + "DESCRIPTION": "GDPR and AI-Act compliance platform", + "MODEL": "SaaS", + "TIER": "Enterprise", + "DATA_LOCATION": "Germany (Frankfurt)", + "MIN_TERM_MONTHS": 12, + "TERMINATION_NOTICE_DAYS": 30 + }, + "LEGAL": { + "GOVERNING_LAW": "Germany", + "JURISDICTION_CITY": "Berlin", + "VERSION_DATE": "2026-01-01", + "EFFECTIVE_DATE": "2026-01-01", + "LANG": "en" + }, + "PRIVACY": { + "CONTACT_EMAIL": "privacy@breakpilot.de", + "DPO_NAME": "Max Mustermann", + "DPO_EMAIL": "dpo@breakpilot.de", + "PRIVACY_POLICY_URL": "https://breakpilot.de/privacy" + }, + "SLA": { + "AVAILABILITY_PERCENT": 99.9, + "MAINTENANCE_NOTICE_HOURS": 72, + "SUPPORT_EMAIL": "support@breakpilot.de", + "SUPPORT_HOURS": "Mon–Fri 09:00–18:00 CET", + "RESPONSE_CRITICAL_H": 1, "RESOLUTION_CRITICAL_H": 4, + "RESPONSE_HIGH_H": 4, "RESOLUTION_HIGH_H": 24, + "RESPONSE_MEDIUM_H": 24, "RESOLUTION_MEDIUM_H": 120, + "RESPONSE_LOW_H": 72 + }, + "PAYMENTS": { + "MONTHLY_FEE_EUR": 499, + "PAYMENT_DUE_DAY": 1, + "PAYMENT_METHOD": "Invoice", + "PAYMENT_DAYS": 30 + }, + "SECURITY": { + "INCIDENT_NOTICE_HOURS": 24, + "LOG_RETENTION_DAYS": 7, + "SECURITY_LOG_RETENTION_DAYS": 30 + }, + "NDA": { "PURPOSE": "", "DURATION_YEARS": 5, "PENALTY_AMOUNT_EUR": null }, + "CONSENT": { + "WEBSITE_NAME": "breakpilot.de", + "ANALYTICS_TOOLS": null, + "MARKETING_PARTNERS": null + } + }, + "modules": { "enabled": [] } +} diff --git a/admin-compliance/app/sdk/document-generator/examples/nda_de.json b/admin-compliance/app/sdk/document-generator/examples/nda_de.json new file mode 100644 index 0000000..3838754 --- /dev/null +++ b/admin-compliance/app/sdk/document-generator/examples/nda_de.json @@ -0,0 +1,85 @@ +{ + "spec_version": "1.0.0", + "doc_type": "nda_de", + "render": { "lang": "de", "variant": "b2b", "format": "markdown", "strict": true }, + "context": { + "PROVIDER": { + "LEGAL_NAME": "BreakPilot GmbH", + "LEGAL_FORM": "GmbH", + "ADDRESS_LINE": "Musterstraße 1", + "POSTAL_CODE": "10115", + "CITY": "Berlin", + "COUNTRY": "DE", + "EMAIL": "kontakt@breakpilot.de", + "WEBSITE_URL": "https://breakpilot.de", + "CEO_NAME": "Max Mustermann", + "REGISTER_COURT": "Amtsgericht Berlin", + "REGISTER_NUMBER": "HRB 123456" + }, + "CUSTOMER": { + "LEGAL_NAME": "Beispiel AG", + "ADDRESS_LINE": "Hauptstraße 10", + "POSTAL_CODE": "80331", + "CITY": "München", + "COUNTRY": "DE", + "CONTACT_NAME": "Erika Musterfrau", + "EMAIL": "erika@beispiel-ag.de", + "IS_CONSUMER": false, + "IS_BUSINESS": true + }, + "SERVICE": { + "NAME": "BreakPilot Compliance SDK", + "DESCRIPTION": "DSGVO- und AI-Act-Compliance-Plattform für SaaS-Anbieter", + "MODEL": "SaaS", + "TIER": "Professional", + "DATA_LOCATION": "Deutschland (Frankfurt)", + "MIN_TERM_MONTHS": 12, + "TERMINATION_NOTICE_DAYS": 30 + }, + "LEGAL": { + "GOVERNING_LAW": "Deutschland", + "JURISDICTION_CITY": "Berlin", + "VERSION_DATE": "2026-01-01", + "EFFECTIVE_DATE": "2026-01-01", + "LANG": "de" + }, + "PRIVACY": { + "CONTACT_EMAIL": "datenschutz@breakpilot.de", + "DPO_NAME": "Max Mustermann", + "DPO_EMAIL": "dsb@breakpilot.de", + "PRIVACY_POLICY_URL": "https://breakpilot.de/datenschutz" + }, + "SLA": { + "AVAILABILITY_PERCENT": 99.5, + "MAINTENANCE_NOTICE_HOURS": 72, + "SUPPORT_EMAIL": "support@breakpilot.de", + "SUPPORT_HOURS": "Mo–Fr 09:00–18:00 CET", + "RESPONSE_CRITICAL_H": 2, "RESOLUTION_CRITICAL_H": 8, + "RESPONSE_HIGH_H": 4, "RESOLUTION_HIGH_H": 24, + "RESPONSE_MEDIUM_H": 24, "RESOLUTION_MEDIUM_H": 120, + "RESPONSE_LOW_H": 72 + }, + "PAYMENTS": { + "MONTHLY_FEE_EUR": 199, + "PAYMENT_DUE_DAY": 1, + "PAYMENT_METHOD": "Rechnung", + "PAYMENT_DAYS": 14 + }, + "SECURITY": { + "INCIDENT_NOTICE_HOURS": 24, + "LOG_RETENTION_DAYS": 7, + "SECURITY_LOG_RETENTION_DAYS": 30 + }, + "NDA": { + "PURPOSE": "Zusammenarbeit bei der Entwicklung und dem Betrieb der BreakPilot Compliance Platform", + "DURATION_YEARS": 5, + "PENALTY_AMOUNT_EUR": 25000 + }, + "CONSENT": { + "WEBSITE_NAME": "breakpilot.de", + "ANALYTICS_TOOLS": null, + "MARKETING_PARTNERS": null + } + }, + "modules": { "enabled": [] } +} diff --git a/admin-compliance/app/sdk/document-generator/examples/nda_en.json b/admin-compliance/app/sdk/document-generator/examples/nda_en.json new file mode 100644 index 0000000..d7fc925 --- /dev/null +++ b/admin-compliance/app/sdk/document-generator/examples/nda_en.json @@ -0,0 +1,82 @@ +{ + "spec_version": "1.0.0", + "doc_type": "nda_en", + "render": { "lang": "en", "variant": "b2b", "format": "markdown", "strict": true }, + "context": { + "PROVIDER": { + "LEGAL_NAME": "BreakPilot GmbH", + "LEGAL_FORM": "GmbH", + "ADDRESS_LINE": "Musterstraße 1", + "POSTAL_CODE": "10115", + "CITY": "Berlin", + "COUNTRY": "DE", + "EMAIL": "contact@breakpilot.de", + "WEBSITE_URL": "https://breakpilot.de" + }, + "CUSTOMER": { + "LEGAL_NAME": "Acme Corp Ltd.", + "ADDRESS_LINE": "123 Main Street", + "POSTAL_CODE": "EC1A 1BB", + "CITY": "London", + "COUNTRY": "GB", + "CONTACT_NAME": "John Smith", + "EMAIL": "john.smith@acme.example", + "IS_CONSUMER": false, + "IS_BUSINESS": true + }, + "SERVICE": { + "NAME": "BreakPilot Compliance SDK", + "DESCRIPTION": "GDPR and AI-Act compliance platform for SaaS providers", + "MODEL": "SaaS", + "TIER": "Enterprise", + "DATA_LOCATION": "Germany (Frankfurt)", + "MIN_TERM_MONTHS": 12, + "TERMINATION_NOTICE_DAYS": 30 + }, + "LEGAL": { + "GOVERNING_LAW": "Germany", + "JURISDICTION_CITY": "Berlin", + "VERSION_DATE": "2026-01-01", + "EFFECTIVE_DATE": "2026-01-01", + "LANG": "en" + }, + "PRIVACY": { + "CONTACT_EMAIL": "privacy@breakpilot.de", + "DPO_NAME": "Max Mustermann", + "DPO_EMAIL": "dpo@breakpilot.de", + "PRIVACY_POLICY_URL": "https://breakpilot.de/privacy" + }, + "SLA": { + "AVAILABILITY_PERCENT": 99.9, + "MAINTENANCE_NOTICE_HOURS": 72, + "SUPPORT_EMAIL": "support@breakpilot.de", + "SUPPORT_HOURS": "Mon–Fri 09:00–18:00 CET", + "RESPONSE_CRITICAL_H": 1, "RESOLUTION_CRITICAL_H": 4, + "RESPONSE_HIGH_H": 4, "RESOLUTION_HIGH_H": 24, + "RESPONSE_MEDIUM_H": 24, "RESOLUTION_MEDIUM_H": 120, + "RESPONSE_LOW_H": 72 + }, + "PAYMENTS": { + "MONTHLY_FEE_EUR": 499, + "PAYMENT_DUE_DAY": 1, + "PAYMENT_METHOD": "Invoice", + "PAYMENT_DAYS": 30 + }, + "SECURITY": { + "INCIDENT_NOTICE_HOURS": 24, + "LOG_RETENTION_DAYS": 7, + "SECURITY_LOG_RETENTION_DAYS": 30 + }, + "NDA": { + "PURPOSE": "Collaboration on the development and operation of the BreakPilot Compliance Platform", + "DURATION_YEARS": 5, + "PENALTY_AMOUNT_EUR": 50000 + }, + "CONSENT": { + "WEBSITE_NAME": "breakpilot.de", + "ANALYTICS_TOOLS": null, + "MARKETING_PARTNERS": null + } + }, + "modules": { "enabled": [] } +} diff --git a/admin-compliance/app/sdk/document-generator/examples/sla_de.json b/admin-compliance/app/sdk/document-generator/examples/sla_de.json new file mode 100644 index 0000000..40cb9e1 --- /dev/null +++ b/admin-compliance/app/sdk/document-generator/examples/sla_de.json @@ -0,0 +1,76 @@ +{ + "spec_version": "1.0.0", + "doc_type": "sla_de", + "render": { "lang": "de", "variant": "b2b", "format": "markdown", "strict": true }, + "context": { + "PROVIDER": { + "LEGAL_NAME": "BreakPilot GmbH", + "LEGAL_FORM": "GmbH", + "ADDRESS_LINE": "Musterstraße 1", + "POSTAL_CODE": "10115", + "CITY": "Berlin", + "COUNTRY": "DE", + "EMAIL": "kontakt@breakpilot.de", + "WEBSITE_URL": "https://breakpilot.de" + }, + "CUSTOMER": { + "LEGAL_NAME": "Beispiel AG", + "EMAIL": "it@beispiel-ag.de", + "IS_CONSUMER": false, + "IS_BUSINESS": true + }, + "SERVICE": { + "NAME": "BreakPilot Compliance SDK", + "DESCRIPTION": "DSGVO- und AI-Act-Compliance-Plattform für SaaS-Anbieter", + "MODEL": "SaaS", + "TIER": "Professional", + "DATA_LOCATION": "Deutschland (Frankfurt)", + "EXPORT_FORMATS": ["JSON", "CSV", "PDF"], + "EXPORT_WINDOW_DAYS": 30, + "MIN_TERM_MONTHS": 12, + "TERMINATION_NOTICE_DAYS": 30 + }, + "LEGAL": { + "GOVERNING_LAW": "Deutschland", + "JURISDICTION_CITY": "Berlin", + "VERSION_DATE": "2026-01-01", + "EFFECTIVE_DATE": "2026-01-01", + "LANG": "de" + }, + "PRIVACY": { + "CONTACT_EMAIL": "datenschutz@breakpilot.de", + "DPO_NAME": "Max Mustermann", + "DPO_EMAIL": "dsb@breakpilot.de", + "PRIVACY_POLICY_URL": "https://breakpilot.de/datenschutz" + }, + "SLA": { + "AVAILABILITY_PERCENT": 99.5, + "MAINTENANCE_NOTICE_HOURS": 72, + "SUPPORT_EMAIL": "support@breakpilot.de", + "SUPPORT_PHONE": "+49 30 12345678", + "SUPPORT_HOURS": "Mo–Fr 09:00–18:00 CET", + "RESPONSE_CRITICAL_H": 2, "RESOLUTION_CRITICAL_H": 8, + "RESPONSE_HIGH_H": 4, "RESOLUTION_HIGH_H": 24, + "RESPONSE_MEDIUM_H": 24, "RESOLUTION_MEDIUM_H": 120, + "RESPONSE_LOW_H": 72 + }, + "PAYMENTS": { + "MONTHLY_FEE_EUR": 199, + "PAYMENT_DUE_DAY": 1, + "PAYMENT_METHOD": "Rechnung", + "PAYMENT_DAYS": 14 + }, + "SECURITY": { + "INCIDENT_NOTICE_HOURS": 24, + "LOG_RETENTION_DAYS": 7, + "SECURITY_LOG_RETENTION_DAYS": 30 + }, + "NDA": { "PURPOSE": "", "DURATION_YEARS": 5, "PENALTY_AMOUNT_EUR": null }, + "CONSENT": { + "WEBSITE_NAME": "breakpilot.de", + "ANALYTICS_TOOLS": null, + "MARKETING_PARTNERS": null + } + }, + "modules": { "enabled": [] } +} diff --git a/admin-compliance/app/sdk/document-generator/page.tsx b/admin-compliance/app/sdk/document-generator/page.tsx index a4c3e76..8f6cfd7 100644 --- a/admin-compliance/app/sdk/document-generator/page.tsx +++ b/admin-compliance/app/sdk/document-generator/page.tsx @@ -14,7 +14,12 @@ import { import { DataPointsPreview } from './components/DataPointsPreview' import { DocumentValidation } from './components/DocumentValidation' import { generateAllPlaceholders } from '@/lib/sdk/document-generator/datapoint-helpers' -import { loadAllTemplates, searchTemplates } from './searchTemplates' +import { loadAllTemplates } from './searchTemplates' +import { + TemplateContext, EMPTY_CONTEXT, + contextToPlaceholders, getRelevantSections, + getUncoveredPlaceholders, getMissingRequired, +} from './contextBridge' // ============================================================================= // CATEGORY CONFIG @@ -35,6 +40,120 @@ const CATEGORIES: { key: string; label: string; types: string[] | null }[] = [ { key: 'misc', label: 'Weitere', types: ['community_guidelines', 'copyright_policy', 'data_usage_clause'] }, ] +// ============================================================================= +// CONTEXT FORM CONFIG +// ============================================================================= + +const SECTION_LABELS: Record = { + PROVIDER: 'Anbieter', + CUSTOMER: 'Kunde / Gegenpartei', + SERVICE: 'Dienst / Produkt', + LEGAL: 'Rechtliches', + PRIVACY: 'Datenschutz', + SLA: 'Service Level (SLA)', + PAYMENTS: 'Zahlungskonditionen', + SECURITY: 'Sicherheit & Logs', + NDA: 'Geheimhaltung (NDA)', + CONSENT: 'Cookie / Einwilligung', +} + +type FieldType = 'text' | 'email' | 'number' | 'select' | 'textarea' | 'boolean' +interface FieldDef { + key: string + label: string + type?: FieldType + opts?: string[] + span?: boolean + nullable?: boolean +} + +const SECTION_FIELDS: Record = { + PROVIDER: [ + { key: 'LEGAL_NAME', label: 'Firmenname' }, + { key: 'EMAIL', label: 'Kontakt-E-Mail', type: 'email' }, + { key: 'LEGAL_FORM', label: 'Rechtsform' }, + { key: 'ADDRESS_LINE', label: 'Adresse' }, + { key: 'POSTAL_CODE', label: 'PLZ' }, + { key: 'CITY', label: 'Stadt' }, + { key: 'WEBSITE_URL', label: 'Website-URL' }, + { key: 'CEO_NAME', label: 'Geschäftsführer' }, + { key: 'REGISTER_COURT', label: 'Registergericht' }, + { key: 'REGISTER_NUMBER', label: 'HRB-Nummer' }, + { key: 'VAT_ID', label: 'USt-ID' }, + { key: 'PHONE', label: 'Telefon' }, + ], + CUSTOMER: [ + { key: 'LEGAL_NAME', label: 'Name / Firma' }, + { key: 'EMAIL', label: 'E-Mail', type: 'email' }, + { key: 'CONTACT_NAME', label: 'Ansprechpartner' }, + { key: 'ADDRESS_LINE', label: 'Adresse' }, + { key: 'POSTAL_CODE', label: 'PLZ' }, + { key: 'CITY', label: 'Stadt' }, + { key: 'COUNTRY', label: 'Land' }, + { key: 'IS_CONSUMER', label: 'Verbraucher (B2C)', type: 'boolean' }, + { key: 'IS_BUSINESS', label: 'Unternehmer (B2B)', type: 'boolean' }, + ], + SERVICE: [ + { key: 'NAME', label: 'Dienstname' }, + { key: 'DESCRIPTION', label: 'Beschreibung', type: 'textarea', span: true }, + { key: 'MODEL', label: 'Modell', type: 'select', opts: ['SaaS', 'PaaS', 'IaaS', 'OnPrem', 'Hybrid'] }, + { key: 'TIER', label: 'Plan / Tier' }, + { key: 'DATA_LOCATION', label: 'Datenspeicherort' }, + { key: 'EXPORT_WINDOW_DAYS', label: 'Export-Frist (Tage)', type: 'number' }, + { key: 'MIN_TERM_MONTHS', label: 'Mindestlaufzeit (Monate)', type: 'number' }, + { key: 'TERMINATION_NOTICE_DAYS', label: 'Kündigungsfrist (Tage)', type: 'number' }, + ], + LEGAL: [ + { key: 'GOVERNING_LAW', label: 'Anwendbares Recht' }, + { key: 'JURISDICTION_CITY', label: 'Gerichtsstand (Stadt)' }, + { key: 'VERSION_DATE', label: 'Versionsstand (JJJJ-MM-TT)' }, + { key: 'EFFECTIVE_DATE', label: 'Gültig ab (JJJJ-MM-TT)' }, + ], + PRIVACY: [ + { key: 'DPO_NAME', label: 'DSB-Name' }, + { key: 'DPO_EMAIL', label: 'DSB-E-Mail', type: 'email' }, + { key: 'CONTACT_EMAIL', label: 'Datenschutz-Kontakt', type: 'email' }, + { key: 'PRIVACY_POLICY_URL', label: 'Datenschutz-URL' }, + { key: 'COOKIE_POLICY_URL', label: 'Cookie-Policy-URL' }, + { key: 'ANALYTICS_RETENTION_MONTHS', label: 'Analytics-Aufbewahrung (Monate)', type: 'number' }, + { key: 'SUPERVISORY_AUTHORITY_NAME', label: 'Aufsichtsbehörde' }, + ], + SLA: [ + { key: 'AVAILABILITY_PERCENT', label: 'Verfügbarkeit (%)', type: 'number' }, + { key: 'MAINTENANCE_NOTICE_HOURS', label: 'Wartungsankündigung (h)', type: 'number' }, + { key: 'SUPPORT_EMAIL', label: 'Support-E-Mail', type: 'email' }, + { key: 'SUPPORT_HOURS', label: 'Support-Zeiten' }, + { key: 'RESPONSE_CRITICAL_H', label: 'Reaktion Kritisch (h)', type: 'number' }, + { key: 'RESOLUTION_CRITICAL_H', label: 'Lösung Kritisch (h)', type: 'number' }, + { key: 'RESPONSE_HIGH_H', label: 'Reaktion Hoch (h)', type: 'number' }, + { key: 'RESOLUTION_HIGH_H', label: 'Lösung Hoch (h)', type: 'number' }, + { key: 'RESPONSE_MEDIUM_H', label: 'Reaktion Mittel (h)', type: 'number' }, + { key: 'RESOLUTION_MEDIUM_H', label: 'Lösung Mittel (h)', type: 'number' }, + { key: 'RESPONSE_LOW_H', label: 'Reaktion Niedrig (h)', type: 'number' }, + ], + PAYMENTS: [ + { key: 'MONTHLY_FEE_EUR', label: 'Monatl. Gebühr (EUR)', type: 'number' }, + { key: 'PAYMENT_DUE_DAY', label: 'Fälligkeitstag', type: 'number' }, + { key: 'PAYMENT_METHOD', label: 'Zahlungsmethode' }, + { key: 'PAYMENT_DAYS', label: 'Zahlungsziel (Tage)', type: 'number' }, + ], + SECURITY: [ + { key: 'INCIDENT_NOTICE_HOURS', label: 'Meldepflicht Vorfälle (h)', type: 'number' }, + { key: 'LOG_RETENTION_DAYS', label: 'Log-Aufbewahrung (Tage)', type: 'number' }, + { key: 'SECURITY_LOG_RETENTION_DAYS', label: 'Sicherheits-Log (Tage)', type: 'number' }, + ], + NDA: [ + { key: 'PURPOSE', label: 'Zweck', type: 'textarea', span: true }, + { key: 'DURATION_YEARS', label: 'Laufzeit (Jahre)', type: 'number' }, + { key: 'PENALTY_AMOUNT_EUR', label: 'Vertragsstrafe EUR (leer = keine)', type: 'number', nullable: true }, + ], + CONSENT: [ + { key: 'WEBSITE_NAME', label: 'Website-Name' }, + { key: 'ANALYTICS_TOOLS', label: 'Analytics-Tools (leer = kein Block)', nullable: true }, + { key: 'MARKETING_PARTNERS', label: 'Marketing-Partner (leer = kein Block)', nullable: true }, + ], +} + // ============================================================================= // SMALL COMPONENTS // ============================================================================= @@ -78,7 +197,6 @@ function LibraryCard({ return (
- {/* Card header */}

@@ -94,9 +212,7 @@ function LibraryCard({ )} {placeholderCount > 0 && ( - - {placeholderCount} Platzh. - + {placeholderCount} Platzh. )}

@@ -115,7 +231,6 @@ function LibraryCard({
- {/* Inline preview */} {expanded && (
@@ -127,32 +242,149 @@ function LibraryCard({
   )
 }
 
+// =============================================================================
+// CONTEXT SECTION FORM
+// =============================================================================
+
+function ContextSectionForm({
+  section,
+  context,
+  onChange,
+}: {
+  section: keyof TemplateContext
+  context: TemplateContext
+  onChange: (section: keyof TemplateContext, key: string, value: unknown) => void
+}) {
+  const fields = SECTION_FIELDS[section]
+  const sectionData = context[section] as Record
+
+  return (
+    
+ {fields.map((field) => { + const rawValue = sectionData[field.key] + const inputCls = 'w-full px-3 py-2 border border-gray-200 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-purple-400' + + if (field.type === 'boolean') { + return ( +
+ onChange(section, field.key, e.target.checked)} + className="w-4 h-4 accent-purple-600" + /> + +
+ ) + } + + if (field.type === 'select' && field.opts) { + return ( +
+ + +
+ ) + } + + if (field.type === 'textarea') { + return ( +
+ +