[FEAT] Rischi: suggerimento probabilità/impatto dallo stato di conformità

Nella modale "Valuta" di un rischio-requisito non ancora valutato, Probabilità e
Impatto vengono pre-compilati in base allo stato (conforme→basso 1/2, parziale→
medio 3/3, non conforme→alto 4/4) con nota esplicita "Valori suggeriti … è solo
un suggerimento, modificabili". Se già valutato, usa i valori salvati. Idea
pre-avallata dal nis2-expert (precompilare l'asse dallo stato = rischio residuo).
Solo frontend (risks.html); nessun valore imposto (art.24 non prescrive metodo).
version 1.25.8.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
DevEnv nis2-agile
2026-07-28 08:39:40 +02:00
co-authored by Claude Opus 4.8
parent 03796978c5
commit 924963444e
2 changed files with 20 additions and 3 deletions
+19 -2
View File
@@ -716,15 +716,31 @@
return o;
}
// Suggerimento (NON obbligo) di probabilità/impatto dallo stato di conformità:
// un requisito conforme ha rischio residuo basso, uno non conforme più alto.
// È solo un valore pre-compilato che l'utente può modificare (avallato nis2-expert).
function suggestScores(stato) {
switch (stato) {
case 'conforme': return { l: 1, i: 2 };
case 'parziale': return { l: 3, i: 3 };
case 'non_conforme': return { l: 4, i: 4 };
case 'non_applicabile': return { l: 1, i: 1 };
default: return { l: 3, i: 3 }; // da_valutare
}
}
function openEvaluateModal(requisitoId) {
if (!canEvaluate) return;
const r = (derivedData || []).find(x => String(x.requisito_id) === String(requisitoId));
if (!r) { showNotification('Rischio non trovato', 'error'); return; }
const curL = (r.likelihood >= 1 && r.likelihood <= 5) ? parseInt(r.likelihood) : 3;
const curI = (r.impact >= 1 && r.impact <= 5) ? parseInt(r.impact) : 3;
const curStato = r.stato || 'da_valutare';
const curNote = r.valutazione_rischio || '';
// Già valutato? uso i valori salvati; altrimenti pre-compilo un SUGGERIMENTO dallo stato.
const evaluated = (r.likelihood >= 1 && r.likelihood <= 5) && (r.impact >= 1 && r.impact <= 5);
const sug = suggestScores(curStato);
const curL = evaluated ? parseInt(r.likelihood) : sug.l;
const curI = evaluated ? parseInt(r.impact) : sug.i;
const statoOpts = DERIVED_STATUS_OPTIONS.map(([v, l]) =>
`<option value="${v}" ${v === curStato ? 'selected' : ''}>${escapeHtml(l)}</option>`).join('');
@@ -750,6 +766,7 @@
<div style="font-size:0.72rem;color:var(--gray-500);margin-top:4px;">Impatto della non conformità o del conseguente incidente.</div>
</div>
</div>
${!evaluated ? `<p style="font-size:0.78rem;color:#0e7a4a;background:#eefbf3;border:1px solid #bfe8cf;border-radius:8px;padding:9px 11px;margin:0 0 14px;line-height:1.5;">💡 <b>Valori suggeriti</b> in base allo stato di conformità (conforme → basso, parziale → medio, non conforme → alto). È solo un <b>suggerimento</b>: modificali pure liberamente.</p>` : ''}
<div class="form-group">
<label for="eval-note" class="form-label">Valutazione del rischio <span style="color:var(--gray-400);font-size:0.75rem;font-weight:400;">(opzionale)</span></label>
<textarea class="form-textarea" id="eval-note" rows="3" placeholder="Note sulla valutazione del rischio">${escapeHtml(curNote)}</textarea>