[FEAT] Epic C / C3 — rimosso modulo 'Analisi GAP ACN' (superato da C1)

Simon C3: l'analisi gap ACN non è un artefatto normativo e va eliminata; la conformità
emerge da C1 (elenco Misure/Requisiti + valutazione per requisito in org_requisito_state).

Ricognizione → migrazione → backup → rimozione (sicuro, 0 perdite):
- Tabelle acn_assessments/acn_assessment_responses VUOTE (0 righe) -> droppate (mig.049,
  guard anti-drop se >0 righe). Ricreabili da 036. Nessun dato utente perso.
- Integrazione lg231: /api/services/gap-analysis legge 'assessments' generale, NON il modulo
  ACN -> intatta. Verificato.
- RaciController ripuntato su cfg_nis2_misure (fonte canonica) al posto di acn_measures.json
  (rimosso); validazione measure_code verificata (/raci/objects?type=measure -> 43 misure).
Rimossi: AcnAssessmentController, public/acn-gap.html, application/data/acn_measures.json,
routing acn-gap, voci sidebar (common.js + common-bi.js), metodi api.js acn*, sezione help 'acn',
chiavi i18n acn.*, mapping demo-selectors. Tour demo step 3 RIPUNTATO su misure-requisiti
(no step rotto, 10 step). Sidebar BI ora mostra 'Misure e Requisiti' (gap di common-bi.js sanato).
Verifiche prod: /acn-gap.html 404, /api/acn-gap/* 404, /misure-requisiti 200, RaciController OK.
Cache-buster ?v=20260624, version 1.18.3, SW v1.18.3.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
DevEnv nis2-agile
2026-06-16 19:24:29 +02:00
co-authored by Claude Opus 4.8
parent 45e6c3599c
commit e281aa4970
50 changed files with 147 additions and 2506 deletions
+11 -8
View File
@@ -22,8 +22,8 @@
* - 'inventario' = `assets`; 'procedure' = `policies`; rischi = `risks`;
* fornitori = `suppliers`. Label: assets.name, policies.title, risks.title,
* suppliers.name, org_roles.role_name.
* - misure ACN = application/data/acn_measures.json (campo 'code'); NON e una
* tabella DB -> risk_measure.measure_code e una stringa validata sul JSON.
* - misure = tabella canonica cfg_nis2_misure (campo misura_code); risk_measure.measure_code
* e una stringa validata su quella tabella (Epic C / C1; ex acn_measures.json, rimosso con C3).
* - raci_assignments.object_id e POLIMORFICO -> niente FK; esistenza verificata
* in PHP. I nomi tabella/colonna provengono SEMPRE dalle const-map qui sotto
* dopo validazione enum (mai da stringhe grezze della request).
@@ -461,15 +461,18 @@ class RaciController extends BaseController
return $lt;
}
/** Carica e memoizza il catalogo misure ACN dal JSON. */
/**
* Carica e memoizza il catalogo misure dalla tabella canonica cfg_nis2_misure
* (Epic C / C1). Forma di ritorno invariata (['code','title']) per compatibilità
* con assertMeasureExists/measureLabel. Sostituisce il vecchio acn_measures.json.
*/
private function loadMeasures(): array
{
if (self::$measuresCache === null) {
$path = APP_PATH . '/data/acn_measures.json';
$raw = is_readable($path) ? file_get_contents($path) : false;
$data = $raw !== false ? json_decode($raw, true) : null;
self::$measuresCache = is_array($data) && isset($data['measures']) && is_array($data['measures'])
? $data['measures'] : [];
$rows = Database::fetchAll('SELECT misura_code, misura_descr FROM cfg_nis2_misure ORDER BY ord ASC');
self::$measuresCache = array_map(static function ($r) {
return ['code' => $r['misura_code'], 'title' => $r['misura_descr']];
}, $rows);
}
return self::$measuresCache;
}