# MAPPA-LOGICA · Segnalazioni Sicurezza (Whistleblowing) ⟦ INIZIO · U-WB · Videata "Segnalazioni Sicurezza" ⟧ File: public/whistleblowing.html · URL: /whistleblowing.html · Scopo: canale interno di segnalazione violazioni e anomalie di sicurezza ai sensi dell'Art. 32 D.Lgs. 138/2024, con segnalazioni anonime protette, tracking via token e gestione del ciclo di vita (ricevuta → revisione → indagine → risolta/chiusa) · Profili: l'invio (POST submit) non richiede autenticazione lato API (supporta segnalazioni anonime; la pagina però è dietro checkAuth client-side) e il tracking anonimo via token è anch'esso senza auth; lista, statistiche, dettaglio e gestione (cambio stato, assegnazione, chiusura, note di risoluzione) sono riservati a org_admin e compliance_manager (super_admin bypassa) — gate backend `requireOrgRole` su list/get/update/assign/close/stats in WhistleblowingController; gli altri ruoli ricevono 403 INSUFFICIENT_ROLE su lista e statistiche. • U-WB.1 — Header pagina + switch viste Mostra: titolo "Segnalazioni Sicurezza", sottotitolo "Canale interno Art.32 NIS2 — Segnala violazioni e anomalie di sicurezza". Azioni: bottone "Traccia Segnalazione Anonima" → `switchView('track')` (vista U-WB.6); bottone "Nuova Segnalazione" → `switchView('submit')` (vista U-WB.5). Le 3 viste (list/submit/track) sono mutuamente esclusive. Dati da: nessuno (navigazione client-side). Confine: `.page-header` (riga 38); bottoni senza id, dentro `.page-header-actions` (righe 44 e 48). • U-WB.2 — Banner Art. 32 Mostra: "Art. 32 D.Lgs. 138/2024 — Canale Segnalazioni Interno": le entità NIS2 devono predisporre canali interni; le segnalazioni anonime sono protette e il segnalante non può essere identificato; ogni segnalazione gestita con priorità e tracciabilità. Azioni: nessuna (informativo). Dati da: statico (HTML). Confine: `.art32-banner` (riga 56) — classe, nessun id. • U-WB.3 — Statistiche (4 card) Mostra: "Totale Segnalazioni" (total), "Da Gestire" (received + under_review, ambra), "In Indagine" (investigating), "Critiche/Alte" (critical + high, rosso). Azioni: nessuna (lettura); ricaricate dopo ogni update. Dati da: GET /api/whistleblowing/stats (risposta: data.stats) — riservato a org_admin/compliance_manager (403 INSUFFICIENT_ROLE per gli altri ruoli). Confine: `#stats-grid` (riga 62). • U-WB.4 — Vista Lista: filtri + tabella segnalazioni Mostra: filtri: stato (Ricevute / In revisione / In indagine / Risolte / Chiuse), priorità (Critica/Alta/Media/Bassa), categoria (Incidente sicurezza, Data breach, Accesso non autorizzato, Violazione policy, Rischio supply chain, Non conformità NIS2, Altro). Tabella con colonne: Codice (report_code), Categoria (badge), Titolo, Priorità (badge colorato), Stato (badge colorato), Anonima (scudo verde "Anonima" con lucchetto, oppure "Firmata"), Assegnata (nome o —), Data, bottone "Gestisci". Azioni: cambio filtro → `loadReports()` con query status/priority/category; "Gestisci" → `viewReport(id)` apre la modale di gestione (U-WB.7). Dati da: GET /api/whistleblowing/list?status=&priority=&category= (risposta: data.reports[]) — riservato a org_admin/compliance_manager (403 INSUFFICIENT_ROLE per gli altri ruoli). Confine: `#view-list` (riga 67); `#filter-status` (73), `#filter-priority` (82), `#filter-category` (90), `#reports-container` (103). • U-WB.5 — Vista "Nuova Segnalazione" (form invio) Mostra: checkbox "Segnalazione anonima — La tua identità non verrà registrata" (spuntata di default); form: Categoria* (8 opzioni incl. Corruzione/Frode), Titolo*, Descrizione dettagliata*, Priorità stimata (Media default, Alta, Critica — Azione immediata richiesta, Bassa), Articolo NIS2 violato (opzionale, es. Art.21/Art.23), Email per follow-up (opzionale — lasciare vuoto per anonimato completo). Azioni: "Invia Segnalazione" → `submitReport()` → POST; in caso di successo mostra modale con il codice segnalazione (report_code) e, se anonima, il token di tracking da conservare (anonymous_token); "Annulla" → torna alla lista. Dati da: POST /api/whistleblowing/submit (body: category, title, description, priority, nis2_article, is_anonymous, contact_email, organization_id da localStorage nis2_org_id). Confine: `#view-submit` (riga 107); `#is-anonymous` (117), `#submit-form` (122), `#rep-category` (125), `#rep-title` (139), `#rep-description` (143), `#rep-priority` (147), `#rep-article` (156), `#contact-email-group` (158), `#rep-email` (160). • U-WB.6 — Vista "Traccia Segnalazione Anonima" Mostra: campo "Token Segnalazione"; risultato: codice segnalazione, badge stato, categoria, timeline degli eventi (descrizione + data); messaggio "Token non valido o segnalazione non trovata" se il token non corrisponde. Azioni: "Verifica Stato" → `trackReport()` → GET con il token; "Annulla" → torna alla lista. Dati da: GET /api/whistleblowing/track-anonymous?token=. Confine: `#view-track` (riga 173); `#track-token` (182), `#track-result` (188). • U-WB.7 — Modale dettaglio/gestione segnalazione Mostra: titolo " — "; badge priorità, stato, eventuale scudo "Anonima"; descrizione completa; griglia: Categoria, Art. NIS2, Assegnata a, Data; Timeline degli eventi (descrizione, data/ora, autore); select "Cambia stato..." (In revisione / In indagine / Risolta / Chiusa / Respinta); textarea "Note di risoluzione...". Azioni: "Salva" → `updateReport(id)` → PUT con status e/o resolution_notes, poi notifica "Segnalazione aggiornata." e ricarica lista+stats; "Chiudi" → chiude la modale. Dati da: GET /api/whistleblowing/{id} (dettaglio + timeline); PUT /api/whistleblowing/{id} (body: {status?, resolution_notes?}). Confine: modale generata da `showModal()` di common.js; campi `#modal-status` (riga 353 script inline) e `#modal-notes` (riga 360 script inline), esistono solo a modale aperta. ⟦ FINE · U-WB ⟧ ## ID STABILI MANCANTI (da aggiungere) | Elemento | Riga | Id proposto | |---|---|---| | Bottone "Traccia Segnalazione Anonima" header | 44 | `nis2-wb-btn-track` | | Bottone "Nuova Segnalazione" header | 48 | `nis2-wb-btn-new` | | Banner Art.32 | 56 | `nis2-wb-art32-banner` | | Bottone "Gestisci" per riga (dinamico) | 312 (template JS) | data-attribute `data-wb-view-id` | | Bottone "Verifica Stato" vista track | 185 | `nis2-wb-btn-verify` | | Bottone submit "Invia Segnalazione" | 164 | `nis2-wb-btn-submit` |