From dbda3efde4527c46a135990786db7159684fb730 Mon Sep 17 00:00:00 2001 From: DevEnv nis2-agile Date: Mon, 15 Jun 2026 17:36:46 +0200 Subject: [PATCH] =?UTF-8?q?[DOCS]=20A4=20design:=20modello=20relazionale?= =?UTF-8?q?=20(organigramma+RACI=20hub,=20skill/gap=20competenze/formazion?= =?UTF-8?q?e,=20m2m=20procedure/inventario/rischi,=20scadenziario=20centra?= =?UTF-8?q?lizzato)=20=E2=80=94=20ancorato=20GV.RR/PR.AT/ID.AM/GV.PO/GV.SC?= =?UTF-8?q?/art.23-24,=205=20fasi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/DESIGN_A4_RELATIONAL.md | 77 ++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 docs/DESIGN_A4_RELATIONAL.md diff --git a/docs/DESIGN_A4_RELATIONAL.md b/docs/DESIGN_A4_RELATIONAL.md new file mode 100644 index 0000000..ca00e81 --- /dev/null +++ b/docs/DESIGN_A4_RELATIONAL.md @@ -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.