Moduli Abilitati

Gerarchia Pacchetti licenza + Profilo attività + Permessi utente — Pannello SUPERADMIN

v 2.2 Aprile 2026 SUPERADMIN only Logica certificazione v 2.2

Scopo del pannello

1Cos'è la gerarchia a 3 livelli

Per decidere se un modulo (es. Magazzino, Sistema TS, Corrispettivi) è visibile a un utente di un workspace, NOX applica tre filtri indipendenti in intersezione. Tutti e tre devono dire «sì» per mostrare il modulo.

1

Pacchetto licenza

Risponde a: «Il cliente ha pagato questo set di funzionalità?» — dominio commerciale.

Configurato da: SUPERADMINDove: /admin/pacchettiGranularità: Workspace
2

Profilo attività

Risponde a: «Questa tipologia di impresa può legalmente/utilmente usare questo modulo?» — dominio fiscale e di pertinenza.

Configurato da: Admin clienteDove: Parametri → Profilo AttivitàGranularità: Workspace
3

Permesso utente

Risponde a: «Questo singolo utente del workspace è autorizzato a vedere il modulo?» — dominio operativo/ruolo.

Configurato da: Admin clienteDove: Modifica Utente → ModuliGranularità: Utente
I tre livelli sono indipendenti: ciascuno aggiunge un vincolo. Un modulo può essere nascosto da un solo livello anche se gli altri due lo permetterebbero.
2Perché serve questa gerarchia

Prima della certificazione v 2.2 esistevano solo due configurazioni scollegate:

  • Profilo attività: stringa in Parametri, usata per terminologia ma non filtrava i menu
  • menuConfig utente: priorità assoluta, permetteva conflitti silenziosi (un dentista poteva attivarsi «magazzino» senza che nessuno lo notasse)

Mancava una separazione netta tra:

ConcettoPrimaOra (v 2.2)
Licenza commerciale (cosa ho pagato)Non esistevaLivello 1 (Pacchetti)
Pertinenza fiscale (cosa ha senso per me)Solo terminologiaLivello 2 (Profilo)
Permesso operativo (cosa vede il singolo utente)Unico filtro attivoLivello 3 (menuConfig)
La gerarchia a 3 livelli evita conflitti: il sistema rifiuta automaticamente di mostrare moduli non coerenti con licenza o profilo, anche se l'admin del cliente prova a forzarli.
3Livello 1 — Pacchetti licenza

I 7 pacchetti commerciali disponibili:

PacchettoModuli inclusiNote
BASEDashboard, Soggetti, Catalogo, Aliquote IVA, Parametri, Utenti, GDPR, Backup, SDISempre attivo, non disattivabile
FATTURAZIONEDocumenti, Listini, Sconti, Scadenzario, Lettere di IntentoCore per qualsiasi attività commerciale
MAGAZZINOMovimenti, Giacenze, Ubicazioni, Inventari, LottiPer produttori, commercianti, farmacie
CONTABILITAPiano dei Conti, Prima Nota, Registri IVA, Liquidazione, F24, Dichiarazione annuale, ConservazioneContabilità ordinaria e semplificata
CORRISPETTIVICorrispettivi giornalieri (art. 24 DPR 633/72)Vendita al dettaglio
VENDITE_B2BCRM, Agenti, Provvigioni, SpedizioniAziende con rete vendita
SISTEMA_TSSistema Tessera Sanitaria, Opposizioni pazienteSOLO professionisti sanitari (DM 31/07/2015)

Caratteristiche

  • Attivazione tracciata: attivato_il, attivato_da
  • Disattivazione tracciata: disattivato_il, disattivato_da (non elimina il record, marca attivo=false)
  • BASE sempre ON: il toggle è disabilitato, il pacchetto è tecnicamente impossibile da disattivare
  • Effetto immediato: dopo il salvataggio, alla prima chiamata API l'utente non vedrà più i moduli del pacchetto disattivato
4Livello 2 — Profilo attività

Il profilo attività (Parametri → Dati Aziendali) definisce quali moduli sono rilevanti per quel tipo di impresa, nell'intersezione con i pacchetti attivi.

12 profili preconfigurati:

