[DOCS] A4 design: modello relazionale (organigramma+RACI hub, skill/gap competenze/formazione, m2m procedure/inventario/rischi, scadenziario centralizzato) — ancorato GV.RR/PR.AT/ID.AM/GV.PO/GV.SC/art.23-24, 5 fasi

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
DevEnv nis2-agile
2026-06-15 17:36:46 +02:00
co-authored by Claude Opus 4.8
parent 3c5184bbae
commit dbda3efde4
+77
View File
@@ -0,0 +1,77 @@
# DESIGN — A4: Modello relazionale (organigramma RACI ↔ skill / formazione / inventario / procedure / rischi + scadenziario)
> Stato: **DESIGN (pre-implementazione)**. Contesto: segnalazioni Simon Fattori, punti **2, 3, 4, 5, 6, 7** (accolti in A4). Data: 2026-06-15.
> È l'epic più grande → da realizzare a **FASI**. Ancoraggio normativo verificato (Det. ACN 164179/2025 + D.Lgs. 138/2024). Vedi `reference-dlgs-articles`, `DESIGN_A2_ONBOARDING.md`.
## 0. Principio
A4 trasforma i moduli oggi "a silos" in un **grafo relazionale** con al centro l'**organigramma** (ruoli/responsabilità) e la **matrice RACI** come hub che lega i ruoli agli oggetti (inventario, procedure, rischi). Obiettivo: compliance *vissuta e dimostrabile in audit* (chi è responsabile di cosa, con quali competenze, con quali scadenze).
## 1. Stato attuale (da ESTENDERE)
| Ambito | Esiste? | Note |
|---|---|---|
| RACI ruoli | Parziale | `isms_roles` (mig.037): `role_name`, `user_id`, `responsibility`, `raci ENUM(R,A,C,I)` — ma **legato a un `isms_model`** (SGSI clausola 5.3), 1 valore RACI per ruolo, **non** matrice ruolo×oggetto |
| Organigramma org-wide | NO | nessuna gerarchia ruoli, nessun "nodo organo di gestione/board" |
| Skill / mansioni / competenze | NO | — |
| Gap competenze | NO | — |
| Formazione | SÌ | `training_courses` / `training_assignments` (`target_role` solo ENUM, non FK a ruolo) |
| Procedure | SÌ | `policies` (+ `policy_versions`, `next_review_date`) |
| Inventario | SÌ | `assets` (+ `relevance_score`/`is_nis2_relevant` GV.OC-04) |
| Rischi | SÌ | `risks` (+ `risk_treatments`, `kri`) |
| Fornitori/stakeholder | SÌ | `suppliers` (Supply Chain) |
| Azioni | SÌ | `non_conformities` / `corrective_actions` (mig.004) |
| Scadenziario centralizzato | NO | scadenze sparse (`policies.next_review_date`, `compliance_controls.next_review_date`, `*.due_date`) |
## 2. Modello entità + relazioni (il cuore)
**Nuove tabelle** (additive):
- **`org_roles`** — organigramma: `id, organization_id, role_name, parent_role_id NULL (gerarchia), holder_user_id NULL, is_governance_body TINYINT (nodo organi di amministrazione/direttivi, Art.23), description, created_at`. *(L'`isms_roles` SGSI può puntare a `org_roles` via `org_role_id` opzionale; non si duplica.)*
- **`skills`** — catalogo competenze: `id, organization_id NULL(=globali), name, area`.
- **`role_skills`** — competenze RICHIESTE da un ruolo: `role_id → org_roles, skill_id, required_level (1-5)`. (m2m ruolo↔skill)
- **`user_skills`** — competenze POSSEDUTE: `user_id, skill_id, level (1-5), acquired_via (course_id NULL → training), evidence`. (m2m utente↔skill, collegato al registro corsi)
- **`skill_course_map`** — skill ↔ corso che la eroga: `skill_id, training_course_id`. (collega competenze ↔ formazione)
- **`raci_assignments`** — **MATRICE RACI** (hub): `id, organization_id, role_id → org_roles, object_type ENUM('inventory','procedure','risk','supplier'), object_id, raci ENUM('R','A','C','I')`. → lega l'organigramma a inventario/procedure/rischi/fornitori (m2m via questa tabella).
- **link m2m diretti** (richiesti dalle segnalazioni 4/5/7): `procedure_inventory(procedure_id, asset_id)`, `procedure_risk(procedure_id, risk_id)`, `inventory_risk(asset_id, risk_id)`, `risk_measure(risk_id, measure_code)` (le misure ACN dell'assessment).
- **`review_schedule`** — **SCADENZIARIO centralizzato**: `id, organization_id, entity_type ENUM('role','skill','inventory','procedure','risk','supplier','measure'), entity_id, owner_role_id NULL, frequency_months, last_reviewed_at, next_review_date, status ENUM('ok','due','overdue'), notes`. Aggrega/sostituisce le scadenze sparse.
- **`actions`** (oppure riuso `corrective_actions`): azione generata da **alert** (gap competenza, scadenza, rischio) → `source_type, source_id, assigned_role_id, due_date, status`. *(Riuso consigliato di `corrective_actions` + un campo `source_type` per non duplicare il workflow CAPA.)*
**Relazioni chiave** (tutte m2m dove indicato dalle segnalazioni):
```
org_roles ──< raci_assignments >── (inventory | procedure | risk | supplier)
org_roles ──< role_skills >── skills ──< user_skills >── users
skills ──< skill_course_map >── training_courses
procedures ──< procedure_inventory >── inventory ──< inventory_risk >── risks
procedures ──< procedure_risk >── risks ──< risk_measure >── misure ACN (assessment)
(role|skill|inventory|procedure|risk|supplier) ──1:N── review_schedule
gap competenze / scadenze / rischi ──trigger──> actions(corrective_actions)
```
## 3. Gap competenze (segnalazione 3)
**Gap = `role_skills.required_level` (del ruolo che l'utente ricopre) − `user_skills.level`** per ciascuna skill richiesta. Vista `competence_gap` (calcolata): per ogni utente con `org_roles.holder_user_id`, confronto richiesto vs posseduto. **Alert** quando gap > 0 → apertura **azione** (`corrective_actions`, `source_type='competence_gap'`) + voce nello **`review_schedule`**. Ancoraggio: **PR.AT-01** (tutti), **PR.AT-02** (solo essenziali), **GV.RR-04** (cyber nelle pratiche HR).
## 4. Ancoraggio normativo per entità (must-have)
- **Organigramma/ruoli** → **GV.RR-02** (ruoli, responsabilità e poteri stabiliti/comunicati) + **Art. 23 D.Lgs. 138/2024** (responsabilità organi di amministrazione e direttivi) → **`is_governance_body`** obbligatorio come nodo distinto con potere di approvazione.
- **Skill/formazione** → **PR.AT-01/02**, **GV.RR-04**.
- **Inventario** → **ID.AM-01/02** (+03 essenziali); collegare al **registro GV.OC-04** (`relevance_score`), non duplicarlo.
- **Procedure** → **GV.PO-01** (policy) + **GV.PO-02** (riesame/aggiornamento → scadenziario obbligatorio).
- **Rischi** → **Art. 24 D.Lgs.** + **GV.RM-03** + famiglia **ID.RA**; mappabili sulle misure (37 importanti / 43 essenziali, fino al livello requisito).
- **Stakeholder/fornitori** (segnalazione 6) → **GV.SC-02** include fornitori **+ clienti + partner** (non solo fornitori) + **GV.SC-04/05/07**; non duplicare il modulo Supply Chain esistente.
- **Scadenziario** → la revisione periodica è obbligo per **GV.PO-02**, **GV.SC-07**, **PR.AT**, **DE.CM** (periodicità puntuale come buona prassi dove non fissata).
## 5. Migration (additiva) — sketch
Nuova `041_relational_model.sql`: `org_roles`, `skills`, `role_skills`, `user_skills`, `skill_course_map`, `raci_assignments`, `procedure_inventory`, `procedure_risk`, `inventory_risk`, `risk_measure`, `review_schedule` (+ `corrective_actions.source_type`). Tutte con `organization_id` + FK + UNIQUE sulle coppie m2m. Idempotente (runner come 039/040).
## 6. UI (a fasi)
- **Organigramma**: vista ad albero (ruoli, holder, RACI badge), editor ruolo.
- **Matrice RACI**: griglia ruolo × oggetto con celle R/A/C/I.
- **Gap competenze**: dashboard per utente/ruolo (richiesto vs posseduto) + CTA "apri azione/assegna corso".
- **Scadenziario**: calendario/tabella unica delle revisioni (filtrabile per entità, owner, stato due/overdue).
- Link m2m editabili nelle pagine inventario/procedure/rischi.
## 7. Fasi consigliate (A4 è grande → spezzare)
- **4.1** `org_roles` (organigramma + nodo governance Art.23) + vista albero.
- **4.2** `skills`/`role_skills`/`user_skills`/`skill_course_map` + gap competenze (segn. 3) + alert→azione.
- **4.3** `raci_assignments` (matrice RACI) + link m2m procedure/inventario/rischi (segn. 4/5/7).
- **4.4** `review_schedule` centralizzato (segn. trasversale) + migrazione delle scadenze esistenti.
- **4.5** estensione stakeholder a clienti/partner (segn. 6, GV.SC-02) riusando Supply Chain.
## 8. Cosa NON cambia / riuso
Riuso `training_*`, `policies`, `assets` (+relevance GV.OC-04), `risks`, `suppliers`, `corrective_actions`. `isms_roles` resta per la SoA SGSI (può linkare `org_roles`). Nessuna modifica ai flussi auth/onboarding/incidenti. `entity_type`/schema esistente invariati.