Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
9.5 KiB
DESIGN — A4: Modello relazionale (organigramma RACI ↔ skill / formazione / inventario / procedure / rischi + scadenziario)
Stato: IN CORSO. 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.AVANZAMENTO: ✅ 4.1 Organigramma (
041_org_roles.sql,OrgRoleController,organigramma.html) — LIVE. ✅ 4.2 Competenze (042_competences.sql:skills/role_skills/user_skills/skill_course_map;CompetenceController;competenze.html) — LIVE. ✅ 4.3 Matrice RACI (043_raci.sql:raci_assignments+procedure_inventory/procedure_risk/inventory_risk/risk_measure;RaciController;raci.html+raci.js; object_id polimorfico anti-IDOR app-layer) — LIVE (commitb4d47d5). ✅ 4.4 Scadenziario (044_review_schedule.sql;ReviewScheduleControllerlist/complete/sync;review-schedule.html) — LIVE. ✅ 4.5 Stakeholder estesi (045_stakeholders.sqlsuppliers.stakeholder_type;SupplyChainController::stakeholderMap;stakeholders.html) — LIVE (commitc5b00cc). 🎉 A4 COMPLETA (5/5).🔴 RETTIFICA NOMI REALI (verificata sul codice): questo design parlava di una tabella
corrective_actionsche NON ESISTE. La tabella delle azioni reale ècapa_actions(mig.004), figlia obbligatoria dinon_conformities(NCR) viancr_id NOT NULL, e non ha una colonnasource_type. L'alert "gap → azione" (impl. in 4.2) quindi NON creacorrective_actions/source_type: crea unanon_conformitiesancorata al gap (source='management_review',source_entity_type='competence_gap',source_entity_id=role_skills.id) + unacapa_actionsfiglia. Le menzioni dicorrective_actions/source_typequi sotto vanno lette in questo senso.
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_rolesSGSI può puntare aorg_rolesviaorg_role_idopzionale; 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.- azione da alert → riuso
non_conformities+capa_actions(mig.004): l'alert (gap competenza, scadenza, rischio) crea una NCR ancorata viasource_entity_type/source_entity_id(es.'competence_gap'+role_skills.id) e unacapa_actionsfiglia. (NON esistecorrective_actions/source_type: si riusa l'intero workflow CAPA senza alterarne lo schema.)
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──> non_conformities ──< capa_actions (workflow CAPA)
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 = NCR (non_conformities, source_entity_type='competence_gap', source_entity_id=role_skills.id) + capa_actions figlia (+ in futuro 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_bodyobbligatorio 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_schedulecentralizzato (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.