ProfiloModuli tipicamente rilevanti
STUDIO_MEDICODocumenti, Scadenzario, Sistema TS, Prima Nota, Registri IVA, Conservazione
STUDIO_NATUROPATICODocumenti, Scadenzario, Prima Nota, Registri IVA (no Sistema TS perché non medicina riconosciuta)
STUDIO_DENTISTICODocumenti, Scadenzario, Sistema TS, Magazzino (materiali), Listini
FARMACIAFatturazione + Corrispettivi + Magazzino + Sistema TS + Contabilità completa + Lettere di Intento
STUDIO_LEGALE / COMMERCIALISTAFatturazione + Scadenzario + Prima Nota + Registri IVA (no magazzino, no corrispettivi)
FERRAMENTA / ELETTRONICA_HIFIFatturazione + Corrispettivi + Magazzino + Contabilità + CRM + Spedizioni
VERNICIATURAFatturazione + Magazzino + Contabilità (solo B2B, no corrispettivi)
ASSOCIAZIONEDocumenti (ricevute) + Scadenzario (quote) + CRM (soci)
AGENTE_COMMERCIOFatturazione + CRM + Provvigioni (no magazzino, no corrispettivi)
GENERICOTutti rilevanti (fallback)
La tabella profili_moduli_preset contiene per ciascun profilo una riga per modulo con flag rilevante + campo motivazione con riferimento normativo o spiegazione operativa.

UI nei Parametri

Nella pagina Dati Aziendali, accanto alla label "Profilo Attività" c'è un pulsante «Moduli» che apre una modal con le due colonne:

  • Auto-attivati (verde): moduli rilevanti per il profilo corrente
  • Nascosti per questo profilo (grigio): moduli disponibili ma non pertinenti (tooltip con motivazione)
5Livello 3 — Permessi utente

Ogni utente ha un suo menuConfig che contiene le chiavi modulo con valore true/false.

Comportamento in Modifica Utente → Moduli

  • I moduli non permessi dai livelli 1+2 appaiono disabilitati, barrati, con badge BLOCCATO e tooltip che spiega il motivo (es. «Pacchetto MAGAZZINO non attivo» oppure «Non rilevante per il profilo STUDIO_MEDICO»)
  • I moduli permessi da 1+2 sono toggolabili liberamente dall'admin del cliente
  • Anche se l'admin del cliente forza un toggle, il backend rifiuterà la chiamata API del modulo bloccato (HTTP 403)
6Regola di intersezione

La formula che applica il sistema:

modulo_visibile(utente, workspace, modulo) =
    pacchetto_attivo(workspace, pacchetto_di(modulo))  // livello 1
  AND profilo_compatibile(workspace.profilo, modulo)   // livello 2
  AND utente_abilitato(utente.menuConfig, modulo)    // livello 3

Se uno solo dei tre filtri ritorna false, il modulo non è visibile.

Il pacchetto BASE è esente dal controllo livello 1: i suoi moduli (Utenti, Parametri, Backup, Dashboard…) sono sempre disponibili a prescindere dalla licenza, altrimenti non sarebbe possibile gestire il workspace stesso.
7Ordine operativo (onboarding nuovo cliente)
  1. TU come SUPERADMIN: apri /admin/pacchetti, seleziona il workspace del nuovo cliente, spunta i pacchetti acquistati. Salva. (BASE già attivo.)
  2. Admin del cliente: apre Parametri → Dati Aziendali, seleziona il suo Profilo Attività. Clicca il pulsante "Moduli" per vedere l'anteprima dei moduli attivati/nascosti. Salva parametri.
  3. Admin del cliente: va in Utenti → Modifica Utente, configura i permessi specifici per ciascun dipendente (es. la commessa vede solo Corrispettivi, il contabile vede solo Registri IVA + Piano Conti).
  4. Gli utenti operano: ogni volta che aprono un menu o chiamano un'API, i tre filtri vengono applicati automaticamente.
