Files
breakpilot-compliance/admin-compliance/lib/sdk/vvt-baseline-catalog.ts
Benjamin Boenisch 4435e7ea0a Initial commit: breakpilot-compliance - Compliance SDK Platform
Services: Admin-Compliance, Backend-Compliance,
AI-Compliance-SDK, Consent-SDK, Developer-Portal,
PCA-Platform, DSMS

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 23:47:28 +01:00

631 lines
30 KiB
TypeScript

/**
* VVT Baseline-Katalog
*
* Vordefinierte Verarbeitungstaetigkeiten als Templates.
* Werden vom Profiling-Fragebogen (Generator) genutzt, um
* auf Basis der Antworten VVT-Eintraege vorzubefuellen.
*/
import type { VVTActivity, BusinessFunction } from './vvt-types'
export interface BaselineTemplate {
templateId: string
businessFunction: BusinessFunction
name: string
description: string
purposes: string[]
legalBases: { type: string; description?: string; reference?: string }[]
dataSubjectCategories: string[]
personalDataCategories: string[]
recipientCategories: { type: string; name: string; description?: string }[]
retentionPeriod: { duration?: number; durationUnit?: string; description: string; legalBasis?: string; deletionProcedure?: string }
tomDescription: string
structuredToms: {
accessControl: string[]
confidentiality: string[]
integrity: string[]
availability: string[]
separation: string[]
}
typicalSystems: string[]
protectionLevel: 'LOW' | 'MEDIUM' | 'HIGH'
dpiaRequired: boolean
tags: string[]
}
// =============================================================================
// BASELINE TEMPLATES
// =============================================================================
export const VVT_BASELINE_CATALOG: BaselineTemplate[] = [
// ==================== HR ====================
{
templateId: 'hr-mitarbeiterverwaltung',
businessFunction: 'hr',
name: 'Mitarbeiterverwaltung',
description: 'Verwaltung von Stammdaten, Vertraegen und Personalakten der Beschaeftigten',
purposes: ['Durchfuehrung des Beschaeftigungsverhaeltnisses', 'Personalverwaltung und -planung'],
legalBases: [
{ type: 'CONTRACT', description: 'Arbeitsvertrag', reference: 'Art. 6 Abs. 1 lit. b DSGVO' },
{ type: 'LEGAL_OBLIGATION', description: 'Arbeitsrechtliche Pflichten', reference: '§ 26 BDSG' },
],
dataSubjectCategories: ['EMPLOYEES'],
personalDataCategories: ['NAME', 'CONTACT', 'ADDRESS', 'DOB', 'SOCIAL_SECURITY', 'TAX_ID', 'BANK_ACCOUNT', 'EMPLOYMENT_DATA'],
recipientCategories: [
{ type: 'INTERNAL', name: 'Personalabteilung' },
{ type: 'AUTHORITY', name: 'Finanzamt' },
{ type: 'AUTHORITY', name: 'Sozialversicherungstraeger' },
],
retentionPeriod: { duration: 10, durationUnit: 'YEARS', description: '10 Jahre nach Ende des Beschaeftigungsverhaeltnisses', legalBasis: 'HGB § 257, AO § 147', deletionProcedure: 'Sichere Loeschung nach Ablauf' },
tomDescription: 'Zugriffskontrolle auf Personalakten, Verschluesselung, Protokollierung',
structuredToms: {
accessControl: ['RBAC', 'Need-to-know-Prinzip', 'Personalakten nur fuer HR'],
confidentiality: ['Verschluesselung personenbezogener Daten', 'Vertraulichkeitsvereinbarungen'],
integrity: ['Aenderungsprotokollierung', 'Vier-Augen-Prinzip bei Gehaltsaenderungen'],
availability: ['Regelmaessige Backups', 'Redundante Speicherung'],
separation: ['Trennung Personal-/Gehaltsdaten'],
},
typicalSystems: ['HR-Software', 'Gehaltsabrechnung', 'Dokumentenmanagement'],
protectionLevel: 'HIGH',
dpiaRequired: false,
tags: ['hr', 'mitarbeiter', 'personal'],
},
{
templateId: 'hr-gehaltsabrechnung',
businessFunction: 'hr',
name: 'Gehaltsabrechnung',
description: 'Berechnung und Auszahlung von Gehaeltern, Sozialabgaben und Steuern',
purposes: ['Lohn- und Gehaltsabrechnung', 'Erfuellung steuer- und sozialversicherungsrechtlicher Pflichten'],
legalBases: [
{ type: 'CONTRACT', description: 'Arbeitsvertrag', reference: 'Art. 6 Abs. 1 lit. b DSGVO' },
{ type: 'LEGAL_OBLIGATION', description: 'Steuer-/Sozialversicherungsrecht', reference: 'Art. 6 Abs. 1 lit. c DSGVO' },
],
dataSubjectCategories: ['EMPLOYEES'],
personalDataCategories: ['NAME', 'ADDRESS', 'SOCIAL_SECURITY', 'TAX_ID', 'BANK_ACCOUNT', 'SALARY_DATA'],
recipientCategories: [
{ type: 'PROCESSOR', name: 'Lohnbuero / Steuerberater' },
{ type: 'AUTHORITY', name: 'Finanzamt' },
{ type: 'AUTHORITY', name: 'Krankenkassen' },
],
retentionPeriod: { duration: 10, durationUnit: 'YEARS', description: '10 Jahre (steuerrechtlich)', legalBasis: 'AO § 147 Abs. 1 Nr. 1', deletionProcedure: 'Automatische Loeschung nach Fristablauf' },
tomDescription: 'Strenge Zugriffskontrolle, Verschluesselung, Trennung von Stamm- und Gehaltsdaten',
structuredToms: {
accessControl: ['Nur Lohnbuchhaltung/Steuerberater', 'MFA'],
confidentiality: ['Verschluesselung at-rest und in-transit', 'Vertraulichkeitsklausel'],
integrity: ['Revisionssichere Ablage', 'Pruefprotokoll'],
availability: ['Monatliche Backups', 'Jahresabschluss-Archiv'],
separation: ['Gehaltsdaten getrennt von allgemeinen Personaldaten'],
},
typicalSystems: ['DATEV', 'Lohnabrechnungssoftware'],
protectionLevel: 'HIGH',
dpiaRequired: false,
tags: ['hr', 'gehalt', 'lohn', 'steuer'],
},
{
templateId: 'hr-bewerbermanagement',
businessFunction: 'hr',
name: 'Bewerbermanagement',
description: 'Entgegennahme, Verwaltung und Bewertung von Bewerbungen',
purposes: ['Bearbeitung eingehender Bewerbungen', 'Bewerberauswahl'],
legalBases: [
{ type: 'CONTRACT', description: 'Vorvertragliche Massnahmen', reference: 'Art. 6 Abs. 1 lit. b DSGVO' },
{ type: 'LEGITIMATE_INTEREST', description: 'Bewerberauswahl', reference: '§ 26 Abs. 1 BDSG' },
],
dataSubjectCategories: ['APPLICANTS'],
personalDataCategories: ['NAME', 'CONTACT', 'ADDRESS', 'EDUCATION_DATA', 'EMPLOYMENT_DATA', 'PHOTO_VIDEO'],
recipientCategories: [
{ type: 'INTERNAL', name: 'Personalabteilung' },
{ type: 'INTERNAL', name: 'Fachabteilung' },
],
retentionPeriod: { duration: 6, durationUnit: 'MONTHS', description: '6 Monate nach Absage (AGG-Frist)', legalBasis: 'AGG § 15 Abs. 4', deletionProcedure: 'Automatische Loeschung 6 Monate nach Absage' },
tomDescription: 'Zugriffsbeschraenkung auf beteiligte Entscheidungstraeger, verschluesselte Uebertragung',
structuredToms: {
accessControl: ['Nur HR + Fachabteilung', 'Zeitlich begrenzter Zugriff'],
confidentiality: ['TLS fuer Bewerbungsportale', 'Verschluesselter E-Mail-Empfang'],
integrity: ['Unveraenderbare Bewerbungseingaenge'],
availability: ['Regelmaessige Backups'],
separation: ['Getrennte Bewerberdatenbank'],
},
typicalSystems: ['Bewerbermanagementsystem', 'E-Mail'],
protectionLevel: 'MEDIUM',
dpiaRequired: false,
tags: ['hr', 'bewerbung', 'recruiting'],
},
{
templateId: 'hr-zeiterfassung',
businessFunction: 'hr',
name: 'Zeiterfassung',
description: 'Erfassung von Arbeitszeiten, Urlaub und Fehlzeiten',
purposes: ['Arbeitszeiterfassung gemaess ArbZG', 'Urlaubsverwaltung'],
legalBases: [
{ type: 'LEGAL_OBLIGATION', description: 'Arbeitszeitgesetz', reference: 'Art. 6 Abs. 1 lit. c DSGVO, ArbZG § 16 Abs. 2' },
],
dataSubjectCategories: ['EMPLOYEES'],
personalDataCategories: ['NAME', 'EMPLOYMENT_DATA'],
recipientCategories: [
{ type: 'INTERNAL', name: 'Personalabteilung' },
{ type: 'INTERNAL', name: 'Vorgesetzte' },
],
retentionPeriod: { duration: 2, durationUnit: 'YEARS', description: '2 Jahre (ArbZG)', legalBasis: 'ArbZG § 16 Abs. 2', deletionProcedure: 'Automatische Loeschung' },
tomDescription: 'Zugriffskontrolle nach Abteilung, Protokollierung von Aenderungen',
structuredToms: {
accessControl: ['Vorgesetzte sehen nur eigene Abteilung', 'HR sieht alle'],
confidentiality: ['Krankmeldungen nur HR'],
integrity: ['Aenderungshistorie'],
availability: ['Taegliches Backup'],
separation: ['Trennung Zeitdaten / Gehaltsdaten'],
},
typicalSystems: ['Zeiterfassungssystem', 'HR-Software'],
protectionLevel: 'MEDIUM',
dpiaRequired: false,
tags: ['hr', 'zeiterfassung', 'arbeitszeit'],
},
// ==================== FINANCE ====================
{
templateId: 'finance-buchhaltung',
businessFunction: 'finance',
name: 'Buchhaltung & Rechnungswesen',
description: 'Finanzbuchhaltung, Rechnungsstellung und Zahlungsverkehr',
purposes: ['Finanzbuchhaltung', 'Rechnungsstellung', 'Erfuellung handels-/steuerrechtlicher Aufbewahrungspflichten'],
legalBases: [
{ type: 'LEGAL_OBLIGATION', description: 'HGB, AO', reference: 'Art. 6 Abs. 1 lit. c DSGVO' },
{ type: 'CONTRACT', description: 'Vertragserfuellung', reference: 'Art. 6 Abs. 1 lit. b DSGVO' },
],
dataSubjectCategories: ['CUSTOMERS', 'SUPPLIERS', 'BUSINESS_PARTNERS'],
personalDataCategories: ['NAME', 'CONTACT', 'ADDRESS', 'BANK_ACCOUNT', 'PAYMENT_DATA', 'CONTRACT_DATA', 'TAX_ID'],
recipientCategories: [
{ type: 'PROCESSOR', name: 'Steuerberater / Wirtschaftspruefer' },
{ type: 'AUTHORITY', name: 'Finanzamt' },
],
retentionPeriod: { duration: 10, durationUnit: 'YEARS', description: '10 Jahre (HGB) / 6 Jahre (Geschaeftsbriefe)', legalBasis: 'HGB § 257, AO § 147', deletionProcedure: 'Loeschung nach Ablauf der jeweiligen Frist' },
tomDescription: 'Zugriffskontrolle nach Vier-Augen-Prinzip, revisionssichere Archivierung',
structuredToms: {
accessControl: ['Vier-Augen-Prinzip', 'RBAC nach Buchhaltungsrollen'],
confidentiality: ['Verschluesselung Finanzdaten'],
integrity: ['Revisionssichere Archivierung (GoBD)', 'Aenderungsprotokoll'],
availability: ['Redundante Speicherung', 'Jaehrliche Backups'],
separation: ['Trennung Debitoren/Kreditoren'],
},
typicalSystems: ['DATEV', 'ERP-System', 'Buchhaltungssoftware'],
protectionLevel: 'MEDIUM',
dpiaRequired: false,
tags: ['finance', 'buchhaltung', 'rechnungswesen'],
},
{
templateId: 'finance-zahlungsverkehr',
businessFunction: 'finance',
name: 'Zahlungsverkehr',
description: 'Abwicklung von Zahlungen, SEPA-Lastschriften und Ueberweisungen',
purposes: ['Zahlungsabwicklung', 'Mahnwesen'],
legalBases: [
{ type: 'CONTRACT', description: 'Vertragserfuellung', reference: 'Art. 6 Abs. 1 lit. b DSGVO' },
],
dataSubjectCategories: ['CUSTOMERS', 'SUPPLIERS'],
personalDataCategories: ['NAME', 'BANK_ACCOUNT', 'PAYMENT_DATA'],
recipientCategories: [
{ type: 'PROCESSOR', name: 'Zahlungsdienstleister' },
{ type: 'PROCESSOR', name: 'Kreditinstitut' },
],
retentionPeriod: { duration: 10, durationUnit: 'YEARS', description: '10 Jahre', legalBasis: 'HGB § 257', deletionProcedure: 'Automatische Loeschung' },
tomDescription: 'PCI-DSS-konforme Verarbeitung, Verschluesselung, Zugriffsbeschraenkung',
structuredToms: {
accessControl: ['Streng limitierter Zugriff', 'MFA'],
confidentiality: ['TLS 1.3', 'Tokenisierung von Zahlungsdaten'],
integrity: ['Transaktionsprotokoll'],
availability: ['Hochverfuegbarer Zahlungsservice'],
separation: ['Zahlungsdaten getrennt von CRM'],
},
typicalSystems: ['Banking-Software', 'Payment Gateway'],
protectionLevel: 'HIGH',
dpiaRequired: false,
tags: ['finance', 'zahlung', 'payment'],
},
// ==================== SALES / CRM ====================
{
templateId: 'sales-kundenverwaltung',
businessFunction: 'sales_crm',
name: 'Kundenverwaltung (CRM)',
description: 'Verwaltung von Kundenbeziehungen, Kontakten und Vertriebsaktivitaeten',
purposes: ['Kundenbetreuung', 'Vertragserfuellung', 'Vertriebssteuerung'],
legalBases: [
{ type: 'CONTRACT', description: 'Kundenvertrag', reference: 'Art. 6 Abs. 1 lit. b DSGVO' },
{ type: 'LEGITIMATE_INTEREST', description: 'Kundenbindung', reference: 'Art. 6 Abs. 1 lit. f DSGVO' },
],
dataSubjectCategories: ['CUSTOMERS', 'PROSPECTIVE_CUSTOMERS', 'BUSINESS_PARTNERS'],
personalDataCategories: ['NAME', 'CONTACT', 'ADDRESS', 'CONTRACT_DATA', 'COMMUNICATION_DATA'],
recipientCategories: [
{ type: 'INTERNAL', name: 'Vertrieb' },
{ type: 'INTERNAL', name: 'Kundenservice' },
],
retentionPeriod: { duration: 3, durationUnit: 'YEARS', description: '3 Jahre nach letzter Interaktion (Verjaeherung)', legalBasis: 'BGB § 195', deletionProcedure: 'Loeschung nach Inaktivitaetsfrist' },
tomDescription: 'Zugriffskontrolle nach Kundengruppen, Verschluesselung, regemaessige Datenpflege',
structuredToms: {
accessControl: ['RBAC nach Vertriebsgebiet', 'Kundendaten-Owner'],
confidentiality: ['Verschluesselung in CRM', 'VPN fuer Fernzugriff'],
integrity: ['Aenderungshistorie im CRM'],
availability: ['Cloud-CRM mit SLA 99.9%'],
separation: ['Mandantentrennung'],
},
typicalSystems: ['CRM-System', 'E-Mail', 'Telefon'],
protectionLevel: 'MEDIUM',
dpiaRequired: false,
tags: ['sales', 'crm', 'kunden', 'vertrieb'],
},
{
templateId: 'sales-vertriebssteuerung',
businessFunction: 'sales_crm',
name: 'Vertriebssteuerung',
description: 'Analyse von Vertriebskennzahlen und Pipeline-Management',
purposes: ['Vertriebsoptimierung', 'Umsatzplanung'],
legalBases: [
{ type: 'LEGITIMATE_INTEREST', description: 'Unternehmenssteuerung', reference: 'Art. 6 Abs. 1 lit. f DSGVO' },
],
dataSubjectCategories: ['CUSTOMERS', 'PROSPECTIVE_CUSTOMERS'],
personalDataCategories: ['NAME', 'CONTRACT_DATA', 'COMMUNICATION_DATA'],
recipientCategories: [
{ type: 'INTERNAL', name: 'Vertriebsleitung' },
{ type: 'INTERNAL', name: 'Geschaeftsfuehrung' },
],
retentionPeriod: { duration: 3, durationUnit: 'YEARS', description: '3 Jahre', legalBasis: 'Berechtigtes Interesse', deletionProcedure: 'Anonymisierung nach Ablauf' },
tomDescription: 'Aggregierte Auswertungen wo moeglich, Zugriffsbeschraenkung auf Fuehrungsebene',
structuredToms: {
accessControl: ['Nur Management'],
confidentiality: ['Aggregierte Reports bevorzugt'],
integrity: ['Nachvollziehbare Berechnungen'],
availability: ['Dashboard-Verfuegbarkeit'],
separation: ['Reporting getrennt von Operativdaten'],
},
typicalSystems: ['CRM-System', 'BI-Tool'],
protectionLevel: 'LOW',
dpiaRequired: false,
tags: ['sales', 'vertrieb', 'reporting'],
},
// ==================== MARKETING ====================
{
templateId: 'marketing-newsletter',
businessFunction: 'marketing',
name: 'Newsletter-Marketing',
description: 'Versand von Marketing-E-Mails und Newslettern an Abonnenten',
purposes: ['Direktmarketing', 'Kundenbindung', 'Informationsversand'],
legalBases: [
{ type: 'CONSENT', description: 'Einwilligung zum Newsletter-Empfang', reference: 'Art. 6 Abs. 1 lit. a DSGVO, § 7 Abs. 2 UWG' },
],
dataSubjectCategories: ['NEWSLETTER_SUBSCRIBERS', 'CUSTOMERS'],
personalDataCategories: ['NAME', 'CONTACT', 'USAGE_DATA'],
recipientCategories: [
{ type: 'PROCESSOR', name: 'E-Mail-Dienstleister' },
{ type: 'INTERNAL', name: 'Marketing-Abteilung' },
],
retentionPeriod: { description: 'Bis zum Widerruf der Einwilligung', deletionProcedure: 'Sofortige Loeschung bei Abmeldung' },
tomDescription: 'Double-Opt-In, Abmeldelink in jeder E-Mail, Einwilligungsprotokollierung',
structuredToms: {
accessControl: ['Nur Marketing-Team'],
confidentiality: ['TLS-Versand', 'Keine Weitergabe an Dritte'],
integrity: ['Einwilligungsnachweis (Timestamp, IP, Version)'],
availability: ['Redundanter E-Mail-Service'],
separation: ['Newsletter-Liste getrennt von CRM'],
},
typicalSystems: ['Newsletter-Tool', 'E-Mail-Marketing-Plattform'],
protectionLevel: 'LOW',
dpiaRequired: false,
tags: ['marketing', 'newsletter', 'email'],
},
{
templateId: 'marketing-website-analytics',
businessFunction: 'marketing',
name: 'Website-Analytics',
description: 'Analyse des Nutzerverhaltens auf der Website mittels Tracking-Tools',
purposes: ['Website-Optimierung', 'Reichweitenmessung'],
legalBases: [
{ type: 'CONSENT', description: 'Cookie-Einwilligung', reference: 'Art. 6 Abs. 1 lit. a DSGVO, § 25 TDDDG' },
],
dataSubjectCategories: ['WEBSITE_USERS'],
personalDataCategories: ['IP_ADDRESS', 'DEVICE_ID', 'USAGE_DATA', 'LOCATION_DATA'],
recipientCategories: [
{ type: 'PROCESSOR', name: 'Analytics-Anbieter' },
{ type: 'INTERNAL', name: 'Marketing' },
],
retentionPeriod: { duration: 14, durationUnit: 'MONTHS', description: '14 Monate', deletionProcedure: 'Automatische Loeschung/Anonymisierung' },
tomDescription: 'IP-Anonymisierung, Cookie-Consent-Management, Opt-Out-Moeglichkeit',
structuredToms: {
accessControl: ['Nur Webanalyse-Team'],
confidentiality: ['IP-Anonymisierung', 'Pseudonymisierung'],
integrity: ['Datenqualitaetspruefung'],
availability: ['CDN-basiertes Tracking'],
separation: ['Analytics getrennt von personenbezogenen Profilen'],
},
typicalSystems: ['Matomo', 'Plausible', 'Google Analytics'],
protectionLevel: 'MEDIUM',
dpiaRequired: false,
tags: ['marketing', 'analytics', 'website', 'tracking'],
},
{
templateId: 'marketing-social-media',
businessFunction: 'marketing',
name: 'Social-Media-Marketing',
description: 'Betrieb von Social-Media-Kanaelen und Interaktion mit Nutzern',
purposes: ['Oeffentlichkeitsarbeit', 'Kundeninteraktion'],
legalBases: [
{ type: 'LEGITIMATE_INTEREST', description: 'Marketing', reference: 'Art. 6 Abs. 1 lit. f DSGVO' },
],
dataSubjectCategories: ['WEBSITE_USERS', 'CUSTOMERS'],
personalDataCategories: ['NAME', 'CONTACT', 'USAGE_DATA', 'COMMUNICATION_DATA'],
recipientCategories: [
{ type: 'CONTROLLER', name: 'Social-Media-Plattform (gemeinsame Verantwortlichkeit)' },
],
retentionPeriod: { description: 'Abhaengig von Plattform-Einstellungen', deletionProcedure: 'Regelmaessige Pruefung und Bereinigung' },
tomDescription: 'Datenschutzeinstellungen der Plattform, gemeinsame Verantwortlichkeit gemaess Art. 26',
structuredToms: {
accessControl: ['Nur Social-Media-Manager', 'Passwort-Manager'],
confidentiality: ['Plattform-Datenschutzeinstellungen'],
integrity: ['Redaktionsplan'],
availability: ['Multi-Kanal-Management'],
separation: ['Geschaeftlich/Privat getrennt'],
},
typicalSystems: ['Social-Media-Plattformen', 'Social-Media-Management-Tool'],
protectionLevel: 'LOW',
dpiaRequired: false,
tags: ['marketing', 'social-media'],
},
// ==================== SUPPORT ====================
{
templateId: 'support-ticketsystem',
businessFunction: 'support',
name: 'Kundenservice / Ticketsystem',
description: 'Bearbeitung von Kundenanfragen und Support-Tickets',
purposes: ['Kundenservice', 'Reklamationsbearbeitung', 'Vertragserfuellung'],
legalBases: [
{ type: 'CONTRACT', description: 'Kundenvertrag', reference: 'Art. 6 Abs. 1 lit. b DSGVO' },
],
dataSubjectCategories: ['CUSTOMERS', 'APP_USERS'],
personalDataCategories: ['NAME', 'CONTACT', 'CONTRACT_DATA', 'COMMUNICATION_DATA'],
recipientCategories: [
{ type: 'INTERNAL', name: 'Support-Team' },
{ type: 'PROCESSOR', name: 'Helpdesk-Software-Anbieter' },
],
retentionPeriod: { duration: 3, durationUnit: 'YEARS', description: '3 Jahre nach Ticketschliessung', legalBasis: 'BGB § 195', deletionProcedure: 'Automatische Loeschung geschlossener Tickets' },
tomDescription: 'Zugriffskontrolle nach Ticket-Owner, Verschluesselung, Audit-Trail',
structuredToms: {
accessControl: ['Ticket-basierte Zugriffskontrolle', 'Agent-Rollen'],
confidentiality: ['TLS', 'Verschluesselung'],
integrity: ['Ticket-Historie unveraenderbar'],
availability: ['Hochverfuegbarer Helpdesk'],
separation: ['Mandantentrennung'],
},
typicalSystems: ['Helpdesk-Software', 'E-Mail', 'Chat'],
protectionLevel: 'MEDIUM',
dpiaRequired: false,
tags: ['support', 'kundenservice', 'tickets'],
},
// ==================== IT OPERATIONS ====================
{
templateId: 'it-systemadministration',
businessFunction: 'it_operations',
name: 'Systemadministration',
description: 'Verwaltung von IT-Systemen, Benutzerkonten und Zugriffsrechten',
purposes: ['IT-Betrieb', 'Benutzerverwaltung', 'Sicherheitsueberwachung'],
legalBases: [
{ type: 'LEGITIMATE_INTEREST', description: 'IT-Sicherheit', reference: 'Art. 6 Abs. 1 lit. f DSGVO' },
{ type: 'CONTRACT', description: 'Bereitstellung IT-Dienste', reference: 'Art. 6 Abs. 1 lit. b DSGVO' },
],
dataSubjectCategories: ['EMPLOYEES', 'APP_USERS'],
personalDataCategories: ['NAME', 'CONTACT', 'LOGIN_DATA', 'IP_ADDRESS', 'DEVICE_ID'],
recipientCategories: [
{ type: 'INTERNAL', name: 'IT-Abteilung' },
{ type: 'PROCESSOR', name: 'IT-Dienstleister' },
],
retentionPeriod: { duration: 1, durationUnit: 'YEARS', description: '1 Jahr nach Kontodeaktivierung', deletionProcedure: 'Automatische Loeschung deaktivierter Konten' },
tomDescription: 'PAM, MFA, Protokollierung, regelmaessige Rechtereviews',
structuredToms: {
accessControl: ['PAM (Privileged Access Management)', 'MFA', 'Regelmaessige Rechtereviews'],
confidentiality: ['Verschluesselung', 'Passwort-Policies'],
integrity: ['Change Management', 'Konfigurationsmanagement'],
availability: ['Redundanz', 'Monitoring', 'Alerting'],
separation: ['Prod/Dev/Staging getrennt', 'Admin-Netze isoliert'],
},
typicalSystems: ['Active Directory / IAM', 'Monitoring', 'ITSM'],
protectionLevel: 'MEDIUM',
dpiaRequired: false,
tags: ['it', 'admin', 'benutzerverwaltung'],
},
{
templateId: 'it-backup',
businessFunction: 'it_operations',
name: 'Backup & Recovery',
description: 'Sicherung und Wiederherstellung von Daten und Systemen',
purposes: ['Datensicherung', 'Disaster Recovery', 'Geschaeftskontinuitaet'],
legalBases: [
{ type: 'LEGITIMATE_INTEREST', description: 'Datensicherheit', reference: 'Art. 6 Abs. 1 lit. f DSGVO, Art. 32 DSGVO' },
],
dataSubjectCategories: ['EMPLOYEES', 'CUSTOMERS'],
personalDataCategories: ['NAME', 'CONTACT', 'CONTRACT_DATA'],
recipientCategories: [
{ type: 'PROCESSOR', name: 'Backup-Dienstleister' },
{ type: 'INTERNAL', name: 'IT-Abteilung' },
],
retentionPeriod: { duration: 90, durationUnit: 'DAYS', description: '90 Tage Aufbewahrung der Backups', deletionProcedure: 'Automatische Rotation und Loeschung' },
tomDescription: 'Verschluesselung, Zugriffskontrolle, regelmaessige Wiederherstellungstests',
structuredToms: {
accessControl: ['Nur Backup-Admins', 'Separater Encryption Key'],
confidentiality: ['AES-256-Verschluesselung', 'Verschluesselter Transport'],
integrity: ['Checksummen-Pruefung', 'Regelmaessige Restore-Tests'],
availability: ['3-2-1-Backup-Regel', 'Georedundanz'],
separation: ['Backup-Netzwerk isoliert'],
},
typicalSystems: ['Backup-Software', 'Cloud-Storage'],
protectionLevel: 'MEDIUM',
dpiaRequired: false,
tags: ['it', 'backup', 'recovery'],
},
{
templateId: 'it-logging',
businessFunction: 'it_operations',
name: 'Protokollierung & Logging',
description: 'Erfassung von System- und Sicherheitslogs zur Fehlerbehebung und Angriffserkennung',
purposes: ['IT-Sicherheit', 'Fehlerbehebung', 'Angriffserkennung'],
legalBases: [
{ type: 'LEGITIMATE_INTEREST', description: 'IT-Sicherheit und Betrieb', reference: 'Art. 6 Abs. 1 lit. f DSGVO' },
],
dataSubjectCategories: ['EMPLOYEES', 'APP_USERS', 'WEBSITE_USERS'],
personalDataCategories: ['IP_ADDRESS', 'LOGIN_DATA', 'USAGE_DATA', 'DEVICE_ID'],
recipientCategories: [
{ type: 'INTERNAL', name: 'IT-Sicherheit' },
{ type: 'PROCESSOR', name: 'SIEM-Anbieter' },
],
retentionPeriod: { duration: 90, durationUnit: 'DAYS', description: '90 Tage (Standard) / 1 Jahr (Security-Logs)', deletionProcedure: 'Automatische Rotation' },
tomDescription: 'SIEM, Integritaetsschutz der Logs, Zugriffskontrolle, Pseudonymisierung',
structuredToms: {
accessControl: ['Nur Security-Team', 'Read-Only fuer Auditoren'],
confidentiality: ['Pseudonymisierung wo moeglich'],
integrity: ['WORM-Storage fuer Security-Logs', 'Hashketten'],
availability: ['Redundante Log-Speicherung'],
separation: ['Zentrale Log-Infrastruktur getrennt'],
},
typicalSystems: ['SIEM', 'ELK Stack', 'Syslog'],
protectionLevel: 'MEDIUM',
dpiaRequired: false,
tags: ['it', 'logging', 'sicherheit'],
},
{
templateId: 'it-iam',
businessFunction: 'it_operations',
name: 'Identity & Access Management',
description: 'Verwaltung von Identitaeten, Authentifizierung und Autorisierung',
purposes: ['Zugriffskontrolle', 'Identitaetsverwaltung', 'Compliance'],
legalBases: [
{ type: 'LEGITIMATE_INTEREST', description: 'IT-Sicherheit', reference: 'Art. 6 Abs. 1 lit. f DSGVO' },
{ type: 'CONTRACT', description: 'Bereitstellung IT-Dienste', reference: 'Art. 6 Abs. 1 lit. b DSGVO' },
],
dataSubjectCategories: ['EMPLOYEES', 'APP_USERS'],
personalDataCategories: ['NAME', 'CONTACT', 'LOGIN_DATA'],
recipientCategories: [
{ type: 'INTERNAL', name: 'IT-Abteilung' },
{ type: 'PROCESSOR', name: 'IAM-Anbieter' },
],
retentionPeriod: { duration: 6, durationUnit: 'MONTHS', description: '6 Monate nach Kontodeaktivierung', deletionProcedure: 'Automatische Deprovisionierung' },
tomDescription: 'MFA, SSO, regelmaessige Access Reviews, Least-Privilege-Prinzip',
structuredToms: {
accessControl: ['MFA', 'SSO', 'Least Privilege', 'Regelmaessige Reviews'],
confidentiality: ['Passwort-Hashing (bcrypt)', 'Token-basierte Auth'],
integrity: ['Audit-Trail aller Aenderungen'],
availability: ['Hochverfuegbarer IdP'],
separation: ['Identitaeten pro Mandant'],
},
typicalSystems: ['IAM-System', 'SSO Provider', 'MFA'],
protectionLevel: 'HIGH',
dpiaRequired: false,
tags: ['it', 'iam', 'zugriffskontrolle'],
},
// ==================== OTHER ====================
{
templateId: 'other-videokonferenz',
businessFunction: 'other',
name: 'Videokonferenzen',
description: 'Durchfuehrung von Video-Meetings und Online-Besprechungen',
purposes: ['Interne Kommunikation', 'Kundeninteraktion', 'Remote-Arbeit'],
legalBases: [
{ type: 'LEGITIMATE_INTEREST', description: 'Geschaeftliche Kommunikation', reference: 'Art. 6 Abs. 1 lit. f DSGVO' },
{ type: 'CONTRACT', description: 'Arbeitsvertrag (bei Mitarbeitern)', reference: 'Art. 6 Abs. 1 lit. b DSGVO' },
],
dataSubjectCategories: ['EMPLOYEES', 'CUSTOMERS', 'BUSINESS_PARTNERS'],
personalDataCategories: ['NAME', 'CONTACT', 'PHOTO_VIDEO', 'IP_ADDRESS', 'COMMUNICATION_DATA'],
recipientCategories: [
{ type: 'PROCESSOR', name: 'Videokonferenz-Anbieter' },
],
retentionPeriod: { description: 'Keine dauerhafte Speicherung von Meetings (sofern nicht aufgezeichnet)', deletionProcedure: 'Aufzeichnungen nach Verwendungszweck loeschen' },
tomDescription: 'Ende-zu-Ende-Verschluesselung, Warteraum, Passwortschutz, Aufnahme nur mit Einwilligung',
structuredToms: {
accessControl: ['Meeting-Passwort', 'Warteraum', 'Host-Kontrolle'],
confidentiality: ['TLS / E2E-Verschluesselung'],
integrity: ['Teilnehmerliste'],
availability: ['Redundante Infrastruktur'],
separation: ['Separate Meeting-Raeume'],
},
typicalSystems: ['Jitsi', 'Zoom', 'Teams', 'Google Meet'],
protectionLevel: 'LOW',
dpiaRequired: false,
tags: ['kommunikation', 'video', 'meeting'],
},
{
templateId: 'other-besuchermanagement',
businessFunction: 'other',
name: 'Besuchermanagement',
description: 'Erfassung und Verwaltung von Besuchern am Firmenstandort',
purposes: ['Zutrittskontrolle', 'Sicherheit', 'Nachverfolgung'],
legalBases: [
{ type: 'LEGITIMATE_INTEREST', description: 'Gebaeudesicherheit', reference: 'Art. 6 Abs. 1 lit. f DSGVO' },
],
dataSubjectCategories: ['VISITORS'],
personalDataCategories: ['NAME', 'CONTACT', 'PHOTO_VIDEO'],
recipientCategories: [
{ type: 'INTERNAL', name: 'Empfang / Sicherheit' },
],
retentionPeriod: { duration: 30, durationUnit: 'DAYS', description: '30 Tage nach Besuch', deletionProcedure: 'Automatische Loeschung' },
tomDescription: 'Besucherausweise, Begleitpflicht, zeitlich begrenzter Zugang',
structuredToms: {
accessControl: ['Besucherausweise', 'Begleitpflicht'],
confidentiality: ['Besucherliste nicht oeffentlich einsehbar'],
integrity: ['Besuchsprotokoll'],
availability: ['Papier-Backup fuer Besucherliste'],
separation: ['Besucherbereich getrennt'],
},
typicalSystems: ['Besuchermanagementsystem', 'Zutrittskontrollsystem'],
protectionLevel: 'LOW',
dpiaRequired: false,
tags: ['besucher', 'zutritt', 'empfang'],
},
]
// =============================================================================
// HELPER: Convert template to VVTActivity
// =============================================================================
export function templateToActivity(template: BaselineTemplate, vvtId: string): Omit<import('./vvt-types').VVTActivity, 'id'> & { id: string } {
const now = new Date().toISOString()
return {
id: crypto.randomUUID(),
vvtId,
name: template.name,
description: template.description,
purposes: template.purposes,
legalBases: template.legalBases,
dataSubjectCategories: template.dataSubjectCategories,
personalDataCategories: template.personalDataCategories,
recipientCategories: template.recipientCategories,
thirdCountryTransfers: [],
retentionPeriod: template.retentionPeriod,
tomDescription: template.tomDescription,
businessFunction: template.businessFunction,
systems: template.typicalSystems.map((s, i) => ({ systemId: `sys-${i}`, name: s })),
deploymentModel: 'cloud',
dataSources: [{ type: 'DATA_SUBJECT', description: 'Direkt von der betroffenen Person' }],
dataFlows: [],
protectionLevel: template.protectionLevel,
dpiaRequired: template.dpiaRequired,
structuredToms: template.structuredToms,
status: 'DRAFT',
responsible: '',
owner: '',
createdAt: now,
updatedAt: now,
}
}
// =============================================================================
// HELPER: Get templates by business function
// =============================================================================
export function getTemplatesByFunction(fn: BusinessFunction): BaselineTemplate[] {
return VVT_BASELINE_CATALOG.filter(t => t.businessFunction === fn)
}
export function getTemplateById(templateId: string): BaselineTemplate | undefined {
return VVT_BASELINE_CATALOG.find(t => t.templateId === templateId)
}