# 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=""` (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` |