'use client' import { useMemo, useState } from 'react' import { useVendorCompliance } from '@/lib/sdk/vendor-compliance' import { getTransferRequirement, ADEQUACY_DECISIONS, type AdequacyDecision } from '@/lib/sdk/vendor-compliance/adequacy-decisions' import Link from 'next/link' // ============================================================================ // Types // ============================================================================ interface TransferEntry { vendorId: string vendorName: string country: string isEU: boolean isAdequate: boolean mechanisms: string[] hasSCC: boolean hasTIA: boolean status: 'green' | 'yellow' | 'red' statusLabel: string } // ============================================================================ // Helpers // ============================================================================ function getTransferStatus( isEU: boolean, isAdequate: boolean, mechanisms: string[], hasSCC: boolean, ): { status: 'green' | 'yellow' | 'red'; label: string } { if (isEU) return { status: 'green', label: 'EU/EWR' } if (isAdequate) return { status: 'green', label: 'Angemessenheitsbeschluss' } if (hasSCC && mechanisms.length > 0) return { status: 'yellow', label: 'SCC vorhanden' } if (mechanisms.length > 0) return { status: 'yellow', label: 'Mechanismus vorhanden' } return { status: 'red', label: 'Kein Transfermechanismus' } } const statusColors = { green: 'bg-green-100 text-green-800', yellow: 'bg-amber-100 text-amber-800', red: 'bg-red-100 text-red-800', } const statusDots = { green: 'bg-green-500', yellow: 'bg-amber-500', red: 'bg-red-500', } // ============================================================================ // Component // ============================================================================ export default function TransfersPage() { const { vendors, contracts } = useVendorCompliance() const [filter, setFilter] = useState<'all' | 'green' | 'yellow' | 'red'>('all') // Build transfer entries from vendors with non-EU processing locations const transfers = useMemo(() => { if (!vendors) return [] const entries: TransferEntry[] = [] for (const vendor of vendors) { const locations = (vendor as Record).processingLocations as Array<{ country: string; isEU: boolean; isAdequate: boolean }> || [] const mechanisms = (vendor as Record).transferMechanisms as string[] || [] // Check if vendor has any SCC contract const vendorContracts = (contracts || []).filter( (c: Record) => c.vendorId === vendor.id ) const hasSCC = vendorContracts.some( (c: Record) => c.documentType === 'SCC' ) for (const loc of locations) { const { status, label } = getTransferStatus(loc.isEU, loc.isAdequate, mechanisms, hasSCC) entries.push({ vendorId: vendor.id, vendorName: vendor.name, country: loc.country, isEU: loc.isEU, isAdequate: loc.isAdequate, mechanisms, hasSCC, hasTIA: false, // TODO: Check if TIA document exists for this vendor status, statusLabel: label, }) } } return entries }, [vendors, contracts]) // Filter const filtered = filter === 'all' ? transfers : transfers.filter((t) => t.status === filter) // Stats const stats = useMemo(() => ({ total: transfers.length, eu: transfers.filter((t) => t.isEU).length, adequate: transfers.filter((t) => !t.isEU && t.isAdequate).length, thirdCountry: transfers.filter((t) => !t.isEU && !t.isAdequate).length, red: transfers.filter((t) => t.status === 'red').length, }), [transfers]) return (

Drittlandtransfers

Uebersicht aller Datenuebermittlungen nach Verarbeitungsstandort. Art. 44-49 DSGVO.

{/* Stats */}
Gesamt
{stats.total}
EU/EWR + Adequat
{stats.eu + stats.adequate}
Drittland (mit Mechanismus)
{stats.thirdCountry - stats.red}
Handlungsbedarf
{stats.red}
{/* Filter */}
{(['all', 'green', 'yellow', 'red'] as const).map((f) => ( ))}
{/* Table */}
{filtered.length === 0 ? ( ) : ( filtered.map((t, i) => ( )) )}
Status Vendor Land Mechanismus SCC TIA Aktionen
{transfers.length === 0 ? 'Keine Vendors mit Verarbeitungsstandorten erfasst.' : 'Keine Eintraege fuer den gewaehlten Filter.'}
{t.statusLabel} {t.vendorName} {t.country} {t.isEU && (EU)} {t.mechanisms.length > 0 ? t.mechanisms.join(', ') : Keiner} {t.hasSCC ? Vorhanden : -} {t.hasTIA ? Vorhanden : !t.isEU && !t.isAdequate ? Fehlt : -} {!t.isEU && !t.isAdequate && ( TIA erstellen )}
{/* Explanation: What do I need to do? */}

Was muss ich tun?

Wenn Ihr Unternehmen personenbezogene Daten an Empfaenger ausserhalb der EU/des EWR uebermittelt, muessen Sie sicherstellen, dass ein angemessenes Datenschutzniveau besteht. Es gibt drei Wege:

{/* Option 1: Adequacy */}
Angemessenheitsbeschluss

Die EU-Kommission hat fuer bestimmte Laender festgestellt, dass ein angemessenes Datenschutzniveau besteht. Fuer diese Laender sind keine SCC und kein TIA erforderlich.

{/* Option 2: DPF */}
DPF-Zertifizierung (nur USA)

US-Unternehmen koennen sich nach dem EU-US Data Privacy Framework zertifizieren. Pruefen Sie unter{' '} dataprivacyframework.gov {' '} ob Ihr US-Dienstleister zertifiziert ist. Falls ja: keine SCC/TIA noetig.

{/* Option 3: SCC + TIA */}
SCC + TIA erforderlich

Fuer alle anderen Drittlaender muessen Sie EU-Standardvertragsklauseln (SCC) abschliessen und ein Transfer Impact Assessment (TIA) durchfuehren. Beides finden Sie im{' '} Document Generator unter "Drittlandtransfer".

{/* Adequacy countries list */}
Laender mit Angemessenheitsbeschluss anzeigen ({ADEQUACY_DECISIONS.length} Laender)
{ADEQUACY_DECISIONS.map((d: AdequacyDecision) => ( ))}
Land Seit Einschraenkung
{d.countryName} {d.requiresCertification && ( Zertifizierung erforderlich )} {d.since} {d.restriction || d.expires || '—'}
{/* Schrems II info */}
Hintergrund — EuGH Schrems II: Der EuGH hat 2020 das EU-US Privacy Shield fuer ungueltig erklaert und klargestellt, dass bei Drittlandtransfers immer geprueft werden muss, ob die Gesetze des Empfaengerstaats den Schutz der uebermittelten Daten beeintraechtigen (z.B. durch Massenueberwachung oder fehlende Rechtsbehelfe). Das TIA dokumentiert genau diese Pruefung. Seit Juli 2023 gibt es mit dem EU-US Data Privacy Framework einen neuen Angemessenheitsbeschluss fuer DPF-zertifizierte US-Unternehmen.
) }