# MAPPA-LOGICA · Aggiornamenti Normativi ⟦ INIZIO · U-NORMATIVE · Videata "Aggiornamenti Normativi" ⟧ File: public/normative.html · URL: /normative.html · Scopo: feed degli aggiornamenti normativi NIS2 / ACN / DORA / ENISA / ISO 27001 con presa visione (ACK) tracciata e documentata ai fini dell'audit di compliance NIS2 Art.21 · Profili: lettura (lista, pendenti, statistiche) per tutti i membri dell'organizzazione; la presa visione (POST ack) è riservata a org_admin e compliance_manager (super_admin bypassa) — gate backend `requireOrgRole` in NormativeController::acknowledge; la UI mostra comunque il bottone "Prendi in visione" a tutti, ma per gli altri ruoli il backend risponde 403 INSUFFICIENT_ROLE. La presa visione è registrata con nome utente. • U-NORMATIVE.1 — Header pagina + "Solo Pendenti" Mostra: titolo "Aggiornamenti Normativi", sottotitolo "Feed NIS2 / ACN / DORA — Presa visione obbligatoria per audit compliance". Azioni: bottone "Solo Pendenti" → `loadPending()` → mostra solo gli aggiornamenti non ancora presi in visione. Dati da: GET /api/normative/pending (risposta: data.pending[]). Confine: `.page-header` (riga 35); bottone senza id, dentro `.page-header-actions` (riga 41). • U-NORMATIVE.2 — Statistiche (4 card) Mostra: "Aggiornamenti Totali" (total_updates), "Prese Visione" (acknowledged, verde), "Pendenti" (pending, ambra), "Compliance ACK" (ack_rate %, colore primario). Azioni: nessuna (lettura). Dati da: GET /api/normative/stats (renderizzata da `renderStats()`). Confine: `#stats-grid` (riga 49). • U-NORMATIVE.3 — Barra "Avanzamento presa visione" Mostra: percentuale ACK (es. "75%") e progress bar proporzionale; nota: "Documentare la presa visione degli aggiornamenti normativi è richiesto per la compliance NIS2 Art.21". Azioni: nessuna (lettura). Dati da: GET /api/normative/stats (campo ack_rate). Confine: `#ack-pct` (riga 58) e `#ack-bar` (riga 61). • U-NORMATIVE.4 — Filtri lista Mostra: select "Tutte le fonti" (D.Lgs. 138/2024, Direttiva NIS2, ACN Guideline, DORA, ENISA, ISO 27001); select "Tutti i livelli" di impatto (Critico, Alto, Medio, Basso, Informativo); checkbox "Solo azione richiesta". Azioni: ogni cambio filtro → `loadUpdates()` ricarica la lista con i parametri query source / impact / action_required=1. Dati da: GET /api/normative/list?source=&impact=&action_required= (risposta: data.updates[]). Confine: `#filter-source` (riga 72), `#filter-impact` (riga 82), `#filter-action` (riga 91). • U-NORMATIVE.5 — Lista card aggiornamenti Mostra: per ogni aggiornamento una card con: chip fonte (es. "D.Lgs. 138/2024"), badge impatto colorato (Critico/Alto/Medio/Basso/Informativo), badge "Azione richiesta" (se action_required, con bordo sinistro ambra), badge presa visione ("Preso in visione da " verde, oppure "Da prendere in visione" ambra — card già ACK in opacità ridotta), titolo, riferimento normativo (code), sommario, chip dei domini impattati (affected_domains), data "In vigore: ", link "Fonte" (apre l'URL ufficiale in nuova scheda). Azioni: bottone "Prendi in visione" (solo se non ancora ACK) → apre la modale di presa visione (U-NORMATIVE.6); link "Fonte" → URL esterno. Dati da: GET /api/normative/list (o /api/normative/pending in modalità "Solo Pendenti"). Confine: `#updates-container` (riga 98); singole card generate via JS con id `#update-` (riga 207 dello script inline). • U-NORMATIVE.6 — Modale "Presa Visione" Mostra: testo esplicativo (documentare la presa visione, note opzionali sull'impatto per l'organizzazione); textarea "Note (opzionale)". Azioni: "Conferma presa visione" → `confirmAck(id)` → POST con le note, poi notifica "Presa visione registrata e documentata.", ricarica lista e statistiche; "Annulla" → chiude la modale. Dati da: POST /api/normative/{id}/ack (body: {notes}) — richiede ruolo org_admin o compliance_manager (super_admin bypassa); altri ruoli ricevono 403 INSUFFICIENT_ROLE. Confine: modale generata da `showModal()` di common.js; campo note `#ack-notes` (riga 249 dello script inline, esiste solo a modale aperta). ⟦ FINE · U-NORMATIVE ⟧ ## ID STABILI MANCANTI (da aggiungere) | Elemento | Riga | Id proposto | |---|---|---| | Bottone "Solo Pendenti" nell'header | 41 | `nis2-normative-btn-pending` | | Bottone "Prendi in visione" su card (dinamico) | 230 (template JS) | `nis2-normative-btn-ack-` (o data-attribute `data-ack-id`) | | Card barra avanzamento ACK | 54 | `nis2-normative-ack-card` |