'use client' import React, { useState, useCallback } from 'react' import { useRouter } from 'next/navigation' import { useSDK } from '@/lib/sdk' import { StepHeader, STEP_EXPLANATIONS } from '@/components/sdk/StepHeader' import { DocumentUploadSection, type UploadedDocument } from '@/components/sdk' // ============================================================================= // TYPES // ============================================================================= interface RetentionPolicy { id: string dataCategory: string description: string retentionPeriod: string legalBasis: string startEvent: string deletionMethod: string status: 'active' | 'review-needed' | 'expired' lastReview: Date nextReview: Date recordCount: number | null } // ============================================================================= // MOCK DATA // ============================================================================= const mockPolicies: RetentionPolicy[] = [ { id: 'ret-1', dataCategory: 'Personalakten', description: 'Beschaeftigtendaten und Gehaltsabrechnungen', retentionPeriod: '10 Jahre', legalBasis: 'Steuerrecht, Sozialversicherungsrecht', startEvent: 'Ende des Beschaeftigungsverhaeltnisses', deletionMethod: 'Automatische Loeschung nach Ablauf', status: 'active', lastReview: new Date('2024-01-01'), nextReview: new Date('2025-01-01'), recordCount: 245, }, { id: 'ret-2', dataCategory: 'Buchhaltungsbelege', description: 'Rechnungen, Kontoauszuege, Buchungsbelege', retentionPeriod: '10 Jahre', legalBasis: 'HGB, AO', startEvent: 'Ende des Kalenderjahres', deletionMethod: 'Manuelle Pruefung und Vernichtung', status: 'active', lastReview: new Date('2024-01-15'), nextReview: new Date('2025-01-15'), recordCount: 12450, }, { id: 'ret-3', dataCategory: 'Bewerbungsunterlagen', description: 'Lebenslaeufe, Anschreiben, Zeugnisse', retentionPeriod: '6 Monate', legalBasis: 'Berechtigtes Interesse (AGG-Frist)', startEvent: 'Absage oder Stellenbesetzung', deletionMethod: 'Automatische Loeschung', status: 'active', lastReview: new Date('2024-01-10'), nextReview: new Date('2024-07-10'), recordCount: 89, }, { id: 'ret-4', dataCategory: 'Marketing-Einwilligungen', description: 'Newsletter-Abonnements und Werbeeinwilligungen', retentionPeriod: 'Bis Widerruf', legalBasis: 'Einwilligung Art. 6 Abs. 1 lit. a DSGVO', startEvent: 'Widerruf der Einwilligung', deletionMethod: 'Sofortige Loeschung bei Widerruf', status: 'active', lastReview: new Date('2023-12-01'), nextReview: new Date('2024-06-01'), recordCount: 5623, }, { id: 'ret-5', dataCategory: 'Webserver-Logs', description: 'IP-Adressen, Zugriffszeiten, User-Agents', retentionPeriod: '7 Tage', legalBasis: 'Berechtigtes Interesse (IT-Sicherheit)', startEvent: 'Zeitpunkt des Zugriffs', deletionMethod: 'Automatische Rotation', status: 'active', lastReview: new Date('2024-01-20'), nextReview: new Date('2024-04-20'), recordCount: null, }, { id: 'ret-6', dataCategory: 'Kundenstammdaten', description: 'Name, Adresse, Kontaktdaten von Kunden', retentionPeriod: '3 Jahre nach letzter Interaktion', legalBasis: 'Vertragserfuellung, Berechtigtes Interesse', startEvent: 'Letzte Kundeninteraktion', deletionMethod: 'Pruefung und manuelle Loeschung', status: 'review-needed', lastReview: new Date('2023-06-01'), nextReview: new Date('2024-01-01'), recordCount: 8920, }, ] // ============================================================================= // COMPONENTS // ============================================================================= function PolicyCard({ policy }: { policy: RetentionPolicy }) { const statusColors = { active: 'bg-green-100 text-green-700 border-green-200', 'review-needed': 'bg-yellow-100 text-yellow-700 border-yellow-200', expired: 'bg-red-100 text-red-700 border-red-200', } const statusLabels = { active: 'Aktiv', 'review-needed': 'Pruefung erforderlich', expired: 'Abgelaufen', } const isReviewDue = policy.nextReview <= new Date() return (
{statusLabels[policy.status]} {policy.retentionPeriod}

{policy.dataCategory}

{policy.description}

Rechtsgrundlage: {policy.legalBasis}
Startereignis: {policy.startEvent}
Loeschmethode: {policy.deletionMethod}
Datensaetze: {policy.recordCount ? policy.recordCount.toLocaleString('de-DE') : 'N/A'}
Naechste Pruefung: {policy.nextReview.toLocaleDateString('de-DE')} {isReviewDue && ' (faellig)'}
) } // ============================================================================= // MAIN PAGE // ============================================================================= export default function LoeschfristenPage() { const router = useRouter() const { state } = useSDK() const [policies] = useState(mockPolicies) const [filter, setFilter] = useState('all') // Handle uploaded document const handleDocumentProcessed = useCallback((doc: UploadedDocument) => { console.log('[Loeschfristen Page] Document processed:', doc) }, []) // Open document in workflow editor const handleOpenInEditor = useCallback((doc: UploadedDocument) => { router.push(`/compliance/workflow?documentType=loeschfristen&documentId=${doc.id}&mode=change`) }, [router]) const filteredPolicies = filter === 'all' ? policies : policies.filter(p => p.status === filter) const activeCount = policies.filter(p => p.status === 'active').length const reviewNeededCount = policies.filter(p => p.status === 'review-needed' || p.nextReview <= new Date()).length const totalRecords = policies.reduce((sum, p) => sum + (p.recordCount || 0), 0) const stepInfo = STEP_EXPLANATIONS['loeschfristen'] return (
{/* Step Header */} {/* Document Upload Section */} {/* Stats */}
Datenkategorien
{policies.length}
Aktive Regeln
{activeCount}
Pruefung erforderlich
{reviewNeededCount}
Betroffene Datensaetze
{totalRecords.toLocaleString('de-DE')}
{/* Info Box */}

Hinweis zur Datenspeicherung

Nach Art. 5 Abs. 1 lit. e DSGVO duerfen personenbezogene Daten nur so lange gespeichert werden, wie es fuer die Zwecke, fuer die sie verarbeitet werden, erforderlich ist (Speicherbegrenzung).

{/* Filter */}
Filter: {['all', 'active', 'review-needed'].map(f => ( ))}
{/* Policies List */}
{filteredPolicies.map(policy => ( ))}
{filteredPolicies.length === 0 && (

Keine Loeschfristen gefunden

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

)}
) }