[FIX] Rischi 12 col: titoli gruppo "Rischio Inerente/Residuo" + soglie alert 9-12 (feedback Simon)

Riscontro Simon sulla tabella Gestione Rischi:
- Titoli di gruppo sui tripletti Probabilità/Impatto/Valutazione: da
  "VALUTAZIONE RISCHIO INERENTE/RESIDUO" a "Rischio Inerente"/"Rischio Residuo"
  (risks.html thead + i18n.js grp_inherent/grp_residual IT+EN).
- Ritirata eccezione #3: banda Alert riportata a spec Simon 15-25/9-12/3-8/1-2.
  Simon ha ragione: con P,I in 1-5 i prodotti 7/11/13/14 non esistono → nessun
  buco. alertBand resta >=9 (=9-12 in pratica); aggiornati commento, help.js,
  manuale, KB (9-14 -> 9-12).
- Cache-buster help.js/i18n.js -> 20260730b (i18n va bustato o riscrive il titolo).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
DevEnv nis2-agile
2026-07-31 07:36:43 +02:00
co-authored by Claude Opus 4.8
parent 7149e762f8
commit 8799620fba
39 changed files with 85 additions and 84 deletions
+4 -4
View File
@@ -38,8 +38,8 @@ errore umano) — copre l'approccio multirischio richiesto dall'art. 24 D.Lgs. 1
| 11 | **Esito residuo** | *Rivalutare* (9–25) o *Adeguato* (1–8). |
| 12 | **Rischio Residuo** | "Valutato" + link per aggiornare **esplicitamente** lo stato di conformità. |
Le colonne 3-5 sono raggruppate sotto **VALUTAZIONE RISCHIO INERENTE** (prima del trattamento),
le 8-10 sotto **VALUTAZIONE RISCHIO RESIDUO** (dopo il trattamento).
Le colonne 3-5 sono raggruppate sotto il titolo **Rischio Inerente** (valutazione prima del
trattamento), le 8-10 sotto **Rischio Residuo** (valutazione dopo il trattamento).
## 3. Come valutare un rischio
Se sei **Amministratore**, **Compliance Manager** o **super admin**:
@@ -54,7 +54,7 @@ In base al punteggio **inerente** compare un pulsante colorato:
| Punteggio inerente | Alert | Colore |
|--------------------|-------|--------|
| 15 – 25 | **Azione Prioritaria** | rosso |
| 9 – 14 | **Azione Critica** | rosso tenue |
| 9 – 12 | **Azione Critica** | rosso tenue |
| 3 – 8 | **Azione Necessaria** | arancione |
| 1 – 2 | **Azione Suggerita** | verde |
@@ -62,7 +62,7 @@ Cliccando l'Alert si apre un pannello con le **azioni già registrate** su quel
recente) e una riga in alto con la **data di oggi** e il pulsante **Crea azione** per aggiungerne
una nuova. È il primo mattone del futuro **Modulo Azioni** (registro azioni, audit, KPI, budget).
> Le soglie (15-25, 9-14, …) sono una **scelta metodologica** dell'organizzazione (ISO/IEC 27001
> Le soglie (15-25, 9-12, …) sono una **scelta metodologica** dell'organizzazione (ISO/IEC 27001
> §6.1.2), non un obbligo di legge.
## 5. Rischio residuo e conformità: due cose diverse (importante)
+3 -3
View File
@@ -16,10 +16,10 @@ Ogni rischio ha un codice **RSK-‹misura›Com.‹n›** (es. `RSK-GV.OC-04Com.
La tabella dei rischi-da-requisito ha **12 colonne**:
1. **Codice rischio** (RSK-…): cliccabile, apre la voce in **Misure e Requisiti**.
2. **Descrizione rischio**: il rischio di default associato al requisito nel framework (campo `risk_descr`).
3-5. **VALUTAZIONE RISCHIO INERENTE** (prima del trattamento): Probabilità (1-5), Impatto (1-5), Valutazione (= P×I, 1-25).
6. **Alert**: dipende dal punteggio inerente — 15-25 *Azione Prioritaria*, 9-14 *Azione Critica*, 3-8 *Azione Necessaria*, 1-2 *Azione Suggerita*. Cliccando si vedono/creano le **azioni** su quel rischio.
3-5. Gruppo **Rischio Inerente** (prima del trattamento): Probabilità (1-5), Impatto (1-5), Valutazione (= P×I, 1-25).
6. **Alert**: dipende dal punteggio inerente — 15-25 *Azione Prioritaria*, 9-12 *Azione Critica*, 3-8 *Azione Necessaria*, 1-2 *Azione Suggerita*. Cliccando si vedono/creano le **azioni** su quel rischio.
7. **Rischio Inerente**: "Valutato" quando inerente è compilato.
8-10. **VALUTAZIONE RISCHIO RESIDUO** (dopo il trattamento): Probabilità, Impatto, Valutazione.
8-10. Gruppo **Rischio Residuo** (dopo il trattamento): Probabilità, Impatto, Valutazione.
11. **Esito residuo**: *Rivalutare* (punteggio residuo 9-25) o *Adeguato* (1-8).
12. **Rischio Residuo**: "Valutato" + link per aggiornare **esplicitamente** lo stato di conformità del requisito.
+2 -2
View File
@@ -166,8 +166,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
// ── Auth check ───────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated');
+2 -2
View File
@@ -89,8 +89,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
// ── Auth check ───────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated');
+2 -2
View File
@@ -96,8 +96,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
// ── Auth check ───────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated');
+2 -2
View File
@@ -1126,8 +1126,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
if (!checkAuth()) throw new Error('Not authenticated');
loadSidebar(); // = loadTopnavV3()
+2 -2
View File
@@ -274,8 +274,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
// ── Auth check ───────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated');
+2 -2
View File
@@ -381,8 +381,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
// ── Auth & Init ─────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated');
+2 -2
View File
@@ -194,8 +194,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
'use strict';
/*
+2 -2
View File
@@ -201,8 +201,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
if (!checkAuth()) throw new Error('Not authenticated');
+2 -2
View File
@@ -196,8 +196,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script src="/js/competenze.js?v=20260627"></script>
<script>
function v3Icons() { if (window.lucide && lucide.createIcons) { try { lucide.createIcons(); } catch (e) {} } }
+2 -2
View File
@@ -102,8 +102,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script src="/js/connettori-discovery.js?v=20260627"></script>
<script>
if (typeof checkAuth === 'function' && !checkAuth()) {
+2 -2
View File
@@ -159,8 +159,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
'use strict';
/* Controlli periodici (control monitoring §9.1/A.8.16): controlli ricorrenti + esecuzioni (evidenza) + NC/AC. */
+2 -2
View File
@@ -226,8 +226,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
// ── Icone inline (Lucide stroke) usate nelle stringhe HTML generate dal JS.
// Renderizzate immediatamente (no createIcons re-run), self-host, niente sprite BI. ──
+2 -2
View File
@@ -116,8 +116,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script src="/js/dashboard.js?v=20260724a"></script>
<script>
// ── Auth check ───────────────────────────────────────────
+2 -2
View File
@@ -1181,8 +1181,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
// La guida è accessibile anche da non autenticati (utile per onboarding)
// ma se sei loggato carichi chrome + i18n normalmente. ZERO modifiche backend.
+2 -2
View File
@@ -363,8 +363,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
// ── Auth & Init ──────────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated');
+2 -2
View File
@@ -935,8 +935,8 @@ curl -H <span class="str">"X-API-Key: nis2_TUA_CHIAVE"</span> \
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
if (!checkAuth()) throw new Error('Not authenticated');
loadSidebar(); // = loadTopnavV3()
+2 -2
View File
@@ -164,8 +164,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
'use strict';
/*
+2 -2
View File
@@ -203,8 +203,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script src="/js/isms.js?v=20260627v3"></script>
<script>
// Icone Lucide della chrome + crumb/page-head statici. L'init dati e il wiring
+1 -1
View File
@@ -608,7 +608,7 @@ const HelpSystem = (function () {
'Il codice <strong>RSK-‹misura›Com.‹n›</strong> e\' una <strong>codifica interna di NIS2 Agile</strong>; ‹misura› (es. GV.OC-04) e\' il codice della misura del Framework Nazionale richiamato dalla Determinazione ACN 164179/2025. <strong>Non</strong> e\' un codice o numero ufficiale ACN.',
'La tabella ha <strong>12 colonne</strong>: <strong>Codice rischio</strong> (cliccabile, apre la voce in Misure e Requisiti), <strong>Descrizione rischio</strong> (il rischio di default associato al requisito nel framework), e due valutazioni affiancate — <strong>RISCHIO INERENTE</strong> (prima del trattamento) e <strong>RISCHIO RESIDUO</strong> (dopo il trattamento). Ogni valutazione ha Probabilità, Impatto e Valutazione (= Probabilità × Impatto, scala 1–25).',
'I profili <strong>Amministratore</strong>, <strong>Compliance Manager</strong> e <strong>super admin</strong> compilano <strong>direttamente in tabella</strong> Probabilità e Impatto (1–5): la Valutazione si calcola da sola e il salvataggio è automatico. La <strong>Probabilità</strong> è la probabilità che la minaccia sfrutti la carenza del requisito; l\'<strong>Impatto</strong> (scala 1–5, non euro) è la severità della non conformità o del conseguente incidente.',
'La colonna <strong>Alert</strong> compare in base al punteggio inerente: <em>Azione Prioritaria</em> (15–25), <em>Azione Critica</em> (9–14), <em>Azione Necessaria</em> (3–8), <em>Azione Suggerita</em> (1–2). Le soglie sono una <strong>scelta metodologica</strong> dell\'organizzazione (rif. ISO/IEC 27001 §6.1.2), <strong>non un obbligo di legge</strong>. Cliccando l\'Alert si apre l\'elenco delle azioni passate su quel rischio e si può <strong>creare una nuova azione</strong>.',
'La colonna <strong>Alert</strong> compare in base al punteggio inerente: <em>Azione Prioritaria</em> (15–25), <em>Azione Critica</em> (9–12), <em>Azione Necessaria</em> (3–8), <em>Azione Suggerita</em> (1–2). Le soglie sono una <strong>scelta metodologica</strong> dell\'organizzazione (rif. ISO/IEC 27001 §6.1.2), <strong>non un obbligo di legge</strong>. Cliccando l\'Alert si apre l\'elenco delle azioni passate su quel rischio e si può <strong>creare una nuova azione</strong>.',
'La colonna <strong>Esito residuo</strong> segnala se il rischio residuo va <strong>rivalutato</strong> (punteggio 9–25) o è <strong>adeguato</strong> (1–8). <strong>Importante</strong>: il punteggio di rischio residuo <strong>non</strong> determina automaticamente lo <em>stato di conformità</em> del requisito. La <strong>conformità</strong> dipende dall\'attuazione della misura e dalle evidenze e si aggiorna in modo esplicito dal link "stato" nella colonna Rischio Residuo. Sono due piani distinti (punteggio di rischio ≠ conformità al requisito).',
'La tabella elenca <strong>solo i requisiti applicabili alla tua classe</strong> (importante &rarr; Allegato 1, essenziale &rarr; Allegato 2 della Determinazione ACN 164179/2025). Se l\'elenco e\' lungo, il riquadro <strong>scorre verticalmente</strong> con l\'intestazione fissa.',
'La seconda tabella, <strong>Rischi aggiuntivi (approccio multirischio / all-hazard)</strong>, permette ai <strong>profili amministrativi</strong> di aggiungere rischi non coperti da un singolo requisito (minacce fisiche, catena di fornitura, eventi naturali): copre l\'approccio multirischio richiesto dall\'art. 24 D.Lgs. 138/2024.'
+2 -2
View File
@@ -173,8 +173,8 @@ const I18n = (function () {
'risks.derived_code_legend': { it: 'RSK-‹misura›Com.‹n› è una codifica interna di NIS2 Agile; ‹misura› (es. GV.OC-04) è il codice della misura del Framework Nazionale richiamato dalla Determinazione ACN 164179/2025. Elenco in sola lettura.', en: 'RSK-‹measure›Com.‹n› is an internal NIS2 Agile code; ‹measure› (e.g. GV.OC-04) is the National Framework measure code referenced by ACN Determination 164179/2025. Read-only list.' },
'risks.col_code': { it: 'Codice rischio', en: 'Risk code' },
'risks.col_risk': { it: 'Descrizione rischio', en: 'Risk description' },
'risks.grp_inherent': { it: 'VALUTAZIONE RISCHIO INERENTE', en: 'INHERENT RISK ASSESSMENT' },
'risks.grp_residual': { it: 'VALUTAZIONE RISCHIO RESIDUO', en: 'RESIDUAL RISK ASSESSMENT' },
'risks.grp_inherent': { it: 'Rischio Inerente', en: 'Inherent Risk' },
'risks.grp_residual': { it: 'Rischio Residuo', en: 'Residual Risk' },
'risks.col_alert': { it: 'Alert', en: 'Alert' },
'risks.col_inherent': { it: 'Rischio Inerente', en: 'Inherent risk' },
'risks.col_res_outcome': { it: 'Esito residuo', en: 'Residual outcome' },
+2 -2
View File
@@ -179,8 +179,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script src="/js/kb.js"></script>
<script>
// Gate auth + chrome come le altre pagine V3.
+2 -2
View File
@@ -151,8 +151,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
'use strict';
/*
+2 -2
View File
@@ -179,8 +179,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
'use strict';
/*
+2 -2
View File
@@ -141,8 +141,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
// ── Auth + chrome + i18n + help ──────────────────────────
if (!checkAuth()) throw new Error('Not authenticated');
+2 -2
View File
@@ -155,8 +155,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script src="/js/organigramma.js?v=20260627"></script>
<script>
// Render icone Lucide (chrome + crumb + bottoni). organigramma.js fa render albero
+2 -2
View File
@@ -344,8 +344,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
// ── Auth & Init ─────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated');
+2 -2
View File
@@ -145,8 +145,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script src="/js/raci.js?v=20260627"></script>
<script>
function v3Icons() { if (window.lucide && lucide.createIcons) { try { lucide.createIcons(); } catch (e) {} } }
+2 -2
View File
@@ -236,8 +236,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
// ── Auth & Init ─────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated');
+2 -2
View File
@@ -161,8 +161,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
'use strict';
/*
+7 -6
View File
@@ -406,10 +406,10 @@
<tr>
<th scope="col" rowspan="2" data-i18n="risks.col_code">Codice rischio</th>
<th scope="col" rowspan="2" data-i18n="risks.col_risk">Descrizione rischio</th>
<th scope="colgroup" colspan="3" class="grp grp-inh" data-i18n="risks.grp_inherent">VALUTAZIONE RISCHIO INERENTE</th>
<th scope="colgroup" colspan="3" class="grp grp-inh" data-i18n="risks.grp_inherent">Rischio Inerente</th>
<th scope="col" rowspan="2" data-i18n="risks.col_alert">Alert</th>
<th scope="col" rowspan="2" data-i18n="risks.col_inherent">Rischio Inerente</th>
<th scope="colgroup" colspan="3" class="grp grp-res" data-i18n="risks.grp_residual">VALUTAZIONE RISCHIO RESIDUO</th>
<th scope="colgroup" colspan="3" class="grp grp-res" data-i18n="risks.grp_residual">Rischio Residuo</th>
<th scope="col" rowspan="2" data-i18n="risks.col_res_outcome">Esito residuo</th>
<th scope="col" rowspan="2" data-i18n="risks.col_residual">Rischio Residuo</th>
</tr>
@@ -544,8 +544,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
// ── Auth & Init ──────────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated');
@@ -682,8 +682,9 @@
if (p >= 3) return 'rk-med';
return 'rk-low';
}
// ── Banda ALERT sul punteggio INERENTE (prodotto P×I). Eccezione #3: la banda
// 13-14 (scoperta nella spec) è inclusa in "Critica" → 9-14 Critica, 15-25 Prioritaria. ──
// ── Banda ALERT sul punteggio INERENTE (prodotto P×I). Soglie da spec Simon:
// 15-25 Prioritaria, 9-12 Critica, 3-8 Necessaria, 1-2 Suggerita.
// NB: con P,I in 1-5 i prodotti 7/11/13/14 NON esistono → nessun buco (conferma Simon). ──
function alertBand(p) {
if (p == null) return null;
if (p >= 15) return { cls: 'alert-pri', label: 'Azione Prioritaria' };
+2 -2
View File
@@ -739,8 +739,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
// ── Auth check ───────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated');
+2 -2
View File
@@ -219,8 +219,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
'use strict';
/*
+2 -2
View File
@@ -214,8 +214,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
'use strict';
/*
+2 -2
View File
@@ -546,8 +546,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
// ── Auth & Init ─────────────────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated');
+2 -2
View File
@@ -194,8 +194,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
// ── Auth & Init (ordine V3) ─────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated');
+2 -2
View File
@@ -262,8 +262,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
if (!checkAuth()) throw new Error('Not authenticated');
loadSidebar();
+2 -2
View File
@@ -147,8 +147,8 @@
<script src="/js/common.js?v=20260729b"></script>
<script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260729"></script>
<script src="/js/i18n.js?v=20260730a"></script>
<script src="/js/help.js?v=20260730a"></script>
<script src="/js/i18n.js?v=20260730b"></script>
<script src="/js/help.js?v=20260730b"></script>
<script>
// ── Auth + chrome + i18n + help ──────────────────────────────
if (!checkAuth()) throw new Error('Not authenticated');