'use client' import React, { useState } from 'react' import { useSDK } from '@/lib/sdk' import { StepHeader, STEP_EXPLANATIONS } from '@/components/sdk/StepHeader' // ============================================================================= // TYPES // ============================================================================= interface Obligation { id: string title: string description: string source: string sourceArticle: string deadline: Date | null status: 'pending' | 'in-progress' | 'completed' | 'overdue' priority: 'critical' | 'high' | 'medium' | 'low' responsible: string linkedSystems: string[] } // ============================================================================= // MOCK DATA // ============================================================================= const mockObligations: Obligation[] = [ { id: 'obl-1', title: 'Risikomanagementsystem implementieren', description: 'Ein Risikomanagementsystem fuer das Hochrisiko-KI-System muss implementiert werden.', source: 'AI Act', sourceArticle: 'Art. 9', deadline: new Date('2024-06-01'), status: 'in-progress', priority: 'critical', responsible: 'IT Security', linkedSystems: ['Bewerber-Screening'], }, { id: 'obl-2', title: 'Technische Dokumentation erstellen', description: 'Umfassende technische Dokumentation fuer alle Hochrisiko-KI-Systeme.', source: 'AI Act', sourceArticle: 'Art. 11', deadline: new Date('2024-05-15'), status: 'pending', priority: 'high', responsible: 'Entwicklung', linkedSystems: ['Bewerber-Screening'], }, { id: 'obl-3', title: 'Datenschutzerklaerung aktualisieren', description: 'Die Datenschutzerklaerung muss an die neuen KI-Verarbeitungen angepasst werden.', source: 'DSGVO', sourceArticle: 'Art. 13/14', deadline: new Date('2024-02-01'), status: 'overdue', priority: 'high', responsible: 'Datenschutz', linkedSystems: ['Kundenservice Chatbot', 'Empfehlungsalgorithmus'], }, { id: 'obl-4', title: 'KI-Kennzeichnung implementieren', description: 'Nutzer muessen informiert werden, dass sie mit einem KI-System interagieren.', source: 'AI Act', sourceArticle: 'Art. 52', deadline: new Date('2024-03-01'), status: 'completed', priority: 'medium', responsible: 'UX Team', linkedSystems: ['Kundenservice Chatbot'], }, { id: 'obl-5', title: 'Menschliche Aufsicht sicherstellen', description: 'Prozesse fuer menschliche Aufsicht bei automatisierten Entscheidungen.', source: 'AI Act', sourceArticle: 'Art. 14', deadline: new Date('2024-04-01'), status: 'pending', priority: 'critical', responsible: 'Operations', linkedSystems: ['Bewerber-Screening'], }, ] // ============================================================================= // COMPONENTS // ============================================================================= function ObligationCard({ obligation }: { obligation: Obligation }) { const priorityColors = { critical: 'bg-red-100 text-red-700', high: 'bg-orange-100 text-orange-700', medium: 'bg-yellow-100 text-yellow-700', low: 'bg-green-100 text-green-700', } const statusColors = { pending: 'bg-gray-100 text-gray-600 border-gray-200', 'in-progress': 'bg-blue-100 text-blue-700 border-blue-200', completed: 'bg-green-100 text-green-700 border-green-200', overdue: 'bg-red-100 text-red-700 border-red-200', } const statusLabels = { pending: 'Ausstehend', 'in-progress': 'In Bearbeitung', completed: 'Abgeschlossen', overdue: 'Ueberfaellig', } const daysUntilDeadline = obligation.deadline ? Math.ceil((obligation.deadline.getTime() - new Date().getTime()) / (1000 * 60 * 60 * 24)) : null return (
{obligation.priority === 'critical' ? 'Kritisch' : obligation.priority === 'high' ? 'Hoch' : obligation.priority === 'medium' ? 'Mittel' : 'Niedrig'} {statusLabels[obligation.status]} {obligation.source} {obligation.sourceArticle}

{obligation.title}

{obligation.description}

Verantwortlich: {obligation.responsible}
{obligation.deadline && (
Frist: {obligation.deadline.toLocaleDateString('de-DE')} {daysUntilDeadline !== null && ( ({daysUntilDeadline < 0 ? `${Math.abs(daysUntilDeadline)} Tage ueberfaellig` : `${daysUntilDeadline} Tage`}) )}
)}
{obligation.linkedSystems.length > 0 && (
Betroffene Systeme: {obligation.linkedSystems.map(sys => ( {sys} ))}
)}
{obligation.status !== 'completed' && ( )}
) } // ============================================================================= // MAIN PAGE // ============================================================================= export default function ObligationsPage() { const { state } = useSDK() const [obligations] = useState(mockObligations) const [filter, setFilter] = useState('all') const filteredObligations = filter === 'all' ? obligations : obligations.filter(o => o.status === filter || o.priority === filter || o.source.toLowerCase().includes(filter)) const pendingCount = obligations.filter(o => o.status === 'pending').length const inProgressCount = obligations.filter(o => o.status === 'in-progress').length const overdueCount = obligations.filter(o => o.status === 'overdue').length const completedCount = obligations.filter(o => o.status === 'completed').length const stepInfo = STEP_EXPLANATIONS['obligations'] return (
{/* Step Header */} {/* Stats */}
Ausstehend
{pendingCount}
In Bearbeitung
{inProgressCount}
Ueberfaellig
{overdueCount}
Abgeschlossen
{completedCount}
{/* Urgent Alert */} {overdueCount > 0 && (

Achtung: {overdueCount} ueberfaellige Pflicht(en)

Diese Pflichten erfordern sofortige Aufmerksamkeit.

)} {/* Filter */}
Filter: {['all', 'overdue', 'pending', 'in-progress', 'completed', 'critical', 'ai'].map(f => ( ))}
{/* Obligations List */}
{filteredObligations .sort((a, b) => { // Sort by status priority: overdue > in-progress > pending > completed const statusOrder = { overdue: 0, 'in-progress': 1, pending: 2, completed: 3 } return statusOrder[a.status] - statusOrder[b.status] }) .map(obligation => ( ))}
{filteredObligations.length === 0 && (

Keine Pflichten gefunden

Passen Sie den Filter an oder fuegen Sie neue Pflichten hinzu.

)}
) }