# Workflow: Fragebögen in Sicherheitsbereichen ## Ziel Zuordnung strukturiert erfassbarer Fragebögen (`Questionaire`) zu einem `SecurityArea` via `SecurityAreaQuestionnaire`. ## Beteiligte Klassen - `SecurityAreaController` – UI Aktionen (add/remove, refresh). - `SecurityAreaManager` – Persistenzoperationen (add/remove/reload, Verfügbarkeitsliste). - `SecurityAreaQuestionnaire` – Assoziative Entity (enthält Name / ID des Fragebogens + Bezug zum Schutzbereich). - `QuestionaireManager` (nicht gezeigt) – Verwaltung aller Fragebögen. ## Hinzufügen Ablauf 1. Nutzer wählt Schutzbereich + Fragebogen im Dialog. 2. Controller ruft `securityAreaManager.addQuestionnaireToSecurityArea(selectedArea, selectedQuestionnaire)`. 3. Manager: - Lädt `area` (falls persistent) neu per `em.find`. - Erzeugt neues `SecurityAreaQuestionnaire` Objekt. - Setzt Relation (wrapper.setArea(area)). - Persistiert Wrapper, merged Area. 4. Controller: `refrehSelected()` (Merge + Initialize Lazy Collections), zeigt Erfolgsmeldung. ## Entfernen Ablauf 1. Nutzer wählt zugeordneten Fragebogen (Wrapper-Objekt). 2. Controller ruft `securityAreaManager.removeQuestionnaireFromSecurityArea(area, wrapper)`. 3. Manager lädt Entities (falls notwendig), entfernt aus Collection, `em.remove(wrapper)`, `em.merge(area)`. 4. Controller aktualisiert Verfügbare Liste. ## Verfügbare Fragebögen - Abfrage aller Fragebögen: `SELECT q FROM Questionaire q ORDER BY q.name`. - Filter: Namen bereits zugeordneter Wrapper (Verbesserung: Filter per ID zur Sicherheit gegen Namensduplikate). ## Edge Cases - Bereich / Fragebogen null: Controller zeigt Fehlermeldung. - Concurrent Änderung: Nach Persist immer Refresh durchführen. - Doppelte Zuordnung: Filter verhindert erneute Anzeige; Manager könnte zusätzlich prüfen (Collection enthält bereits Name). ## Verbesserungen - Validierung auf Einzigartigkeit im Manager (statt nur UI Filter). - Optimierte Fetch Strategie (JOIN FETCH) bei Reload. - Nutzung eines Service zur Kapselung Geschäftslogik + Manager nur für CRUD. ## Beispiel Pseudocode (Hinzufügen) ```java if (questionnaire != null && area != null) { areaManager.addQuestionnaireToSecurityArea(area, questionnaire); controller.refrehSelected(); } ``` --- Aktualisiert: 2025-10-20