# MAPPA-LOGICA · Audit & Report ⟦ INIZIO · U-REPORTS · Videata "Audit & Report" ⟧ File: public/reports.html · URL: /reports.html · Scopo: reportistica di compliance NIS2: report esecutivo stampabile, gestione dei controlli di compliance (framework NIS2/ISO 27001), audit log immutabile, mapping NIS2↔ISO 27001:2022, monitoraggio continuo dei controlli (evidence automation) e requisiti operativi ACN (Determina 164179/2025) · Profili: tutti gli utenti autenticati dell'organizzazione (voce sidebar "Audit & Report"); aggiornamento controlli/requisiti soggetto ai permessi backend (org_admin, compliance_manager, auditor in lettura) • U-REPORTS.1 — Intestazione pagina e tab di navigazione (6 tab) Mostra: titolo "Audit & Report"; pulsante "Genera Report"; 6 tab: "Report Compliance" (attivo di default), "Controlli", "Audit Log", "ISO 27001", "Monitoraggio Continuo", "Requisiti ACN" Azioni: "Genera Report" → `generateReport()` (attiva il tab Report e genera); click tab → `switchTab()` attiva il pannello e carica i dati corrispondenti Dati da: nessun endpoint diretto (ogni tab innesca il proprio caricamento) Confine: `header.content-header` (righe ~352-357) e `div.tab-nav` (righe ~361-368); pulsante e bottoni tab NON hanno id stabile • U-REPORTS.2 — Tab "Report Compliance" (report esecutivo) Mostra: stato iniziale: "Nessun report generato — Clicca 'Genera Report'". Dopo la generazione: intestazione "Report di Compliance NIS2" con nome organizzazione e data/ora; sezione "Informazioni Organizzazione" (Nome, Settore, Tipo Entita', Paese); sezione "Riepilogo Compliance" con barra percentuale colorata (verde ≥80%, giallo ≥50%, rosso <50%) e 5 KPI: Controlli Totali, Implementati, Rischi Aperti, Incidenti, Policy Approvate; sezione "Stato Controlli" (tabella Codice, Titolo, Stato, Implementazione — barra colorata con %); pulsante "Stampa Report" Azioni: "Genera Report" (header) → GET report e render; "Stampa Report" → `window.print()` (CSS @media print nasconde sidebar/header/tab) Dati da: GET /api/audit/report (`api.generateComplianceReport()`) Confine: pannello `#tab-report` (riga ~371), contenuto in `#report-container` (~372) • U-REPORTS.3 — Tab "Controlli" (compliance controls) Mostra: tabella controlli: Codice (monospace), Framework (NIS2/ISO27001), Titolo, Stato (badge: Non Iniziato, In Corso, Implementato, Verificato), % Implementazione (barra colorata), Responsabile, Prossima Verifica. Righe cliccabili. Stato vuoto: "Nessun controllo configurato — appariranno dopo il primo assessment" Azioni: click riga → modale "Modifica Controllo: {codice}" con: Titolo (sola lettura), Stato (`#ctrl-status`), % Implementazione (slider `#ctrl-impl-pct` con valore live in `#ctrl-impl-pct-val`), Descrizione Evidenza (`#ctrl-evidence`), Responsabile ID utente (`#ctrl-responsible`), Prossima Verifica (`#ctrl-next-review`); "Salva" → `saveControl(id)` e ricarica Dati da: GET /api/audit/controls (`api.listControls()`) · PUT /api/audit/controls/{id} (`api.updateControl(id, data)`) Confine: pannello `#tab-controls` (riga ~382), contenuto in `#controls-container` (~383); campi modale `#ctrl-*` (righe ~827-846) dentro `#modal-overlay` • U-REPORTS.4 — Tab "Audit Log" (registro attivita') Mostra: tabella paginata (25 per pagina): Data/Ora, Utente, Azione (etichette italiane: "Accesso effettuato", "Rischio creato", "Policy approvata", "Pre-allarme inviato", "Evidenza caricata", ecc.), Entita' (tipo + #id), Dettagli (JSON appiattito in "chiave: valore", troncato con tooltip); paginazione "Precedente / Pagina N di M / Successiva". Stato vuoto: "Nessun log disponibile" Azioni: "Precedente"/"Successiva" → `goAuditPage(n)` ricarica la pagina richiesta Dati da: GET /api/audit/logs?page=N&per_page=25 (`api.getAuditLogs(params)`) Confine: pannello `#tab-audit` (riga ~392), contenuto in `#audit-container` (~393); i pulsanti di paginazione (HTML dinamico) NON hanno id stabile • U-REPORTS.5 — Tab "ISO 27001" (mapping normativo) Mostra: card "Mapping NIS2 - ISO 27001:2022" con righe di corrispondenza: badge "Art. {nis2}" → freccia → badge dei controlli ISO 27001 corrispondenti → titolo descrittivo della misura. Stato vuoto: "Nessun mapping disponibile" Azioni: nessuna (sola lettura) Dati da: GET /api/audit/iso27001-mapping (`api.getIsoMapping()`) Confine: pannello `#tab-iso` (riga ~402), contenuto in `#iso-container` (~403) • U-REPORTS.6 — Tab "Monitoraggio Continuo" (continuous control monitoring) Mostra: testo introduttivo: stato di freschezza dei controlli alimentato dalle evidenze automatiche dei connettori (Evidence Automation), con copertura % (monitorati/totali); 5 card di sintesi: Sano (verde), Attenzione (giallo), Evidenza scaduta (arancione), Non conforme (rosso), Non monitorato (grigio); tabella: Stato (pallino colorato), Controllo (codice), Titolo, Ultima evidenza (o "mai"), Freschezza (giorni). Stato vuoto in tabella: "Nessun controllo. Le evidenze arrivano via POST /api/services/evidence-ingest." Azioni: nessuna (sola lettura; le evidenze sono ingerite da sistemi esterni via Services API) Dati da: GET /api/audit/controlsMonitoring (`api.getControlsMonitoring()`) Confine: pannello `#tab-monitoring` (riga ~412), contenuto in `#monitoring-container` (~413) • U-REPORTS.7 — Tab "Requisiti ACN" (specifiche di base, Determina ACN 164179/2025) Mostra: testo introduttivo: requisiti operativi "specifiche di base ACN" (Determina 164179/2025, Framework Nazionale 2025) per il tipo di soggetto dell'organizzazione (essenziale/importante), totale requisiti e "Compliance: N%" con citazione della fonte; 4 card di sintesi: Implementato (verde), In corso (giallo), Da iniziare (grigio), Non applicabile (grigio scuro); requisiti raggruppati per funzione del Framework, in tabelle con colonne: Sottocat. (codice sottocategoria con tooltip testo integrale), Requisito, Stato (pallino + select inline: Da iniziare, In corso, Implementato, Non applicabile) Azioni: cambio select stato → `updateAcn(id, status)` salva subito e ricarica il tab Dati da: GET /api/audit/acnRequirements (`api.getAcnRequirements()`) · PUT /api/audit/acnRequirements/{id} (`api.updateAcnRequirement(id, status, note)`) Confine: pannello `#tab-acn` (riga ~421), contenuto in `#acn-container` (~422); le select di stato (HTML dinamico) NON hanno id stabile ⟦ FINE · U-REPORTS ⟧ ## ID STABILI MANCANTI (da aggiungere) | Elemento | Riga | Id proposto | |---|---|---| | Pulsante "Genera Report" (header) | 355 | `nis2-reports-btn-generate` | | Contenitore tab bar `div.tab-nav` | 361 | `nis2-reports-tabs` | | Bottone tab "Report Compliance" | 362 | `nis2-reports-tab-btn-report` | | Bottone tab "Controlli" | 363 | `nis2-reports-tab-btn-controls` | | Bottone tab "Audit Log" | 364 | `nis2-reports-tab-btn-audit` | | Bottone tab "ISO 27001" | 365 | `nis2-reports-tab-btn-iso` | | Bottone tab "Monitoraggio Continuo" | 366 | `nis2-reports-tab-btn-monitoring` | | Bottone tab "Requisiti ACN" | 367 | `nis2-reports-tab-btn-acn` | | Pulsante "Stampa Report" (HTML dinamico nel report) | 722 | `nis2-reports-btn-print` | | Select stato requisito ACN (HTML dinamico per riga) | 543 | `nis2-reports-acn-status-{id}` |