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

5.0 KiB

MAPPA-LOGICA · Le Mie Aziende (vista consulente)

⟦ INIZIO · U-COMPANIES · Videata "Le Mie Aziende" (vista consulente) ⟧ File: public/companies.html · URL: /companies.html · Scopo: portafoglio clienti del consulente — elenco aziende seguite con compliance score, rischi/incidenti e accesso rapido alla gestione di ciascuna org · Profili: solo utenti con ruolo consultant (la pagina verifica api.isConsultant() cioè localStorage nis2_user_role === 'consultant'; chi non è consulente viene rediretto a dashboard.html, riga 351-354)

• U-COMPANIES.1 — Header pagina e azioni Mostra: titolo "Le Mie Aziende" + sottotitolo "Gestisci il portafoglio clienti e monitora la compliance NIS2"; campo di ricerca con placeholder "Cerca azienda..."; bottone primario "Aggiungi Cliente" (link a onboarding.html) Azioni: digitare nel campo di ricerca filtra le card per nome in tempo reale (oninput="filterCompanies(this.value)", filtro client-side su attributo data-name); click "Aggiungi Cliente" → naviga a /onboarding.html Dati da: nessuna chiamata API (filtro locale) Confine: #search-input (input ricerca, riga 290); contenitore header .companies-header (riga 282, senza id)

• U-COMPANIES.2 — Griglia card aziende Mostra: una card per ogni organizzazione del consulente con: avatar a iniziali, ragione sociale, Partita IVA (prefisso "IT"), badge classificazione NIS2 ("Essenziale" rosso / "Importante" giallo / "Volontaria" / "Non NIS2"), barra "Compliance" con percentuale colorata (caricata in asincrono), due contatori "Rischi aperti" e "Incidenti attivi" (asincroni), etichetta settore in italiano (mappa getSectorLabel, 30 settori NIS2 Allegato I/II), bottoni "Connettori" e "Gestisci". All'avvio mostra 2 skeleton card di caricamento. Azioni: click "Gestisci" → manageCompany(orgId): imposta l'organizzazione attiva (api.setOrganization) e naviga a dashboard.html; click "Connettori" → apre la modale connettori (U-COMPANIES.4) Dati da: GET /api/organizations/list (lista org); per OGNI org GET /api/dashboard/overview con header X-Organization-Id commutato temporaneamente (campi usati: compliance_score, open_risks, active_incidents) Confine: #companies-grid (riga 300); ogni card .company-card[data-org-id]; elementi asincroni con id dinamici #score-row-{orgId}, #score-fill-{orgId}, #score-val-{orgId}, #stats-row-{orgId}, #stat-risks-{orgId}, #stat-incidents-{orgId} (template righe 422-440)

• U-COMPANIES.3 — Stato vuoto Mostra: icona edificio, titolo "Nessuna azienda ancora", testo "Aggiungi il tuo primo cliente per iniziare a monitorare la compliance NIS2.", bottone "Aggiungi Primo Cliente". Compare se la lista è vuota, se l'API fallisce, oppure se il filtro di ricerca non trova nulla. Azioni: click "Aggiungi Primo Cliente" → /onboarding.html Dati da: stesso GET /api/organizations/list (mostrato quando data è vuoto) Confine: #companies-empty (riga 323, inizialmente display:none)

• U-COMPANIES.4 — Modale "Connettori — {azienda}" (Evidence Automation) Mostra: per ogni tipo di connettore disponibile (etichette: Microsoft 365 / Entra ID, Google Workspace, Amazon Web Services, Microsoft Azure, Identity Provider, EDR / XDR, SIEM / SOC, Ticketing (Jira/ServiceNow)) una riga con: checkbox "Attivo", input tenant_id / account_id, input client_id / app_id, badge stato segreto ("Segreto non impostato" grigio / "Segreto in attesa" giallo / "Segreto configurato" verde), bottone "Salva". Nota in testa: qui si salvano solo parametri NON segreti; il client secret va nel vault dell'amministratore. Azioni: "Salva" per riga → PUT con {type, enabled, config:{tenant_id, client_id}, secret_status:'pending'}; al successo notifica "Connettore salvato" + alert con cli_hint (comando vault per il segreto); "✕" o click sullo sfondo → chiude la modale Dati da: GET /api/organizations/{orgId}/connectors (apertura: connectors esistenti + available_types); PUT /api/organizations/{orgId}/connectors (salvataggio) Confine: #conn-modal (creato dinamicamente da showConnModal, riga 504); righe .conn-row[data-type] con input .c-en, .c-tenant, .c-client

• U-COMPANIES.5 — Sidebar di navigazione Mostra: sidebar Bootstrap Italia condivisa dell'app (voci generate da common-bi.js) Azioni: navigazione verso le altre viste Dati da: nessuna (markup iniettato da loadSidebar() di js/common-bi.js) Confine: #sidebar (riga 275)

⟦ FINE · U-COMPANIES ⟧

ID STABILI MANCANTI (da aggiungere)

Elemento Riga Id proposto
Bottone header "Aggiungi Cliente" (link) 292 nis2-companies-add-btn
Bottone empty state "Aggiungi Primo Cliente" 329 nis2-companies-add-first-btn
Bottone card "Connettori" (per card) 444 nis2-companies-connectors-btn-{orgId}
Bottone card "Gestisci" (per card) 447 nis2-companies-manage-btn-{orgId}
Contenitore header pagina .companies-header 282 nis2-companies-header
Bottone "Salva" riga connettore (modale) 489 nis2-companies-conn-save-{type}