Alla creazione di un nuovo workspace tutti i 7 pacchetti sono attivi di default (per retrocompatibilità). Il SUPERADMIN poi restringe quelli non venduti.
8Esempi pratici
ScenarioPacchettiProfilomenuConfig utenteRisultato
Cassiere farmaciaBASE + FATT + MAG + CORR + STS + CONTFARMACIAcorrispettivi=on✅ Vede Corrispettivi
Contabile farmaciaCome sopraFARMACIAregistro-iva=on, corrispettivi=off✅ Vede Registro IVA
❌ Non vede Corrispettivi (livello 3)
Medico senza pacchetto CORRBASE + FATT + STS + CONT (NO CORR)STUDIO_MEDICOqualunque❌ Corrispettivi non visibili (livello 1: pacchetto mancante)
Studio dentistico baseBASE + FATT + STS + MAGSTUDIO_DENTISTICOmagazzino=on, sistema-ts=on✅ Vede entrambi (compatibili con profilo)
Commercialista con tutti i pacchettiTutti i 7STUDIO_COMMERCIALISTAsistema-ts=on❌ Sistema TS non visibile (livello 2: non rilevante per profilo)
Ferramenta venditore esternoBASE + FATT + MAG + CORR + VENDITE_B2BFERRAMENTAspedizioni=on, magazzino=off✅ Vede Spedizioni
❌ Non vede Magazzino (livello 3)
Il messaggio di HTTP 403 restituito dal backend include sempre il motivo esatto del blocco (pacchetto / profilo / menuConfig), utile per il supporto.
9Comportamento runtime (sidebar, API, 403)

Sidebar / Topbar

Ogni voce di menu viene filtrata da AuthService.isMenuEnabled(key) che applica in ordine livello 1 → 2 → 3. Il menu della voce bloccata non compare proprio: l'utente non vede neanche che esiste.

Chiamate API

Il middleware backend richiedeModulo(moduloKey) sui route sensibili:

  • Passa il controllo se tutti e 3 i livelli approvano
  • Ritorna HTTP 403 Forbidden con JSON: {"error": "Modulo 'X' non accessibile: <motivo>", "dettaglio": {...}}
  • SUPERADMIN bypassa i livelli 2 e 3 (ma non 1)

Endpoint /api/me/moduli-attivi

Restituisce l'elenco dei moduli effettivamente visibili all'utente corrente, con dettaglio di ciascun check (pacchettoOk, profiloOk, utenteOk) per debug.

10Aprire il pannello /admin/pacchetti

Dalla topbar, il pulsante dorato «Moduli Abilitati» (con icona inventory) è visibile solo per SUPERADMIN.

Layout della pagina

  1. Selettore workspace: dropdown con i workspace disponibili
  2. Griglia di card pacchetti: una card per ciascun pacchetto (7 totali), con toggle di attivazione e lista dei moduli inclusi
  3. Footer sticky: appare solo se ci sono modifiche non salvate, con pulsanti Salva e Annulla

Aspetto delle card

  • Card attiva: bordo verde, opacità piena
  • Card inattiva: bordo grigio, opacità 55%
  • Card BASE: toggle disabilitato con etichetta "sempre attivo"
11Salvare le modifiche
  1. Modifica i toggle dei pacchetti
  2. Il footer sticky mostra il numero di modifiche pendenti
  3. Clicca Salva modifiche: PUT /api/pacchetti/workspace/:wsId
  4. Il backend aggiorna pacchetti_workspace riga per riga: se il pacchetto cambia da attivo a inattivo (o viceversa), registra disattivato_il/da o attivato_il/da
  5. Messaggio di conferma "Pacchetti aggiornati". La lista viene ricaricata.
Le modifiche hanno effetto immediato: gli utenti del workspace che aprono un menu ora filtreranno con i nuovi pacchetti.
12Disattivare un pacchetto in produzione

Scenario: il cliente cambia contratto e rimuove il pacchetto MAGAZZINO.

  1. Avvisa il cliente: i suoi utenti perderanno l'accesso ai moduli magazzino al prossimo refresh della pagina
  2. Verifica transizioni aperte: assicurati che non ci siano movimenti di magazzino in bozza o inventari in corso che l'utente dovrà comunque completare
  3. Disattiva il toggle MAGAZZINO in /admin/pacchetti del workspace
  4. Salva
  5. I dati storici non vengono cancellati: restano consultabili solo da SUPERADMIN, che bypassa il filtro 2 ma non il 1 (quindi vede solo moduli del pacchetto BASE+altri attivi)
Disattivare pacchetti fiscali (CONTABILITA, FATTURAZIONE) può impedire all'utente di emettere nuove fatture. Coordinare sempre con il commercialista del cliente prima di procedere.
13Tabelle DB e API

Tabelle nel DB master gestione

TabellaScopo
pacchetti_workspacePacchetti attivi per workspace (con attivato/disattivato_il/da)
moduli_catalogoCatalogo dei 25 moduli con mapping al pacchetto di appartenenza
profili_moduli_presetPer ciascun profilo attività, quali moduli sono rilevanti (con motivazione)

