feat: Add application form seed

This commit is contained in:
2026-01-21 06:29:54 +01:00
parent 8350a1bd5d
commit e7633f9bc4
6 changed files with 1054 additions and 23 deletions

View File

@@ -178,27 +178,28 @@ class ApplicationFormFormatService(
}
}
val latexContent = buildString {
if (isWideTable) {
// Use smaller font and tighter column spacing for wide tables
appendLine("\\footnotesize")
appendLine("\\setlength{\\tabcolsep}{2pt}")
val latexContent =
buildString {
if (isWideTable) {
// Use smaller font and tighter column spacing for wide tables
appendLine("\\footnotesize")
appendLine("\\setlength{\\tabcolsep}{2pt}")
}
appendLine("\\begin{tabularx}{$tableWidth}{$columnSpec}")
appendLine("\\toprule")
appendLine("$headerRow \\\\")
appendLine("\\midrule")
dataRows.forEach { row: String ->
appendLine("$row \\\\")
}
appendLine("\\bottomrule")
appendLine("\\end{tabularx}")
if (isWideTable) {
// Reset to normal settings after the table
appendLine("\\normalsize")
appendLine("\\setlength{\\tabcolsep}{6pt}")
}
}
appendLine("\\begin{tabularx}{$tableWidth}{$columnSpec}")
appendLine("\\toprule")
appendLine("$headerRow \\\\")
appendLine("\\midrule")
dataRows.forEach { row: String ->
appendLine("$row \\\\")
}
appendLine("\\bottomrule")
appendLine("\\end{tabularx}")
if (isWideTable) {
// Reset to normal settings after the table
appendLine("\\normalsize")
appendLine("\\setlength{\\tabcolsep}{6pt}")
}
}
return latexContent to isWideTable
}

View File

