From 19d6437161c49acc48850231acf84df09d90a242 Mon Sep 17 00:00:00 2001 From: Sharang Parnerkar <30073382+mighty840@users.noreply.github.com> Date: Sat, 18 Apr 2026 00:46:31 +0200 Subject: [PATCH] refactor(admin): split vvt-baseline-catalog into domain barrel Extracted 630-LOC monolith into 6 domain files (all <200 LOC) plus a 29-line barrel re-exporting everything for zero breaking-change impact. Co-Authored-By: Claude Sonnet 4.6 --- .../lib/sdk/vvt-baseline-catalog.ts | 645 +----------------- .../lib/sdk/vvt-baseline-catalog/helpers.ts | 63 ++ .../lib/sdk/vvt-baseline-catalog/marketing.ts | 94 +++ .../lib/sdk/vvt-baseline-catalog/other.ts | 65 ++ .../lib/sdk/vvt-baseline-catalog/sales-crm.ts | 67 ++ .../sdk/vvt-baseline-catalog/support-it.ts | 158 +++++ 6 files changed, 469 insertions(+), 623 deletions(-) create mode 100644 admin-compliance/lib/sdk/vvt-baseline-catalog/helpers.ts create mode 100644 admin-compliance/lib/sdk/vvt-baseline-catalog/marketing.ts create mode 100644 admin-compliance/lib/sdk/vvt-baseline-catalog/other.ts create mode 100644 admin-compliance/lib/sdk/vvt-baseline-catalog/sales-crm.ts create mode 100644 admin-compliance/lib/sdk/vvt-baseline-catalog/support-it.ts diff --git a/admin-compliance/lib/sdk/vvt-baseline-catalog.ts b/admin-compliance/lib/sdk/vvt-baseline-catalog.ts index 85fcbc5..a12013a 100644 --- a/admin-compliance/lib/sdk/vvt-baseline-catalog.ts +++ b/admin-compliance/lib/sdk/vvt-baseline-catalog.ts @@ -1,630 +1,29 @@ /** - * VVT Baseline-Katalog + * VVT Baseline-Katalog — Barrel * * Vordefinierte Verarbeitungstaetigkeiten als Templates. * Werden vom Profiling-Fragebogen (Generator) genutzt, um * auf Basis der Antworten VVT-Eintraege vorzubefuellen. + * + * Domain files: + * ./vvt-baseline-catalog/types.ts — BaselineTemplate interface + * ./vvt-baseline-catalog/hr-finance.ts — HR & Finance templates + * ./vvt-baseline-catalog/sales-crm.ts — Sales / CRM templates + * ./vvt-baseline-catalog/marketing.ts — Marketing templates + * ./vvt-baseline-catalog/support-it.ts — Support & IT Operations templates + * ./vvt-baseline-catalog/other.ts — Other (video, visitors) templates + * ./vvt-baseline-catalog/helpers.ts — Catalog assembly & helper functions */ -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 & { 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) -} +export type { BaselineTemplate } from './vvt-baseline-catalog/types' +export { HR_VVT_TEMPLATES, FINANCE_VVT_TEMPLATES } from './vvt-baseline-catalog/hr-finance' +export { SALES_CRM_VVT_TEMPLATES } from './vvt-baseline-catalog/sales-crm' +export { MARKETING_VVT_TEMPLATES } from './vvt-baseline-catalog/marketing' +export { SUPPORT_VVT_TEMPLATES, IT_OPERATIONS_VVT_TEMPLATES } from './vvt-baseline-catalog/support-it' +export { OTHER_VVT_TEMPLATES } from './vvt-baseline-catalog/other' +export { + VVT_BASELINE_CATALOG, + templateToActivity, + getTemplatesByFunction, + getTemplateById, +} from './vvt-baseline-catalog/helpers' diff --git a/admin-compliance/lib/sdk/vvt-baseline-catalog/helpers.ts b/admin-compliance/lib/sdk/vvt-baseline-catalog/helpers.ts new file mode 100644 index 0000000..f9f034d --- /dev/null +++ b/admin-compliance/lib/sdk/vvt-baseline-catalog/helpers.ts @@ -0,0 +1,63 @@ +/** + * VVT Baseline-Katalog — Helpers & Catalog Assembly + */ + +import type { BusinessFunction } from '../vvt-types' +import type { BaselineTemplate } from './types' +import { HR_VVT_TEMPLATES, FINANCE_VVT_TEMPLATES } from './hr-finance' +import { SALES_CRM_VVT_TEMPLATES } from './sales-crm' +import { MARKETING_VVT_TEMPLATES } from './marketing' +import { SUPPORT_VVT_TEMPLATES, IT_OPERATIONS_VVT_TEMPLATES } from './support-it' +import { OTHER_VVT_TEMPLATES } from './other' + +export const VVT_BASELINE_CATALOG: BaselineTemplate[] = [ + ...HR_VVT_TEMPLATES, + ...FINANCE_VVT_TEMPLATES, + ...SALES_CRM_VVT_TEMPLATES, + ...MARKETING_VVT_TEMPLATES, + ...SUPPORT_VVT_TEMPLATES, + ...IT_OPERATIONS_VVT_TEMPLATES, + ...OTHER_VVT_TEMPLATES, +] + +export function templateToActivity( + template: BaselineTemplate, + vvtId: string, +): Omit & { 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, + } +} + +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) +} diff --git a/admin-compliance/lib/sdk/vvt-baseline-catalog/marketing.ts b/admin-compliance/lib/sdk/vvt-baseline-catalog/marketing.ts new file mode 100644 index 0000000..c1298b1 --- /dev/null +++ b/admin-compliance/lib/sdk/vvt-baseline-catalog/marketing.ts @@ -0,0 +1,94 @@ +/** + * VVT Baseline-Katalog — Marketing + */ + +import type { BaselineTemplate } from './types' + +export const MARKETING_VVT_TEMPLATES: BaselineTemplate[] = [ + { + 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'], + }, +] diff --git a/admin-compliance/lib/sdk/vvt-baseline-catalog/other.ts b/admin-compliance/lib/sdk/vvt-baseline-catalog/other.ts new file mode 100644 index 0000000..ec0b2d7 --- /dev/null +++ b/admin-compliance/lib/sdk/vvt-baseline-catalog/other.ts @@ -0,0 +1,65 @@ +/** + * VVT Baseline-Katalog — Sonstige (Other) + */ + +import type { BaselineTemplate } from './types' + +export const OTHER_VVT_TEMPLATES: BaselineTemplate[] = [ + { + 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'], + }, +] diff --git a/admin-compliance/lib/sdk/vvt-baseline-catalog/sales-crm.ts b/admin-compliance/lib/sdk/vvt-baseline-catalog/sales-crm.ts new file mode 100644 index 0000000..7f901db --- /dev/null +++ b/admin-compliance/lib/sdk/vvt-baseline-catalog/sales-crm.ts @@ -0,0 +1,67 @@ +/** + * VVT Baseline-Katalog — Sales / CRM + */ + +import type { BaselineTemplate } from './types' + +export const SALES_CRM_VVT_TEMPLATES: BaselineTemplate[] = [ + { + 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'], + }, +] diff --git a/admin-compliance/lib/sdk/vvt-baseline-catalog/support-it.ts b/admin-compliance/lib/sdk/vvt-baseline-catalog/support-it.ts new file mode 100644 index 0000000..25b4061 --- /dev/null +++ b/admin-compliance/lib/sdk/vvt-baseline-catalog/support-it.ts @@ -0,0 +1,158 @@ +/** + * VVT Baseline-Katalog — Support & IT Operations + */ + +import type { BaselineTemplate } from './types' + +export const SUPPORT_VVT_TEMPLATES: BaselineTemplate[] = [ + { + 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'], + }, +] + +export const IT_OPERATIONS_VVT_TEMPLATES: BaselineTemplate[] = [ + { + 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'], + }, +]