Deliverable formazione-first (DESIGN_AVATAR_FORMAZIONE / product-demo-complete):
- docs/mappa-logica/01..22_*.md: tutte le viste app V2 mappate (formato canonico standard §2),
selettori VERIFICATI sul DOM reale, endpoint verificati su api.js/script, gate ruolo dai controller
- docs/mappa-logica/SELETTORI_DEMO.md: registry canonico (22 viste, 131 visualizzazione + 89 azioni)
+ worklist consolidata 132 id stabili da aggiungere (modifiche chirurgiche future)
- docs/formazione/TASSONOMIA_CORSO_NIS2.{md,json}: 10 moduli / 28 lezioni / ~7h45, prerequisiti+durate,
esame con soglia 80%, sandbox 'prova tu' org 996002
- fix kb.js: ingest scope=ORG ora invia organization_id (prima 422 KB_ORG_REQUIRED) — bug trovato da A2
Prodotto con 4 trittici di agenti (A1 esecutore -> A2 revisore -> A3 controllore avversariale):
A2: ~14 correzioni (cross-ref, gate ruolo, comportamenti); A3 PASS: 38 selettori campionati 0 rotti,
18 endpoint reali, 0 violazioni normative (Allegati 3/4, IS-4, '1 mese', PII.* interna), 9 claim verificati.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
7.2 KiB
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} |