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

7.1 KiB

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