# MAPPA-LOGICA · Gestione Rischi ⟦ INIZIO · U-RISKS · Videata "Gestione Rischi" ⟧ File: public/risks.html · URL: /risks.html · Scopo: risk register NIS2 — censimento rischi (probabilità x impatto), matrice 5x5, analisi quantitativa FAIR (ALE/Monte Carlo), dashboard KRI, trattamenti e suggerimenti AI · Profili: tutti gli utenti autenticati con organizzazione (org_admin, compliance_manager, board_member, auditor, employee, consultant; super_admin) • U-RISKS.1 — Intestazione: toggle viste + azioni globali Mostra: titolo "Gestione Rischi"; toggle a 4 viste: "Tabella", "Matrice", "Quantitativo (FAIR)", "KRI"; bottoni "AI Suggerisci" e "+ Nuovo Rischio". Azioni: click sul toggle → `switchView()` mostra la vista corrispondente; "AI Suggerisci" → modale con rischi suggeriti dall'AI (U-RISKS.9); "+ Nuovo Rischio" → modale creazione rischio (U-RISKS.7). Dati da: "AI Suggerisci": `POST /api/risks/ai-suggest`. Confine: toggle `#view-toggle` (riga ~310); bottone `#btn-ai-suggest` (riga ~316). I singoli bottoni del toggle e "+ Nuovo Rischio" non hanno id (vedi ID mancanti). • U-RISKS.2 — Vista Tabella: filtri + registro rischi Mostra: filtri "Tutte le categorie" (Cyber, Operativo, Compliance, Supply Chain, Fisico, Umano) e "Tutti gli stati" (Identificato, In Analisi, In Trattamento, Monitorato, Chiuso); tabella con colonne Codice, Titolo, Categoria, Probabilita' (n/5), Impatto (n/5), Score (badge circolare colorato: low<10, medium 10-14, high 15-19, critical ≥20), Stato, Azioni (matita=Modifica, cestino=Elimina). Righe cliccabili. Azioni: cambio filtro → ricarica lista; click riga → dettaglio rischio (U-RISKS.6); matita → modale modifica (U-RISKS.7); cestino → modale conferma eliminazione (U-RISKS.8). Dati da: `GET /api/risks/list?category=&status=` (risposta `data.items`). Confine: contenitore `#view-table` (riga ~326); filtri `#filter-category` (riga ~328) e `#filter-status` (riga ~337); corpo tabella `#risks-table-body` (riga ~362). • U-RISKS.3 — Vista Matrice di Rischio 5x5 Mostra: card "Matrice di Rischio 5x5" (sottotitolo "Rischi inerenti (esclusi chiusi)"): griglia Probabilita' (asse Y, 5→1) x Impatto (asse X, 1→5), celle colorate dal verde al rosso secondo score P×I; dot bianco con il numero di rischi nella cella (tooltip con i titoli). Legenda: Basso (1-4), Medio (5-9), Alto (10-14), Elevato (15-19), Critico (20-25). Azioni: hover sulle celle (tooltip); nessun click. Dati da: `GET /api/risks/matrix` (risposta `data.risks` con `likelihood`, `impact`, `title`). Confine: contenitore `#view-matrix` (riga ~375); griglia `#risk-matrix-grid` (riga ~386). • U-RISKS.4 — Vista Quantitativo (FAIR): simulatore ALE + registro Mostra: card "Analisi Quantitativa del Rischio (FAIR)" — "Perdita Annua Attesa (ALE) in EUR — simulazione Monte Carlo". Form: select Rischio, TEF min/probabile/max (eventi/anno), Vulnerabilita (0-1), Perdita min/probabile/max (EUR). Risultati: 4 stat-box "ALE P10 (ottimistico)", "ALE Mediana (P50)", "ALE P90 (pessimistico)", "ALE Media", LEF medio e istogramma della distribuzione delle perdite simulate. Seconda card "Registro Quantitativo" con "ALE di portafoglio" e tabella (Codice, Titolo, Categoria, ALE Min/Mediana/Max/Media). Azioni: "Calcola ALE" → esegue la simulazione FAIR sul rischio selezionato e aggiorna il registro. Dati da: select rischi: `GET /api/risks/list?per_page=200`; calcolo: `POST /api/risks/{id}/fair` (body `tef_min, tef_ml, tef_max, vuln, lm_min, lm_ml, lm_max`); registro: `GET /api/risks/fairRegister` (campi `portfolio_ale_mean`, `risks[]`). Confine: contenitore `#view-fair` (riga ~420); select `#fair-risk-select` (riga ~429); input `#fair-tef-min` (~430), `#fair-tef-ml` (~431), `#fair-tef-max` (~432), `#fair-vuln` (~433), `#fair-lm-min` (~434), `#fair-lm-ml` (~435), `#fair-lm-max` (~436); bottone `#btn-run-fair` (riga ~438); risultati `#fair-result` (~439) con `#fair-p10`/`#fair-p50`/`#fair-p90`/`#fair-mean` (~441-444), `#fair-lef` (~446), `#fair-histogram` (~447), `#fair-histogram-labels` (~448); portafoglio `#fair-portfolio` (~454); registro `#fair-register-body` (~458). • U-RISKS.5 — Vista KRI: indicatori chiave di rischio Mostra: 4 stat-box riepilogo per stato (Critico/rosso, Attenzione/ambra, OK/verde, N/D/grigio); tabella KRI con colonne Stato (semaforo), Indicatore (nome + descrizione), Categoria, Valore (con unità), Soglia Warning, Soglia Critica, Azioni (Modifica). Azioni: "+ Nuovo KRI" → modale creazione (U-RISKS.8); "Modifica" su riga → stessa modale precompilata. Dati da: `GET /api/risks/kri` (campi `summary{red,amber,green,unknown}`, `kris[]`). Confine: contenitore `#view-kri` (riga ~464); riepilogo `#kri-summary` (riga ~466); corpo tabella `#kri-table-body` (riga ~473). Il bottone "+ Nuovo KRI" non ha id (vedi ID mancanti). • U-RISKS.6 — Vista Dettaglio rischio (generata via JS) Mostra: bottone "Torna alla lista"; card principale con codice + titolo, blocco score "Probabilita' x Impatto = Rischio Inerente" (+ "Rischio Residuo" se presente), Descrizione, Categoria, Stato, Trattamento (Mitigare/Accettare/Trasferire/Evitare), Sorgente Minaccia, Vulnerabilita', Responsabile, Data Revisione, Articolo NIS2; card "Trattamenti" con elenco azioni (descrizione, stato, responsabile, scadenza, note); card laterale "Riepilogo" (Codice, Creato il, Aggiornato il, numero Trattamenti). Azioni: "Torna alla lista" → ripristina la vista precedente; "Modifica" → modale modifica; "Elimina" → modale conferma; "+ Aggiungi" trattamento → modale trattamento (U-RISKS.8). Dati da: `GET /api/risks/{id}` (include `treatments[]`). Confine: contenitore `#view-detail` (riga ~479); contenuto interno generato via JS senza id propri (bottone back con classe `.detail-back`). • U-RISKS.7 — Modale "Nuovo Rischio" / "Modifica Rischio" (generata via JS) Mostra: campi Titolo*, Descrizione, Categoria, Trattamento, Sorgente Minaccia, Vulnerabilita', slider Probabilita' 1-5 (con scala ISO 27005: da "1 - Remota: <1% probabilità annua" a "5 - Quasi Certa: >70%"), slider Impatto 1-5 (da "1 - Minimo: <€10k danno" a "5 - Catastrofico: >€10M"), anteprima live "Rischio Inerente" (P×I, colore dinamico), Responsabile (ID utente), Data Revisione, Articolo NIS2 di riferimento. Azioni: "Crea Rischio"/"Salva Modifiche" → crea o aggiorna il rischio e ricarica lista/dettaglio; "Annulla" → chiude. Dati da: creazione: `POST /api/risks/create`; modifica: `PUT /api/risks/{id}`; precompilazione: `GET /api/risks/{id}`. Confine: modale in `#modal-overlay` (common.js); campi JS: `#risk-title`, `#risk-description`, `#risk-category`, `#risk-treatment`, `#risk-threat-source`, `#risk-vulnerability`, `#risk-likelihood`, `#risk-impact`, `#likelihood-value`, `#impact-value`, `#likelihood-detail`, `#impact-detail`, `#score-preview-value`, `#risk-owner`, `#risk-review-date`, `#risk-nis2-article` (script righe ~1080-1156). • U-RISKS.8 — Modali secondarie: KRI, Trattamento, Eliminazione (generate via JS) Mostra: (a) Modale "Nuovo KRI"/"Modifica KRI": Nome indicatore*, Descrizione, Categoria, Unita (%, count, EUR...), Valore corrente, Obiettivo, Soglia Warning, Soglia Critica, Direzione (Valori alti = peggio / Valori bassi = peggio). (b) Modale "Aggiungi Trattamento": Descrizione Azione*, Responsabile (ID utente), Data Scadenza, Stato (Pianificato/In Corso/Completato), Note. (c) Modale "Conferma Eliminazione": testo con titolo del rischio. Azioni: (a) "Salva" → crea/aggiorna KRI; (b) "Aggiungi" → crea trattamento e ricarica il dettaglio; (c) "Elimina" → cancella il rischio. Dati da: KRI: `POST /api/risks/kri` (create) e `PUT /api/risks/kri/{id}` (update); trattamento: `POST /api/risks/{id}/treatments`; eliminazione: `DELETE /api/risks/{id}`. Confine: tutte in `#modal-overlay`; campi KRI: `#kri-name`, `#kri-desc`, `#kri-cat`, `#kri-unit`, `#kri-cur`, `#kri-target`, `#kri-warn`, `#kri-crit`, `#kri-dir` (script righe ~764-777); campi trattamento: `#treatment-description`, `#treatment-responsible`, `#treatment-due-date`, `#treatment-status`, `#treatment-notes` (script righe ~1264-1291). • U-RISKS.9 — Modale "Rischi Suggeriti dall'AI" (generata via JS) Mostra: elenco scrollabile di rischi suggeriti dall'AI in base al settore/asset dell'organizzazione: titolo, descrizione, tag categoria, badge "P:n" e "I:n". Azioni: "Chiudi" → chiude la modale (i suggerimenti non vengono inseriti automaticamente nel registro). Dati da: `POST /api/risks/ai-suggest` (risposta array o `data.suggestions[]`). Confine: modale in `#modal-overlay`; trigger `#btn-ai-suggest` (riga ~316). ⟦ FINE · U-RISKS ⟧ ## ID STABILI MANCANTI (da aggiungere) | Elemento | Riga | Id proposto | |---|---|---| | Bottone toggle "Tabella" | ~311 | `nis2-risks-toggle-tabella` | | Bottone toggle "Matrice" | ~312 | `nis2-risks-toggle-matrice` | | Bottone toggle "Quantitativo (FAIR)" | ~313 | `nis2-risks-toggle-fair` | | Bottone toggle "KRI" | ~314 | `nis2-risks-toggle-kri` | | Bottone "+ Nuovo Rischio" (header) | ~320 | `nis2-risks-btn-nuovo` | | Bottone "+ Nuovo KRI" (vista KRI) | ~467 | `nis2-risks-btn-nuovo-kri` | | Bottone "Torna alla lista" nel dettaglio (classe `.detail-back`, generato via JS) | script ~918 | `nis2-risks-btn-back` |