Endpoint API

MetodoPathScopo
GET/api/pacchetti/moduli-catalogoLista completa dei 25 moduli
GET/api/pacchetti/pacchetti-disponibili7 pacchetti con moduli raggruppati
GET/api/pacchetti/profili/:profilo/presetPreset moduli rilevanti per profilo
GET/api/pacchetti/workspace/:wsIdPacchetti attivi workspace [SUPERADMIN]
PUT/api/pacchetti/workspace/:wsIdAggiorna pacchetti [SUPERADMIN]
GET/api/pacchetti/workspace/:wsId/moduli-lecitiLista moduli permessi da livelli 1+2
GET/api/me/moduli-attiviModuli visibili all'utente corrente (1+2+3)
14Override SUPERADMIN

Il ruolo SUPERADMIN ha comportamento speciale nella gerarchia:

LivelloSUPERADMIN
1. Pacchetto❌ NON bypassabile — se il pacchetto non è attivo, il modulo non esiste proprio (anche per lo stesso SUPERADMIN)
2. Profilo✅ Bypassato — il SUPERADMIN vede anche moduli non rilevanti per il profilo, per poter fare diagnosi o setup avanzato
3. menuConfig✅ Bypassato — il SUPERADMIN ignora anche i permessi utente specifici, per poter operare su tutti i dati del workspace
Questa asimmetria è intenzionale: la licenza commerciale (livello 1) è il solo vincolo che non può essere aggirato, perché rappresenta il contratto con il cliente. Gli altri due livelli sono convenzioni operative che il SUPERADMIN può oltrepassare per motivi tecnici.
15Declassamento automatico dei moduli obbligatori

Nel catalogo moduli, alcune voci sono marcate come indispensabile: true e non sarebbero mai disattivabili. In pratica questa rigidità crea problemi: un naturopata forfettario non ha bisogno dei Registri IVA, un professionista senza cassa non vuole vedere la voce Rivalsa INPS, un consulente non spedisce nulla quindi non serve la voce Spedizioni. Dalla versione 2.2, il backend declassa automaticamente certi moduli in base al contesto letto dai Parametri aziendali (tab Fatturazione-Cassa).

I 3 tipi di moduli

CategoriaComportamentoModuli inclusi
🔒 Core di sistemaSempre obbligatori per tutti i regimi/attività. Il toggle resta bloccato.dashboard, soggetti, catalogo, aliquote-iva, parametri, utenti, gdpr, backup, sdi, documenti
⚖️ Fiscali condizionaliObbligatori solo se il regime/cassa/anagrafica/attività lo richiedono. Altrimenti declassati a disattivabili.registro-iva, corrispettivi, sistema-ts, esterometro, intrastat-ue, split-payment, reverse-charge, lettere-intento, autofatture, ritenuta-acconto, rivalsa-inps, cassa-previdenziale, esigibilita-differ
✅ Operativi sbloccabiliNel DB sono marcati indispensabili ma in pratica sono funzionali al business: l'admin decide se mostrarli, indipendentemente dal regime.listini, scadenzario, magazzino, piano-dei-conti, prima-nota, spedizioni

Le 4 regole di declassamento fiscale

L'endpoint GET /api/pacchetti/workspace/:wsId/moduli-config legge 4 campi dai Parametri del workspace e applica le regole sotto:

Condizione ParametriModuli declassatiMotivo
Regime fiscale ∈ {RF19 forfettario, RF02 minimi}registro-iva, corrispettivi, aliquote-iva, esterometro, intrastat-ue, split-payment, reverse-charge, lettere-intento, autofatture, ritenuta-acconto, esigibilita-differFORFETTARIO
Cassa previdenziale vuota (tipoCassaPrevId IS NULL)rivalsa-inps, cassa-previdenzialeNO_CASSA_PREV
Tipo anagrafica ∈ {PERSONA_GIURIDICA, ENTE_PUBBLICO}ritenuta-acconto, rivalsa-inpsNON_PROFESSIONISTA
Tipo attività non sanitaria (diverso da STUDIO_MEDICO, STUDIO_DENTISTICO, FARMACIA)sistema-tsNON_SANITARIO
(sempre)listini, scadenzario, magazzino, piano-dei-conti, prima-nota, spedizioniOPERATIVO
I motivi sono cumulativi: un modulo come rivalsa-inps in un workspace SRL senza cassa avrà motiviDeclass: ['NO_CASSA_PREV', 'NON_PROFESSIONISTA'], utile per mostrare tooltip esplicativi in UI.