@@ -13,8 +13,10 @@ interface ApplicationFormRepository : JpaRepository<ApplicationForm, UUID> {
fun existsByIsTemplateTrue(): Boolean
fun existsByIsTemplateFalseAndOrganizationId(organizationId: String): Boolean
@Query(
"SELECT c FROM ApplicationForm c WHERE (c.isTemplate IS false) AND (:organizationId is null or c.organizationId = :organizationId)",
"SELECT c FROM ApplicationForm c WHERE (c.isTemplate IS false) AND (:organizationId is null or c.organizationId = :organizationId or c.organizationId IS NULL or c.organizationId = '')",
)
fun findAllByIsTemplateFalseAndOrganizationId(
organizationId: String?,

View File

@@ -0,0 +1,84 @@
package com.betriebsratkanzlei.legalconsenthub.seed
import com.betriebsratkanzlei.legalconsenthub.application_form.ApplicationFormMapper
import com.betriebsratkanzlei.legalconsenthub.application_form.ApplicationFormRepository
import com.betriebsratkanzlei.legalconsenthub.application_form_version.ApplicationFormVersionService
import com.betriebsratkanzlei.legalconsenthub.user.User
import com.betriebsratkanzlei.legalconsenthub.user.UserRepository
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormDto
import com.betriebsratkanzlei.legalconsenthub_api.model.ApplicationFormStatus
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
import org.slf4j.LoggerFactory
import org.springframework.boot.ApplicationArguments
import org.springframework.boot.ApplicationRunner
import org.springframework.core.annotation.Order
import org.springframework.core.io.ClassPathResource
import org.springframework.stereotype.Component
import org.springframework.transaction.annotation.Transactional
@Component
@Order(200)
class InitialApplicationFormSeeder(
private val applicationFormRepository: ApplicationFormRepository,
private val applicationFormMapper: ApplicationFormMapper,
private val userRepository: UserRepository,
private val versionService: ApplicationFormVersionService,
) : ApplicationRunner {
private val yamlMapper = ObjectMapper(YAMLFactory()).findAndRegisterModules()
override fun run(args: ApplicationArguments) {
seedInitialFormIfMissing()
}
@Transactional
fun seedInitialFormIfMissing() {
if (applicationFormRepository.existsByIsTemplateFalseAndOrganizationId("")) {
log.info(
"At least one application form already present, skipping initial form seed",
)
return
}
val seedingUser = getOrCreateSeedingUser()
val dto = loadInitialFormDto()
val applicationForm =
applicationFormMapper.toNewApplicationForm(
dto.copy(isTemplate = false, status = ApplicationFormStatus.DRAFT),
seedingUser,
)
val savedApplicationForm = applicationFormRepository.save(applicationForm)
// Create initial version so PDF export is available
versionService.createVersion(savedApplicationForm, seedingUser)
log.info("Seeded initial application form with realistic values (name={})", savedApplicationForm.name)
}
private fun loadInitialFormDto(): ApplicationFormDto =
ClassPathResource(INITIAL_FORM_RESOURCE_PATH).inputStream.use { inputStream ->
yamlMapper.readValue(inputStream, ApplicationFormDto::class.java)
}
private fun getOrCreateSeedingUser(): User {
val existing = userRepository.findById(SEEDING_USER_ID)
if (existing.isPresent) return existing.get()
val user =
User(
keycloakId = SEEDING_USER_ID,
name = "System Seeder",
organizationId = null,
email = null,
)
return userRepository.save(user)
}
companion object {
private val log = LoggerFactory.getLogger(InitialApplicationFormSeeder::class.java)
private const val INITIAL_FORM_RESOURCE_PATH = "seed/initial_application_form.yaml"
private const val SEEDING_USER_ID = "system-seeder"
}
}

View File

@@ -10,11 +10,13 @@ import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
import org.slf4j.LoggerFactory
import org.springframework.boot.ApplicationArguments
import org.springframework.boot.ApplicationRunner
import org.springframework.core.annotation.Order
import org.springframework.core.io.ClassPathResource
import org.springframework.stereotype.Component
import org.springframework.transaction.annotation.Transactional
@Component
@Order(100)
class InitialApplicationFormTemplateSeeder(
private val applicationFormRepository: ApplicationFormRepository,
private val applicationFormMapper: ApplicationFormMapper,

View File

@@ -0,0 +1,911 @@
isTemplate: false
name: SAP S/4HANA
formElementSections:
# --- Main Section ---
- title: Angaben zum IT-System
shortTitle: IT-System
description: Alle Angaben zum IT-System
formElementSubSections:
# Art der Maßnahme (primary branching point)
- title: Art der Maßnahme
subtitle: ''
formElements:
- reference: art_der_massnahme
title: Art der IT-System Maßnahme
description: Handelt es sich um eine Einführung, Änderung, Erweiterung oder Ablösung/Einstellung eines IT-Systems?
options:
- value: 'true'
label: Einführung
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: ''
label: Einführung mit einhergehender Ablösung
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: ''
label: Änderung IT-System
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: ''
label: Einstellung IT-System
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
type: RADIOBUTTON
sectionSpawnTriggers:
- templateReference: rollen_berechtigungen_template
sectionSpawnConditionType: SHOW
sectionSpawnExpectedValue: Einführung
sectionSpawnOperator: EQUALS
- templateReference: verarbeitung_mitarbeiterdaten_template
sectionSpawnConditionType: SHOW
sectionSpawnExpectedValue: Einführung
sectionSpawnOperator: EQUALS
# Einführung: Allgemeine Informationen
- title: Allgemeine Informationen
subtitle: Grundlegende Informationen zur Einführung
formElements:
- reference: testphase_findet_statt
title: Findet eine Testphase statt?
description: Findet eine Testphase statt?
options:
- value: 'true'
label: Ja
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: ''
label: Nein
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
type: RADIOBUTTON
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: art_der_massnahme
formElementExpectedValue: Einführung
formElementOperator: EQUALS
- reference: mitarbeiterdaten_nicht_anonymisiert
title: Werden Mitarbeiterdaten in der Testphase nicht-anonymisiert oder pseudonymisiert verarbeitet?
description: Werden Mitarbeiterdaten in der Testphase nicht-anonymisiert oder pseudonymisiert verarbeitet?
options:
- value: 'true'
label: Ja
processingPurpose: DATA_ANALYSIS
employeeDataCategory: REVIEW_REQUIRED
- value: ''
label: Nein
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
type: RADIOBUTTON
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: testphase_findet_statt
formElementExpectedValue: Ja
formElementOperator: EQUALS
- reference: art_der_mitarbeiterdaten
title: Welche Art von Mitarbeiterdaten werden verarbeitet?
description: Welche Art von Mitarbeiterdaten werden verarbeitet?
options:
- value: 'Stammdaten (Name, Personalnummer, Kostenstelle), Gehalts- und Lohndaten, Arbeitszeitdaten, Abwesenheiten, Leistungsdaten, Berechtigungsstrukturen'
label: Art der Mitarbeiterdaten
processingPurpose: DATA_ANALYSIS
employeeDataCategory: SENSITIVE
type: TEXTAREA
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: mitarbeiterdaten_nicht_anonymisiert
formElementExpectedValue: Ja
formElementOperator: EQUALS
- reference: umfang_der_mitarbeiterdatenverarbeitung
title: In welchem Umfang werden Mitarbeiterdaten verarbeitet?
description: In welchem Umfang werden Mitarbeiterdaten verarbeitet?
options:
- value: 'Alle Arbeitnehmer der Unternehmensgruppe (ca. 8.500 Mitarbeiter weltweit). Tägliche Verarbeitung für Lohn- und Gehaltsabrechnung, wöchentlich für Produktionsplanung und Zeiterfassung, monatlich für Controlling-Reports und Performance-Analysen.'
label: Umfang der Verarbeitung
processingPurpose: DATA_ANALYSIS
employeeDataCategory: SENSITIVE
type: TEXTAREA
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: mitarbeiterdaten_nicht_anonymisiert
formElementExpectedValue: Ja
formElementOperator: EQUALS
- reference: anzahl_betroffener_mitarbeiter
title: Wie viele Mitarbeiter sind von der Testphase betroffen?
description: Wie viele Mitarbeiter sind von der Testphase betroffen?
options:
- value: '250 Mitarbeiter in der Pilotphase (Finance, HR, Supply Chain Teams), danach schrittweiser Rollout auf alle 8.500 Mitarbeiter'
label: Anzahl betroffener Mitarbeiter
processingPurpose: DATA_ANALYSIS
employeeDataCategory: REVIEW_REQUIRED
type: TEXTAREA
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: testphase_findet_statt
formElementExpectedValue: Ja
formElementOperator: EQUALS
# Einführung: Betroffene Einheiten
- title: Betroffene Einheiten und Verantwortlichkeiten
subtitle: Informationen zu betroffenen Einheiten und Verantwortlichen
formElements:
- reference: betroffene_unternehmen
title: Für welche Unternehmen soll das IT-System eingeführt werden?
description: Für welche Unternehmen soll das IT-System eingeführt werden?
options:
- value: 'Alle Gesellschaften der Unternehmensgruppe: Holding AG, Produktions GmbH, Services GmbH, International Inc.'
label: Betroffene Unternehmen
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: NON_CRITICAL
type: TEXTAREA
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: art_der_massnahme
formElementExpectedValue: Einführung
formElementOperator: EQUALS
- reference: betroffene_betriebe
title: Für welche Betriebe/Betriebsteile wird das IT-System eingeführt?
description: Für welche Betriebe/Betriebsteile wird das IT-System eingeführt?
options:
- value: 'Zentrale Verwaltung Frankfurt, Produktionsstandorte München und Stuttgart, Vertriebsniederlassungen Hamburg, Berlin, Köln, Außenstandorte international'
label: Betroffene Betriebe/Betriebsteile
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: REVIEW_REQUIRED
type: TEXTAREA
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: art_der_massnahme
formElementExpectedValue: Einführung
formElementOperator: EQUALS
- reference: betroffene_bereiche
title: Für welche Bereiche bzw. Abteilungen wird das IT-System zum Einsatz kommen?
description: Für welche Bereiche bzw. Abteilungen wird das IT-System zum Einsatz kommen?
options:
- value: 'Finance & Controlling, Human Resources, Supply Chain Management, Manufacturing & Operations, Sales & Distribution, Procurement, Quality Management'
label: Bereiche/Abteilungen
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: REVIEW_REQUIRED
type: TEXTAREA
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: art_der_massnahme
formElementExpectedValue: Einführung
formElementOperator: EQUALS
- reference: verantwortlicher_fachbereich
title: Wer ist der verantwortliche Fachbereich und Ansprechpartner?
description: Wer ist der verantwortliche Fachbereich und Ansprechpartner?
options:
- value: 'Group Finance, Projektleiter: Dr. Michael Schmidt (CFO), Stellvertreter: Sarah Müller (Head of IT), Kontakt: m.schmidt@company.de, Tel: +49 69 1234-5678'
label: Fachbereich und Ansprechpartner
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: NON_CRITICAL
type: TEXTAREA
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: art_der_massnahme
formElementExpectedValue: Einführung
formElementOperator: EQUALS
# Einführung: Angaben zum IT-System
- title: Angaben zum IT-System
subtitle: Detaillierte Informationen zum IT-System
formElements:
- reference: systembeschreibung
title: Kurze Systembeschreibung
description: Kurze Beschreibung des IT-Systems
options:
- value: 'SAP S/4HANA ist ein modernes, integriertes Enterprise Resource Planning (ERP) System der SAP SE. Es dient der unternehmensweiten Planung und Steuerung von Geschäftsprozessen in Echtzeit. Kernfunktionalitäten umfassen: Finanzwesen und Controlling, Personalwirtschaft, Supply Chain Management, Produktion, Vertrieb, Einkauf und Materialwirtschaft. Das System basiert auf einer In-Memory-Datenbank (SAP HANA) und bietet erweiterte Analytics- und KI-Funktionen für Predictive Analytics und automatisierte Prozessoptimierung.'
label: Systembeschreibung
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: NON_CRITICAL
type: TEXTAREA
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: art_der_massnahme
formElementExpectedValue: Einführung
formElementOperator: EQUALS
- reference: anbieter
title: Wer ist der Anbieter des IT-Systems?
description: Wer ist der Anbieter des IT-Systems?
options:
- value: 'SAP SE, Dietmar-Hopp-Allee 16, 69190 Walldorf, Deutschland'
label: Anbieter
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: NON_CRITICAL
type: TEXTAREA
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: art_der_massnahme
formElementExpectedValue: Einführung
formElementOperator: EQUALS
- reference: speicherort
title: Wo werden die Daten gespeichert?
description: Wo werden die Daten gespeichert?
options:
- value: 'true'
label: Rechenzentrum
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: REVIEW_REQUIRED
- value: ''
label: Cloud
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: REVIEW_REQUIRED
- value: ''
label: Hybrid
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: REVIEW_REQUIRED
type: RADIOBUTTON
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: art_der_massnahme
formElementExpectedValue: Einführung
formElementOperator: EQUALS
- reference: zugriff_art
title: Erfolgt der Zugriff stationär oder mobil?
description: Erfolgt der Zugriff stationär oder mobil?
options:
- value: ''
label: Stationär
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: NON_CRITICAL
- value: ''
label: Mobil
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: REVIEW_REQUIRED
- value: 'true'
label: Beides
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: REVIEW_REQUIRED
type: RADIOBUTTON
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: art_der_massnahme
formElementExpectedValue: Einführung
formElementOperator: EQUALS
- reference: endgeraetezugriff
title: Erfolgt der Zugriff über dienstliche oder private Endgeräte?
description: Erfolgt der Zugriff über dienstliche oder private Endgeräte?
options:
- value: 'true'
label: Dienstlich
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: NON_CRITICAL
- value: ''
label: Privat
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: SENSITIVE
- value: ''
label: Beides
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: SENSITIVE
type: RADIOBUTTON
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: art_der_massnahme
formElementExpectedValue: Einführung
formElementOperator: EQUALS
- reference: einfuehrung_module_komponenten
title: Werden Module oder Komponenten eingeführt?
description: Werden Module oder Komponenten eingeführt?
options:
- value: 'true'
label: Module
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: NON_CRITICAL
- value: ''
label: Komponenten
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: NON_CRITICAL
- value: ''
label: Beides
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: NON_CRITICAL
type: RADIOBUTTON
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: art_der_massnahme
formElementExpectedValue: Einführung
formElementOperator: EQUALS
- reference: modul_1
title: Modul 1
description: Name des ersten Moduls
options:
- value: 'SAP Finance and Controlling (FI/CO)'
label: Modulname
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: NON_CRITICAL
type: TEXTFIELD
isClonable: true
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: einfuehrung_module_komponenten
formElementExpectedValue: Module
formElementOperator: EQUALS
- formElementConditionType: SHOW
sourceFormElementReference: einfuehrung_module_komponenten
formElementExpectedValue: Beides
formElementOperator: EQUALS
sectionSpawnTriggers:
- templateReference: module_details_template
sectionSpawnConditionType: SHOW
sectionSpawnExpectedValue: ''
sectionSpawnOperator: IS_NOT_EMPTY
- reference: modul_2
title: Modul 2
description: Name des zweiten Moduls
options:
- value: 'SAP Human Capital Management (HCM)'
label: Modulname
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: SENSITIVE
type: TEXTFIELD
isClonable: true
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: einfuehrung_module_komponenten
formElementExpectedValue: Module
formElementOperator: EQUALS
- formElementConditionType: SHOW
sourceFormElementReference: einfuehrung_module_komponenten
formElementExpectedValue: Beides
formElementOperator: EQUALS
sectionSpawnTriggers:
- templateReference: module_details_template
sectionSpawnConditionType: SHOW
sectionSpawnExpectedValue: ''
sectionSpawnOperator: IS_NOT_EMPTY
- reference: modul_3
title: Modul 3
description: Name des dritten Moduls
options:
- value: 'SAP Supply Chain Management (SCM)'
label: Modulname
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: NON_CRITICAL
type: TEXTFIELD
isClonable: true
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: einfuehrung_module_komponenten
formElementExpectedValue: Module
formElementOperator: EQUALS
- formElementConditionType: SHOW
sourceFormElementReference: einfuehrung_module_komponenten
formElementExpectedValue: Beides
formElementOperator: EQUALS
sectionSpawnTriggers:
- templateReference: module_details_template
sectionSpawnConditionType: SHOW
sectionSpawnExpectedValue: ''
sectionSpawnOperator: IS_NOT_EMPTY
- reference: ki_einsatz
title: Wird KI eingesetzt?
description: Wird im System künstliche Intelligenz eingesetzt?
options:
- value: 'true'
label: Ja
processingPurpose: DATA_ANALYSIS
employeeDataCategory: REVIEW_REQUIRED
- value: ''
label: Nein
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: NON_CRITICAL
type: RADIOBUTTON
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: art_der_massnahme
formElementExpectedValue: Einführung
formElementOperator: EQUALS
sectionSpawnTriggers:
- templateReference: ki_details_template
sectionSpawnConditionType: SHOW
sectionSpawnExpectedValue: Ja
sectionSpawnOperator: EQUALS
- reference: wirtschaftliche_auswirkungen
title: Hat das IT-System wirtschaftliche Auswirkungen?
description: Hat das IT-System wirtschaftliche Auswirkungen auf die Organisation?
options:
- value: 'true'
label: Ja
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: NON_CRITICAL
- value: ''
label: Nein
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: NON_CRITICAL
type: RADIOBUTTON
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: art_der_massnahme
formElementExpectedValue: Einführung
formElementOperator: EQUALS
- reference: beschreibung_wirtschaftliche_auswirkungen
title: Beschreibung der wirtschaftlichen Auswirkungen
description: Bitte beschreiben Sie die wirtschaftlichen Auswirkungen
options:
- value: 'Steigerung der Prozesseffizienz um ca. 25-30% durch Automatisierung und Echtzeitdatenverarbeitung. Reduzierung von Fehlerraten in der Abrechnung um 15-20%. Verbesserte Transparenz in der Finanzplanung und im Controlling ermöglicht schnellere Entscheidungsfindung. Einsparungen bei manuellen Prozessen: ca. 45 FTE-Äquivalente. Geschätzter ROI nach 3 Jahren. Investitionsvolumen: ca. 12 Mio. EUR (Lizenzen, Implementation, Change Management).'
label: Wirtschaftliche Auswirkungen
processingPurpose: BUSINESS_PROCESS
employeeDataCategory: NON_CRITICAL
type: TEXTAREA
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: wirtschaftliche_auswirkungen
formElementExpectedValue: Ja
formElementOperator: EQUALS
# --- Eingabeseite 2: Rollen und Berechtigungen (spawned section) ---
- title: Rollen und Berechtigungen
shortTitle: Rollen/Berechtigungen
description: Vollständiges Rollen- und Berechtigungskonzept für das IT-System
spawnedFromElementReference: art_der_massnahme
formElementSubSections:
# Question: Performance/Behavior monitoring
- title: Leistungs-/Verhaltensüberwachung
formElements:
- reference: luv_beabsichtigt
title: Soll durch das IT-System Leistung und/oder Verhalten von Arbeitnehmern überwacht werden?
description: Wenn JA wird eine ausführliche Rollen- und Berechtigungsmatrix benötigt
type: RADIOBUTTON
options:
- value: 'true'
label: Ja
processingPurpose: DATA_ANALYSIS
employeeDataCategory: SENSITIVE
- value: ''
label: Nein
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
# Simple roles table (shown when LuV = Nein)
- title: Einfache Darstellung Rollen/Berechtigungen
formElements:
- reference: einfache_rollen_tabelle
title: Rollen und Berechtigungen
description: Übersicht der Rollen und deren Zugriffsberechtigungen
type: TABLE
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: luv_beabsichtigt
formElementExpectedValue: Nein
formElementOperator: EQUALS
options:
- value: '[]'
label: Rollen-ID
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: '[]'
label: Fachliche Rolle
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: '[]'
label: Rollenzahl
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: '[]'
label: Beschreibung
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: '[]'
label: Zugriffsberechtigungen
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: REVIEW_REQUIRED
# Detailed roles matrix (shown when LuV = Ja)
- title: 1. Rollenstamm
formElements:
- reference: rollenstamm_tabelle
title: Rollenstamm
description: Definition der Systemrollen
type: TABLE
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: luv_beabsichtigt
formElementExpectedValue: Ja
formElementOperator: EQUALS
options:
- value: '["R001", "R002", "R003", "R004", "R005"]'
label: Rollen-ID
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: '["SAP_FI_MANAGER", "SAP_HR_SPECIALIST", "SAP_SCM_PLANNER", "SAP_CONTROLLER", "SAP_ADMIN"]'
label: Rollenname
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: '["Finance Manager mit Vollzugriff auf FI/CO Module", "HR-Spezialist für Personalstammdaten und Abrechnung", "Supply Chain Planner für Produktions- und Bedarfsplanung", "Controller für Reporting und Analysen", "Systemadministrator für technische Konfiguration"]'
label: Beschreibung
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- title: 2. Permission-Katalog
formElements:
- reference: permission_katalog_tabelle
title: Permission-Katalog
description: Definition der Systemberechtigungen
type: TABLE
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: luv_beabsichtigt
formElementExpectedValue: Ja
formElementOperator: EQUALS
options:
- value: '["P001", "P002", "P003", "P004", "P005", "P006"]'
label: Permission-ID
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: '["READ_EMPLOYEE_DATA", "WRITE_EMPLOYEE_DATA", "READ_FINANCIAL_DATA", "WRITE_FINANCIAL_DATA", "READ_REPORTS", "ADMIN_CONFIG"]'
label: Permission-Name
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: '["Lesezugriff auf Mitarbeiterstammdaten", "Schreibzugriff auf Mitarbeiterstammdaten", "Lesezugriff auf Finanzdaten", "Schreibzugriff auf Finanzdaten", "Zugriff auf Reports und Analysen", "Administrative Systemkonfiguration"]'
label: Kurzbeschreibung
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- title: 3. Scope-Katalog
formElements:
- reference: scope_katalog_tabelle
title: Scope-Katalog
description: Auf welche Objekte/Organisationseinheiten werden Berechtigungen angewendet?
type: TABLE
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: luv_beabsichtigt
formElementExpectedValue: Ja
formElementOperator: EQUALS
options:
- value: '["S001", "S002", "S003", "S004"]'
label: Scope-ID
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: '["SCOPE_HOLDING", "SCOPE_PRODUCTION", "SCOPE_SALES", "SCOPE_GLOBAL"]'
label: Scope-Name
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: '["Holding AG - Zentrale Frankfurt", "Produktionsstandorte München und Stuttgart", "Vertriebsniederlassungen Deutschland", "Alle Gesellschaften weltweit"]'
label: Bedeutung
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- title: 4. Schranken Rolle → erlaubte Permissions
formElements:
- reference: schranken_rolle_permissions_tabelle
title: Schranken Rolle → erlaubte Permissions (Leitplanken)
description: Zuordnung der Rollen zu den jeweiligen Berechtigungen (Maximalrahmen)
type: TABLE
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: luv_beabsichtigt
formElementExpectedValue: Ja
formElementOperator: EQUALS
options:
- value: '["R001", "R002", "R003", "R004", "R005"]'
label: Rollen-ID
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
columnConfig:
sourceTableReference: rollenstamm_tabelle
sourceColumnIndex: 0
- value: '["P003,P004,P005", "P001,P002,P005", "P001,P003,P005", "P001,P003,P005", "P001,P002,P003,P004,P005,P006"]'
label: Permission-ID
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
columnConfig:
sourceTableReference: permission_katalog_tabelle
sourceColumnIndex: 0
isMultipleAllowed: true
- value: '["Nur eigene Kostenstelle", "Nur zugewiesene Mitarbeiter", "Nur Supply Chain Daten", "Nur lesend für Reporting", "Vollzugriff für Administration"]'
label: Einschränkungen
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: REVIEW_REQUIRED
- title: 5. Schranke Rolle → Erlaubte Scopes
formElements:
- reference: schranken_rolle_scopes_tabelle
title: Schranke Rolle → Erlaubte Scopes
description: Beschränkung des Zugriffs über die Rollen auf bestimmte Organisationseinheiten
type: TABLE
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: luv_beabsichtigt
formElementExpectedValue: Ja
formElementOperator: EQUALS
options:
- value: '["R001", "R002", "R003", "R004", "R005"]'
label: Rollen-ID
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
columnConfig:
sourceTableReference: rollenstamm_tabelle
sourceColumnIndex: 0
- value: '["S001,S004", "S001,S002,S003", "S002", "S004", "S004"]'
label: Scope-ID
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
columnConfig:
sourceTableReference: scope_katalog_tabelle
sourceColumnIndex: 0
isMultipleAllowed: true
- value: '["Zugriff auf Holding und globale Daten", "Zugriff auf alle deutschen Standorte", "Nur Produktionsstandorte", "Globaler Lesezugriff für Reporting", "Vollzugriff für Administration"]'
label: Einschränkung / Kommentar
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: REVIEW_REQUIRED
# --- Eingabeseite 3: Verarbeitung Mitarbeiterdaten (spawned section) ---
- title: Verarbeitung von Mitarbeiterdaten
shortTitle: Mitarbeiterdaten
description: Angaben zur Verarbeitung von personenbezogenen Arbeitnehmerdaten
spawnedFromElementReference: art_der_massnahme
formElementSubSections:
# Question: Personal data processing
- title: Grundlegende Fragen
formElements:
- reference: personenbezogene_daten_verarbeitet
title: Werden durch das IT-System personenbezogene Daten von Arbeitnehmern verarbeitet?
description: ''
type: RADIOBUTTON
options:
- value: 'true'
label: Ja
processingPurpose: DATA_ANALYSIS
employeeDataCategory: SENSITIVE
- value: ''
label: Nein
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
# Verarbeitete personenbezogene Daten (Umfassende Darstellung - shown when LuV = Ja)
- title: Verarbeitete personenbezogene Daten (Umfassende Darstellung)
formElements:
- reference: umfassende_datenverarbeitung_tabelle
title: Verarbeitete personenbezogene Daten
description: Umfassende Übersicht der verarbeiteten Daten mit Leistungs-/Verhaltenskontrolle
type: TABLE
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: personenbezogene_daten_verarbeitet
formElementExpectedValue: Ja
formElementOperator: EQUALS
- formElementConditionType: SHOW
sourceFormElementReference: luv_beabsichtigt
formElementExpectedValue: Ja
formElementOperator: EQUALS
options:
- value: '["V001", "V002", "V003", "V004", "V005"]'
label: Verarbeitungsvorgang-ID
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: '["Personalstammdatenpflege", "Zeiterfassung", "Gehaltsabrechnung", "Leistungsbeurteilung", "Produktionsauswertung"]'
label: Bezeichnung
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: '["HCM Master Data", "CATS Zeiterfassung", "Payroll Processing", "Performance Management", "Shop Floor Control"]'
label: Systemfunktion/Verarbeitungsform
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: '["Anlage und Pflege von Mitarbeiterstammdaten", "Erfassung von Arbeitszeiten und Abwesenheiten", "Berechnung und Auszahlung von Gehältern", "Erfassung und Auswertung von Leistungsdaten", "Analyse von Produktionskennzahlen pro Schicht"]'
label: Kurzbeschreibung
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: '["Stammdaten", "Arbeitszeitdaten", "Gehaltsdaten", "Leistungsdaten", "Produktionsdaten"]'
label: Datenkategorien
processingPurpose: DATA_ANALYSIS
employeeDataCategory: REVIEW_REQUIRED
- value: '["Name, Adresse, Personalnummer, Bankverbindung", "An-/Abmeldezeiten, Pausenzeiten, Überstunden", "Bruttogehalt, Abzüge, Zulagen, Sonderzahlungen", "Zielerreichung, Bewertungen, Entwicklungsgespräche", "Stückzahlen, Fehlerquoten, Maschinenzeiten"]'
label: Verarbeitete Arbeitnehmerdaten
processingPurpose: DATA_ANALYSIS
employeeDataCategory: SENSITIVE
- value: '["Alle Mitarbeiter", "Alle Mitarbeiter mit Zeiterfassung", "Alle Mitarbeiter", "Führungskräfte und Mitarbeiter mit Zielvereinbarung", "Produktionsmitarbeiter"]'
label: Betroffene Mitarbeiter
processingPurpose: DATA_ANALYSIS
employeeDataCategory: SENSITIVE
- value: '["Personalverwaltung", "Arbeitszeitdokumentation", "Entgeltabrechnung", "Personalentwicklung", "Produktionssteuerung"]'
label: Allgemeiner Zweck
processingPurpose: DATA_ANALYSIS
employeeDataCategory: REVIEW_REQUIRED
- value: '["Fortlaufend", "Täglich", "Monatlich", "Jährlich/Halbjährlich", "Täglich/Schichtweise"]'
label: Häufigkeit/Anlass
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: '["R002", "R002,R004", "R001,R002", "R002,R004", "R003,R004"]'
label: Rollen-Sichtbarkeit (grob)
processingPurpose: DATA_ANALYSIS
employeeDataCategory: REVIEW_REQUIRED
columnConfig:
sourceTableReference: rollenstamm_tabelle
sourceColumnIndex: 0
isMultipleAllowed: true
- value: '["Nein", "Ja - an Vorgesetzte", "Nein", "Ja - an Management", "Ja - an Produktionsleitung"]'
label: Export/Weitergabe (Ja/Nein + Ziel)
processingPurpose: DATA_ANALYSIS
employeeDataCategory: REVIEW_REQUIRED
- value: '["false", "true", "false", "true", "true"]'
label: Leistungs-/Verhaltenskontrolle beabsichtigt?
processingPurpose: DATA_ANALYSIS
employeeDataCategory: SENSITIVE
columnConfig:
isCheckbox: true
# Angaben zur Leistungs-/Verhaltenskontrolle
- title: Angaben zur Leistungs-/Verhaltenskontrolle
formElements:
- reference: luv_details_tabelle
title: Angaben zur Leistungs-/Verhaltenskontrolle
description: Detaillierte Angaben zu Verarbeitungsvorgängen mit Leistungs-/Verhaltenskontrolle
type: TABLE
tableRowPreset:
sourceTableReference: umfassende_datenverarbeitung_tabelle
filterCondition:
sourceColumnIndex: 11
expectedValue: 'true'
operator: EQUALS
columnMappings:
- sourceColumnIndex: 0
targetColumnIndex: 0
canAddRows: false
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: personenbezogene_daten_verarbeitet
formElementExpectedValue: Ja
formElementOperator: EQUALS
- formElementConditionType: SHOW
sourceFormElementReference: luv_beabsichtigt
formElementExpectedValue: Ja
formElementOperator: EQUALS
options:
- value: '["V002", "V004", "V005"]'
label: Verarbeitungsvorgang-ID
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
columnConfig:
sourceTableReference: umfassende_datenverarbeitung_tabelle
sourceColumnIndex: 0
isReadOnly: true
- value: '["Überwachung der Einhaltung von Arbeitszeiten", "Bewertung der individuellen Zielerreichung", "Auswertung der Produktivität pro Mitarbeiter/Schicht"]'
label: Konkreter Kontrollzweck
processingPurpose: DATA_ANALYSIS
employeeDataCategory: SENSITIVE
- value: '["Zeitbasierte Kontrolle", "Ergebniskontrolle", "Leistungskontrolle"]'
label: Kontrollart
processingPurpose: DATA_ANALYSIS
employeeDataCategory: SENSITIVE
- value: '["Hinweis bei Abweichungen, keine automatischen Konsequenzen", "Einfluss auf Bonuszahlungen und Beförderungen", "Grundlage für Schichtplanung und Personalentscheidungen"]'
label: Entscheidungswirkung
processingPurpose: DATA_ANALYSIS
employeeDataCategory: SENSITIVE
- value: '["Individuell pro Mitarbeiter", "Individuell pro Mitarbeiter", "Schicht/Team, bei Auffälligkeiten individuell"]'
label: Granularität/Bezugsebene
processingPurpose: DATA_ANALYSIS
employeeDataCategory: SENSITIVE
- value: '["Ja", "Ja", "Ja, bei begründetem Verdacht"]'
label: Drilldown bis Person möglich?
processingPurpose: DATA_ANALYSIS
employeeDataCategory: SENSITIVE
- value: '["Nein", "Ja - Ranking im Team", "Ja - Vergleich mit Durchschnitt"]'
label: Ranking/Scoring
processingPurpose: DATA_ANALYSIS
employeeDataCategory: SENSITIVE
- value: '["N/A", "Min. 5 Personen im Vergleich", "Min. 10 Personen pro Auswertung"]'
label: Mindestgruppe/Schwelle
processingPurpose: DATA_ANALYSIS
employeeDataCategory: SENSITIVE
- value: '["Automatischer Hinweis bei > 10h Arbeitszeit", "Nein, manuelle Bewertung", "Alert bei Produktivität < 80% des Durchschnitts"]'
label: Automatisierte Alerts/Entscheidungen
processingPurpose: DATA_ANALYSIS
employeeDataCategory: SENSITIVE
- value: '["Benachrichtigung an Mitarbeiter und Vorgesetzten", "4-Augen-Prinzip bei Bewertungen", "Prüfung durch BR vor Einzelauswertungen"]'
label: Schutzmaßnahmen/Governance
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: REVIEW_REQUIRED
- value: '["true", "true", "true"]'
label: Audit-Logging erforderlich
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: REVIEW_REQUIRED
columnConfig:
isCheckbox: true
# Access rules table
- title: Zugriffsregeln hinsichtlich der Verarbeitungsvorgänge
formElements:
- reference: zugriffsregeln_tabelle
title: Zugriffsregeln hinsichtlich der Verarbeitungsvorgänge
description: Detaillierte Zugriffsregeln pro Verarbeitungsvorgang und Rolle
type: TABLE
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: personenbezogene_daten_verarbeitet
formElementExpectedValue: Ja
formElementOperator: EQUALS
- formElementConditionType: SHOW
sourceFormElementReference: luv_beabsichtigt
formElementExpectedValue: Ja
formElementOperator: EQUALS
options:
- value: '["V001", "V002", "V003", "V004", "V005"]'
label: Verarbeitungsvorgang-ID
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
columnConfig:
sourceTableReference: umfassende_datenverarbeitung_tabelle
sourceColumnIndex: 0
- value: '["R002", "R002", "R001", "R002", "R003"]'
label: Rollen-ID
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
columnConfig:
sourceTableReference: rollenstamm_tabelle
sourceColumnIndex: 0
- value: '["true", "true", "true", "true", "true"]'
label: Sichtbar (Ja/Nein)
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
columnConfig:
isCheckbox: true
- value: '["S001,S002,S003", "S001,S002,S003", "S004", "S001,S002,S003", "S002"]'
label: Scope-ID
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
columnConfig:
sourceTableReference: scope_katalog_tabelle
sourceColumnIndex: 0
isMultipleAllowed: true
- value: '["Nur eigene Mitarbeiter im Verantwortungsbereich", "Nur direkte Berichte und Teamleiter", "Nur aggregierte Finanzdaten", "Nur bei 4-Augen-Freigabe", "Nur Produktionsbereich"]'
label: Bedingungen/Restriktionen
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: REVIEW_REQUIRED
# Permissions per processing operation table
- title: Berechtigungen für die jeweiligen Verarbeitungsvorgänge
formElements:
- reference: berechtigungen_verarbeitung_tabelle
title: Berechtigungen für die jeweiligen Verarbeitungsvorgänge
description: Welche Berechtigungen haben welche Rollen für welche Verarbeitungsvorgänge?
type: TABLE
visibilityConditions:
- formElementConditionType: SHOW
sourceFormElementReference: personenbezogene_daten_verarbeitet
formElementExpectedValue: Ja
formElementOperator: EQUALS
- formElementConditionType: SHOW
sourceFormElementReference: luv_beabsichtigt
formElementExpectedValue: Ja
formElementOperator: EQUALS
options:
- value: '["V001", "V002", "V003", "V004", "V005"]'
label: Verarbeitungsvorgang-ID
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
columnConfig:
sourceTableReference: umfassende_datenverarbeitung_tabelle
sourceColumnIndex: 0
- value: '["R002", "R002", "R001", "R002", "R003"]'
label: Rollen-ID
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
columnConfig:
sourceTableReference: rollenstamm_tabelle
sourceColumnIndex: 0
- value: '["P001,P002", "P001", "P003,P004", "P001,P005", "P001,P005"]'
label: Permission-ID
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
columnConfig:
sourceTableReference: permission_katalog_tabelle
sourceColumnIndex: 0
rowConstraint:
constraintTableReference: schranken_rolle_permissions_tabelle
constraintKeyColumnIndex: 0
constraintValueColumnIndex: 1
currentRowKeyColumnIndex: 1
- value: '["Ja", "Ja, bedingt", "Ja", "Ja, bedingt", "Ja, bedingt"]'
label: Erlaubt (Ja/Nein/bedingt)
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: NON_CRITICAL
- value: '["Vollzugriff auf eigene Mitarbeiter", "Nur Lesezugriff auf Zeitdaten", "Schreibzugriff für Gehaltsabrechnung", "Nur mit Freigabe durch Vorgesetzten", "Nur aggregierte Produktionsdaten"]'
label: Bedingungen
processingPurpose: SYSTEM_OPERATION
employeeDataCategory: REVIEW_REQUIRED