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>
5.4 KiB
MAPPA-LOGICA · Formazione e Awareness
⟦ INIZIO · U-TRAINING · Videata "Formazione e Awareness" ⟧ File: public/training.html · URL: /training.html · Scopo: gestione della formazione in cybersicurezza richiesta dall'Art. 20 NIS2 (obbligo formativo per organi di gestione e dipendenti): catalogo corsi, assegnazioni personali, monitoraggio della compliance formativa per membro · Profili: tutti gli utenti autenticati dell'organizzazione (voce sidebar "Formazione"); il tab "Le Mie Assegnazioni" mostra i corsi dell'utente corrente; creazione corsi e assegnazioni soggette ai permessi backend (org_admin, compliance_manager, consultant)
• U-TRAINING.1 — Intestazione pagina e azioni globali
Mostra: titolo "Formazione e Awareness"; etichetta "Art. 20 NIS2"; pulsante "+ Nuovo Corso"
Azioni: "+ Nuovo Corso" → modale creazione corso (U-TRAINING.3)
Dati da: nessun endpoint (elementi statici)
Confine: header.content-header (righe ~230-236); il pulsante NON ha id stabile
• U-TRAINING.2 — Tab di navigazione (3 tab)
Mostra: tab "Corsi" (attivo di default), "Le Mie Assegnazioni", "Compliance Formativa"
Azioni: click → switchTab(tabId, btn) attiva il pannello corrispondente (#tab-courses, #tab-assignments, #tab-compliance) e carica i dati del tab
Dati da: nessun endpoint diretto (ogni tab innesca il proprio caricamento)
Confine: div.tab-nav (righe ~240-244); i bottoni tab NON hanno id stabile
• U-TRAINING.3 — Tab "Corsi": catalogo corsi + modale "Nuovo Corso di Formazione"
Mostra: griglia di card corso: titolo, badge "Obbligatorio" (se is_mandatory), descrizione, durata in minuti, ruolo destinatario (Tutti, Organi di Gestione, Compliance Manager, Dipendente, Tecnico), riferimento "Art. {nis2_article}", "Soglia: N%" (punteggio minimo quiz). Stato vuoto: "Nessun corso disponibile". Modale creazione con campi: Titolo* (#course-title), Descrizione (#course-description), Ruolo Destinatario (#course-target-role), Durata minuti (#course-duration), Articolo NIS2 (#course-nis2-article, es. "Art. 20"), Punteggio Minimo % (#course-passing-score, default 70), checkbox "Corso obbligatorio" (#course-mandatory)
Azioni: le card corso sono informative (nessun click); "Crea Corso" nella modale → createCourse() (titolo obbligatorio) → POST e ricarica catalogo
Dati da: GET /api/training/courses (api.listCourses()) · POST /api/training/courses (api.post('/training/courses', data))
Confine: pannello #tab-courses (riga ~247), griglia #courses-grid (~248); campi modale #course-* (righe ~415-443) dentro #modal-overlay
• U-TRAINING.4 — Tab "Le Mie Assegnazioni"
Mostra: tabella delle assegnazioni dell'utente corrente: Corso (titolo + etichetta rossa "Obbligatorio" se applicabile), Stato (badge: Assegnato, In Corso, Completato, Scaduto — "Scaduto" calcolato client-side se due_date passata e non completato), Scadenza, Punteggio Quiz (%), Azioni. Stato vuoto: "Nessuna assegnazione"
Azioni: "Inizia" (stato Assegnato/Scaduto) → updateAssignment(id, 'in_progress'); "Completa" (stato In Corso) → updateAssignment(id, 'completed'); corsi completati mostrano l'etichetta "Completato"
Dati da: GET /api/training/assignments (api.getMyTraining()) · PUT /api/training/assignments/{id} (api.put, body {status})
Confine: pannello #tab-assignments (riga ~257), contenuto in #assignments-container (~258)
• U-TRAINING.5 — Tab "Compliance Formativa"
Mostra: pulsante "Assegna Corso" in alto a destra; tabella dei membri dell'organizzazione: Nome, Email, Ruolo, Corsi Completati (completati/totali), "% Compliance Obbligatoria" con barra colorata (verde ≥80%, giallo ≥50%, rosso <50%). Stato vuoto: "Nessun membro trovato"
Azioni: "Assegna Corso" → modale assegnazione (U-TRAINING.6)
Dati da: GET /api/training/compliance-status (api.getTrainingCompliance())
Confine: pannello #tab-compliance (riga ~267), contenuto in #compliance-container (~271); il pulsante "Assegna Corso" NON ha id stabile
• U-TRAINING.6 — Modale "Assegna Corso"
Mostra: select "Corso" (#assign-course-id, popolata dal catalogo); campo "Scadenza" (#assign-due-date, date); elenco "Seleziona Utenti" con checkbox per membro (input.assign-user-cb, nome + ruolo), popolato dai dati del tab Compliance
Azioni: "Assegna" → doAssignCourse() (richiede almeno un utente selezionato) → POST e ricarica compliance; se non esistono corsi, avviso "Nessun corso disponibile. Crea prima un corso."
Dati da: POST /api/training/assign (api.post('/training/assign', {course_id, user_ids, due_date})) · catalogo corsi da GET /api/training/courses se non gia' caricato
Confine: #modal-overlay; select #assign-course-id (riga ~687), data #assign-due-date (~691), checkbox con classe stabile assign-user-cb (~677)
⟦ FINE · U-TRAINING ⟧
ID STABILI MANCANTI (da aggiungere)
| Elemento | Riga | Id proposto |
|---|---|---|
| Pulsante "+ Nuovo Corso" (header) | 234 | nis2-training-btn-new-course |
Contenitore tab bar div.tab-nav |
240 | nis2-training-tabs |
| Bottone tab "Corsi" | 241 | nis2-training-tab-btn-courses |
| Bottone tab "Le Mie Assegnazioni" | 242 | nis2-training-tab-btn-assignments |
| Bottone tab "Compliance Formativa" | 243 | nis2-training-tab-btn-compliance |
| Pulsante "Assegna Corso" (tab compliance) | 269 | nis2-training-btn-assign-course |