diff --git a/admin-compliance/app/sdk/company-profile/page.tsx b/admin-compliance/app/sdk/company-profile/page.tsx index ff48e09..8b69a93 100644 --- a/admin-compliance/app/sdk/company-profile/page.tsx +++ b/admin-compliance/app/sdk/company-profile/page.tsx @@ -34,7 +34,7 @@ const BASE_WIZARD_STEPS = [ { id: 3, name: 'Firmengroesse', description: 'Mitarbeiter und Umsatz' }, { id: 4, name: 'Standorte', description: 'Hauptsitz und Zielmaerkte' }, { id: 5, name: 'Datenschutz', description: 'Rollen und KI-Nutzung' }, - { id: 6, name: 'Systeme & KI', description: 'IT-Systeme und KI-Katalog' }, + { id: 6, name: 'Verarbeitung & KI', description: 'Verarbeitungstätigkeiten und KI-Systeme' }, { id: 7, name: 'Rechtlicher Rahmen', description: 'Regulierungen und Prüfzyklen' }, ] @@ -200,7 +200,7 @@ const STEP_EXPLANATIONS: Record = { 3: 'Die Unternehmensgröße bestimmt, ob Sie einen DSB benennen müssen (ab 20 MA), ob NIS2-Pflichten greifen und welche Audit-Anforderungen gelten.', 4: 'Standorte und Zielmärkte bestimmen, welche nationalen Datenschutzgesetze zusätzlich zur DSGVO greifen (z.B. BDSG, DSG-AT, UK GDPR, CCPA).', 5: 'Ob Sie Verantwortlicher oder Auftragsverarbeiter sind, bestimmt Ihre DSGVO-Pflichten grundlegend. KI-Nutzung löst zusätzliche AI-Act-Pflichten aus.', - 6: 'Ihre IT-Systeme und KI-Anwendungen werden für das Verarbeitungsverzeichnis (VVT), die technisch-organisatorischen Maßnahmen (TOM) und die KI-Risikobewertung benötigt.', + 6: 'Ihre Verarbeitungstätigkeiten bilden die Grundlage für das Verarbeitungsverzeichnis (Art. 30 DSGVO). KI-Systeme werden für die AI-Act-Analyse erfasst — die Risikoeinstufung übernimmt unser Tool.', 7: 'Regulierungsrahmen und Prüfzyklen definieren, welche Compliance-Module für Sie aktiviert werden und in welchem Rhythmus Audits stattfinden.', 8: 'Als Maschinenbauer gelten zusätzliche Anforderungen: CE-Kennzeichnung, Maschinenverordnung, Produktsicherheit und ggf. Hochrisiko-KI im Sinne des AI Act.', } @@ -342,37 +342,25 @@ function StepCompanySize({ -
-
- - -
- -
- - -
+
+ + + {(data.companySize === 'medium' || data.companySize === 'large' || data.companySize === 'enterprise') && ( +

+ Geben Sie den konsolidierten Konzernumsatz an, wenn der Compliance-Check für Mutter- und Tochtergesellschaften gelten soll. + Für eine einzelne Einheit eines Konzerns geben Sie nur deren Umsatz an. +

+ )}
) @@ -394,45 +382,104 @@ function StepLocations({ } } + const stateLabel = data.headquartersCountry === 'CH' ? 'Kanton' : + data.headquartersCountry === 'AT' ? 'Bundesland' : + data.headquartersCountry === 'DE' ? 'Bundesland' : 'Region / Provinz' + return (
-
-
- - -
+ {/* Country */} +
+ + +
+ {/* Other country free text */} + {data.headquartersCountry === 'other' && (
+ + onChange({ headquartersCountryOther: e.target.value })} + placeholder="z.B. Vereinigtes Königreich" + className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" + /> +
+ )} + + {/* Street + House Number */} +
+ + onChange({ headquartersStreet: e.target.value })} + placeholder="Musterstraße 42" + className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" + /> +
+ + {/* PLZ + City */} +
+
+ + onChange({ headquartersZip: e.target.value })} + placeholder="10115" + className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" + /> +
+
onChange({ headquartersCity: e.target.value })} - placeholder="z.B. Berlin" + placeholder="Berlin" className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" />
+ {/* State / Bundesland / Kanton */} +
+ + onChange({ headquartersState: e.target.value })} + placeholder={data.headquartersCountry === 'CH' ? 'z.B. Zürich' : data.headquartersCountry === 'AT' ? 'z.B. Wien' : 'z.B. Bayern'} + className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" + /> +
+
- {Object.entries(TARGET_MARKET_LABELS).map(([value, { label, description, regulations }]) => ( + {Object.entries(TARGET_MARKET_LABELS).map(([value, { label, description }]) => ( ))}
@@ -553,48 +592,189 @@ function StepDataProtection({ } // ============================================================================= -// STEP 6: SYSTEME & KI +// STEP 6: VERARBEITUNGSTAETIGKEITEN & KI // ============================================================================= -interface ProcessingSystem { +// DSGVO-Standard Datenkategorien +const DATA_CATEGORIES = [ + { id: 'stammdaten', label: 'Stammdaten', desc: 'Name, Geburtsdatum, Geschlecht' }, + { id: 'kontaktdaten', label: 'Kontaktdaten', desc: 'E-Mail, Telefon, Adresse' }, + { id: 'vertragsdaten', label: 'Vertragsdaten', desc: 'Vertragsnummer, Laufzeit, Konditionen' }, + { id: 'zahlungsdaten', label: 'Zahlungs-/Bankdaten', desc: 'IBAN, Kreditkarte, Rechnungen' }, + { id: 'beschaeftigtendaten', label: 'Beschäftigtendaten', desc: 'Gehalt, Arbeitszeiten, Urlaub' }, + { id: 'kommunikation', label: 'Kommunikationsdaten', desc: 'E-Mail-Inhalte, Chat-Verläufe' }, + { id: 'nutzungsdaten', label: 'Nutzungs-/Logdaten', desc: 'IP-Adressen, Login-Zeiten, Klicks' }, + { id: 'standortdaten', label: 'Standortdaten', desc: 'GPS, Check-in, Lieferadressen' }, + { id: 'bilddaten', label: 'Bild-/Videodaten', desc: 'Fotos, Videoaufnahmen, Profilbilder' }, + { id: 'bewerberdaten', label: 'Bewerberdaten', desc: 'Lebenslauf, Zeugnisse, Anschreiben' }, +] as const + +const SPECIAL_DATA_CATEGORIES = [ + { id: 'gesundheit', label: 'Gesundheitsdaten', desc: 'Krankheitstage, Atteste, Diagnosen' }, + { id: 'biometrie', label: 'Biometrische Daten', desc: 'Fingerabdruck, Gesichtserkennung' }, + { id: 'religion', label: 'Religiöse Überzeugungen', desc: 'Konfession, Feiertage' }, + { id: 'gewerkschaft', label: 'Gewerkschaftszugehörigkeit', desc: 'Mitgliedschaft' }, + { id: 'genetik', label: 'Genetische Daten', desc: 'DNA, Erbkrankheiten' }, +] as const + +// Rechtsgrundlagen nach DSGVO Art. 6 +const LEGAL_BASES = [ + { id: 'consent', label: 'Einwilligung (Art. 6 Abs. 1a)' }, + { id: 'contract', label: 'Vertragserfüllung (Art. 6 Abs. 1b)' }, + { id: 'legal', label: 'Rechtliche Verpflichtung (Art. 6 Abs. 1c)' }, + { id: 'interest', label: 'Berechtigtes Interesse (Art. 6 Abs. 1f)' }, +] as const + +// Verarbeitungstätigkeiten-Vorlagen nach Branche +interface ProcessingActivityTemplate { + id: string name: string - vendor: string - hosting: string - personal_data_categories: string[] + purpose: string + default_categories: string[] + default_legal_basis: string +} + +const COMMON_ACTIVITIES: ProcessingActivityTemplate[] = [ + { id: 'personal', name: 'Personalverwaltung', purpose: 'Verwaltung von Mitarbeiterdaten, Gehaltsabrechnung, Arbeitszeitverwaltung', default_categories: ['stammdaten', 'kontaktdaten', 'beschaeftigtendaten', 'zahlungsdaten'], default_legal_basis: 'contract' }, + { id: 'buchhaltung', name: 'Buchhaltung / Rechnungswesen', purpose: 'Rechnungsstellung, Zahlungsabwicklung, Steuerliche Pflichten', default_categories: ['stammdaten', 'kontaktdaten', 'vertragsdaten', 'zahlungsdaten'], default_legal_basis: 'legal' }, + { id: 'bewerbung', name: 'Bewerbermanagement', purpose: 'Verwaltung von Bewerbungen und Auswahlverfahren', default_categories: ['stammdaten', 'kontaktdaten', 'bewerberdaten'], default_legal_basis: 'consent' }, + { id: 'website', name: 'Website-Betrieb', purpose: 'Bereitstellung der Unternehmenswebsite, Analytics, Kontaktformulare', default_categories: ['nutzungsdaten', 'kontaktdaten'], default_legal_basis: 'interest' }, + { id: 'email', name: 'E-Mail-Kommunikation', purpose: 'Geschäftliche E-Mail-Korrespondenz', default_categories: ['stammdaten', 'kontaktdaten', 'kommunikation'], default_legal_basis: 'interest' }, +] + +const INDUSTRY_ACTIVITIES: Record = { + 'Technologie / IT': [ + { id: 'crm', name: 'CRM / Kundenverwaltung', purpose: 'Pflege von Kundenbeziehungen, Vertriebspipeline', default_categories: ['stammdaten', 'kontaktdaten', 'vertragsdaten', 'kommunikation'], default_legal_basis: 'contract' }, + { id: 'support', name: 'Support / Ticketsystem', purpose: 'Kundenanfragen bearbeiten, Fehlerbehebung', default_categories: ['stammdaten', 'kontaktdaten', 'kommunikation', 'nutzungsdaten'], default_legal_basis: 'contract' }, + { id: 'saas', name: 'SaaS-Plattform / Nutzerkonten', purpose: 'Bereitstellung der Software, Nutzerverwaltung', default_categories: ['stammdaten', 'kontaktdaten', 'nutzungsdaten', 'vertragsdaten'], default_legal_basis: 'contract' }, + ], + 'E-Commerce / Handel': [ + { id: 'bestellung', name: 'Bestellabwicklung', purpose: 'Bestellannahme, Zahlungsabwicklung, Versand', default_categories: ['stammdaten', 'kontaktdaten', 'zahlungsdaten', 'vertragsdaten', 'standortdaten'], default_legal_basis: 'contract' }, + { id: 'kundenkonto', name: 'Kundenkonto-Verwaltung', purpose: 'Registrierung, Login, Bestellhistorie', default_categories: ['stammdaten', 'kontaktdaten', 'nutzungsdaten'], default_legal_basis: 'contract' }, + { id: 'newsletter', name: 'Newsletter / Marketing', purpose: 'E-Mail-Marketing, Werbeaktionen', default_categories: ['stammdaten', 'kontaktdaten', 'nutzungsdaten'], default_legal_basis: 'consent' }, + ], + 'Finanzdienstleistungen': [ + { id: 'konto', name: 'Kontoverwaltung', purpose: 'Kontoeröffnung, KYC, Kontopflege', default_categories: ['stammdaten', 'kontaktdaten', 'zahlungsdaten', 'vertragsdaten'], default_legal_basis: 'contract' }, + { id: 'compliance_fin', name: 'Regulatorische Pflichten', purpose: 'Geldwäscheprävention, Meldepflichten', default_categories: ['stammdaten', 'zahlungsdaten'], default_legal_basis: 'legal' }, + ], + 'Gesundheitswesen': [ + { id: 'patient', name: 'Patientenverwaltung', purpose: 'Aufnahme, Behandlung, Dokumentation', default_categories: ['stammdaten', 'kontaktdaten', 'gesundheit'], default_legal_basis: 'contract' }, + { id: 'termin', name: 'Terminplanung', purpose: 'Terminvergabe und -verwaltung', default_categories: ['stammdaten', 'kontaktdaten'], default_legal_basis: 'contract' }, + { id: 'abrechnung_kv', name: 'Abrechnung / KV', purpose: 'Kassenärztliche Abrechnung, Privatliquidation', default_categories: ['stammdaten', 'zahlungsdaten', 'gesundheit'], default_legal_basis: 'legal' }, + ], + 'Beratung / Consulting': [ + { id: 'crm', name: 'CRM / Kundenverwaltung', purpose: 'Pflege von Kundenbeziehungen, Projekthistorie', default_categories: ['stammdaten', 'kontaktdaten', 'vertragsdaten', 'kommunikation'], default_legal_basis: 'contract' }, + { id: 'projekt', name: 'Projektmanagement', purpose: 'Projektverwaltung, Zeiterfassung, Dokumentation', default_categories: ['stammdaten', 'beschaeftigtendaten', 'kommunikation'], default_legal_basis: 'contract' }, + ], + 'Bildung': [ + { id: 'schueler', name: 'Schüler-/Teilnehmerverwaltung', purpose: 'Verwaltung von Lernenden, Noten, Anwesenheit', default_categories: ['stammdaten', 'kontaktdaten', 'nutzungsdaten'], default_legal_basis: 'contract' }, + { id: 'lernplattform', name: 'Lernplattform / LMS', purpose: 'Bereitstellung von Lernmaterialien, Prüfungen', default_categories: ['stammdaten', 'nutzungsdaten', 'kommunikation'], default_legal_basis: 'contract' }, + ], + 'Marketing / Agentur': [ + { id: 'crm', name: 'CRM / Kundenverwaltung', purpose: 'Pflege von Kundenbeziehungen, Kampagnen', default_categories: ['stammdaten', 'kontaktdaten', 'vertragsdaten', 'kommunikation'], default_legal_basis: 'contract' }, + { id: 'campaign', name: 'Kampagnen / Analytics', purpose: 'Werbekampagnen, Tracking, Auswertung', default_categories: ['nutzungsdaten', 'kontaktdaten', 'standortdaten'], default_legal_basis: 'consent' }, + ], + 'Produktion / Industrie': [ + { id: 'lieferanten', name: 'Lieferantenverwaltung', purpose: 'Bestellungen, Lieferantenqualifizierung', default_categories: ['stammdaten', 'kontaktdaten', 'vertragsdaten', 'zahlungsdaten'], default_legal_basis: 'contract' }, + { id: 'zutrittskontrolle', name: 'Zutrittskontrolle', purpose: 'Werksgelände-Zugang, Besuchermanagement', default_categories: ['stammdaten', 'standortdaten', 'bilddaten'], default_legal_basis: 'interest' }, + ], +} + +// Get processing activity templates for the selected industry +function getActivityTemplates(industry: string): ProcessingActivityTemplate[] { + const industrySpecific = INDUSTRY_ACTIVITIES[industry] || [] + // Merge common + industry-specific, avoiding duplicate IDs + const existingIds = new Set(industrySpecific.map(a => a.id)) + const common = COMMON_ACTIVITIES.filter(a => !existingIds.has(a.id)) + return [...industrySpecific, ...common] +} + +interface ProcessingActivity { + id: string + name: string + purpose: string + data_categories: string[] + legal_basis: string + custom?: boolean } interface AISystem { name: string - purpose: string - risk_category: string vendor: string - has_human_oversight: boolean + purpose: string + processes_personal_data: boolean } -function StepSystemsAndAI({ +function StepProcessingAndAI({ data, onChange, }: { - data: Partial & { processingSystems?: ProcessingSystem[]; aiSystems?: AISystem[] } + data: Partial & { processingSystems?: ProcessingActivity[]; aiSystems?: AISystem[] } onChange: (updates: Record) => void }) { - const systems = (data as any).processingSystems || [] - const aiSystems = (data as any).aiSystems || [] + const activities: ProcessingActivity[] = (data as any).processingSystems || [] + const aiSystems: AISystem[] = (data as any).aiSystems || [] + const industry = data.industry || '' + const [expandedActivity, setExpandedActivity] = useState(null) - const addSystem = () => { - onChange({ processingSystems: [...systems, { name: '', vendor: '', hosting: 'cloud', personal_data_categories: [] }] }) - } - const removeSystem = (i: number) => { - onChange({ processingSystems: systems.filter((_: ProcessingSystem, idx: number) => idx !== i) }) - } - const updateSystem = (i: number, updates: Partial) => { - const updated = [...systems] - updated[i] = { ...updated[i], ...updates } - onChange({ processingSystems: updated }) + // Get suggested templates based on industry + const templates = getActivityTemplates(industry) + const activeIds = new Set(activities.map(a => a.id)) + + const toggleActivity = (template: ProcessingActivityTemplate) => { + if (activeIds.has(template.id)) { + onChange({ processingSystems: activities.filter(a => a.id !== template.id) }) + } else { + onChange({ + processingSystems: [...activities, { + id: template.id, + name: template.name, + purpose: template.purpose, + data_categories: [...template.default_categories], + legal_basis: template.default_legal_basis, + }], + }) + } } + const updateActivity = (id: string, updates: Partial) => { + onChange({ + processingSystems: activities.map(a => a.id === id ? { ...a, ...updates } : a), + }) + } + + const toggleDataCategory = (activityId: string, categoryId: string) => { + const activity = activities.find(a => a.id === activityId) + if (!activity) return + const cats = activity.data_categories.includes(categoryId) + ? activity.data_categories.filter(c => c !== categoryId) + : [...activity.data_categories, categoryId] + updateActivity(activityId, { data_categories: cats }) + } + + const addCustomActivity = () => { + const id = `custom_${Date.now()}` + onChange({ + processingSystems: [...activities, { + id, + name: '', + purpose: '', + data_categories: [], + legal_basis: 'contract', + custom: true, + }], + }) + setExpandedActivity(id) + } + + const removeActivity = (id: string) => { + onChange({ processingSystems: activities.filter(a => a.id !== id) }) + if (expandedActivity === id) setExpandedActivity(null) + } + + // AI Systems const addAISystem = () => { - onChange({ aiSystems: [...aiSystems, { name: '', purpose: '', risk_category: 'limited', vendor: '', has_human_oversight: true }] }) + onChange({ aiSystems: [...aiSystems, { name: '', vendor: '', purpose: '', processes_personal_data: false }] }) } const removeAISystem = (i: number) => { onChange({ aiSystems: aiSystems.filter((_: AISystem, idx: number) => idx !== i) }) @@ -607,58 +787,254 @@ function StepSystemsAndAI({ return (
- {/* Processing Systems */} + {/* Processing Activities */}
-
-
-

IT-Systeme mit personenbezogenen Daten

-

Systeme, die personenbezogene Daten verarbeiten (fuer VVT-Generierung)

-
- +

Verarbeitungstätigkeiten

+

+ Wählen Sie aus, welche Verarbeitungstätigkeiten in Ihrem Unternehmen stattfinden. Diese bilden die Grundlage für Ihr Verarbeitungsverzeichnis (VVT) nach Art. 30 DSGVO. +

+ + {/* Template checkboxes */} +
+ {templates.map(template => { + const isActive = activeIds.has(template.id) + const activity = activities.find(a => a.id === template.id) + const isExpanded = expandedActivity === template.id + + return ( +
+
{ + if (!isActive) { + toggleActivity(template) + setExpandedActivity(template.id) + } else { + setExpandedActivity(isExpanded ? null : template.id) + } + }} + > + { + e.stopPropagation() + toggleActivity(template) + }} + className="w-4 h-4 text-purple-600 rounded focus:ring-purple-500 flex-shrink-0" + /> +
+ {template.name} +

{template.purpose}

+
+ {isActive && ( + + {activity?.data_categories.length || 0} Kategorien + + )} + {isActive && ( + + + + )} +
+ + {/* Expanded detail: data categories + legal basis */} + {isActive && isExpanded && activity && ( +
+ {/* Data Categories */} +
+ +
+ {DATA_CATEGORIES.map(cat => ( + + ))} +
+
+ + {/* Special Categories (Art. 9) */} +
+ +
+ {SPECIAL_DATA_CATEGORIES.map(cat => ( + + ))} +
+
+ + {/* Legal Basis */} +
+ + +
+ + {/* Remove button for template-based activities */} + +
+ )} +
+ ) + })}
- {systems.length === 0 && ( -
Noch keine Systeme hinzugefuegt
- )} -
- {systems.map((sys: ProcessingSystem, i: number) => ( -
-
- System {i + 1} - -
-
- updateSystem(i, { name: e.target.value })} placeholder="Name (z.B. SAP HR)" className="px-3 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-purple-500 focus:border-transparent" /> - updateSystem(i, { vendor: e.target.value })} placeholder="Hersteller" className="px-3 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-purple-500 focus:border-transparent" /> -
-
- - updateSystem(i, { personal_data_categories: e.target.value.split(',').map(s => s.trim()).filter(Boolean) })} placeholder="Datenkategorien (kommagetrennt)" className="px-3 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-purple-500 focus:border-transparent" /> + + {/* Custom activities */} + {activities.filter(a => a.custom).map(activity => ( +
+
setExpandedActivity(expandedActivity === activity.id ? null : activity.id)} + > + +
+ {activity.name || 'Neue Verarbeitungstätigkeit'}
+ + +
- ))} -
+ + {expandedActivity === activity.id && ( +
+
+ updateActivity(activity.id, { name: e.target.value })} + placeholder="Name der Verarbeitungstätigkeit" + className="px-3 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-purple-500 focus:border-transparent" + /> + updateActivity(activity.id, { purpose: e.target.value })} + placeholder="Zweck der Verarbeitung" + className="px-3 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-purple-500 focus:border-transparent" + /> +
+ + {/* Data Categories */} +
+ +
+ {DATA_CATEGORIES.map(cat => ( + + ))} +
+
+ + {/* Special Categories */} +
+ +
+ {SPECIAL_DATA_CATEGORIES.map(cat => ( + + ))} +
+
+ + {/* Legal Basis */} +
+ + +
+ + +
+ )} +
+ ))} + + {/* Add custom activity button */} +
- {/* AI Systems */} + {/* AI Systems — simplified */}
-
-
-

