'use client' /** * Obligations Dashboard - Regulatory Obligations Overview * * Features: * - Organization facts input for assessment * - Applicable regulations based on sector/size * - Obligations list with filtering (by regulation, deadline, responsible) * - Incident reporting deadlines * - Executive summary and PDF export */ import { useState, useEffect } from 'react' import { PagePurpose } from '@/components/common/PagePurpose' // Types matching the backend interface Obligation { id: string regulation_id: string title: string description: string legal_basis: { norm: string; article?: string }[] category: string responsible: string deadline?: { type: 'absolute' | 'relative' date?: string duration?: string } sanctions?: { max_fine: string personal_liability?: boolean criminal?: boolean } evidence: string[] priority: 'critical' | 'high' | 'medium' | 'low' dependencies?: string[] iso27001_mapping?: string[] } interface ApplicableRegulation { id: string name: string classification: string reason: string obligation_count: number } interface IncidentDeadline { regulation_id: string phase: string deadline: string content: string recipient: string legal_basis: string } interface ExecutiveSummary { total_regulations: number total_obligations: number critical_obligations: number overdue_obligations: number upcoming_deadlines: number key_risks: string[] recommended_actions: string[] } interface SanctionsSummary { max_financial_risk: string personal_liability_risk: boolean criminal_risk: boolean summary: string } interface ObligationsOverview { id: string organization_name: string assessment_date: string applicable_regulations: ApplicableRegulation[] obligations: Obligation[] incident_deadlines: IncidentDeadline[] executive_summary: ExecutiveSummary sanctions_summary: SanctionsSummary } // NIS2 Sector Options const NIS2_SECTORS = { annex_i: [ { value: 'energy', label: 'Energie', description: 'Strom, Gas, Oel, Fernwaerme, Wasserstoff' }, { value: 'transport', label: 'Verkehr', description: 'Luft, Schiene, Wasser, Strasse' }, { value: 'banking', label: 'Bankwesen', description: 'Kreditinstitute' }, { value: 'financial_markets', label: 'Finanzmarktinfrastruktur', description: 'Handelsplaetze, zentrale Gegenparteien' }, { value: 'healthcare', label: 'Gesundheitswesen', description: 'Krankenhaeuser, Labore, Pharma' }, { value: 'utilities', label: 'Trinkwasser', description: 'Trinkwasserversorgung' }, { value: 'wastewater', label: 'Abwasser', description: 'Abwasserentsorgung' }, { value: 'digital_infrastructure', label: 'Digitale Infrastruktur', description: 'IXP, DNS, TLD, Cloud, Rechenzentren' }, { value: 'ict_services', label: 'ICT-Dienstleistungen', description: 'Managed Services, Managed Security' }, { value: 'public_administration', label: 'Oeffentliche Verwaltung', description: 'Zentralregierung' }, { value: 'space', label: 'Weltraum', description: 'Raumfahrtinfrastruktur' }, ], annex_ii: [ { value: 'postal', label: 'Post- und Kurierdienste', description: 'Postdienstleister' }, { value: 'waste_management', label: 'Abfallbewirtschaftung', description: 'Entsorgung, Recycling' }, { value: 'chemicals', label: 'Chemie', description: 'Herstellung, Produktion, Vertrieb' }, { value: 'food', label: 'Lebensmittel', description: 'Produktion, Verarbeitung, Grosshandel' }, { value: 'manufacturing', label: 'Verarbeitendes Gewerbe', description: 'Medizinprodukte, IT, Fahrzeuge, Maschinen' }, { value: 'digital_providers', label: 'Digitale Dienste', description: 'Online-Marktplaetze, Suchmaschinen, Social Media' }, { value: 'research', label: 'Forschung', description: 'Forschungseinrichtungen' }, ], other: [ { value: 'retail', label: 'Einzelhandel', description: 'Nicht NIS2-relevant' }, { value: 'education', label: 'Bildung', description: 'Schulen, Universitaeten (ggf. oeffentlich)' }, { value: 'other', label: 'Sonstige', description: 'Nicht in NIS2-Sektoren' }, ], } // Size categories const SIZE_CATEGORIES = [ { value: 'micro', label: 'Kleinstunternehmen', description: '< 10 MA, < 2 Mio. EUR Umsatz' }, { value: 'small', label: 'Kleines Unternehmen', description: '< 50 MA, < 10 Mio. EUR Umsatz' }, { value: 'medium', label: 'Mittleres Unternehmen', description: '< 250 MA, < 50 Mio. EUR Umsatz' }, { value: 'large', label: 'Grossunternehmen', description: '>= 250 MA oder >= 50 Mio. EUR Umsatz' }, ] // Special services (NIS2) const SPECIAL_SERVICES = [ { value: 'dns', label: 'DNS-Dienste', description: 'Authoritative oder rekursive DNS' }, { value: 'tld', label: 'TLD-Registry', description: 'Top-Level-Domain Registrierung' }, { value: 'cloud', label: 'Cloud-Computing', description: 'IaaS, PaaS, SaaS' }, { value: 'datacenter', label: 'Rechenzentrum', description: 'Co-Location, Housing' }, { value: 'cdn', label: 'CDN', description: 'Content Delivery Network' }, { value: 'trust_services', label: 'Vertrauensdienste', description: 'QTSP, Zertifikate' }, { value: 'msp', label: 'Managed Services', description: 'IT-Management fuer Dritte' }, { value: 'mssp', label: 'Managed Security', description: 'Security Services fuer Dritte' }, ] // AI Act High-Risk Categories (Annex III) const AI_HIGH_RISK_CATEGORIES = [ { value: 'biometric', label: 'Biometrische Identifizierung', description: 'Gesichtserkennung, Fingerabdruck' }, { value: 'critical_infrastructure', label: 'Kritische Infrastruktur', description: 'Wasser, Gas, Strom, Verkehr' }, { value: 'education', label: 'Bildung & Ausbildung', description: 'Zulassung, Bewertung von Lernenden' }, { value: 'employment', label: 'Beschaeftigung', description: 'Recruiting, Leistungsbewertung' }, { value: 'public_services', label: 'Oeffentliche Dienste', description: 'Sozialleistungen, Kreditwuerdigkeit' }, { value: 'law_enforcement', label: 'Strafverfolgung', description: 'Risikoeinschaetzung, Polygraph' }, { value: 'migration', label: 'Migration & Asyl', description: 'Visumspruefung, Asylverfahren' }, { value: 'justice', label: 'Justiz', description: 'Rechtsprechung, Streitbeilegung' }, ] // AI System Types const AI_SYSTEM_TYPES = [ { value: 'chatbot', label: 'Chatbot / Conversational AI', description: 'Kundendialog, Support' }, { value: 'recommendation', label: 'Empfehlungssystem', description: 'Produkt-, Inhaltsempfehlungen' }, { value: 'analytics', label: 'Predictive Analytics', description: 'Vorhersagen, Forecasting' }, { value: 'document_processing', label: 'Dokumentenverarbeitung', description: 'OCR, NER, Klassifizierung' }, { value: 'image_recognition', label: 'Bilderkennung', description: 'Objekterkennung, Qualitaetspruefung' }, { value: 'voice_recognition', label: 'Spracherkennung', description: 'Speech-to-Text, Stimmanalyse' }, { value: 'generative', label: 'Generative KI', description: 'Text-, Bild-, Code-Generierung' }, { value: 'decision_support', label: 'Entscheidungsunterstuetzung', description: 'Automatisierte Entscheidungen' }, ] const PRIORITY_COLORS = { critical: { bg: 'bg-red-100', text: 'text-red-800', border: 'border-red-300' }, high: { bg: 'bg-orange-100', text: 'text-orange-800', border: 'border-orange-300' }, medium: { bg: 'bg-yellow-100', text: 'text-yellow-800', border: 'border-yellow-300' }, low: { bg: 'bg-green-100', text: 'text-green-800', border: 'border-green-300' }, } const CATEGORY_ICONS: Record = { meldepflicht: '๐Ÿ“‹', governance: '๐Ÿ‘”', technisch: '๐Ÿ”ง', personal: '๐Ÿ‘ฅ', lieferkette: '๐Ÿ”—', audit: '๐Ÿ“Š', } export default function ObligationsPage() { // Assessment input state const [organizationName, setOrganizationName] = useState('') const [sector, setSector] = useState('') const [sizeCategory, setSizeCategory] = useState('') const [specialServices, setSpecialServices] = useState([]) const [isKritis, setIsKritis] = useState(false) const [isPartOfGroup, setIsPartOfGroup] = useState(false) const [processesPersonalData, setProcessesPersonalData] = useState(true) const [usesAI, setUsesAI] = useState(false) const [country, setCountry] = useState('DE') // AI Act specific state const [aiHighRiskCategories, setAiHighRiskCategories] = useState([]) const [aiSystemTypes, setAiSystemTypes] = useState([]) const [isGPAIProvider, setIsGPAIProvider] = useState(false) const [aiUsesPublicSpaces, setAiUsesPublicSpaces] = useState(false) const [aiAffectsEmployees, setAiAffectsEmployees] = useState(false) // Export state const [exporting, setExporting] = useState(false) const [exportFormat, setExportFormat] = useState<'pdf' | 'markdown'>('pdf') // Assessment result state const [overview, setOverview] = useState(null) const [loading, setLoading] = useState(false) const [error, setError] = useState(null) // Filter state const [filterRegulation, setFilterRegulation] = useState('all') const [filterPriority, setFilterPriority] = useState('all') const [filterResponsible, setFilterResponsible] = useState('all') const [activeTab, setActiveTab] = useState<'all' | 'by-deadline' | 'by-regulation' | 'by-responsible'>('all') // Check for stored assessment useEffect(() => { const stored = localStorage.getItem('obligations_assessment') if (stored) { try { setOverview(JSON.parse(stored)) } catch (e) { console.error('Failed to parse stored assessment:', e) } } }, []) const runAssessment = async () => { setLoading(true) setError(null) // Build facts from inputs const facts = { organization: { employee_count: sizeCategory === 'micro' ? 5 : sizeCategory === 'small' ? 30 : sizeCategory === 'medium' ? 150 : 500, annual_revenue: sizeCategory === 'micro' ? 1000000 : sizeCategory === 'small' ? 5000000 : sizeCategory === 'medium' ? 30000000 : 100000000, country: country, is_part_of_group: isPartOfGroup, eu_member: ['DE', 'AT', 'FR', 'IT', 'ES', 'NL', 'BE', 'PL'].includes(country), }, sector: { primary_sector: sector, special_services: specialServices, is_kritis: isKritis, kritis_threshold_met: isKritis, }, data_protection: { processes_personal_data: processesPersonalData, }, ai_usage: { uses_ai: usesAI, high_risk_categories: aiHighRiskCategories, system_types: aiSystemTypes, is_gpai_provider: isGPAIProvider, public_spaces_biometric: aiUsesPublicSpaces, affects_employees: aiAffectsEmployees, }, } try { // Try to call the SDK backend const res = await fetch('/api/sdk/v1/ucca/obligations/assess', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ facts, organization_name: organizationName, }), }) if (res.ok) { const data = await res.json() setOverview(data.overview) localStorage.setItem('obligations_assessment', JSON.stringify(data.overview)) } else { // Fallback: Generate mock data for demo const mockOverview = generateMockOverview(organizationName, sector, sizeCategory, specialServices, isKritis, usesAI, aiHighRiskCategories) setOverview(mockOverview) localStorage.setItem('obligations_assessment', JSON.stringify(mockOverview)) } } catch (err) { console.error('Assessment failed:', err) // Generate mock data for demo const mockOverview = generateMockOverview(organizationName, sector, sizeCategory, specialServices, isKritis, usesAI, aiHighRiskCategories) setOverview(mockOverview) localStorage.setItem('obligations_assessment', JSON.stringify(mockOverview)) } finally { setLoading(false) } } const clearAssessment = () => { setOverview(null) localStorage.removeItem('obligations_assessment') } const exportMemo = async () => { if (!overview) return setExporting(true) try { // Try SDK export endpoint first const res = await fetch('/api/sdk/v1/ucca/obligations/export/direct', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ overview: overview, format: exportFormat, language: 'de', }), }) if (res.ok) { const data = await res.json() if (exportFormat === 'pdf' && data.content) { // Decode base64 and download PDF const byteCharacters = atob(data.content) const byteNumbers = new Array(byteCharacters.length) for (let i = 0; i < byteCharacters.length; i++) { byteNumbers[i] = byteCharacters.charCodeAt(i) } const byteArray = new Uint8Array(byteNumbers) const blob = new Blob([byteArray], { type: 'application/pdf' }) const url = URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = data.filename || `pflichten-memo-${new Date().toISOString().split('T')[0]}.pdf` document.body.appendChild(a) a.click() document.body.removeChild(a) URL.revokeObjectURL(url) setExporting(false) return } else if (data.content) { // Download markdown const blob = new Blob([data.content], { type: 'text/markdown;charset=utf-8' }) const url = URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = data.filename || `pflichten-memo-${new Date().toISOString().split('T')[0]}.md` document.body.appendChild(a) a.click() document.body.removeChild(a) URL.revokeObjectURL(url) setExporting(false) return } } } catch (err) { console.error('SDK export failed, falling back to local export:', err) } // Fallback: Generate markdown locally let content = `# Pflichten-Uebersicht fuer die Geschaeftsfuehrung\n\n` content += `**Datum:** ${new Date(overview.assessment_date).toLocaleDateString('de-DE')}\n` content += `**Organisation:** ${overview.organization_name || 'Nicht angegeben'}\n\n` content += `---\n\n` content += `## Executive Summary\n\n` content += `| Kennzahl | Wert |\n` content += `|----------|------|\n` content += `| Anwendbare Regulierungen | ${overview.executive_summary.total_regulations} |\n` content += `| Gesamtzahl Pflichten | ${overview.executive_summary.total_obligations} |\n` content += `| Kritische Pflichten | ${overview.executive_summary.critical_obligations} |\n` content += `| Ueberfaellige Pflichten | ${overview.executive_summary.overdue_obligations} |\n\n` if (overview.executive_summary.key_risks.length > 0) { content += `### Hauptrisiken\n\n` overview.executive_summary.key_risks.forEach(risk => { content += `- ${risk}\n` }) content += `\n` } if (overview.executive_summary.recommended_actions.length > 0) { content += `### Empfohlene Massnahmen\n\n` overview.executive_summary.recommended_actions.forEach((action, i) => { content += `${i + 1}. ${action}\n` }) content += `\n` } content += `## Anwendbare Regulierungen\n\n` overview.applicable_regulations.forEach(reg => { content += `### ${reg.name}\n` content += `- **Klassifizierung:** ${reg.classification}\n` content += `- **Begruendung:** ${reg.reason}\n` content += `- **Anzahl Pflichten:** ${reg.obligation_count}\n\n` }) content += `## Sanktionsrisiken\n\n` content += `${overview.sanctions_summary.summary}\n\n` if (overview.sanctions_summary.max_financial_risk) { content += `- **Maximales Bussgeld:** ${overview.sanctions_summary.max_financial_risk}\n` } if (overview.sanctions_summary.personal_liability_risk) { content += `- **Persoenliche Haftung:** Ja\n` } content += `\n` content += `## Kritische Pflichten\n\n` overview.obligations .filter(o => o.priority === 'critical') .forEach(obl => { content += `### ${obl.id}: ${obl.title}\n\n` content += `${obl.description}\n\n` content += `- **Verantwortlich:** ${obl.responsible}\n` if (obl.deadline) { content += `- **Frist:** ${obl.deadline.date || obl.deadline.duration}\n` } content += `\n` }) if (overview.incident_deadlines.length > 0) { content += `## Meldepflichten bei Sicherheitsvorfaellen\n\n` content += `| Phase | Frist | Empfaenger |\n` content += `|-------|-------|------------|\n` overview.incident_deadlines.forEach(d => { content += `| ${d.phase} | ${d.deadline} | ${d.recipient} |\n` }) content += `\n` } content += `---\n\n` content += `*Dieses Dokument wurde automatisch generiert und ersetzt keine Rechtsberatung.*\n` // Download as markdown const blob = new Blob([content], { type: 'text/markdown;charset=utf-8' }) const url = URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = `pflichten-memo-${new Date().toISOString().split('T')[0]}.md` document.body.appendChild(a) a.click() document.body.removeChild(a) URL.revokeObjectURL(url) setExporting(false) } // Filter obligations const filteredObligations = overview?.obligations.filter(o => { if (filterRegulation !== 'all' && o.regulation_id !== filterRegulation) return false if (filterPriority !== 'all' && o.priority !== filterPriority) return false if (filterResponsible !== 'all' && o.responsible !== filterResponsible) return false return true }) || [] // Group obligations const obligationsByRegulation = overview?.obligations.reduce((acc, o) => { if (!acc[o.regulation_id]) acc[o.regulation_id] = [] acc[o.regulation_id].push(o) return acc }, {} as Record) || {} const obligationsByResponsible = overview?.obligations.reduce((acc, o) => { if (!acc[o.responsible]) acc[o.responsible] = [] acc[o.responsible].push(o) return acc }, {} as Record) || {} // Get unique values for filters const uniqueRegulations = [...new Set(overview?.obligations.map(o => o.regulation_id) || [])] const uniqueResponsibles = [...new Set(overview?.obligations.map(o => o.responsible) || [])] return (
{/* Assessment Form or Results */} {!overview ? (

Pflichten-Assessment starten

Geben Sie Ihre Unternehmensdaten ein, um automatisch zu ermitteln, welche regulatorischen Pflichten fuer Sie gelten.

{/* Organization Name */}
setOrganizationName(e.target.value)} placeholder="z.B. Muster GmbH" className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500" />
{/* Country */}
{/* Sector */}
{/* Size Category */}
{/* Part of Group */}
{/* Special Services */}
{SPECIAL_SERVICES.map(service => ( ))}
{/* Additional flags */}
{/* AI Act Specific Questions - shown when usesAI is true */} {usesAI && ( <>

๐Ÿค– AI Act Details

{/* AI System Types */}
{AI_SYSTEM_TYPES.map(type => ( ))}
{/* High-Risk Categories */}
{AI_HIGH_RISK_CATEGORIES.map(cat => ( ))}
{/* Additional AI flags */}
)}
{/* Submit Button */}
) : ( <> {/* Results Header */}

Pflichten-Assessment: {overview.organization_name || 'Unbenannt'}

Erstellt am {new Date(overview.assessment_date).toLocaleDateString('de-DE')}

{/* Export Format Toggle */}
{/* Executive Summary Cards */}

Regulierungen

{overview.executive_summary.total_regulations}

anwendbar

Pflichten

{overview.executive_summary.total_obligations}

gesamt

Kritisch

{overview.executive_summary.critical_obligations}

hoechste Prioritaet

Ueberfaellig

{overview.executive_summary.overdue_obligations}

sofort handeln

Max. Risiko

{overview.sanctions_summary.max_financial_risk}

{overview.sanctions_summary.personal_liability_risk ? '+ pers. Haftung' : ''}

{/* Applicable Regulations */}

Anwendbare Regulierungen

{overview.applicable_regulations.map(reg => (
{reg.name} {reg.obligation_count} Pflichten

Klassifizierung: {reg.classification}

{reg.reason}

))}
{/* Incident Deadlines */} {overview.incident_deadlines.length > 0 && (

Meldepflichten bei Sicherheitsvorfaellen

{overview.incident_deadlines.map((deadline, i) => ( ))}
Phase Frist Empfaenger Inhalt
{deadline.phase} {deadline.deadline} {deadline.recipient} {deadline.content}
)} {/* Obligations List with Filters */}

Pflichten ({filteredObligations.length})

{/* Obligations Table */}
{filteredObligations.map(obl => { const priorityColors = PRIORITY_COLORS[obl.priority] return ( ) })}
ID Pflicht Kategorie Verantwortlich Frist Prioritaet Sanktion
{obl.id}

{obl.title}

{obl.description}

{CATEGORY_ICONS[obl.category.toLowerCase()] || '๐Ÿ“‹'} {obl.category} {obl.responsible} {obl.deadline ? ( {obl.deadline.date ? new Date(obl.deadline.date).toLocaleDateString('de-DE') : obl.deadline.duration} ) : ( - )} {obl.priority === 'critical' ? 'Kritisch' : obl.priority === 'high' ? 'Hoch' : obl.priority === 'medium' ? 'Mittel' : 'Niedrig'} {obl.sanctions ? (

{obl.sanctions.max_fine}

{obl.sanctions.personal_liability && (

+ pers. Haftung

)}
) : ( - )}
{/* Key Risks and Recommendations */}
{/* Key Risks */}

โš ๏ธ Hauptrisiken

    {overview.executive_summary.key_risks.map((risk, i) => (
  • โ€ข {risk}
  • ))}
{/* Recommendations */}

โœ… Empfohlene Massnahmen

    {overview.executive_summary.recommended_actions.map((action, i) => (
  1. {i + 1}. {action}
  2. ))}
)}
) } // Mock data generator for demo purposes function generateMockOverview( orgName: string, sector: string, sizeCategory: string, specialServices: string[], isKritis: boolean, usesAI: boolean = false, aiHighRiskCategories: string[] = [] ): ObligationsOverview { const isEssential = sizeCategory === 'large' || isKritis || specialServices.length > 0 const isImportant = sizeCategory === 'medium' && !isEssential const isNIS2Affected = isEssential || isImportant const isAIHighRisk = usesAI && aiHighRiskCategories.length > 0 const regulations: ApplicableRegulation[] = [ { id: 'dsgvo', name: 'DSGVO', classification: 'Anwendbar', reason: 'Verarbeitung personenbezogener Daten', obligation_count: 8, }, ] if (isNIS2Affected) { regulations.push({ id: 'nis2', name: 'NIS2-Richtlinie / BSIG-E', classification: isEssential ? 'Besonders wichtige Einrichtung' : 'Wichtige Einrichtung', reason: isEssential ? 'Sektor in Anhang I und Groessenkriterien erfuellt' : 'Sektor in Anhang II und mittleres Unternehmen', obligation_count: isEssential ? 14 : 12, }) } if (usesAI) { regulations.push({ id: 'ai_act', name: 'EU AI Act', classification: isAIHighRisk ? 'Hochrisiko-KI' : 'Begrenztes Risiko', reason: isAIHighRisk ? 'KI-Einsatz in Hochrisiko-Kategorien (Annex III)' : 'KI-Einsatz mit Transparenzpflichten', obligation_count: isAIHighRisk ? 8 : 3, }) } const obligations: Obligation[] = [] // NIS2 Obligations if (isNIS2Affected) { obligations.push( { id: 'NIS2-OBL-001', regulation_id: 'nis2', title: 'BSI-Registrierung', description: 'Registrierung beim BSI ueber das Meldeportal mit Kontaktdaten, IP-Bereichen und Zustaendigkeiten.', legal_basis: [{ norm: 'ยง 33 BSIG-E' }], category: 'Meldepflicht', responsible: 'Geschaeftsfuehrung', deadline: { type: 'absolute', date: '2025-01-17' }, sanctions: { max_fine: '500.000 EUR' }, evidence: ['Registrierungsbestaetigung BSI'], priority: 'critical', }, { id: 'NIS2-OBL-002', regulation_id: 'nis2', title: 'Risikomanagement-Massnahmen', description: 'Implementierung angemessener technischer und organisatorischer Massnahmen zur Beherrschung von Risiken.', legal_basis: [{ norm: 'Art. 21 NIS2' }, { norm: 'ยง 30 BSIG-E' }], category: 'Technisch', responsible: 'CISO', deadline: { type: 'relative', duration: '18 Monate nach Inkrafttreten' }, sanctions: { max_fine: '10 Mio. EUR oder 2% Jahresumsatz', personal_liability: true }, evidence: ['ISMS-Dokumentation', 'Risikoanalyse'], priority: 'high', }, { id: 'NIS2-OBL-003', regulation_id: 'nis2', title: 'Schulung Leitungsorgane', description: 'Regelmaessige Schulung der Geschaeftsfuehrung zu Cyberrisiken und Risikomanagement.', legal_basis: [{ norm: 'Art. 20 Abs. 2 NIS2' }], category: 'Personal', responsible: 'Geschaeftsfuehrung', deadline: { type: 'relative', duration: 'Jaehrlich' }, sanctions: { max_fine: '10 Mio. EUR', personal_liability: true }, evidence: ['Schulungsnachweise'], priority: 'high', }, { id: 'NIS2-OBL-004', regulation_id: 'nis2', title: 'Incident-Meldeprozess', description: 'Etablierung eines 24h/72h/1M Meldeprozesses fuer Sicherheitsvorfaelle an das BSI.', legal_basis: [{ norm: 'ยง 32 BSIG-E' }], category: 'Meldepflicht', responsible: 'CISO', sanctions: { max_fine: '500.000 EUR' }, evidence: ['Meldeprozess-Dokumentation', 'Erreichbarkeit 24/7'], priority: 'critical', }, { id: 'NIS2-OBL-005', regulation_id: 'nis2', title: 'Supply-Chain-Security', description: 'Sicherheitsanforderungen an Lieferanten und Dienstleister vertraglich festlegen.', legal_basis: [{ norm: 'Art. 21 Abs. 2 lit. d NIS2' }], category: 'Lieferkette', responsible: 'Einkauf / CISO', evidence: ['Lieferantenvertraege', 'Sicherheitsanforderungen'], priority: 'medium', } ) if (isEssential) { obligations.push({ id: 'NIS2-OBL-006', regulation_id: 'nis2', title: 'Regelmaessige Sicherheitspruefungen', description: 'Durchfuehrung regelmaessiger Audits und Penetrationstests (nur besonders wichtige Einrichtungen).', legal_basis: [{ norm: 'ยง 39 BSIG-E' }], category: 'Audit', responsible: 'CISO', deadline: { type: 'relative', duration: 'Alle 2 Jahre' }, sanctions: { max_fine: '10 Mio. EUR' }, evidence: ['Audit-Berichte', 'Pentest-Reports'], priority: 'high', }) } } // DSGVO Obligations obligations.push( { id: 'DSGVO-OBL-001', regulation_id: 'dsgvo', title: 'Verarbeitungsverzeichnis fuehren', description: 'Dokumentation aller Verarbeitungstaetigkeiten gemaess Art. 30 DSGVO.', legal_basis: [{ norm: 'Art. 30 DSGVO' }], category: 'Governance', responsible: 'DSB', sanctions: { max_fine: '10 Mio. EUR oder 2% Jahresumsatz' }, evidence: ['VVT-Dokumentation'], priority: 'high', }, { id: 'DSGVO-OBL-002', regulation_id: 'dsgvo', title: 'Technische und organisatorische Massnahmen', description: 'Implementierung angemessener TOMs zum Schutz personenbezogener Daten.', legal_basis: [{ norm: 'Art. 32 DSGVO' }], category: 'Technisch', responsible: 'IT-Leitung', sanctions: { max_fine: '10 Mio. EUR' }, evidence: ['TOM-Dokumentation'], priority: 'high', }, { id: 'DSGVO-OBL-003', regulation_id: 'dsgvo', title: 'Datenschutz-Folgenabschaetzung', description: 'DSFA bei Verarbeitungen mit hohem Risiko fuer Betroffene.', legal_basis: [{ norm: 'Art. 35 DSGVO' }], category: 'Governance', responsible: 'DSB', sanctions: { max_fine: '10 Mio. EUR' }, evidence: ['DSFA-Dokumentation'], priority: 'medium', } ) // AI Act Obligations if (usesAI) { // Transparency obligations for all AI systems obligations.push({ id: 'AIACT-OBL-001', regulation_id: 'ai_act', title: 'Transparenzpflichten', description: 'Nutzer muessen informiert werden, dass sie mit einem KI-System interagieren.', legal_basis: [{ norm: 'Art. 50 AI Act' }], category: 'Compliance', responsible: 'KI-Verantwortlicher', deadline: { type: 'absolute', date: '2025-08-02' }, sanctions: { max_fine: '15 Mio. EUR oder 3% Jahresumsatz' }, evidence: ['Transparenzhinweise', 'Nutzerschnittstellen-Screenshots'], priority: 'high', }) if (isAIHighRisk) { // High-risk AI obligations obligations.push( { id: 'AIACT-OBL-002', regulation_id: 'ai_act', title: 'Risikomanagement-System', description: 'Einrichtung, Dokumentation und Pflege eines Risikomanagement-Systems fuer das KI-System.', legal_basis: [{ norm: 'Art. 9 AI Act' }], category: 'Governance', responsible: 'KI-Verantwortlicher', deadline: { type: 'absolute', date: '2026-08-02' }, sanctions: { max_fine: '35 Mio. EUR oder 7% Jahresumsatz' }, evidence: ['Risikomanagement-Dokumentation', 'Risikoregister'], priority: 'critical', }, { id: 'AIACT-OBL-003', regulation_id: 'ai_act', title: 'Datengovernance', description: 'Sicherstellung hoher Datenqualitaet fuer Training, Validierung und Tests.', legal_basis: [{ norm: 'Art. 10 AI Act' }], category: 'Technisch', responsible: 'Data Engineer / KI-Team', sanctions: { max_fine: '35 Mio. EUR oder 7% Jahresumsatz' }, evidence: ['Datenqualitaetsberichte', 'Bias-Analysen'], priority: 'high', }, { id: 'AIACT-OBL-004', regulation_id: 'ai_act', title: 'Technische Dokumentation', description: 'Erstellung umfassender technischer Dokumentation vor Inbetriebnahme.', legal_basis: [{ norm: 'Art. 11 AI Act' }], category: 'Governance', responsible: 'KI-Verantwortlicher', sanctions: { max_fine: '35 Mio. EUR oder 7% Jahresumsatz' }, evidence: ['Technische Dokumentation', 'System-Architektur'], priority: 'high', }, { id: 'AIACT-OBL-005', regulation_id: 'ai_act', title: 'Menschliche Aufsicht', description: 'Massnahmen fuer wirksame menschliche Aufsicht waehrend des Betriebs.', legal_basis: [{ norm: 'Art. 14 AI Act' }], category: 'Governance', responsible: 'KI-Verantwortlicher', sanctions: { max_fine: '35 Mio. EUR oder 7% Jahresumsatz' }, evidence: ['Aufsichtskonzept', 'Eingriffsprozesse'], priority: 'critical', }, { id: 'AIACT-OBL-006', regulation_id: 'ai_act', title: 'Grundrechte-Folgenabschaetzung (FRIA)', description: 'Durchfuehrung einer Folgenabschaetzung fuer Grundrechte vor Einsatz.', legal_basis: [{ norm: 'Art. 27 AI Act' }], category: 'Compliance', responsible: 'KI-Verantwortlicher', deadline: { type: 'relative', duration: 'Vor Inbetriebnahme' }, sanctions: { max_fine: '15 Mio. EUR oder 3% Jahresumsatz' }, evidence: ['FRIA-Dokumentation'], priority: 'critical', } ) } } const incidentDeadlines: IncidentDeadline[] = isNIS2Affected ? [ { regulation_id: 'nis2', phase: 'Fruehwarnung', deadline: '24 Stunden', content: 'Erste Meldung ueber erheblichen Sicherheitsvorfall', recipient: 'BSI', legal_basis: 'ยง 32 Abs. 1 BSIG-E', }, { regulation_id: 'nis2', phase: 'Vorfallmeldung', deadline: '72 Stunden', content: 'Schweregrad, IoCs, erste Bewertung', recipient: 'BSI', legal_basis: 'ยง 32 Abs. 2 BSIG-E', }, { regulation_id: 'nis2', phase: 'Abschlussbericht', deadline: '1 Monat', content: 'Root Cause, ergriffene Massnahmen, Auswirkungen', recipient: 'BSI', legal_basis: 'ยง 32 Abs. 3 BSIG-E', }, { regulation_id: 'dsgvo', phase: 'Meldung Datenschutzverletzung', deadline: '72 Stunden', content: 'Meldung bei Verletzung des Schutzes personenbezogener Daten', recipient: 'Aufsichtsbehoerde', legal_basis: 'Art. 33 DSGVO', }, ] : [ { regulation_id: 'dsgvo', phase: 'Meldung Datenschutzverletzung', deadline: '72 Stunden', content: 'Meldung bei Verletzung des Schutzes personenbezogener Daten', recipient: 'Aufsichtsbehoerde', legal_basis: 'Art. 33 DSGVO', }, ] return { id: `assessment-${Date.now()}`, organization_name: orgName || 'Unbenannte Organisation', assessment_date: new Date().toISOString(), applicable_regulations: regulations, obligations: obligations, incident_deadlines: incidentDeadlines, executive_summary: { total_regulations: regulations.length, total_obligations: obligations.length, critical_obligations: obligations.filter(o => o.priority === 'critical').length, overdue_obligations: 0, upcoming_deadlines: obligations.filter(o => o.deadline?.date && new Date(o.deadline.date) < new Date('2025-03-01')).length, key_risks: [ ...(isNIS2Affected ? [ 'BSI-Registrierung bis 17.01.2025 erforderlich', 'Persoenliche Haftung der Geschaeftsfuehrung bei Verstoessen', 'Meldepflichten mit kurzen Fristen (24h/72h)', ] : []), ...(isAIHighRisk ? [ 'Hochrisiko-KI erfordert umfassende Dokumentation und Risikomanagement', 'Grundrechte-Folgenabschaetzung (FRIA) vor Inbetriebnahme erforderlich', 'Bussgelder bis 35 Mio. EUR oder 7% Jahresumsatz bei Verstoessen', ] : []), ...(usesAI && !isAIHighRisk ? [ 'KI-Transparenzpflichten ab August 2025', ] : []), 'DSGVO-Dokumentationspflichten muessen erfuellt werden', 'Bei Datenschutzverletzungen: 72h Meldefrist', ], recommended_actions: [ ...(isNIS2Affected ? [ 'Sofortige BSI-Registrierung einleiten', 'ISMS nach ISO 27001 oder BSI IT-Grundschutz aufbauen', 'Incident-Response-Plan mit 24h-Erreichbarkeit etablieren', ] : []), ...(isAIHighRisk ? [ 'KI-Risikomanagement-System aufbauen', 'Technische Dokumentation fuer KI-Systeme erstellen', 'FRIA durchfuehren und dokumentieren', 'Menschliche Aufsicht implementieren', ] : []), ...(usesAI && !isAIHighRisk ? [ 'Transparenzhinweise fuer KI-Interaktionen implementieren', ] : []), 'Verarbeitungsverzeichnis erstellen/aktualisieren', 'TOMs dokumentieren und regelmaessig pruefen', ], }, sanctions_summary: { max_financial_risk: isAIHighRisk ? '35 Mio. EUR oder 7% Jahresumsatz' : (isNIS2Affected ? '10 Mio. EUR oder 2% Jahresumsatz' : '10 Mio. EUR'), personal_liability_risk: isNIS2Affected, criminal_risk: false, summary: [ isNIS2Affected ? 'Hohe Sanktionsrisiken durch NIS2.' : '', isAIHighRisk ? 'Sehr hohe Bussgelder durch AI Act bei Hochrisiko-KI.' : '', usesAI && !isAIHighRisk ? 'Moderate Bussgelder bei AI Act Transparenzverletzungen.' : '', 'DSGVO-Bussgelder bis 10 Mio. EUR oder 2% des Jahresumsatzes.', isNIS2Affected ? 'Persoenliche Haftung der Geschaeftsfuehrung moeglich.' : '', ].filter(s => s).join(' '), }, } }