Esempi pratici (stessa azienda, 3 regimi diversi)

ScenarioRegimeCassaAnagraficaAttivitàregistro-ivasistema-tsritenuta-accontorivalsa-inpslistini
A — Naturopata forfettarioRF19PFNATUROPATICO✅ sbloccato✅ sbloccato✅ sbloccato✅ sbloccato✅ sbloccato
B — Medico ordinarioRF01ENPAMPFMEDICO🔒 obbligatorio🔒 obbligatorioliberolibero✅ sbloccato
C — SRL genericaRF01PGGENERICO🔒 obbligatorio✅ sbloccato✅ sbloccato✅ sbloccato (2 motivi)✅ sbloccato

Legenda: 🔒 obbligatorio = toggle bloccato, l'utente non può disattivarlo. ✅ sbloccato = toggle libero, l'admin decide. libero = lo era già (nel DB indispensabile: false).

Response API con nuovi campi

GET /api/pacchetti/workspace/:wsId/moduli-config

{
  "profilo":     "STUDIO_NATUROPATICO",
  "regime":      "RF19",
  "forfettario": true,
  "contesto": {
    "regime":         "RF19",
    "cassaPrevId":    null,
    "tipoAnagrafica": "PERSONA_FISICA",
    "tipoAttivita":   "STUDIO_NATUROPATICO"
  },
  "pacchetti":   ["BASE", "FATTURAZIONE", "CONTABILITA", "MAGAZZINO"],
  "moduli": [
    {
      "moduloKey":      "registro-iva",
      "indispensabile": false,
      "disabilitato":   false,
      "declassato":     true,
      "motiviDeclass":  ["FORFETTARIO"],
      "motivoDisab":    null,
      ...
    },
    {
      "moduloKey":      "listini",
      "indispensabile": false,
      "disabilitato":   false,
      "motiviDeclass":  ["OPERATIVO"],
      ...
    }
  ]
}
Il declassamento non rimuove mai un modulo dal menù: si limita a sbloccare il toggle nella sezione "Moduli Abilitati" dell'utente. Se nessun admin lo disattiva esplicitamente, il modulo resta visibile (comportamento retro-compatibile).

Codice — dove modificare le liste

Per aggiungere/togliere moduli dalle 4 categorie, editare backend/services/modulo-access.service.js:

  • MODULI_IVA_DECLASSATI — moduli liberati dal regime forfettario
  • MODULI_CASSA_PREV — moduli liberati se nessuna cassa
  • MODULI_SOLO_PROFESSIONISTA — moduli liberati per società
  • MODULI_SANITARI — moduli liberati per attività non sanitarie
  • MODULI_OPERATIVI_SBLOCCABILI — moduli sempre liberi a prescindere dal contesto
?Domande Frequenti (FAQ)
Un nuovo workspace parte con quali pacchetti attivi?
Tutti e 7 attivi di default (BASE obbligatorio, gli altri 6 accesi). Il SUPERADMIN poi restringe in base al contratto.
Se disattivo un pacchetto, i dati esistenti vengono cancellati?
No. I dati restano nel database. Vengono solo nascosti dai menu e il backend rifiuta nuove operazioni. Riattivando il pacchetto i dati tornano accessibili.
Un admin del cliente può modificare i pacchetti?
No, mai. Solo SUPERADMIN. La pagina /admin/pacchetti ritorna 403 agli admin cliente.
Cambiando il profilo attività cambia tutto istantaneamente?
La configurazione viene salvata subito. Gli utenti vedranno i nuovi moduli rilevanti al prossimo refresh/login. I dati dei moduli che non sono più rilevanti non vengono cancellati, solo nascosti.
Come capisco perché un modulo non è visibile a un utente?
Apri la console browser (F12) e chiama GET /api/me/moduli-attivi. Il campo dettaglio per ciascun modulo mostra i flag pacchettoOk / profiloOk / utenteOk.
Posso aggiungere un modulo custom al catalogo?
Sì, inserendo una riga in moduli_catalogo con modulo_key, pacchetto_key (uno dei 7 esistenti o nuovo), nome, descrizione, ordine. Poi aggiornare i profili_moduli_preset per indicare per quali profili è rilevante. Richiede accesso DB.