KI-Systeme

-

Strukturierter KI-Katalog fuer AI Act Compliance

-
+
+

KI-Systeme

+

+ Welche KI-Systeme setzen Sie ein? Die Risikoeinstufung nach AI Act ermittelt unser Tool automatisch. +

+ {aiSystems.length === 0 && ( -
Noch keine KI-Systeme
+
+ Noch keine KI-Systeme — falls Sie keine einsetzen, einfach leer lassen +
)}
{aiSystems.map((ai: AISystem, i: number) => ( @@ -668,22 +1044,19 @@ function StepSystemsAndAI({
- updateAISystem(i, { name: e.target.value })} placeholder="Name (z.B. Chatbot)" className="px-3 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-purple-500 focus:border-transparent" /> - updateAISystem(i, { vendor: e.target.value })} placeholder="Anbieter" className="px-3 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-purple-500 focus:border-transparent" /> -
- updateAISystem(i, { purpose: e.target.value })} placeholder="Zweck (z.B. Kundensupport)" className="w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-purple-500 focus:border-transparent" /> -
- - + updateAISystem(i, { name: e.target.value })} placeholder="Name (z.B. ChatGPT, Copilot)" className="px-3 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-purple-500 focus:border-transparent" /> + updateAISystem(i, { vendor: e.target.value })} placeholder="Anbieter (z.B. OpenAI, Microsoft)" className="px-3 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-purple-500 focus:border-transparent" />
+ updateAISystem(i, { purpose: e.target.value })} placeholder="Einsatzzweck (z.B. Kundensupport, Code-Assistenz)" className="w-full px-3 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-purple-500 focus:border-transparent" /> +
))}
@@ -1329,7 +1702,11 @@ export default function CompanyProfilePage() { employeeCount: '', annualRevenue: '', headquartersCountry: 'DE', + headquartersCountryOther: '', + headquartersStreet: '', + headquartersZip: '', headquartersCity: '', + headquartersState: '', hasInternationalLocations: false, internationalCountries: [], targetMarkets: [], @@ -1373,7 +1750,11 @@ export default function CompanyProfilePage() { employeeCount: data.employee_count || '', annualRevenue: data.annual_revenue || '', headquartersCountry: data.headquarters_country || 'DE', + headquartersCountryOther: data.headquarters_country_other || '', + headquartersStreet: data.headquarters_street || '', + headquartersZip: data.headquarters_zip || '', headquartersCity: data.headquarters_city || '', + headquartersState: data.headquarters_state || '', hasInternationalLocations: data.has_international_locations || false, internationalCountries: data.international_countries || [], targetMarkets: data.target_markets || [], @@ -1440,7 +1821,11 @@ export default function CompanyProfilePage() { employee_count: formData.employeeCount || '', annual_revenue: formData.annualRevenue || '', headquarters_country: formData.headquartersCountry || 'DE', + headquarters_country_other: formData.headquartersCountryOther || '', + headquarters_street: formData.headquartersStreet || '', + headquarters_zip: formData.headquartersZip || '', headquarters_city: formData.headquartersCity || '', + headquarters_state: formData.headquartersState || '', has_international_locations: formData.hasInternationalLocations || false, international_countries: formData.internationalCountries || [], target_markets: formData.targetMarkets || [], @@ -1699,9 +2084,9 @@ export default function CompanyProfilePage() {
{/* Content */} -
+
{/* Form */} -
+

@@ -1718,7 +2103,7 @@ export default function CompanyProfilePage() { {currentStep === 3 && } {currentStep === 4 && } {currentStep === 5 && } - {currentStep === 6 && } + {currentStep === 6 && } {currentStep === 7 && } {currentStep === 8 && showMachineBuilderStep && } @@ -1751,6 +2136,17 @@ export default function CompanyProfilePage() { {isLastStep ? 'Profil speichern & weiter' : 'Weiter'}

+ + {/* Generate Documents CTA (only when profile is complete) */} + {formData.isComplete && ( +
+

Dokumente generieren

+

+ Basierend auf Ihrem Profil können DSFA, VVT, TOM, Löschfristen und Pflichten automatisch als Entwürfe generiert werden. +

+ +
+ )}
@@ -1781,20 +2177,6 @@ export default function CompanyProfilePage() {
)} - - {/* Sidebar */} -
- {/* Generate Documents CTA */} - {formData.isComplete && ( -
-

Dokumente generieren

-

- Basierend auf Ihrem Profil können DSFA, VVT, TOM, Löschfristen und Pflichten automatisch als Entwürfe generiert werden. -

- -
- )} -
diff --git a/admin-compliance/lib/sdk/types.ts b/admin-compliance/lib/sdk/types.ts index 0e26140..f4f4559 100644 --- a/admin-compliance/lib/sdk/types.ts +++ b/admin-compliance/lib/sdk/types.ts @@ -163,7 +163,11 @@ export interface CompanyProfile { // Locations headquartersCountry: string // ISO country code, e.g., "DE" + headquartersCountryOther: string // Free text if country not in list + headquartersStreet: string + headquartersZip: string headquartersCity: string + headquartersState: string // Bundesland / Kanton / Region hasInternationalLocations: boolean internationalCountries: string[] // ISO country codes