Files
nis2-agile/docs/mappa-logica/09_training.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

53 lines
5.4 KiB
Markdown

# 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` |