From ff775517a2619cbd9cba1c324c748b10f1da0fc5 Mon Sep 17 00:00:00 2001 From: Sharang Parnerkar <30073382+mighty840@users.noreply.github.com> Date: Fri, 10 Apr 2026 21:09:58 +0200 Subject: [PATCH] refactor(admin): split loeschfristen-profiling.ts (538 LOC) into data + logic Types and PROFILING_STEPS data (242 LOC) extracted to loeschfristen-profiling-data.ts. Functions remain in loeschfristen-profiling.ts (306 LOC). Both under 500. Barrel re-exports in the logic file so existing imports work unchanged. next build passes. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../lib/sdk/loeschfristen-profiling-data.ts | 242 ++++++++++++++++++ .../lib/sdk/loeschfristen-profiling.ts | 242 +----------------- 2 files changed, 247 insertions(+), 237 deletions(-) create mode 100644 admin-compliance/lib/sdk/loeschfristen-profiling-data.ts diff --git a/admin-compliance/lib/sdk/loeschfristen-profiling-data.ts b/admin-compliance/lib/sdk/loeschfristen-profiling-data.ts new file mode 100644 index 0000000..f07ee1a --- /dev/null +++ b/admin-compliance/lib/sdk/loeschfristen-profiling-data.ts @@ -0,0 +1,242 @@ +// ============================================================================= +// Loeschfristen Module - Profiling Wizard +// 4-Step Profiling (15 Fragen) zur Generierung von Baseline-Loeschrichtlinien +// ============================================================================= + +import type { LoeschfristPolicy, StorageLocation } from './loeschfristen-types' +import { BASELINE_TEMPLATES, type BaselineTemplate, templateToPolicy } from './loeschfristen-baseline-catalog' + +// ============================================================================= +// TYPES +// ============================================================================= + +export type ProfilingStepId = 'organization' | 'data-categories' | 'systems' | 'special' + +export interface ProfilingQuestion { + id: string + step: ProfilingStepId + question: string // German + helpText?: string + type: 'single' | 'multi' | 'boolean' | 'number' + options?: { value: string; label: string }[] + required: boolean +} + +export interface ProfilingAnswer { + questionId: string + value: string | string[] | boolean | number +} + +export interface ProfilingStep { + id: ProfilingStepId + title: string + description: string + questions: ProfilingQuestion[] +} + +export interface ProfilingResult { + matchedTemplates: BaselineTemplate[] + generatedPolicies: LoeschfristPolicy[] + additionalStorageLocations: StorageLocation[] + hasLegalHoldRequirement: boolean +} + +// ============================================================================= +// PROFILING STEPS (4 Steps, 15 Questions) +// ============================================================================= + +export const PROFILING_STEPS: ProfilingStep[] = [ + // ========================================================================= + // Step 1: Organisation (4 Fragen) + // ========================================================================= + { + id: 'organization', + title: 'Organisation', + description: 'Allgemeine Informationen zu Ihrem Unternehmen, um branchenspezifische Loeschfristen zu ermitteln.', + questions: [ + { + id: 'org-branche', + step: 'organization', + question: 'In welcher Branche ist Ihr Unternehmen taetig?', + helpText: 'Die Branche bestimmt, welche branchenspezifischen Aufbewahrungspflichten relevant sind.', + type: 'single', + options: [ + { value: 'it-software', label: 'IT / Software' }, + { value: 'handel', label: 'Handel' }, + { value: 'dienstleistung', label: 'Dienstleistung' }, + { value: 'gesundheitswesen', label: 'Gesundheitswesen' }, + { value: 'bildung', label: 'Bildung' }, + { value: 'fertigung-industrie', label: 'Fertigung / Industrie' }, + { value: 'finanzwesen', label: 'Finanzwesen' }, + { value: 'oeffentlicher-sektor', label: 'Oeffentlicher Sektor' }, + { value: 'sonstige', label: 'Sonstige' }, + ], + required: true, + }, + { + id: 'org-mitarbeiter', + step: 'organization', + question: 'Wie viele Mitarbeiter hat Ihr Unternehmen?', + helpText: 'Die Unternehmensgroesse beeinflusst den Umfang der erforderlichen Loeschkonzepte.', + type: 'single', + options: [ + { value: '<10', label: 'Weniger als 10' }, + { value: '10-49', label: '10 bis 49' }, + { value: '50-249', label: '50 bis 249' }, + { value: '250+', label: '250 und mehr' }, + ], + required: true, + }, + { + id: 'org-geschaeftsmodell', + step: 'organization', + question: 'Welches Geschaeftsmodell verfolgen Sie?', + helpText: 'B2B und B2C haben unterschiedliche Anforderungen an die Datenhaltung.', + type: 'single', + options: [ + { value: 'b2b', label: 'B2B (Geschaeftskunden)' }, + { value: 'b2c', label: 'B2C (Endkunden)' }, + { value: 'beides', label: 'Beides (B2B und B2C)' }, + ], + required: true, + }, + { + id: 'org-website', + step: 'organization', + question: 'Betreiben Sie eine Website oder Online-Praesenz?', + helpText: 'Websites erzeugen Webserver-Logs und erfordern Cookie-Consent-Verwaltung.', + type: 'boolean', + required: true, + }, + ], + }, + + // ========================================================================= + // Step 2: Datenkategorien (5 Fragen) + // ========================================================================= + { + id: 'data-categories', + title: 'Datenkategorien', + description: 'Welche Arten personenbezogener Daten verarbeiten Sie? Dies bestimmt die relevanten Aufbewahrungsfristen.', + questions: [ + { + id: 'data-hr', + step: 'data-categories', + question: 'Verarbeiten Sie HR-/Personaldaten (Personalakten, Gehaltsabrechnungen, Zeiterfassung)?', + helpText: 'Personalakten unterliegen umfangreichen gesetzlichen Aufbewahrungspflichten (bis zu 10 Jahre).', + type: 'boolean', + required: true, + }, + { + id: 'data-buchhaltung', + step: 'data-categories', + question: 'Fuehren Sie eine Buchhaltung mit Finanzdaten (Rechnungen, Belege, Steuererklarungen)?', + helpText: 'Buchhaltungsunterlagen muessen gemaess HGB und AO bis zu 10 Jahre aufbewahrt werden.', + type: 'boolean', + required: true, + }, + { + id: 'data-vertraege', + step: 'data-categories', + question: 'Verwalten Sie Vertraege mit Kunden oder Lieferanten?', + helpText: 'Vertragsunterlagen und Geschaeftsbriefe haben spezifische Aufbewahrungspflichten.', + type: 'boolean', + required: true, + }, + { + id: 'data-marketing', + step: 'data-categories', + question: 'Betreiben Sie Marketing-Aktivitaeten (Newsletter, CRM-Kampagnen)?', + helpText: 'Marketing-Einwilligungen und Kontakthistorien muessen dokumentiert und verwaltet werden.', + type: 'boolean', + required: true, + }, + { + id: 'data-video', + step: 'data-categories', + question: 'Setzen Sie Videoueberwachung ein?', + helpText: 'Videoueberwachungsdaten haben besonders kurze Loeschfristen (in der Regel 72 Stunden).', + type: 'boolean', + required: true, + }, + ], + }, + + // ========================================================================= + // Step 3: Systeme (3 Fragen) + // ========================================================================= + { + id: 'systems', + title: 'Systeme & Infrastruktur', + description: 'Welche IT-Systeme und Infrastruktur nutzen Sie? Dies beeinflusst die Speicherorte in Ihrem Loeschkonzept.', + questions: [ + { + id: 'sys-cloud', + step: 'systems', + question: 'Nutzen Sie Cloud-Dienste zur Datenspeicherung oder -verarbeitung?', + helpText: 'Cloud-Speicherorte muessen in den Loeschrichtlinien als separate Speicherorte dokumentiert werden.', + type: 'boolean', + required: true, + }, + { + id: 'sys-backup', + step: 'systems', + question: 'Haben Sie Backup-Systeme im Einsatz?', + helpText: 'Backups erfordern eine eigene Loeschstrategie, da Daten dort nach der primaeren Loeschung weiter existieren koennen.', + type: 'boolean', + required: true, + }, + { + id: 'sys-erp', + step: 'systems', + question: 'Setzen Sie ein ERP- oder CRM-System ein?', + helpText: 'ERP-/CRM-Systeme sind haeufig zentrale Speicherorte fuer Kunden- und Geschaeftsdaten.', + type: 'boolean', + required: true, + }, + ], + }, + + // ========================================================================= + // Step 4: Spezielle Anforderungen (3 Fragen) + // ========================================================================= + { + id: 'special', + title: 'Spezielle Anforderungen', + description: 'Gibt es besondere rechtliche oder organisatorische Anforderungen, die Ihr Loeschkonzept beeinflussen?', + questions: [ + { + id: 'special-legal-hold', + step: 'special', + question: 'Gibt es Legal-Hold-Anforderungen (z.B. laufende Rechtsstreitigkeiten, behoerdliche Untersuchungen)?', + helpText: 'Bei einem Legal Hold muessen betroffene Daten trotz abgelaufener Loeschfristen aufbewahrt werden.', + type: 'boolean', + required: true, + }, + { + id: 'special-archivierung', + step: 'special', + question: 'Benoetigen Sie eine Langzeitarchivierung von Dokumenten?', + helpText: 'Langzeitarchivierung kann ueber die gesetzlichen Mindestfristen hinausgehen und erfordert eine gesonderte Rechtfertigung.', + type: 'boolean', + required: true, + }, + { + id: 'special-gesundheit', + step: 'special', + question: 'Verarbeiten Sie Gesundheitsdaten (z.B. Krankmeldungen, Arbeitsmedizin)?', + helpText: 'Gesundheitsdaten sind besonders schuetzenswerte Daten nach Art. 9 DSGVO und unterliegen strengeren Anforderungen.', + type: 'boolean', + required: true, + }, + ], + }, +] + +// ============================================================================= +// HELPER FUNCTIONS +// ============================================================================= + +/** + * Retrieve the value of a specific answer by question ID. + */ diff --git a/admin-compliance/lib/sdk/loeschfristen-profiling.ts b/admin-compliance/lib/sdk/loeschfristen-profiling.ts index 5135f70..22c8c81 100644 --- a/admin-compliance/lib/sdk/loeschfristen-profiling.ts +++ b/admin-compliance/lib/sdk/loeschfristen-profiling.ts @@ -1,245 +1,13 @@ -// ============================================================================= -// Loeschfristen Module - Profiling Wizard -// 4-Step Profiling (15 Fragen) zur Generierung von Baseline-Loeschrichtlinien -// ============================================================================= +// Loeschfristen Profiling — utility functions +// Data (types + PROFILING_STEPS) lives in loeschfristen-profiling-data.ts import type { LoeschfristPolicy, StorageLocation } from './loeschfristen-types' import { BASELINE_TEMPLATES, type BaselineTemplate, templateToPolicy } from './loeschfristen-baseline-catalog' +import type { ProfilingAnswer, ProfilingStepId, ProfilingResult } from './loeschfristen-profiling-data' -// ============================================================================= -// TYPES -// ============================================================================= +// Re-export types + data so existing imports work unchanged +export { type ProfilingStepId, type ProfilingQuestion, type ProfilingAnswer, type ProfilingStep, type ProfilingResult, PROFILING_STEPS } from './loeschfristen-profiling-data' -export type ProfilingStepId = 'organization' | 'data-categories' | 'systems' | 'special' - -export interface ProfilingQuestion { - id: string - step: ProfilingStepId - question: string // German - helpText?: string - type: 'single' | 'multi' | 'boolean' | 'number' - options?: { value: string; label: string }[] - required: boolean -} - -export interface ProfilingAnswer { - questionId: string - value: string | string[] | boolean | number -} - -export interface ProfilingStep { - id: ProfilingStepId - title: string - description: string - questions: ProfilingQuestion[] -} - -export interface ProfilingResult { - matchedTemplates: BaselineTemplate[] - generatedPolicies: LoeschfristPolicy[] - additionalStorageLocations: StorageLocation[] - hasLegalHoldRequirement: boolean -} - -// ============================================================================= -// PROFILING STEPS (4 Steps, 15 Questions) -// ============================================================================= - -export const PROFILING_STEPS: ProfilingStep[] = [ - // ========================================================================= - // Step 1: Organisation (4 Fragen) - // ========================================================================= - { - id: 'organization', - title: 'Organisation', - description: 'Allgemeine Informationen zu Ihrem Unternehmen, um branchenspezifische Loeschfristen zu ermitteln.', - questions: [ - { - id: 'org-branche', - step: 'organization', - question: 'In welcher Branche ist Ihr Unternehmen taetig?', - helpText: 'Die Branche bestimmt, welche branchenspezifischen Aufbewahrungspflichten relevant sind.', - type: 'single', - options: [ - { value: 'it-software', label: 'IT / Software' }, - { value: 'handel', label: 'Handel' }, - { value: 'dienstleistung', label: 'Dienstleistung' }, - { value: 'gesundheitswesen', label: 'Gesundheitswesen' }, - { value: 'bildung', label: 'Bildung' }, - { value: 'fertigung-industrie', label: 'Fertigung / Industrie' }, - { value: 'finanzwesen', label: 'Finanzwesen' }, - { value: 'oeffentlicher-sektor', label: 'Oeffentlicher Sektor' }, - { value: 'sonstige', label: 'Sonstige' }, - ], - required: true, - }, - { - id: 'org-mitarbeiter', - step: 'organization', - question: 'Wie viele Mitarbeiter hat Ihr Unternehmen?', - helpText: 'Die Unternehmensgroesse beeinflusst den Umfang der erforderlichen Loeschkonzepte.', - type: 'single', - options: [ - { value: '<10', label: 'Weniger als 10' }, - { value: '10-49', label: '10 bis 49' }, - { value: '50-249', label: '50 bis 249' }, - { value: '250+', label: '250 und mehr' }, - ], - required: true, - }, - { - id: 'org-geschaeftsmodell', - step: 'organization', - question: 'Welches Geschaeftsmodell verfolgen Sie?', - helpText: 'B2B und B2C haben unterschiedliche Anforderungen an die Datenhaltung.', - type: 'single', - options: [ - { value: 'b2b', label: 'B2B (Geschaeftskunden)' }, - { value: 'b2c', label: 'B2C (Endkunden)' }, - { value: 'beides', label: 'Beides (B2B und B2C)' }, - ], - required: true, - }, - { - id: 'org-website', - step: 'organization', - question: 'Betreiben Sie eine Website oder Online-Praesenz?', - helpText: 'Websites erzeugen Webserver-Logs und erfordern Cookie-Consent-Verwaltung.', - type: 'boolean', - required: true, - }, - ], - }, - - // ========================================================================= - // Step 2: Datenkategorien (5 Fragen) - // ========================================================================= - { - id: 'data-categories', - title: 'Datenkategorien', - description: 'Welche Arten personenbezogener Daten verarbeiten Sie? Dies bestimmt die relevanten Aufbewahrungsfristen.', - questions: [ - { - id: 'data-hr', - step: 'data-categories', - question: 'Verarbeiten Sie HR-/Personaldaten (Personalakten, Gehaltsabrechnungen, Zeiterfassung)?', - helpText: 'Personalakten unterliegen umfangreichen gesetzlichen Aufbewahrungspflichten (bis zu 10 Jahre).', - type: 'boolean', - required: true, - }, - { - id: 'data-buchhaltung', - step: 'data-categories', - question: 'Fuehren Sie eine Buchhaltung mit Finanzdaten (Rechnungen, Belege, Steuererklarungen)?', - helpText: 'Buchhaltungsunterlagen muessen gemaess HGB und AO bis zu 10 Jahre aufbewahrt werden.', - type: 'boolean', - required: true, - }, - { - id: 'data-vertraege', - step: 'data-categories', - question: 'Verwalten Sie Vertraege mit Kunden oder Lieferanten?', - helpText: 'Vertragsunterlagen und Geschaeftsbriefe haben spezifische Aufbewahrungspflichten.', - type: 'boolean', - required: true, - }, - { - id: 'data-marketing', - step: 'data-categories', - question: 'Betreiben Sie Marketing-Aktivitaeten (Newsletter, CRM-Kampagnen)?', - helpText: 'Marketing-Einwilligungen und Kontakthistorien muessen dokumentiert und verwaltet werden.', - type: 'boolean', - required: true, - }, - { - id: 'data-video', - step: 'data-categories', - question: 'Setzen Sie Videoueberwachung ein?', - helpText: 'Videoueberwachungsdaten haben besonders kurze Loeschfristen (in der Regel 72 Stunden).', - type: 'boolean', - required: true, - }, - ], - }, - - // ========================================================================= - // Step 3: Systeme (3 Fragen) - // ========================================================================= - { - id: 'systems', - title: 'Systeme & Infrastruktur', - description: 'Welche IT-Systeme und Infrastruktur nutzen Sie? Dies beeinflusst die Speicherorte in Ihrem Loeschkonzept.', - questions: [ - { - id: 'sys-cloud', - step: 'systems', - question: 'Nutzen Sie Cloud-Dienste zur Datenspeicherung oder -verarbeitung?', - helpText: 'Cloud-Speicherorte muessen in den Loeschrichtlinien als separate Speicherorte dokumentiert werden.', - type: 'boolean', - required: true, - }, - { - id: 'sys-backup', - step: 'systems', - question: 'Haben Sie Backup-Systeme im Einsatz?', - helpText: 'Backups erfordern eine eigene Loeschstrategie, da Daten dort nach der primaeren Loeschung weiter existieren koennen.', - type: 'boolean', - required: true, - }, - { - id: 'sys-erp', - step: 'systems', - question: 'Setzen Sie ein ERP- oder CRM-System ein?', - helpText: 'ERP-/CRM-Systeme sind haeufig zentrale Speicherorte fuer Kunden- und Geschaeftsdaten.', - type: 'boolean', - required: true, - }, - ], - }, - - // ========================================================================= - // Step 4: Spezielle Anforderungen (3 Fragen) - // ========================================================================= - { - id: 'special', - title: 'Spezielle Anforderungen', - description: 'Gibt es besondere rechtliche oder organisatorische Anforderungen, die Ihr Loeschkonzept beeinflussen?', - questions: [ - { - id: 'special-legal-hold', - step: 'special', - question: 'Gibt es Legal-Hold-Anforderungen (z.B. laufende Rechtsstreitigkeiten, behoerdliche Untersuchungen)?', - helpText: 'Bei einem Legal Hold muessen betroffene Daten trotz abgelaufener Loeschfristen aufbewahrt werden.', - type: 'boolean', - required: true, - }, - { - id: 'special-archivierung', - step: 'special', - question: 'Benoetigen Sie eine Langzeitarchivierung von Dokumenten?', - helpText: 'Langzeitarchivierung kann ueber die gesetzlichen Mindestfristen hinausgehen und erfordert eine gesonderte Rechtfertigung.', - type: 'boolean', - required: true, - }, - { - id: 'special-gesundheit', - step: 'special', - question: 'Verarbeiten Sie Gesundheitsdaten (z.B. Krankmeldungen, Arbeitsmedizin)?', - helpText: 'Gesundheitsdaten sind besonders schuetzenswerte Daten nach Art. 9 DSGVO und unterliegen strengeren Anforderungen.', - type: 'boolean', - required: true, - }, - ], - }, -] - -// ============================================================================= -// HELPER FUNCTIONS -// ============================================================================= - -/** - * Retrieve the value of a specific answer by question ID. - */ export function getAnswerValue(answers: ProfilingAnswer[], questionId: string): unknown { const answer = answers.find(a => a.questionId === questionId) return answer?.value ?? undefined