From 186ad830c10f4e9362d4d8c70d7d0f33939d0e0b Mon Sep 17 00:00:00 2001 From: Denis Lugowski Date: Thu, 22 Jan 2026 11:37:17 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20Add=20Eingabeseite=204=20(L=C3=B6schkon?= =?UTF-8?q?zept)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../seed/initial_application_form.yaml | 176 ++++++++++ .../initial_application_form_template.yaml | 310 ++++++++++++++++++ .../composables/useFormElementVisibility.ts | 8 +- 3 files changed, 493 insertions(+), 1 deletion(-) diff --git a/legalconsenthub-backend/src/main/resources/seed/initial_application_form.yaml b/legalconsenthub-backend/src/main/resources/seed/initial_application_form.yaml index 1a09b6f..cea88fe 100644 --- a/legalconsenthub-backend/src/main/resources/seed/initial_application_form.yaml +++ b/legalconsenthub-backend/src/main/resources/seed/initial_application_form.yaml @@ -909,3 +909,179 @@ formElementSections: label: Bedingungen processingPurpose: SYSTEM_OPERATION employeeDataCategory: REVIEW_REQUIRED + +# ============================================================================ +# Löschkonzept Section (Spawned) +# ============================================================================ +- title: Löschkonzept + shortTitle: Löschkonzept + description: Angaben zum Löschkonzept für Verarbeitungsvorgänge, Datenkategorien und Arbeitnehmerdaten + spawnedFromElementReference: art_der_massnahme + formElementSubSections: + + # Subsection 1: Grundlegende Optionen + - title: Grundlegende Angaben zum Löschkonzept + formElements: + + # Checkbox 1: loeschkonzept_hinterlegen = checked + - reference: loeschkonzept_hinterlegen + title: Löschkonzept hinterlegen + description: '' + type: CHECKBOX + options: + - value: 'true' + label: Löschkonzept für die Verarbeitungsvorgänge, Datenkategorien und Arbeitnehmerdaten hinterlegen + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + + # Checkbox 2: globales_loeschkonzept = not checked + - reference: globales_loeschkonzept + title: Globales Löschkonzept + description: '' + type: CHECKBOX + options: + - value: 'false' + label: Es kommt ein globales Löschkonzept hinsichtlich aller Verarbeitungsvorgänge, Datenkategorien und Arbeitnehmerdaten zum Einsatz + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + + # Text field: globales_loeschkonzept_referenz (hidden because checkbox not checked) + - reference: globales_loeschkonzept_referenz + title: Referenz zum globalen Löschkonzept + description: Angabe der Dokumentreferenz oder des Verweises auf das globale Löschkonzept + type: TEXTFIELD + options: + - value: '' + label: Dokumentreferenz + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + + # Checkbox 3: teilweises_globales_loeschkonzept = not checked + - reference: teilweises_globales_loeschkonzept + title: Teilweises globales Löschkonzept + description: '' + type: CHECKBOX + options: + - value: 'false' + label: Ein globales Löschkonzept kommt teilweise zum Einsatz + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + + # Text field: teilweises_globales_loeschkonzept_referenz (hidden) + - reference: teilweises_globales_loeschkonzept_referenz + title: Referenz zum teilweise genutzten Löschkonzept + description: Angabe der Dokumentreferenz oder des Verweises auf das teilweise genutzte Löschkonzept + type: TEXTFIELD + options: + - value: '' + label: Dokumentreferenz + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + + # Rich text: teilweises_loeschkonzept_abweichungen (hidden) + - reference: teilweises_loeschkonzept_abweichungen + title: Abweichungen vom globalen Löschkonzept + description: Beschreiben Sie die Abweichungen vom globalen Löschkonzept + type: RICH_TEXT + options: + - value: '' + label: Abweichungen + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + + # ============================================================================ + # Table WITH LuV (luv_beabsichtigt = Ja) - 10 columns + # ============================================================================ + + - title: Löschkonzept (Umfassende Darstellung) + formElements: + - reference: loeschkonzept_umfassend_tabelle + title: Löschkonzept für Verarbeitungsvorgänge + description: Umfassendes Löschkonzept mit Arbeitnehmerdaten (mit Leistungs-/Verhaltenskontrolle) + type: TABLE + tableRowPreset: + sourceTableReference: umfassende_datenverarbeitung_tabelle + columnMappings: + - sourceColumnIndex: 0 + targetColumnIndex: 0 + - sourceColumnIndex: 4 + targetColumnIndex: 1 + - sourceColumnIndex: 5 + targetColumnIndex: 2 + canAddRows: false + visibilityConditions: + - formElementConditionType: SHOW + sourceFormElementReference: personenbezogene_daten_verarbeitet + formElementExpectedValue: Ja + formElementOperator: EQUALS + - formElementConditionType: SHOW + sourceFormElementReference: luv_beabsichtigt + formElementExpectedValue: Ja + formElementOperator: EQUALS + - formElementConditionType: SHOW + sourceFormElementReference: loeschkonzept_hinterlegen + formElementExpectedValue: 'true' + formElementOperator: EQUALS + options: + # Column 0: Verarbeitungsvorgang-ID (cross-referenced, auto-populated, read-only) + - value: '["V001", "V002", "V003", "V004", "V005"]' + label: Verarbeitungsvorgang-ID + processingPurpose: SYSTEM_OPERATION + employeeDataCategory: NON_CRITICAL + columnConfig: + sourceTableReference: umfassende_datenverarbeitung_tabelle + sourceColumnIndex: 0 + isReadOnly: true + # Column 1: Datenkategorie (cross-referenced, auto-populated, read-only) + - value: '["Stammdaten", "Arbeitszeitdaten", "Gehaltsdaten", "Leistungsdaten", "Produktionsdaten"]' + label: Datenkategorie + processingPurpose: DATA_ANALYSIS + employeeDataCategory: REVIEW_REQUIRED + columnConfig: + sourceTableReference: umfassende_datenverarbeitung_tabelle + sourceColumnIndex: 4 + isReadOnly: true + # Column 2: Arbeitnehmerdaten (cross-referenced, auto-populated, read-only) + - value: '["Name, Adresse, Personalnummer, Bankverbindung", "An-/Abmeldezeiten, Pausenzeiten, Überstunden", "Bruttogehalt, Abzüge, Zulagen, Sonderzahlungen", "Zielerreichung, Bewertungen, Entwicklungsgespräche", "Stückzahlen, Fehlerquoten, Maschinenzeiten"]' + label: Arbeitnehmerdaten + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + columnConfig: + sourceTableReference: umfassende_datenverarbeitung_tabelle + sourceColumnIndex: 5 + isReadOnly: true + # Column 3: Speicherorte / Nebenpfade + - value: '["SAP HCM Infotype 0001/0002, Database Cluster PCL1", "SAP CATS (CAT2/CAT7), Zeitdatenbank", "SAP Payroll Cluster PCL1/PCL2", "SuccessFactors Performance & Goals", "SAP MES Production Tables"]' + label: Speicherorte / Nebenpfade + processingPurpose: SYSTEM_OPERATION + employeeDataCategory: REVIEW_REQUIRED + # Column 4: Aufbewahrungszweck + - value: '["Personalakte, gesetzliche Aufbewahrungspflichten", "Arbeitszeitnachweis, Betriebsrat", "Lohnsteuer, Sozialversicherung", "Personalentwicklung, Nachweispflicht", "Produktionskontrolle, Qualitätssicherung"]' + label: Aufbewahrungszweck + processingPurpose: DATA_ANALYSIS + employeeDataCategory: REVIEW_REQUIRED + # Column 5: Aufbewahrungsfrist + - value: '["10 Jahre nach Austritt", "2 Jahre nach Erfassung", "10 Jahre nach Zahlungsende", "5 Jahre nach Beurteilungsjahr", "3 Jahre nach Produktionsende"]' + label: Aufbewahrungsfrist + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + # Column 6: Löschart + - value: '["Automatische Archivierung mit späterer Löschung", "Automatische Löschung", "Archivierung nach gesetzlicher Frist", "Manuelle Prüfung und Löschung", "Automatische Aggregierung"]' + label: Löschart + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + # Column 7: Löschmethode + - value: '["SAP ILM Archivierung mit Löschlauf", "SAP Reorganisation (RSSCD100)", "Archivlink mit physischer Löschung", "Manuelles Löschprogramm nach Review", "Aggregierung auf Abteilungsebene"]' + label: Löschmethode + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + # Column 8: Ausnahmen + - value: '["Gerichtliche Auskunftspflichten", "Keine", "Betriebsprüfungen durch Finanzbehörden", "Laufende Personalverfahren", "Produkthaftungsfälle"]' + label: Ausnahmen + processingPurpose: DATA_ANALYSIS + employeeDataCategory: REVIEW_REQUIRED + # Column 9: Nachweisform + - value: '["ILM Löschprotokoll, Archivierungslog", "RSSCD100 Batch-Log", "DMS Löschzertifikat", "Löschprotokoll mit Freigabe HRBP", "Aggregierungsbericht mit Checksummen"]' + label: Nachweisform + processingPurpose: DATA_ANALYSIS + employeeDataCategory: REVIEW_REQUIRED diff --git a/legalconsenthub-backend/src/main/resources/seed/initial_application_form_template.yaml b/legalconsenthub-backend/src/main/resources/seed/initial_application_form_template.yaml index 8fa633a..831864a 100644 --- a/legalconsenthub-backend/src/main/resources/seed/initial_application_form_template.yaml +++ b/legalconsenthub-backend/src/main/resources/seed/initial_application_form_template.yaml @@ -43,6 +43,10 @@ formElementSections: sectionSpawnConditionType: SHOW sectionSpawnExpectedValue: Einführung sectionSpawnOperator: EQUALS + - templateReference: loeschkonzept_template + sectionSpawnConditionType: SHOW + sectionSpawnExpectedValue: Einführung + sectionSpawnOperator: EQUALS # Einführung: Allgemeine Informationen - title: Allgemeine Informationen @@ -2212,6 +2216,312 @@ formElementSections: processingPurpose: SYSTEM_OPERATION employeeDataCategory: REVIEW_REQUIRED +# ============================================================================ +# Löschkonzept - Deletion Concept Section +# ============================================================================ +- title: Löschkonzept + shortTitle: Löschkonzept + description: Angaben zum Löschkonzept für Verarbeitungsvorgänge, Datenkategorien und Arbeitnehmerdaten + isTemplate: true + templateReference: loeschkonzept_template + titleTemplate: Löschkonzept + formElementSubSections: + + # Subsection 1: Grundlegende Optionen (Checkboxes) + - title: Grundlegende Angaben zum Löschkonzept + formElements: + + # Checkbox 1: Standard deletion concept + - reference: loeschkonzept_hinterlegen + title: Löschkonzept hinterlegen + description: '' + type: CHECKBOX + visibilityConditions: + - formElementConditionType: SHOW + sourceFormElementReference: personenbezogene_daten_verarbeitet + formElementExpectedValue: Ja + formElementOperator: EQUALS + options: + - value: 'false' + label: Löschkonzept für die Verarbeitungsvorgänge, Datenkategorien und Arbeitnehmerdaten hinterlegen + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + + # Checkbox 2: Global deletion concept + - reference: globales_loeschkonzept + title: Globales Löschkonzept + description: '' + type: CHECKBOX + visibilityConditions: + - formElementConditionType: SHOW + sourceFormElementReference: personenbezogene_daten_verarbeitet + formElementExpectedValue: Ja + formElementOperator: EQUALS + options: + - value: 'false' + label: Es kommt ein globales Löschkonzept hinsichtlich aller Verarbeitungsvorgänge, Datenkategorien und Arbeitnehmerdaten zum Einsatz + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + + # Text field for global concept reference + - reference: globales_loeschkonzept_referenz + title: Referenz zum globalen Löschkonzept + description: Angabe der Dokumentreferenz oder des Verweises auf das globale Löschkonzept + type: TEXTFIELD + visibilityConditions: + - formElementConditionType: SHOW + sourceFormElementReference: personenbezogene_daten_verarbeitet + formElementExpectedValue: Ja + formElementOperator: EQUALS + - formElementConditionType: SHOW + sourceFormElementReference: globales_loeschkonzept + formElementExpectedValue: 'true' + formElementOperator: EQUALS + options: + - value: '' + label: Dokumentreferenz + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + + # Checkbox 3: Partial global deletion concept + - reference: teilweises_globales_loeschkonzept + title: Teilweises globales Löschkonzept + description: '' + type: CHECKBOX + visibilityConditions: + - formElementConditionType: SHOW + sourceFormElementReference: personenbezogene_daten_verarbeitet + formElementExpectedValue: Ja + formElementOperator: EQUALS + options: + - value: 'false' + label: Ein globales Löschkonzept kommt teilweise zum Einsatz + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + + # Text field for partial global concept reference + - reference: teilweises_globales_loeschkonzept_referenz + title: Referenz zum teilweise genutzten Löschkonzept + description: Angabe der Dokumentreferenz oder des Verweises auf das teilweise genutzte Löschkonzept + type: TEXTFIELD + visibilityConditions: + - formElementConditionType: SHOW + sourceFormElementReference: personenbezogene_daten_verarbeitet + formElementExpectedValue: Ja + formElementOperator: EQUALS + - formElementConditionType: SHOW + sourceFormElementReference: teilweises_globales_loeschkonzept + formElementExpectedValue: 'true' + formElementOperator: EQUALS + options: + - value: '' + label: Dokumentreferenz + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + + # Rich text for deviations description + - reference: teilweises_loeschkonzept_abweichungen + title: Abweichungen vom globalen Löschkonzept + description: Beschreiben Sie die Abweichungen vom globalen Löschkonzept + type: RICH_TEXT + visibilityConditions: + - formElementConditionType: SHOW + sourceFormElementReference: personenbezogene_daten_verarbeitet + formElementExpectedValue: Ja + formElementOperator: EQUALS + - formElementConditionType: SHOW + sourceFormElementReference: teilweises_globales_loeschkonzept + formElementExpectedValue: true + formElementOperator: EQUALS + options: + - value: '' + label: Abweichungen + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + + # ============================================================================ + # Table WITHOUT LuV (luv_beabsichtigt = Nein) - 9 columns + # ============================================================================ + + - title: Löschkonzept (Einfache Darstellung) + formElements: + - reference: loeschkonzept_einfach_tabelle + title: Löschkonzept für Verarbeitungsvorgänge + description: Übersicht des Löschkonzepts (ohne Leistungs-/Verhaltenskontrolle) + type: TABLE + tableRowPreset: + sourceTableReference: einfache_datenverarbeitung_tabelle + columnMappings: + - sourceColumnIndex: 0 + targetColumnIndex: 0 + - sourceColumnIndex: 4 + targetColumnIndex: 1 + canAddRows: false + visibilityConditions: + - formElementConditionType: SHOW + sourceFormElementReference: personenbezogene_daten_verarbeitet + formElementExpectedValue: Ja + formElementOperator: EQUALS + - formElementConditionType: SHOW + sourceFormElementReference: luv_beabsichtigt + formElementExpectedValue: Nein + formElementOperator: EQUALS + - formElementConditionType: SHOW + sourceFormElementReference: loeschkonzept_hinterlegen + formElementExpectedValue: 'true' + formElementOperator: EQUALS + options: + # Column 0: Verarbeitungsvorgang-ID (cross-referenced, read-only) + - value: '[]' + label: Verarbeitungsvorgang-ID + processingPurpose: SYSTEM_OPERATION + employeeDataCategory: NON_CRITICAL + columnConfig: + sourceTableReference: einfache_datenverarbeitung_tabelle + sourceColumnIndex: 0 + isReadOnly: true + # Column 1: Datenkategorie (cross-referenced, read-only) + - value: '[]' + label: Datenkategorie + processingPurpose: DATA_ANALYSIS + employeeDataCategory: REVIEW_REQUIRED + columnConfig: + sourceTableReference: einfache_datenverarbeitung_tabelle + sourceColumnIndex: 4 + isReadOnly: true + # Column 2: Speicherorte / Nebenpfade + - value: '[]' + label: Speicherorte / Nebenpfade + processingPurpose: SYSTEM_OPERATION + employeeDataCategory: REVIEW_REQUIRED + # Column 3: Aufbewahrungszweck + - value: '[]' + label: Aufbewahrungszweck + processingPurpose: DATA_ANALYSIS + employeeDataCategory: REVIEW_REQUIRED + # Column 4: Aufbewahrungsfrist + - value: '[]' + label: Aufbewahrungsfrist + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + # Column 5: Löschart + - value: '[]' + label: Löschart + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + # Column 6: Löschmethode + - value: '[]' + label: Löschmethode + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + # Column 7: Ausnahmen + - value: '[]' + label: Ausnahmen + processingPurpose: DATA_ANALYSIS + employeeDataCategory: REVIEW_REQUIRED + # Column 8: Nachweisform + - value: '[]' + label: Nachweisform + processingPurpose: DATA_ANALYSIS + employeeDataCategory: REVIEW_REQUIRED + + # ============================================================================ + # Table WITH LuV (luv_beabsichtigt = Ja) - 10 columns + # ============================================================================ + + - title: Löschkonzept (Umfassende Darstellung) + formElements: + - reference: loeschkonzept_umfassend_tabelle + title: Löschkonzept für Verarbeitungsvorgänge + description: Umfassendes Löschkonzept mit Arbeitnehmerdaten (mit Leistungs-/Verhaltenskontrolle) + type: TABLE + tableRowPreset: + sourceTableReference: umfassende_datenverarbeitung_tabelle + columnMappings: + - sourceColumnIndex: 0 + targetColumnIndex: 0 + - sourceColumnIndex: 4 + targetColumnIndex: 1 + - sourceColumnIndex: 5 + targetColumnIndex: 2 + canAddRows: false + visibilityConditions: + - formElementConditionType: SHOW + sourceFormElementReference: personenbezogene_daten_verarbeitet + formElementExpectedValue: Ja + formElementOperator: EQUALS + - formElementConditionType: SHOW + sourceFormElementReference: luv_beabsichtigt + formElementExpectedValue: Ja + formElementOperator: EQUALS + - formElementConditionType: SHOW + sourceFormElementReference: loeschkonzept_hinterlegen + formElementExpectedValue: 'true' + formElementOperator: EQUALS + options: + # Column 0: Verarbeitungsvorgang-ID (cross-referenced, read-only) + - value: '[]' + label: Verarbeitungsvorgang-ID + processingPurpose: SYSTEM_OPERATION + employeeDataCategory: NON_CRITICAL + columnConfig: + sourceTableReference: umfassende_datenverarbeitung_tabelle + sourceColumnIndex: 0 + isReadOnly: true + # Column 1: Datenkategorie (cross-referenced, read-only) + - value: '[]' + label: Datenkategorie + processingPurpose: DATA_ANALYSIS + employeeDataCategory: REVIEW_REQUIRED + columnConfig: + sourceTableReference: umfassende_datenverarbeitung_tabelle + sourceColumnIndex: 4 + isReadOnly: true + # Column 2: Arbeitnehmerdaten (cross-referenced, read-only) + - value: '[]' + label: Arbeitnehmerdaten + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + columnConfig: + sourceTableReference: umfassende_datenverarbeitung_tabelle + sourceColumnIndex: 5 + isReadOnly: true + # Column 3: Speicherorte / Nebenpfade + - value: '[]' + label: Speicherorte / Nebenpfade + processingPurpose: SYSTEM_OPERATION + employeeDataCategory: REVIEW_REQUIRED + # Column 4: Aufbewahrungszweck + - value: '[]' + label: Aufbewahrungszweck + processingPurpose: DATA_ANALYSIS + employeeDataCategory: REVIEW_REQUIRED + # Column 5: Aufbewahrungsfrist + - value: '[]' + label: Aufbewahrungsfrist + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + # Column 6: Löschart + - value: '[]' + label: Löschart + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + # Column 7: Löschmethode + - value: '[]' + label: Löschmethode + processingPurpose: DATA_ANALYSIS + employeeDataCategory: SENSITIVE + # Column 8: Ausnahmen + - value: '[]' + label: Ausnahmen + processingPurpose: DATA_ANALYSIS + employeeDataCategory: REVIEW_REQUIRED + # Column 9: Nachweisform + - value: '[]' + label: Nachweisform + processingPurpose: DATA_ANALYSIS + employeeDataCategory: REVIEW_REQUIRED + # AI GENERATED TEMPLATES BELOW THIS LINE - WILL BE REPLACED LATER # Änderung: Schnittstellen - title: Änderung Schnittstellen diff --git a/legalconsenthub/app/composables/useFormElementVisibility.ts b/legalconsenthub/app/composables/useFormElementVisibility.ts index 3e43195..6e01ed1 100644 --- a/legalconsenthub/app/composables/useFormElementVisibility.ts +++ b/legalconsenthub/app/composables/useFormElementVisibility.ts @@ -1,5 +1,5 @@ import type { FormElementDto, FormElementVisibilityCondition, VisibilityConditionOperator } from '~~/.api-client' -import { VisibilityConditionOperator as VCOperator, VisibilityConditionType as VCType } from '~~/.api-client' +import { VisibilityConditionOperator as VCOperator, VisibilityConditionType as VCType, FormElementType } from '~~/.api-client' export function useFormElementVisibility() { /** @@ -65,6 +65,12 @@ export function useFormElementVisibility() { } function getFormElementValue(element: FormElementDto): string { + // For CHECKBOX with a single option, return the value directly + if (element.type === FormElementType.Checkbox && element.options.length === 1) { + return element.options[0]?.value || '' + } + + // For other element types (RADIOBUTTON, SELECT, etc.), find the selected option and return its label const selectedOption = element.options.find((option) => option.value === 'true') return selectedOption?.label || '' }