Files
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

64 lines
7.1 KiB
Markdown

# MAPPA-LOGICA · Inventario Asset
⟦ INIZIO · U-ASSETS · Videata "Inventario Asset" ⟧
File: public/assets.html · URL: /assets.html · Scopo: inventario degli asset aziendali (Art. 21.2.i NIS2) con scoring di rilevanza NIS2 a 6 criteri (requisito GV.OC-04 del Framework Nazionale) e import da CSV/CMDB · Profili: tutti gli utenti autenticati dell'organizzazione (voce sidebar "Asset"); azioni di scrittura soggette ai permessi backend (org_admin, compliance_manager, consultant)
• U-ASSETS.1 — Intestazione pagina e azioni globali
Mostra: titolo "Inventario Asset"; etichetta "Art. 21.2.i NIS2"; pulsanti "Importa" (import da CSV/CMDB) e "+ Nuovo Asset"
Azioni: "Importa" → modale import CSV (U-ASSETS.7); "+ Nuovo Asset" → modale creazione (U-ASSETS.5)
Dati da: nessun endpoint (elementi statici)
Confine: `header.content-header` (righe ~267-274); i pulsanti NON hanno id stabile
• U-ASSETS.2 — Card statistiche (4 KPI)
Mostra: "Totale Asset" (`#stat-total`); "Tipologie" (`#stat-types`, numero di tipi distinti) con chip per tipo in `#stat-type-chips` (es. "3 Hardware"); "Asset Critici" (`#stat-critical`, criticita' = critical); "Dismessi" (`#stat-decommissioned`, stato = decommissioned). Nota: i conteggi riflettono il risultato filtrato corrente
Azioni: nessuna (sola lettura, calcolo client-side in `updateStats()`)
Dati da: GET /api/assets/list?asset_type=&criticality=&status= (`api.listAssets(params)`)
Confine: `#asset-stats` (riga ~278); valori `#stat-total` (~284), `#stat-types` (~293), `#stat-type-chips` (~295), `#stat-critical` (~303), `#stat-decommissioned` (~312)
• U-ASSETS.3 — Barra filtri
Mostra: 3 select: "Tutti i tipi" (`#filter-type`: Hardware, Software, Rete, Dati, Servizio, Personale, Struttura), "Tutte le criticita'" (`#filter-criticality`: Critica, Alta, Media, Bassa), "Tutti gli stati" (`#filter-status`: Attivo, Manutenzione, Dismesso)
Azioni: cambio filtro → `applyFilters()` → ricarica dal server con i parametri selezionati
Dati da: GET /api/assets/list (i filtri sono passati come query string: asset_type, criticality, status)
Confine: `div.filters-bar` (righe ~319-343); select `#filter-type` (~320), `#filter-criticality` (~330), `#filter-status` (~337)
• U-ASSETS.4 — Tabella asset
Mostra: colonne: Nome, Tipo, Categoria, Criticita' (badge colorato), Rilevanza NIS2 (punteggio 0-100 + classe Critico/Alto/Medio/Basso/Trascurabile + spunta ✓ se rilevante; "Da valutare" se mai valutato), Owner, Stato (badge), Azioni (grafico=valuta rilevanza, matita=modifica). Stato vuoto: "Nessun asset trovato"
Azioni: click sulla riga → modale dettaglio (U-ASSETS.6); icona grafico → modale scoring rilevanza (U-ASSETS.8); icona matita → modale modifica
Dati da: GET /api/assets/list (`api.listAssets(params)`)
Confine: `#assets-container` (riga ~346, tabella renderizzata via `renderAssets()`)
• U-ASSETS.5 — Modale "Nuovo Asset" / "Modifica Asset"
Mostra: campi: Nome* (`#asset-name`), Tipo* (`#asset-type`), Categoria (`#asset-category`, testo libero es. "Server, Database..."), Descrizione (`#asset-description`), Criticita' (`#asset-criticality`), Stato (`#asset-status`), Owner ID utente (`#asset-owner`), Posizione (`#asset-location`, es. "Data Center Roma"), Indirizzo IP (`#asset-ip`), Fornitore (`#asset-vendor`), Versione (`#asset-version`), Numero Seriale (`#asset-serial`), Data Acquisto (`#asset-purchase-date`), Scadenza Garanzia (`#asset-warranty`)
Azioni: "Annulla" → chiude; "Salva" → `saveAsset()` (validazione: nome obbligatorio) → callback create o update
Dati da: POST /api/assets/create (`api.createAsset`) · PUT /api/assets/{id} (`api.updateAsset`) · in modifica precarico via GET /api/assets/{id} (`api.getAsset`)
Confine: `#modal-overlay` (modale common.js); campi `#asset-*` (righe ~781-845 in `showAssetModal()`)
• U-ASSETS.6 — Modale dettaglio asset
Mostra: griglia campi in sola lettura: Tipo, Categoria, Criticita' (badge), Stato (badge), Owner, Posizione, Indirizzo IP, Fornitore, Versione, Numero Seriale, Data Acquisto, Scadenza Garanzia; sezione "Descrizione" (se presente); sezione "Dipendenze" con tag "ID: n" o "Nessuna dipendenza"
Azioni: "Chiudi"; "Valuta Rilevanza NIS2" → chiude e apre modale scoring (U-ASSETS.8); "Modifica" → chiude e apre modale modifica (U-ASSETS.5)
Dati da: GET /api/assets/{id} (`api.getAsset(id)`)
Confine: `#modal-overlay` (contenuto generato da `showAssetDetail()`, righe ~620-711); i campi interni NON hanno id stabile
• U-ASSETS.7 — Modale "Importa Asset" (CSV/CMDB)
Mostra: istruzioni colonne riconosciute: name, asset_type, criticality, data_classification, internet_facing, dependencies_count, regulated, external_ref, vendor, location; nota "Lo scoring di rilevanza NIS2 (GV.OC-04) viene calcolato automaticamente"; input file `#imp-file`; textarea CSV `#imp-csv` (prima riga = intestazioni, con esempio precompilato come placeholder); area anteprima `#imp-preview`
Azioni: scelta file → contenuto copiato nella textarea (`impFile()`); "Importa" → `doImport()` → notifica con esito "N nuovi, N aggiornati, N rilevanti NIS2, N scartati" e ricarica della lista
Dati da: POST /api/assets/import (`api.importAssets({source:'csv', assets})`)
Confine: `#modal-overlay`; elementi `#imp-file` (riga ~894), `#imp-csv` (~896), `#imp-preview` (~899)
• U-ASSETS.8 — Modale "Valuta Rilevanza NIS2" (scoring GV.OC-04)
Mostra: intestazione con metodologia e soglia di rilevanza (≥ punti soglia restituita dal server); 6 criteri come select (`select.score-criterion`, una per criterio, con etichetta, help e punteggio per opzione, griglia caricata dal server); box riepilogo `#score-preview` con "Totale: N/100" (`#score-total`) e classe calcolata (`#score-class`: Critico ≥80, Alto ≥60, Medio ≥40, Basso ≥20, Trascurabile <20; "Rilevante NIS2 ✓" da 40 in su); nota: il punteggio aggiorna automaticamente anche la criticita' dell'asset
Azioni: cambio select → `updateScorePreview()` ricalcola live; "Calcola e Salva" → `submitScoring(id)` (richiede tutti i 6 criteri compilati) → notifica con score e classe, ricarica lista
Dati da: GET /api/assets/scoringGrid (`api.getScoringGrid()`, griglia criteri/punteggi/soglia) · POST /api/assets/{id}/score (`api.scoreAsset(id, criteria)`) · precarico asset via GET /api/assets/{id}
Confine: `#modal-overlay`; select con classe `score-criterion` e attributo stabile `data-key="<criterio>"` (riga ~566); riepilogo `#score-preview` (~569), `#score-total` e `#score-class` (~570)
⟦ FINE · U-ASSETS ⟧
## ID STABILI MANCANTI (da aggiungere)
| Elemento | Riga | Id proposto |
|---|---|---|
| Pulsante "Importa" (header) | 271 | `nis2-assets-btn-import` |
| Pulsante "+ Nuovo Asset" (header) | 272 | `nis2-assets-btn-new` |
| Barra filtri `div.filters-bar` | 319 | `nis2-assets-filters` |
| Pulsanti azione riga tabella (valuta/modifica, HTML dinamico `.btn-icon`) | 505-509 | `nis2-assets-row-btn-score-{id}` / `nis2-assets-row-btn-edit-{id}` |
| Pulsanti footer modale dettaglio (Chiudi/Valuta/Modifica) | 703-705 | `nis2-assets-detail-btn-close` / `-score` / `-edit` |