# 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}` |