Files
nis2-agile/docs/mappa-logica/13_whistleblowing.md
T
DevEnv nis2-agileandClaude Opus 4.8 4dfab2a391 [FORMAZIONE] Avatar di prodotto — mappa-logica COMPLETA (22 viste) + SELETTORI_DEMO + tassonomia corso + fix kb.js
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>
2026-06-12 18:50:19 +02:00

59 lines
6.4 KiB
Markdown

# 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=<token>.
Confine: `#view-track` (riga 173); `#track-token` (182), `#track-result` (188).
• U-WB.7 — Modale dettaglio/gestione segnalazione
Mostra: titolo "<report_code> — <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` |