'use client' /** * VVT - Verarbeitungsverzeichnis * * Art. 30 DSGVO - Verzeichnis von Verarbeitungstaetigkeiten */ import { useState } from 'react' import { PagePurpose } from '@/components/common/PagePurpose' interface ProcessingActivity { id: string name: string purpose: string legalBasis: string legalBasisDetail: string categories: string[] recipients: string[] thirdCountryTransfer: boolean thirdCountryDetails?: string retentionPeriod: string technicalMeasures: string[] lastReview: string status: 'active' | 'inactive' | 'review_needed' } export default function VVTPage() { const [expandedActivity, setExpandedActivity] = useState('user_accounts') const [filterStatus, setFilterStatus] = useState('all') const processingActivities: ProcessingActivity[] = [ { id: 'user_accounts', name: 'Nutzerkontenverwaltung', purpose: 'Bereitstellung und Verwaltung von Benutzerkonten fuer die Plattform-Nutzung', legalBasis: 'Art. 6 Abs. 1 lit. b DSGVO', legalBasisDetail: 'Vertragserfuellung - Notwendig zur Bereitstellung des Dienstes', categories: ['Name', 'E-Mail-Adresse', 'Passwort (gehasht)', 'Profilbild (optional)'], recipients: ['Keine externen Empfaenger'], thirdCountryTransfer: false, retentionPeriod: '3 Jahre nach Kontolöschung', technicalMeasures: ['Verschluesselung', 'Zugriffskontrolle', 'Audit-Logging'], lastReview: '2024-12-01', status: 'active' }, { id: 'consent_management', name: 'Einwilligungsverwaltung', purpose: 'Verwaltung und Dokumentation von Einwilligungen gemaess DSGVO', legalBasis: 'Art. 6 Abs. 1 lit. c DSGVO', legalBasisDetail: 'Rechtliche Verpflichtung - Nachweis der Einwilligung', categories: ['Benutzer-ID', 'Einwilligungstyp', 'Zeitstempel', 'IP-Adresse', 'Version'], recipients: ['DSB (Datenschutzbeauftragter)', 'Aufsichtsbehoerden bei Anfrage'], thirdCountryTransfer: false, retentionPeriod: '6 Jahre nach Widerruf (Nachweispflicht)', technicalMeasures: ['Unveraenderbarkeit', 'Zeitstempel', 'Audit-Trail'], lastReview: '2024-12-01', status: 'active' }, { id: 'learning_analytics', name: 'Lernfortschrittsanalyse', purpose: 'Analyse des Lernfortschritts zur Verbesserung der Lernerfahrung', legalBasis: 'Art. 6 Abs. 1 lit. a DSGVO', legalBasisDetail: 'Einwilligung - Nutzer stimmt der Analyse explizit zu', categories: ['Benutzer-ID', 'Lernaktivitaeten', 'Testergebnisse', 'Zeitaufwand'], recipients: ['Lehrer (aggregiert)', 'Eltern (mit Einwilligung)'], thirdCountryTransfer: false, retentionPeriod: 'Bis zum Ende des Schuljahres + 1 Jahr', technicalMeasures: ['Pseudonymisierung', 'Verschluesselung', 'Zugriffsbeschraenkung'], lastReview: '2024-11-15', status: 'active' }, { id: 'ai_processing', name: 'KI-gestuetzte Verarbeitung', purpose: 'Automatische Korrektur und Feedback-Generierung mittels KI', legalBasis: 'Art. 6 Abs. 1 lit. a DSGVO', legalBasisDetail: 'Einwilligung - Explizite Zustimmung zur KI-Verarbeitung', categories: ['Benutzer-ID', 'Eingabetexte', 'Generierte Bewertungen'], recipients: ['Ollama (lokal)', 'Optional: Cloud-LLM (mit Einwilligung)'], thirdCountryTransfer: true, thirdCountryDetails: 'OpenAI (USA) - nur bei expliziter Einwilligung, Standardvertragsklauseln', retentionPeriod: 'Sofortige Loeschung nach Verarbeitung (keine Speicherung)', technicalMeasures: ['Anonymisierung wo moeglich', 'Keine Speicherung bei Drittanbietern'], lastReview: '2024-12-01', status: 'review_needed' }, { id: 'support_requests', name: 'Support-Anfragen', purpose: 'Bearbeitung von Support- und Hilfe-Anfragen', legalBasis: 'Art. 6 Abs. 1 lit. b DSGVO', legalBasisDetail: 'Vertragserfuellung - Teil des Service-Angebots', categories: ['Name', 'E-Mail', 'Anfrage-Inhalt', 'Anhaenge'], recipients: ['Support-Team', 'Entwickler (bei technischen Problemen)'], thirdCountryTransfer: false, retentionPeriod: '2 Jahre nach Abschluss des Tickets', technicalMeasures: ['Zugriffskontrolle', 'Verschluesselung'], lastReview: '2024-10-01', status: 'active' }, { id: 'newsletter', name: 'Newsletter-Versand', purpose: 'Information ueber Updates, Features und relevante Bildungsthemen', legalBasis: 'Art. 6 Abs. 1 lit. a DSGVO', legalBasisDetail: 'Einwilligung - Double-Opt-In Verfahren', categories: ['E-Mail-Adresse', 'Anrede', 'Praeferenzen'], recipients: ['E-Mail-Provider (Mailpit/SMTP)'], thirdCountryTransfer: false, retentionPeriod: 'Bis zum Widerruf', technicalMeasures: ['Abmelde-Link in jeder E-Mail', 'Verschluesselung'], lastReview: '2024-11-01', status: 'active' }, { id: 'logging', name: 'System-Logging', purpose: 'Sicherheit, Fehleranalyse und Betrieb der Plattform', legalBasis: 'Art. 6 Abs. 1 lit. f DSGVO', legalBasisDetail: 'Berechtigtes Interesse - Sicherheit und Betrieb', categories: ['IP-Adresse', 'Zeitstempel', 'Anfrage-Details', 'User-Agent'], recipients: ['IT-Administratoren', 'Bei Sicherheitsvorfaellen: Behoerden'], thirdCountryTransfer: false, retentionPeriod: '90 Tage (Standard-Logs), 2 Jahre (Security-Logs)', technicalMeasures: ['IP-Anonymisierung nach 7 Tagen', 'Zugriffsbeschraenkung'], lastReview: '2024-12-01', status: 'active' }, ] const getStatusBadge = (status: string) => { switch (status) { case 'active': return Aktiv case 'inactive': return Inaktiv case 'review_needed': return Pruefung erforderlich default: return null } } const filteredActivities = filterStatus === 'all' ? processingActivities : processingActivities.filter(a => a.status === filterStatus) return (
{/* Header */}

Verarbeitungstaetigkeiten

{processingActivities.length} dokumentierte Taetigkeiten

{/* Filter */}
{[ { value: 'all', label: 'Alle' }, { value: 'active', label: 'Aktiv' }, { value: 'review_needed', label: 'Pruefung erforderlich' }, { value: 'inactive', label: 'Inaktiv' }, ].map(filter => ( ))}
{/* Activities List */}
{filteredActivities.map((activity) => (
{expandedActivity === activity.id && (
{/* Left Column */}

Rechtsgrundlage

{activity.legalBasis}

{activity.legalBasisDetail}

Datenkategorien

{activity.categories.map((cat, idx) => ( {cat} ))}

Empfaenger

    {activity.recipients.map((rec, idx) => (
  • {rec}
  • ))}
{/* Right Column */}

Loeschfrist

{activity.retentionPeriod}

{activity.thirdCountryTransfer && activity.thirdCountryDetails && (

Drittland-Transfer

{activity.thirdCountryDetails}

)}

Technische Massnahmen

{activity.technicalMeasures.map((measure, idx) => ( {measure} ))}

Letzte Pruefung

{activity.lastReview}

)}
))}
{/* Info */}

Pflicht zur Fuehrung

Gemaess Art. 30 DSGVO ist jeder Verantwortliche verpflichtet, ein Verzeichnis aller Verarbeitungstaetigkeiten zu fuehren. Dieses Verzeichnis muss der Aufsichtsbehoerde auf Anfrage zur Verfuegung gestellt werden.

) }