# MAPPA-LOGICA · Gap Analysis ACN (misure di base) ⟦ INIZIO · U-ACN-GAP · Videata "Gap Analysis ACN (misure di base)" ⟧ File: public/acn-gap.html · URL: /acn-gap.html · Scopo: assessment di secondo livello sulla conformità puntuale alla Determinazione ACN 164179/2025 — misure e requisiti specifici per soggetti NIS importanti o essenziali, organizzati per funzione del Framework Nazionale (GV/ID/PR/DE/RS/RC) · Profili: tutti gli utenti autenticati con organizzazione (org_admin, compliance_manager, board_member, auditor, employee, consultant; super_admin). Richiede che l'organizzazione sia già classificata come importante o essenziale. • U-ACN-GAP.1 — Intro normativa e bottone "Analisi AI dei gap" Mostra: box introduttivo "Conformità puntuale alla Determinazione ACN 164179/2025" — spiega che l'analisi va oltre le 10 misure generiche dell'Art. 21 e che il perimetro dipende dalla classificazione (importante o essenziale). Nell'header un bottone "Analisi AI dei gap", visibile solo nella vista risultati. Azioni: "Analisi AI dei gap" → lancia l'analisi AI dei requisiti non conformi (vedi U-ACN-GAP.6). Dati da: `POST /api/acn-gap/{id}/aiAnalyze`. Confine: intro `#acn-intro` (riga ~62); bottone `#btn-ai-analyze` (riga ~56). • U-ACN-GAP.2 — Schermata START: classificazione, perimetro, assessment esistenti Mostra: badge "Soggetto IMPORTANTE" (giallo) o "Soggetto ESSENZIALE" (rosso) con il perimetro applicabile "N misure, M requisiti" (importanti: 37 misure/87 requisiti; essenziali: 43/116). Se l'organizzazione non è classificata: messaggio "Classifica prima il soggetto come importante o essenziale (Impostazioni › Classificazione NIS2)" (error_code ENTITY_LEVEL_REQUIRED). Elenco "Assessment esistenti" con badge Completato (con punteggio) / In corso. Azioni: "Nuova Gap Analysis ACN" → crea l'assessment e apre il wizard; "Consulta il catalogo dei requisiti" → mostra il catalogo read-only (U-ACN-GAP.3); per ogni assessment esistente: "Vedi" (completato) → risultati, "Riprendi" (in corso) → wizard. Dati da: catalogo+livello: `GET /api/acn-gap/catalog` (campi `entity_level`, `totals.measures`, `totals.requirements`, `functions[]`); lista: `GET /api/acn-gap/list`; creazione: `POST /api/acn-gap/create`. Confine: card `#acn-start` (riga ~68); info livello `#acn-level-info` (riga ~70); esistenti `#acn-existing` (riga ~71); bottone `#btn-new-acn` (riga ~72). Il bottone "Consulta il catalogo" non ha id (vedi ID mancanti). • U-ACN-GAP.3 — Catalogo requisiti ACN (read-only) Mostra: card "Catalogo requisiti ACN applicabili": accordion per funzione del Framework Nazionale — Governo (GV), Identificazione (ID), Protezione (PR), Rilevamento (DE), Risposta (RS), Ripristino (RC) — con misure (codice + titolo) e requisiti numerati, testo integrale. Azioni: click sull'intestazione di una funzione → espande/comprime la sezione. Dati da: `GET /api/acn-gap/catalog` (cache in `window._acnCatalog`). Confine: card `#acn-catalog` (riga ~82); contenuto `#acn-catalog-body` (riga ~84). • U-ACN-GAP.4 — Wizard di valutazione requisiti Mostra: barra sticky con titolo "Gap Analysis ACN", badge livello (IMPORTANTE/ESSENZIALE), progress bar, contatore "N / M requisiti con risposta" e hint di salvataggio ("Salvataggio…" / "Salvato HH:MM" / "Salvataggio in sospeso"). Sotto: accordion per funzione con misure (codice + titolo) e per ogni requisito 4 bottoni-pillola: "Attuato" (verde), "Parziale" (giallo), "Non attuato" (rosso), "Non applic." (grigio). Azioni: click su una pillola → seleziona la risposta e salva in autosave batch con debounce 700ms; "Calcola punteggio e completa" → se mancano risposte mostra alert "Mancano N risposte", altrimenti completa e mostra i risultati. Dati da: domande: `GET /api/acn-gap/{id}/requirements`; salvataggio: `POST /api/acn-gap/{id}/respond` (body `{responses:[{requirement_key, response_value}]}`); completamento: `POST /api/acn-gap/{id}/complete`. Confine: contenitore `#acn-wizard` (riga ~88); titolo `#acn-wizard-title` (riga ~92); livello `#acn-wizard-level` (riga ~93); barra `#acn-bar-fill` (riga ~95); contatori `#acn-answered` / `#acn-total` (riga ~96); hint `#acn-savehint` (riga ~97); requisiti `#acn-functions` (riga ~101); messaggio `#acn-wizard-msg` (riga ~105); bottone `#btn-acn-complete` (riga ~106). Le pillole risposta sono generate via JS con classe `.acn-opt` e attributi `data-key`/`data-val`. • U-ACN-GAP.5 — Risultati: punteggio complessivo e per funzione Mostra: card "Esito Gap Analysis ACN" con punteggio complessivo 0-100 (colore: verde ≥80, lime ≥60, ambra ≥40, rosso <40) e didascalia "Punteggio complessivo di conformità (0-100)"; sezione "Punteggio per funzione (Framework Nazionale)" con pill colorate per GV/ID/PR/DE/RS/RC; card "Requisiti non conformi (piano d'azione)" con codice misura, badge "Non attuato"/"Parziale" e testo del requisito (oppure "Nessun gap: pienamente conforme."); bottone "Torna all'inizio". Azioni: "Torna all'inizio" → ricarica la pagina (vista START). Dati da: `GET /api/acn-gap/{id}/report` (campi `assessment.overall_score`, `assessment.function_scores`, `gaps[]`, `assessment.ai_summary`). Confine: contenitore `#acn-results` (riga ~113); punteggio `#acn-overall` (riga ~118); funzioni `#acn-func-scores` (riga ~122); gap `#acn-gaps` (riga ~131). Il bottone "Torna all'inizio" non ha id (vedi ID mancanti). • U-ACN-GAP.6 — Card "Analisi AI dei gap" Mostra: testo dell'analisi AI dei requisiti non conformi (`ai_summary`, pre-formattato). Visibile se l'assessment ha già un riepilogo AI o dopo aver lanciato l'analisi. Azioni: popolata dal bottone `#btn-ai-analyze` (header); durante l'analisi il bottone mostra "Analisi in corso…". Dati da: `POST /api/acn-gap/{id}/aiAnalyze` (risposta `ai_summary`); in lettura da `GET /api/acn-gap/{id}/report`. Confine: card `#acn-ai-card` (riga ~125); contenuto `#acn-ai-body` (riga ~127). ⟦ FINE · U-ACN-GAP ⟧ ## ID STABILI MANCANTI (da aggiungere) | Elemento | Riga | Id proposto | |---|---|---| | Bottone "Consulta il catalogo dei requisiti" | ~75 | `nis2-acn-gap-btn-catalogo` | | Bottone "Torna all'inizio" (vista risultati) | ~134 | `nis2-acn-gap-btn-restart` |