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.0 KiB
MAPPA-LOGICA · Onboarding — Configurazione Iniziale
⟦ INIZIO · U-ONBOARDING · Videata "Onboarding — Configurazione Iniziale" (wizard) ⟧
File: public/onboarding.html · URL: /onboarding.html · Scopo: wizard di configurazione iniziale dell'organizzazione dopo la registrazione — ricerca azienda per Partita IVA, completamento dati aziendali, profilo utente e classificazione NIS2 automatica · Profili: qualsiasi utente autenticato senza organizzazione configurata (richiede solo checkAuth(); nessun vincolo di ruolo). NOTA: nella UI V2 Bootstrap Italia il wizard ha 4 step (lo storico "5 step" con scelta metodo/visura è stato compattato: l'upload visura resta solo come funzione legacy analyzeVisura() nel JS, righe 587-613, senza UI dedicata).
• U-ONBOARDING.1 — Header e stepper di avanzamento
Mostra: logo scudo + titolo "NIS2 Agile" / sottotitolo "Configurazione Iniziale"; stepper orizzontale a 4 passi con etichette "Partita IVA", "Dati Aziendali", "Il Tuo Profilo", "Classificazione"; il passo corrente è evidenziato in blu, i completati in verde con segno di spunta
Azioni: nessuna diretta (lo stepper riflette goToStep(n) / updateStepper)
Dati da: nessuna
Confine: #stepper (riga 122); singoli passi .stepper-step[data-step="1..4"]; connettori .stepper-connector[data-after]
• U-ONBOARDING.2 — Step 1 "Inserisci la Partita IVA dell'azienda"
Mostra: card con campo "Partita IVA *" (prefisso fisso "IT", 11 cifre numeriche, hint "11 cifre numeriche senza prefisso IT"), bottone "Cerca Azienda", area risultato (alert verde "✓ {ragione sociale}" con indirizzo, oppure alert giallo "Azienda non trovata. Puoi inserire i dati manualmente."), spinner "Ricerca in corso... / Interrogazione registro imprese", link "Non trovi l'azienda? Inserisci manualmente", bottone "Continua" (appare solo dopo ricerca riuscita o scelta manuale)
Azioni: "Cerca Azienda" (anche tasto Invio nel campo) → step1FetchCompany(): valida 11 cifre, chiama l'API e precompila lo stato del wizard (name, fiscal_code, address, city, website, email/pec, phone, suggested_sector, employees_range) marcando i campi auto-compilati; "Inserisci manualmente" → step1ManualEntry(): salva solo la P.IVA e abilita "Continua"; "Continua" → goToStep(2)
Dati da: POST /api/onboarding/fetch-company con body {vat_number} (sorgente backend: CertiSource); fonte dati mostrata poi come "Dati precompilati da CertiSource"
Confine: #step-1 (riga 150); input #s1-vat, risultato #s1-result, bottone #s1-fetch-btn, spinner #s1-loading, bottone continua #s1-continue-btn
• U-ONBOARDING.3 — Step 2 "Verifica e Completa i Dati Aziendali"
Mostra: banner verde con la fonte dati (es. "Dati precompilati da CertiSource", visibile solo se auto-fill); form a 2 colonne: Ragione Sociale* (#company-name), Partita IVA (#vat-number), Codice Fiscale (#fiscal-code), Indirizzo (#address), Città (#city), Sito Web (#website), Email Aziendale (#company-email), Telefono Aziendale (#company-phone), Settore NIS2* (#sector, select con optgroup "Settori ad Alta Criticità (Allegato I)" 18 voci e "Altri Settori Critici (Allegato II)" 12 voci + "Altro"), Numero Dipendenti* (#employee-count), Fatturato Annuo EUR* (#annual-turnover). I campi auto-compilati hanno bordo verde e badge "auto-compilato".
Azioni: "Indietro" → goToStep(1); "Continua" → submitStep3(): valida ragione sociale, settore, dipendenti > 0, fatturato ≥ 0 e salva nello stato wizard, poi goToStep(3)
Dati da: nessuna chiamata diretta (usa i dati raccolti allo step 1; validazione client-side)
Confine: #step-2 (riga 199); banner #data-source-banner + testo #data-source-text
• U-ONBOARDING.4 — Step 3 "Completa il tuo profilo"
Mostra: card con Nome Completo (#full-name, precompilato dal profilo se vuoto), Ruolo in Azienda* (#role, select: CEO/Amministratore Delegato, CTO/Direttore Tecnico, CISO/Responsabile Sicurezza, DPO/Data Protection Officer, Compliance Manager, IT Manager, Responsabile Legale, Membro CDA, Consulente Esterno, Altro), Telefono (#user-phone)
Azioni: "Indietro" → goToStep(2); "Continua" → submitStep4(): ruolo obbligatorio, salva profilo e goToStep(4)
Dati da: GET /api/auth/me (all'ingresso nello step, loadUserProfile() precompila full_name)
Confine: #step-3 (riga 312)
• U-ONBOARDING.5 — Step 4 "Classificazione NIS2" (risultato + riepilogo)
Mostra: riquadro risultato classificazione con icona scudo, etichetta e descrizione. Esiti possibili calcolati da classifyLocally() (logica interamente client-side: Allegato I + grande impresa ≥250 dip. o ≥50M€ → "Soggetto Essenziale"; Allegato I/II + media impresa ≥50 dip. o ≥10M€ → "Soggetto Importante"; settore non coperto → "Non Applicabile"; settore coperto sotto soglia → "Sotto le Soglie"). Se non applicabile compare la card "Adesione Volontaria alla NIS2" con checkbox. Sotto, card "Riepilogo Dati Aziendali" con: Ragione Sociale, Partita IVA, Settore, Tipologia Soggetto, Dipendenti, Fatturato Annuo.
Azioni: checkbox adesione volontaria → onVoluntaryChange(): cambia il riquadro in "Adesione Volontaria" e aggiorna il riepilogo; "Indietro" → goToStep(3); "Completa e Vai alla Dashboard" → completeOnboarding() (U-ONBOARDING.6)
Dati da: nessuna chiamata per la classificazione (calcolo locale classifyLocally(sector, employees, turnover), righe 731-762)
Confine: #step-4 (riga 362); risultato #classification-result con #classification-icon, #classification-label, #classification-desc; sezione volontaria #voluntary-section, card #voluntary-card, checkbox #voluntary-checkbox; riepilogo #sum-company, #sum-vat, #sum-sector, #sum-entity-type, #sum-employees, #sum-turnover
• U-ONBOARDING.6 — Completamento onboarding
Mostra: il bottone diventa "Completamento in corso..."; al successo notifica "Configurazione completata con successo!" e redirect dopo 1s (consulente → companies.html, altrimenti → dashboard.html)
Azioni: invio payload {name, vat_number, fiscal_code, address, city, website, contact_email, contact_phone, sector, employee_count, annual_turnover_eur, voluntary_compliance, full_name, phone, country:'IT'}; al successo imposta l'org attiva con api.setOrganization(orgId)
Dati da: POST /api/onboarding/complete; (legacy, senza UI in V2: POST /api/onboarding/upload-visura via api.uploadVisura() per la visura camerale PDF)
Confine: #complete-btn (riga 409)
⟦ FINE · U-ONBOARDING ⟧
ID STABILI MANCANTI (da aggiungere)
| Elemento | Riga | Id proposto |
|---|---|---|
| Bottone "Non trovi l'azienda? Inserisci manualmente" (step 1) | 182 | nis2-onboarding-manual-btn |
| Bottone "Indietro" step 2 | 298 | nis2-onboarding-back-2 |
| Bottone "Continua" step 2 | 303 | nis2-onboarding-next-2 |
| Bottone "Indietro" step 3 | 348 | nis2-onboarding-back-3 |
| Bottone "Continua" step 3 | 353 | nis2-onboarding-next-3 |
| Bottone "Indietro" step 4 | 404 | nis2-onboarding-back-4 |
Select settore: nessun id mancante (ha #sector) |
— | — |