Gestione Documenti
Fatture, DDT, Preventivi, Ordini, Note di Credito, Ricette, Fatture Passive — Manuale completo
Riferimenti normativi
- Art. 21 DPR 633/72 — Contenuto della fattura: Stabilisce i dati obbligatori che ogni fattura deve contenere: data di emissione, numero progressivo, dati del cedente e del cessionario, natura/quantità/prezzo dei beni o servizi, aliquota e ammontare dell'IVA. Il modulo valida tutti questi campi prima dell'invio SDI.
- Art. 21 c.4 DPR 633/72 — Tempistica di emissione: La fattura immediata va emessa entro 12 giorni dall'effettuazione dell'operazione. La fattura differita (TD24) va emessa entro il 15 del mese successivo. Il sistema avvisa se i termini sono superati.
- Art. 25 DPR 633/72 — Registro acquisti: Obbligo di registrazione delle fatture di acquisto (passive FP) nel registro IVA acquisti entro il termine per la liquidazione periodica.
- Art. 19 DPR 633/72 — Detrazione IVA: Il diritto alla detrazione dell'IVA sugli acquisti è esercitabile entro il termine per la dichiarazione annuale relativa all'anno di ricezione del documento.
- DPR 600/73 art. 25-bis — Ritenuta d'acconto: Il sistema calcola automaticamente la ritenuta per i tipi RT01 (persone fisiche) e RT02 (persone giuridiche) con aliquota configurabile.
- DPR 642/72 — Bollo virtuale: Imposta di bollo di 2,00 € applicata automaticamente su documenti con imponibile esente IVA superiore a 77,47 € (DM 17/06/2014).
- L. 190/2014 art. 1 c.54-89 — Regime forfettario: I contribuenti forfettari non applicano IVA in fattura, indicano natura N2.2 e la dicitura di legge. Il sistema imposta automaticamente questi parametri.
- Art. 2 c.2 DPR 633/72 — Omaggio senza rivalsa: Cessione gratuita con IVA a carico del cedente. Il modulo imposta imponibile=0 e natura N2.2.
- Art. 18 c.3 DPR 633/72 — Omaggio con rivalsa: Cessione gratuita con IVA addebitata al cessionario. L'IVA viene calcolata normalmente.
- Art. 14 DPR 633/72 — Valuta estera: Per operazioni in valuta diversa dall'euro, la conversione avviene al tasso BCE del giorno dell'operazione. Il sistema gestisce 21 valute con controvalore EUR automatico.
- DPR 441/97 — Movimentazione e magazzino: Disciplina il registro di carico/scarico. Il modulo genera movimenti automatici alla conferma del documento con logica FIFO/FEFO per i lotti.
- D.Lgs. 127/2015 — Fatturazione elettronica: Obbligo di emissione e ricezione fatture in formato XML FatturaPA tramite Sistema di Interscambio (SDI).
- Specifiche FatturaPA v1.8: Formato XML di riferimento per la trasmissione al SDI. Il modulo genera XML conformi con codici TP (termini pagamento), MP (modalità pagamento), natura, esigibilità, ritenuta e cassa previdenziale.
Note operative e permessi configurabili
🗒️ Pannello Note: ogni scheda di documento (fattura, ricevuta, DDT, ecc.) ha un pannello "post-it"
giallo floating ancorato all'entità corrente. Si apre minimizzato come fascia
centrata sulla topbar (sulla barra blu del modale per i documenti); cliccando
la fascia o la freccia expand_more si espande al centro del viewport
(ridimensionabile via handle in basso a destra). La fascia minimizzata è trascinabile
e la sua posizione viene memorizzata in localStorage per ciascun record (es. ogni
documento ha la sua posizione independente). Per scrivere una nota: testo nel box giallino
+ bottone + Aggiungi (o Cmd/Ctrl + Invio). Modifica/elimina riservate
all'autore o agli amministratori. Cestino note con ripristino disponibile
dal toggle delete_outline nell'header del pannello espanso (solo ADMIN/SUPERADMIN).
Tutti i CRUD (create/update/delete/restore) sono tracciati in audit_log
(consultabile da Amministrazione Sistema → Audit Log).
🔒 Permessi configurabili: alcune azioni di questa scheda (creazione, modifica, cancellazione, esportazione, stampa) possono essere bloccate per il ruolo del tuo workspace. Quando un bottone è bloccato, appare con icona "lucchetto" e tooltip "Permesso disabilitato dal Super Amministratore". La configurazione si fa in Amministrazione di Sistema » Permessi per Ruolo (solo SUPERADMIN).
Nuovo stile UI
🎨 Lista documenti — "Classic ERP": il modulo Documenti adotta una nuova
estetica ispirata ai gestionali professionali (riferimenti: Linear, Stripe Dashboard).
Tipografia Inter per UI e JetBrains Mono per cifre/date/totali
(allineamento tabular). Tabella ultra-compatta con righe a strisce alternate, header
maiuscoletto grigio, badge stato bordati con colore coerente al valore (Bozza, Emesso,
Confermato, Inviato, Pagato, Annullato, Archiviato, Fatturato, Offerta, Ordine), bottoni
azione 22×22 px con hover delicato, sfondo pagina grigio chiaro #f4f6fb da cui
si stacca la card unica che contiene toolbar+tabella+footer.
📝 Form documento (modale): stessa tipografia Inter applicata. Sfondo della "tela" cambiato da bianco a grigio chiaro per stacco visivo delle card-sezione (Righe, Scadenzario, Listino & Sconti, Note, ecc.). Le icone Material continuano a essere visualizzate correttamente (override esplicito sul font).
Il modulo Documenti è il cuore gestionale di NOX Enterprise Suite. Gestisce l'intero ciclo documentale commerciale: dall'offerta (preventivo) all'ordine, dalla bolla (DDT) alla fattura, fino alla nota di credito/debito e alle fatture ricevute dai fornitori (FP).
Tutti i tipi di documento convivono in un archivio unificato, filtrabile per tipo, stato, anno, soggetto e testo libero. Ogni tipo ha regole specifiche (tabs visibili, calcolo IVA/bollo/cassa, stati disponibili) configurabili nella Gestione Tabelle.
Funzionalità principali
- Archivio unificato con filtri avanzati e ricerca full-text
- Creazione guidata con autocompletamento da catalogo e anagrafe
- Sconti a catena (10+10+5), omaggi con/senza rivalsa IVA
- Gestione multi-valuta con controvalore EUR per SDI
- Fatturazione elettronica SDI: generazione XML singola e batch
- Fatture passive (FP) integrate: import XML, esiti EC01/EC02
- Scadenzario automatico con rate configurabili
- Provvigioni agenti su due livelli (riga/documento)
- Movimenti magazzino automatici con lotti FIFO/FEFO
- Listini e scaglioni di prezzo per quantità
- Conversione documenti: Preventivo → Ordine → DDT → Fattura
- Stampa PDF con template personalizzabili (Print Designer)
- Lettere di intento per esportatori abituali
- Validazione fiscale completa pre-invio SDI
Ogni tipo documento ha un codice SDI e regole di fatturazione specifiche. La configurazione avviene in Parametri → Gestione Tabelle → Tipi Documento.
| Codice | Tipo | IVA | Bollo | Cassa | Tabs visibili |
|---|---|---|---|---|---|
| TD01 | Fattura | ✔ | ✔ | — | Righe, Pagamento, Trasporto, Agente, Scadenzario, Listino, Magazzino, Generale |
| TD02 | Acconto su Fattura | ✔ | — | — | Righe, Pagamento, Scadenzario, Generale |
| TD04 | Nota di Credito | ✔ | — | — | Righe, Pagamento, Scadenzario, Generale (rif. fattura originale) |
| TD05 | Nota di Debito | ✔ | — | — | Righe, Pagamento, Scadenzario, Generale |
| TD06 | Parcella | — | ✔ | ✔ | Righe, Pagamento, Scadenzario, Generale (INPS/cassa 4%) |
| TD07 | Fattura Semplificata | ✔ | — | — | Righe, Pagamento, Scadenzario, Generale |
| TD24 | Fattura Differita | ✔ | ✔ | — | Righe (riepilogativa DDT), Pagamento, Trasporto, Agente, Scadenzario, Generale |
| DDT | Documento di Trasporto | ✔ | — | — | Righe, Pagamento, Trasporto, Agente, Scadenzario, Listino, Magazzino, Generale |
| PRV | Preventivo / Offerta | ✔ | — | — | Righe, Pagamento, Agente, Listino, Generale (validità, intro, note) |
| PF | Pro-Forma | ✔ | — | — | Righe, Pagamento, Agente, Listino, Generale |
| ORD | Ordine Cliente | ✔ | — | — | Righe, Pagamento, Agente, Listino, Generale |
| RIC | Ricetta | — | — | — | Righe (descrizione + posologia espansa), Pagamento |
| FP | Fattura Passiva | ✔ | — | — | Righe, Pagamento, Scadenzario, Dati SDI, Generale |
Regole di fatturazione (regoleFatturazione)
Ogni tipo documento ha un oggetto JSON regoleFatturazione che controlla il comportamento del form:
- calcolaIva: se abilitato, calcola IVA per aliquota
- calcolaBollo: applica bollo virtuale 2,00 € se imponibile esente > 77,47 €
- calcolaInps: aggiunge contributo cassa previdenziale
- tabs: array di tab visibili nel form
- statiDisponibili: stati ammessi per il tipo documento
- labelIntestatario: etichetta del soggetto (Cliente, Paziente, Fornitore, Destinatario)
- colore: colore identificativo nella lista documenti
- visibileInInserimento: se appare nel dropdown tipo documento
- isRiepilogativaDDT: abilita selezione DDT da raggruppare (TD24)
- Dalla lista documenti, premere il pulsante + Nuovo nel footer. In alternativa, usare
Ctrl+N. - Selezionare il tipo documento dal dropdown (TD01 Fattura, DDT, PRV Preventivo, FP Fattura Passiva, ecc.). Il form si adatta automaticamente mostrando le tab pertinenti.
- Selezionare il soggetto: digitare almeno 2 caratteri per cercare per nome, cognome, ragione sociale, CF o P.IVA. Oppure premere l'icona lente per sfogliare l'anagrafica completa. Se il soggetto non esiste, premere + Nuovo soggetto per crearlo al volo.
- Compilare la data del documento e, se necessario, la serie/sezionale.
- Inserire le righe nella tab Righe: cercare da catalogo o digitare manualmente.
- Compilare le tab aggiuntive: Pagamento (condizioni, modalità), Trasporto (DDT), Agente, Valuta, ecc.
- Verificare i totali in fondo alla pagina (imponibile, IVA, bollo, cassa, ritenuta, netto a pagare).
- Premere Salva (
Ctrl+S). Il sistema esegue le validazioni fiscali e mostra eventuali avvisi prima del salvataggio.
La griglia righe mostra le colonne configurabili: #, Descrizione, U.M., Quantità, Prezzo, Sconto%, IVA%, Omaggio, Importo, Azioni. Le colonne possono essere mostrate/nascoste dalla Configura Vista.
Inserimento da Catalogo
Digitare almeno 2 caratteri nella colonna Descrizione: il sistema cerca per codice, descrizione, codice fornitore e barcode. I risultati appaiono in un dropdown navigabile con le frecce. Premere Enter per selezionare. Il prezzo, l'IVA e l'unità di misura vengono pre-compilati dalla voce catalogo.
In alternativa, premere l'icona catalogo sulla riga per aprire l'overlay completo con filtri per categoria, fornitore e ricerca avanzata. Si può creare un nuovo articolo al volo con il pulsante dedicato.
Navigazione e inserimento rapido
Tabper passare al campo successivo nella riga- Inserendo una riga valida, si aggiunge automaticamente una riga vuota sotto
- Il pulsante X elimina la riga (con conferma se contiene dati)
- Le righe sono ordinabili tramite il campo #
Formato prezzo (parser intelligente)
Il sistema accetta quattro convenzioni di input e riconosce automaticamente quale interpretazione usare:
| Input utente | Interpretato come | Valore finale |
|---|---|---|
1.234,56 | Formato italiano completo (punto migliaia + virgola decimale) | 1234.56 |
1234,56 | Formato italiano senza migliaia | 1234.56 |
424.15 | Formato ISO/en (punto decimale — un solo punto con cifre decimali diverse da 3) | 424.15 |
1.234 | Formato italiano migliaia (un solo punto con esattamente 3 cifre intere a destra) | 1234.00 |
Il display è sempre in formato italiano 1.234,56. All'ingresso nel campo (focus) il valore viene mostrato con virgola decimale per editing coerente.
KIT (distinta base)
Le voci di tipo KIT nel catalogo possono essere inserite in tre modalità diverse, selezionabili tramite popup al momento dell'inserimento:
- Riga singola — il kit appare con una sola riga, prezzo unico “bundle” del kit. Usato per fatturare al cliente il prezzo promozionale pre-concordato.
- Esplodi componenti — ogni componente diventa una riga separata con il proprio prezzo di listino.
- Esplodi con intestazione Kit — come (2), con in più una riga di separatore “=== KIT: … ===” prima dei componenti (utile in stampa per far capire al cliente quali righe appartengono al kit).
Checkbox “Mantieni prezzo bundle”
Nel popup di inserimento è presente un'opzione “Mantieni prezzo bundle del kit — distribuisci lo sconto sui componenti”. Quando attiva:
- Calcola il fattore
fattore = prezzoBundleKit / sommaPrezziComponenti - Applica il fattore a ogni prezzo componente in modo che la somma delle righe esplose resti uguale al prezzo bundle del kit
- Utile quando il cliente chiede il dettaglio dei componenti ma lo sconto bundle deve restare preservato (per evitare di perdere margine o di dover rinegoziare)
| Esempio | Senza “mantieni bundle” | Con “mantieni bundle” |
|---|---|---|
| Notebook (1.299 €) | 1.299,00 | 1.205,40 |
| Monitor (499 €) | 499,00 | 463,08 |
| Scrivania (349 €) | 349,00 | 323,90 |
| Sedia (289 €) | 289,00 | 268,21 |
| Installazione (150 €) | 150,00 | 139,21 |
| Totale | 2.586,00 | ≈ 2.400,00 (bundle) |
Il flag si resetta automaticamente dopo l'uso (ogni nuovo kit parte con la scelta spenta).
Ricalcolo prezzi al cambio cliente (listino)
Quando si cambia il cliente su un documento in corso di compilazione, il sistema valuta se proporre il ricalcolo automatico dei prezzi dal nuovo listino. Strategia “safe by default”:
| Scenario | Comportamento |
|---|---|
| Apertura di un documento esistente | Nessun dialogo (caricamento iniziale) |
| Nuovo documento, nessuna riga o righe senza voce catalogo | Ricalcolo silenzioso (non c'è nulla da perdere) |
| Nuovo documento / BOZZA con righe già compilate con prezzi | Dialogo di conferma: mostra nuovo listino, numero righe coinvolte, avverte che eventuali sconti manuali verranno sovrascritti |
| Documento in stato EMESSO / CONFERMATO / INVIATO / PAGATO / ARCHIVIATO | Mai toccare i prezzi (sono storicizzati) |
| Listino non cambia (stesso listino del cliente precedente) | Nessun dialogo, nessun ricalcolo |
Ricetta (RIC)
Per il tipo documento RIC, la griglia mostra un layout speciale a 4 colonne con il campo Descrizione espanso su più righe per consentire l'inserimento della posologia completa senza troncamenti.
📝 Natura IVA — subrow automatica quando IVA = 0
Quando in una riga del documento imposti l'aliquota IVA a 0, sotto la riga compare automaticamente una subrow ambrata con il dropdown "Natura IVA (obbligatoria per XML SDI)". Il dropdown ha 21 codici secondo il tracciato FatturaPA:
- N1 — Escluse art. 15 DPR 633/72 (spese banca, anticipazioni in nome e per conto)
- N2.1 — Non soggette art. 7 DPR 633/72 (operazioni fuori campo IVA)
- N2.2 — Non soggette altri casi
- N3.1...N3.6 — Non imponibili (esportazioni, intra-UE, San Marino, lettere d'intento, ecc.)
- N4 — Esenti art. 10 DPR 633/72 (sanitari, naturopati, formazione, finanziarie) — il caso più comune per studi sanitari
- N5 — Regime del margine (beni usati)
- N6.1...N6.9 — Reverse charge / inversione contabile (rottami, oro, edilizia, ecc.)
- N7 — IVA assolta in altro Stato UE (OSS)
Il bordo del dropdown è rosso finché non selezioni un codice (campo richiesto). Hovering sul codice scelto mostra la descrizione completa. Sulle nuove righe in regime forfettario/minimi (RF19/RF02), il default N2.2 viene applicato automaticamente.
Sconto multiplo a catena
Nel campo Sconto% è possibile digitare una catena di sconti come 10+10+5. Il sistema:
- Calcola lo sconto equivalente: 1 - (0.90 × 0.90 × 0.95) = 23,05%
- Applica lo sconto calcolato all'importo della riga
- Preserva la notazione originale “10+10+5” nel campo scontoMultiplo, così al rientro nel documento viene rivisualizzato il formato originale e non il valore calcolato
Il campo si evidenzia in viola quando contiene uno sconto multiplo.
Omaggio
La colonna Omaggio (attivabile da Configura Vista) gestisce le cessioni gratuite secondo la normativa IVA:
| Opzione | Normativa | Comportamento |
|---|---|---|
| S/R — Senza rivalsa | Art. 2 c.2 DPR 633/72 | Imponibile riga = 0, natura = N2.2. L'IVA non viene addebitata al cessionario. |
| C/R — Con rivalsa | Art. 18 c.3 DPR 633/72 | Il prezzo resta invariato ma viene computato come omaggio. L'IVA viene calcolata normalmente e addebitata al destinatario. |
Le righe con omaggio attivo si evidenziano in rosa.
Priorità sconti
Quando più sorgenti forniscono sconti, la priorità applicata è:
- Sconto multiplo catalogo > Sconto default catalogo > Sconto soggetto > API listino > Listino base
Il campo Condizioni e Modalità Pagamento unifica in un'unica selezione:
- Codice condizioni SDI (TP): TP01 (rate), TP02 (completo), TP03 (anticipo)
- Codice modalità SDI (MP): MP01 (contanti), MP02 (assegno), MP05 (bonifico), MP08 (carta), ecc.
La selezione determina automaticamente il comportamento dello scadenzario (numero rate, tipo di pagamento) e i codici da inserire nell'XML FatturaPA.
Comportamento all'incasso
Le condizioni di pagamento possono avere flag aggiuntivi:
- Richiede IBAN: il sistema avvisa se il soggetto non ha l'IBAN configurato
- Richiede riferimento: per pagamenti con riferimento esterno (bonifico, RID)
- Pagamento contanti: flag per la gestione corrispettivi
- Applica sconto: sconto cassa automatico se pagamento entro i termini
Lo scadenzario genera automaticamente le rate di pagamento in base alle condizioni selezionate:
| Tipo | Codice TP | Scadenze generate |
|---|---|---|
| Pagamento a vista | TP02 | 1 scadenza alla data documento |
| Pagamento a N giorni | TP02 | 1 scadenza a data documento + N giorni |
| Rate (30/60/90 gg) | TP01 | N scadenze equamente distribuite |
| Anticipo + saldo | TP03 | Anticipo alla data + saldo a N giorni |
Ogni scadenza è modificabile manualmente: importo, data, flag pagata, data pagamento effettivo. Il sistema verifica che la somma delle scadenze corrisponda al totale documento.
🔄 Rigenerazione automatica scadenze
Le scadenze si rigenerano automaticamente al cambio delle condizioni di pagamento e dopo il salvataggio del documento (debounced ~400ms). Salvaguardia: la rigenerazione automatica non parte se ci sono rate già PAGATA, per non perdere il pagato registrato — in quel caso interviene il banner di disallineamento descritto sotto.
📊 Banner disallineamento scadenzario con 3 azioni
Se la somma delle scadenze del documento non corrisponde al totale documento (al netto delle spese banca/bolli per rata), nella sezione Scadenze appare un banner ambrato con la differenza in evidenza e tre pulsanti:
- 🔄 Rigenera tutto: elimina tutte le scadenze esistenti e ricalcola sul totale documento attuale. Se ci sono rate PAGATA chiede conferma esplicita (riazzera anche le pagate).
- 🗛 Rata di pareggio (X €): aggiunge una nuova rata a copertura della differenza, lasciando intatte tutte le rate esistenti. Si chiede solo la data scadenza (default oggi+30gg).
- ❌ Ignora: chiude il banner senza modifiche.
💰 Formato italiano (1.234,00)
Gli importi nello scadenzario (sia nelle righe che nei totali, sia nella pagina Scadenzario che nella sezione Scadenze del documento) sono visualizzati ed editati in formato italiano con punto come separatore di migliaia e virgola come separatore decimale (es. 1.234,56). Sui campi editabili: parsing intelligente sia di "1.234,56" che di "1234.56" che di "1234,56".
Visibile per DDT e fatture con trasporto. Contiene i dati per il documento di trasporto:
- Vettore: selezionabile dall'anagrafica soggetti con flag “È vettore”
- Destinazione: indirizzo di consegna (diverso dalla sede legale)
- Causale trasporto: vendita, conto lavorazione, conto visione, ecc.
- Porto: franco/assegnato
- Aspetto esteriore: descrizione dei colli
- Numero colli e peso
- Data e ora inizio trasporto
- Tracking: codice di tracciamento spedizione
✉ Pannello "Firma elettronica acquisita"
Nel dettaglio del documento è disponibile il pannello "Firma elettronica acquisita". Quando un documento è stato firmato — tipicamente un ordine raccolto dagli agenti o un DDT firmato alla consegna — il pannello mostra:
- l'immagine della firma apposta dal cliente/destinatario;
- il nome del firmatario;
- la data e l'ora della firma;
- la località GPS in cui è stata raccolta, con link diretto alla mappa.
Serve a verificare in modo immediato chi ha firmato e dove, utile per la conferma degli ordini degli agenti e per la prova di consegna dei DDT.
✍️ Badge firma in elenco documenti
Nell'elenco Documenti, i documenti firmati digitalmente mostrano il badge ✍️ FIRMA. Il colore indica l'origine: verde per gli ordini firmati dagli agenti, arancione per le consegne DDT firmate dai trasportatori. Passando il mouse, il tooltip mostra firmatario, data/ora e posizione GPS.
I simboli di riga (📎 collegati, ✓ fatturato, 🚚 spedizione, ✍️ firma) hanno posizioni a colonna fissa: restano allineati e facili da leggere tra le righe.
Il sistema supporta provvigioni su due livelli con priorità riga > documento > soggetto:
- Agente di testata: selezionabile dalla lista agenti. Imposta la provvigione su tutte le righe che non hanno un agente specifico.
- Agente per riga: sovrascrive l'agente di testata per singole righe, utile quando articoli diversi hanno agenti diversi.
- Percentuale provvigione: applicata sull'imponibile della riga. Il calcolo è
imponibileRiga × %provvigione.
Alla conferma del documento, le provvigioni maturano e sono visibili nel modulo Agenti & Provvigioni per la liquidazione.
Mostra il listino assegnato al soggetto e gli sconti applicabili. Il listino può contenere scaglioni per quantità: all'inserimento o modifica della quantità, il prezzo unitario si aggiorna automaticamente in base allo scaglione appropriato.
Priorità prezzi
- Prezzo da listino soggetto (con scaglioni quantità)
- Prezzo del catalogo
- Prezzo digitato manualmente (sovrascrive sempre)
Le righe il cui prezzo proviene da un listino sono indicate con un'icona tag e il nome del listino nella riga.
Gestione magazzino integrata con il documento:
- Magazzino di testata: selezionabile dalla lista magazzini attivi. Pre-impostato sul magazzino default.
- Magazzino per riga: consente di prelevare articoli da magazzini diversi nella stessa fattura.
- Colonna Disponibile: mostra la giacenza in tempo reale per ogni voce catalogo nel magazzino selezionato.
Movimenti automatici
Al passaggio di stato a CONFERMATO o EMESSO, il sistema genera automaticamente i movimenti di scarico per ogni riga con voce catalogo collegata:
- FIFO (First In, First Out): per articoli senza scadenza, scarica prima i lotti più vecchi per data ricevimento.
- FEFO (First Expired, First Out): per articoli con scadenza, scarica prima i lotti con scadenza più vicina.
- Se un singolo lotto non copre la quantità richiesta, il sistema splitta lo scarico su più lotti.
All'annullamento, i movimenti vengono stornati e le giacenze ripristinate.
Questa tab è visibile solo per il tipo documento FP. Contiene i metadati della fattura ricevuta dal Sistema di Interscambio:
| Campo | Descrizione |
|---|---|
| ID SDI | Identificativo univoco assegnato dal Sistema di Interscambio |
| Nome File SDI | Nome del file XML ricevuto (es. IT01234567890_00001.xml) |
| Data Ricezione | Data di ricezione dal canale SDI |
| Stato SDI | Stato della fattura: Ricevuta, Da verificare, Verificata, Accettata, Contabilizzata, Pagata, Contestata, Scartata |
| Scadenza Pagamento | Data scadenza pagamento al fornitore |
| Conservazione | Flag che indica se la conservazione sostitutiva a norma è stata effettuata |
| P.IVA / CF Fornitore | Dati fiscali del fornitore estratti dall'XML |
| XML Ricevuto | Anteprima dell'XML originale conservato |
Importa da XML
Il pulsante Importa da XML apre una modale dove incollare il contenuto dell'XML FatturaPA ricevuto. Il sistema:
- Analizza l'XML e mostra un'anteprima (fornitore, numero, data, tipo, totale)
- Premendo Applica al Documento, popola automaticamente tutti i campi del form: numero, data, righe, importi IVA, totali
- Cerca il fornitore nell'anagrafica soggetti per P.IVA e lo collega al documento
Esiti EC01 / EC02
Dalla tab Dati SDI è possibile inviare gli esiti di accettazione/rifiuto al SDI:
- EC01 — Accettazione: conferma la ricezione della fattura. Lo stato passa ad “Accettata”.
- EC02 — Rifiuto: contesta la fattura. Lo stato passa a “Contestata”.
I pulsanti sono abilitati solo per fatture in stato Ricevuta, Da verificare o Verificata.
La tab Generale contiene i campi fiscali avanzati e le sezioni condizionali:
Lettera di Intento
Per fatture verso esportatori abituali (art. 8 c.1 lett. c DPR 633/72): selezionare la lettera di intento attiva. Il sistema mostra plafond, utilizzato, residuo e verifica che il documento non ecceda il residuo disponibile. L'IVA viene azzerata con natura N3.4.
Ritenuta d'acconto
Attivabile con checkbox. Campi: tipo ritenuta (RT01/RT02/RT03/RT04), aliquota %, causale pagamento, base di calcolo %. Il calcolo è automatico: imponibile × baseCalcolo% × aliquotaRitenuta%.
Esigibilità IVA e Split Payment
- I — Immediata: comportamento standard
- D — Differita: per fatture differite (TD24)
- S — Split Payment: l'IVA non viene incassata dal cedente ma versata direttamente dal cessionario all'Erario (fatture verso PA)
CIG / CUP
Obbligatori per fatture verso la Pubblica Amministrazione. CIG = Codice Identificativo Gara, CUP = Codice Unico Progetto.
Riferimento fattura originale
Obbligatorio per Note di Credito (TD04) e Note di Debito (TD05): numero e data della fattura alla quale si riferiscono.
Ordine d'acquisto
Dati ordine acquisto (blocco 2.1.2 FatturaPA): numero e data dell'ordine cliente.
Multi-valuta
Selezionare la valuta e il tasso di conversione. Maggiori dettagli nella sezione 18.
Il riepilogo totali è sempre visibile in fondo alla pagina e si aggiorna in tempo reale:
| Voce | Formula di calcolo |
|---|---|
| Imponibile | ∑ (prezzoUnitario × quantità - sconto%) per ogni riga |
| Cassa Previdenza | Imponibile × aliquota cassa% (solo parcelle con calcolaInps=true) |
| IVA | Riepilogo per aliquota: (imponibile + cassa per aliquota) × aliquotaIVA% |
| Bollo virtuale | 2,00 € se imponibile esente IVA > 77,47 € e calcolaBollo=true |
| Totale documento | Imponibile + Cassa + IVA + Bollo |
| Ritenuta d'acconto | Imponibile × baseCalcolo% × aliquotaRitenuta% (se attiva) |
| Netto a pagare | Totale - Ritenuta (- IVA se split payment) |
| Controvalore EUR | Solo se valuta ≠ EUR: totale × tassoConversione |
Riepilogo IVA
Il sistema genera automaticamente il blocco 2.2.2 RiepilogoIVA raggruppando le righe per aliquota e natura, con calcolo dell'esigibilità IVA e riferimento normativo per ciascuna riga del riepilogo.
?? per i valori zero, evitando il bug “falsy zero” dove un imponibile di 0,00 veniva ignorato.
Ogni tipo documento ha i propri stati disponibili. Le transizioni di stato principali:
Documenti commerciali (Fatture, DDT)
| Da | A | Azione automatica |
|---|---|---|
| BOZZA | EMESSO | Assegnazione numero progressivo definitivo dal sezionale. Irreversibile. |
| BOZZA | CONFERMATO | Conferma senza numerazione definitiva |
| BOZZA | ANNULLATO | Annullamento bozza |
| EMESSO | CONFERMATO | Conferma (genera movimenti magazzino) |
| EMESSO | ANNULLATO | Annullamento (storno movimenti magazzino) |
| CONFERMATO | ARCHIVIATO | Archiviazione finale |
| CONFERMATO | ANNULLATO | Annullamento (storno movimenti e provvigioni) |
Preventivi
| Da | A | Descrizione |
|---|---|---|
| BOZZA | INVIATO | Preventivo inviato al cliente |
| INVIATO | ACCETTATO / RIFIUTATO | Esito dal cliente |
| * | SCADUTO | Superata la data validità |
Ordini
| Da | A | Descrizione |
|---|---|---|
| BOZZA | CONFERMATO | Ordine confermato |
| CONFERMATO | IN_LAVORAZIONE | Ordine in fase di evasione |
| IN_LAVORAZIONE | PARZ_EVASO / EVASO | Evasione parziale o completa |
Fatture Passive (FP)
| Stato | Descrizione |
|---|---|
| RICEVUTA | Fattura ricevuta dal SDI, da verificare |
| DA_VERIFICARE | Segnalata per verifica interna |
| VERIFICATA | Controllata dall'operatore |
| CONTABILIZZATA | Registrata in Prima Nota / Registro IVA acquisti |
| PAGATA | Pagamento effettuato al fornitore |
| CONTESTATA | Rifiutata con esito EC02 |
🔒 Blocco modifiche fiscali sui documenti numerati + sblocco amministratore
Quando un documento è numerato (numero progressivo assegnato, diverso da BOZZA) i campi che incidono sui totali fiscali sono bloccati per evitare modifiche non tracciate dopo l'emissione. Campi protetti: righe (qta/prezzo/sconto/IVA/natura), sconto globale, soggetto, data documento, condizioni di pagamento, cassa previdenza, bollo, ritenuta.
Sopra il form modifica appare un banner rosso con il messaggio "Documento N. xxx numerato — modifiche fiscali bloccate" e, per gli admin, il pulsante "Sblocca". La normale procedura di correzione resta la Nota di Credito.
Sblocco admin (eccezionale): cliccando "Sblocca" l'admin inserisce una motivazione obbligatoria registrata in audit log (tabella log_sblocchi_documento). Il banner diventa giallo con la motivazione e il pulsante "Annulla sblocco". Lo sblocco resta attivo finché non viene esplicitamente revocato — così più salvataggi consecutivi non richiedono nuovi sblocchi.
Il modulo genera XML FatturaPA v1.8 conformi alle specifiche dell'Agenzia delle Entrate.
Validazione pre-invio
Prima del salvataggio, il sistema esegue le seguenti validazioni fiscali (con avviso, non bloccante):
- P.IVA: 11 cifre + checksum Luhn mod 10
- Codice Fiscale: 16 caratteri (PF) o 11 cifre (PG)
- Codice Destinatario SDI: 7 caratteri alfanumerici oppure PEC
- Righe IVA 0% senza natura: errore SDI 00401
- Split Payment + Ritenuta: non compatibili (Circ. AdE 15/E 2015)
- NC/ND senza riferimento fattura originale: blocco FatturaPA
- Data futura o oltre 12 giorni (fattura immediata) / 15 mese successivo (differita)
- Regime forfettario con ritenuta o cassa: combinazione impossibile
- IBAN richiesto dalla condizione pagamento ma assente
Generazione singola
Dal documento aperto, premere Invia al SDI nel footer. Il sistema genera l'XML, lo valida e lo trasmette al canale SDI configurato (Aruba, Infocert, PEC).
Generazione batch
Dalla lista documenti, selezionare più fatture e premere Invio batch SDI. Il sistema elabora in sequenza con report esito per ogni documento.
Multi-valuta e SDI
L'XML FatturaPA richiede importi in EUR. Per documenti in altra valuta, il sistema inserisce automaticamente il controvalore in EUR calcolato con il tasso di conversione indicato.
Il sistema supporta la catena documentale completa:
| Da | A | Descrizione |
|---|---|---|
| Preventivo (PRV) | Ordine (ORD) | Mantiene righe, soggetto, condizioni pagamento |
| Ordine (ORD) | DDT | Genera bolla di accompagnamento merce |
| DDT | Fattura (TD01) | Fatturazione singolo DDT |
| Più DDT | Fattura Differita (TD24) | Fattura riepilogativa: raggruppamento più DDT dello stesso soggetto |
DDT Riepilogativa (TD24)
Selezionando il tipo TD24, si apre automaticamente l'overlay selezione DDT dove scegliere i DDT da includere. Il sistema:
- Mostra solo i DDT dello stesso soggetto non ancora collegati a fattura
- Permette la selezione multipla con totale progressivo
- Genera le righe della fattura dai DDT selezionati con riferimento (Rif. DDT n. X del dd/mm/yyyy)
- Collega i DDT alla fattura con relazione documentoPadre
📋 Evadi Ordini → DDT (con controllo fido cliente)
Creando un DDT, dopo aver scelto il cliente, è disponibile il pulsante "📋 Evadi Ordini". Apre l'elenco degli ordini approvati del cliente (stato Confermato o Parzialmente evaso con residuo) e permette di trasformarli in un unico DDT, anche da più ordini insieme.
- Selezione riga per riga con quantità (predefinita = residuo da evadere); il residuo non spedito genera automaticamente i back-order e l'ordine passa a Evaso/Parziale.
- In cima all'elenco viene mostrata la situazione creditizia del cliente: fido massimo, sospesi (rate aperte), insoluti (rate scadute non saldate) e fido residuo.
- Se il fido è superato o sono presenti insoluti, compare un avviso e viene richiesta una conferma esplicita prima di creare il DDT (non blocca, ma avvisa).
Il modulo supporta 21 valute con bandiera identificativa. La valuta è selezionabile nella tab Generale:
- Valuta pre-compilata: se il soggetto ha una valutaDefault, viene impostata automaticamente
- Tasso di conversione: tasso indicativo verso EUR (es. 1 USD = 0,92 EUR). Modificabile manualmente.
- Controvalore EUR: nei totali appare una riga aggiuntiva con il controvalore in euro per l'XML SDI
Ai sensi dell'art. 14 DPR 633/72, la conversione deve avvenire al tasso BCE del giorno dell'operazione. Il tasso inserito è indicativo e può essere aggiornato dall'operatore.
Nel footer del documento è presente il selettore modello di stampa:
- I modelli sono filtrati per tipo documento: selezionando una fattura si vedono solo i template fattura
- Il modello di default è pre-selezionato automaticamente
- Premendo Stampa PDF si genera il documento in una nuova finestra del browser
- I template sono personalizzabili nel modulo Print Designer
Ogni template può includere: logo aziendale, intestazione, griglia righe, riepilogo IVA, totali, coordinate bancarie, diciture obbligatorie, codice a barre e QR code.
Il pannello Configura Vista (icona ingranaggio in alto a destra) permette di personalizzare il form documento:
Colonne Righe
Mostrare/nascondere singole colonne della griglia righe: U.M., Quantità, Prezzo, Sconto, IVA%, Omaggio, Importo, ecc. Lo stato è persistente in localStorage.
Tab visibili
Mostrare/nascondere singole tab del form (Pagamento, Trasporto, Agente, Magazzino, Generale). Utile per semplificare l'interfaccia quando non servono tutte le sezioni.
Vista Espansa
Attivando la Vista Espansa, tutte le tab visibili vengono mostrate in un'unica pagina scorrevole con titoli di sezione, invece della navigazione a tab. Utile per vedere tutto il documento in un colpo d'occhio.
Template Vista
Salvare la configurazione corrente come template e richiamarla in qualsiasi momento. Utile per avere configurazioni diverse per tipi documento diversi.
⬅ Freccia "Torna indietro"
Nell'header del form modifica documento e di tutte le liste principali (Documenti, Soggetti, Catalogo, ecc.) la freccia ← riporta sempre alla videata precedente, rendendo più rapida la navigazione tra le pagine. Dal form modifica documento, la freccia torna alla lista documenti (non alla dashboard).
💾 Pulsante "Salva" unificato
Il pulsante in basso a destra del form documento si chiama Salva, sia per i nuovi documenti che per le modifiche — senza distinzione "Salva" / "Aggiorna" che generava confusione.
📋 Toast di conferma/errore
I toast di salvataggio e di errore hanno una struttura dedicata (classe doc-toast): centrati in basso, larghezza minima 480px, emoji invece di icone-font, niente troncamenti del testo. Il messaggio è sempre leggibile per intero.
| Combinazione | Azione |
|---|---|
Ctrl+S / Cmd+S | Salva documento |
Cmd+Shift+/ | Apri manuale |
Esc | Chiudi modale / torna alla lista |
Tab | Naviga campi riga (avanti) |
Shift+Tab | Naviga campi riga (indietro) |
Enter | Seleziona voce dal dropdown catalogo |
↑ ↓ | Naviga risultati dropdown catalogo |
Ctrl+N / Cmd+N | Nuovo documento |
Per il profilo attività “Studio Medico / Naturopatico”, nel footer della lista documenti è disponibile il pulsante “Elimina Ricette” (icona delete_sweep, colore rosso). Questo pulsante non appare per gli altri profili aziendali.
Motivazione normativa
In Italia il naturopata non è riconosciuto come professione sanitaria (L. 3/2018). A differenza del medico, non ha obbligo di tenuta della cartella clinica né obbligo di conservazione delle prescrizioni. Le “ricette” naturopatiche sono consigli d'acquisto, non atti medici con valore legale.
| Norma | Implicazione per il naturopata |
|---|---|
| Art. 5.1.c GDPR — Minimizzazione | I dati personali devono essere limitati a quanto necessario. Senza obbligo legale di conservazione, mantenere migliaia di ricette con dati sanitari è una violazione del principio di minimizzazione. |
| Art. 5.1.e GDPR — Limitazione conservazione | I dati vanno conservati per un arco di tempo non superiore al conseguimento delle finalità. La finalità del consiglio d'acquisto si esaurisce con l'acquisto stesso. |
| Art. 9 GDPR — Dati particolari (sanitari) | Le indicazioni su integratori, fitoterapici, posologie e note cliniche sono dati relativi alla salute. Il naturopata li tratta solo con consenso esplicito (art. 9.2.a), revocabile in qualsiasi momento. |
| Art. 83 GDPR — Sanzioni | La conservazione di dati sanitari senza base giuridica può comportare sanzioni fino a 20 milioni di euro o 4% del fatturato. |
Confronto Medico vs Naturopata
| Aspetto | Medico / Prof. sanitario | Naturopata |
|---|---|---|
| Base giuridica dati sanitari | Art. 9.2.h GDPR (medicina preventiva) | Solo consenso esplicito art. 9.2.a |
| Obbligo cartella clinica | Sì (DM 380/2000) | No |
| Conservazione obbligatoria ricette | 10 anni minimo | Nessun obbligo |
| Valore legale della ricetta | Atto medico prescrittivo | Consiglio d'acquisto |
| Principio di minimizzazione | Temperato dall'obbligo documentale | Pieno |
Come usare il pulsante
- Dalla lista documenti, il pulsante “Elimina Ricette” appare nel footer a destra (solo per profilo Studio Medico/Naturopatico).
- Il sistema conta il numero di ricette (RIC) presenti nel workspace.
- Prima conferma: mostra il numero esatto di ricette e avvisa che l'operazione è irreversibile.
- Seconda conferma: chiede una conferma finale prima di procedere.
- Il sistema elimina tutte le righe delle ricette e poi tutti i documenti di tipo RIC.
- Messaggio di successo con il conteggio delle ricette eliminate.
Buone pratiche per la conformità GDPR
- Eliminare periodicamente le ricette dei pazienti che non si presentano da oltre 12-24 mesi
- Conservare solo le fatture (obbligo fiscale 10 anni — art. 2220 CC)
- Documentare nel Registro Trattamenti GDPR il termine di conservazione per le ricette
- Acquisire il consenso esplicito (art. 9.2.a) per il trattamento dei dati sanitari e documentarlo nel modulo GDPR
- Informare i pazienti nell'informativa privacy sul periodo di conservazione dei dati relativi alla salute
Aggiornamento funzionale del modulo documenti. Di seguito le novità introdotte.
Tab dinamiche dal profilo + moduli workspace
Le tab del form documento (Pagamento, Trasporto, Agente, Scadenzario, Magazzino, Dati SDI) non sono più configurabili manualmente da “Configura Vista”. La visibilità viene determinata automaticamente combinando:
- Il profilo del tipo documento (es. PF_SANITARIO, PF_NATUROPATA, PF_COMMERCIALE)
- I moduli abilitati nel workspace corrente (Parametri → menuConfig)
La sezione “Tab visibili” è stata rimossa dal pannello Configura Vista. Resta la personalizzazione delle colonne righe e del tema.
Totali nascosti per le Ricette (RIC)
Sui documenti di tipo RIC (Ricetta / Consiglio d'acquisto) non vengono più mostrati i campi:
- Imponibile, INPS, Bollo, Netto a pagare
- Tab Generale, Pagamento, Scadenzario
La ricetta mantiene solo le sezioni rilevanti: Soggetto, Righe, eventuale Tab Magazzino. Questo rende l'interfaccia coerente con la natura non fiscale del documento.
Pulsante “Fattura Diretta” (solo su RIC)
Sui documenti RIC compare un nuovo pulsante “Fattura Diretta” che esegue in un'unica azione:
- Crea una fattura TD01 in stato EMESSA con le stesse righe della ricetta
- Usa la Dicitura Standard e l'Importo Proposto dai preset configurati in Parametri → Preset Fatture
- Emette anche la ricetta corrente (cambio di stato automatico)
Numero manuale per documenti in Bozza
Accanto al badge BOZZA, nell'intestazione del documento, è ora presente un input inline che consente di assegnare manualmente un numero al documento prima dell'emissione. Utile per recuperare numerazioni saltate o inserire documenti storici.
Navigazione frecce per tipo documento
Le frecce di navigazione ← precedente / successivo → nell'header del documento filtrano ora per lo stesso tipo documento del corrente. Scorrendo da una fattura TD01 si passa solo ad altre TD01; da una RIC ad altre RIC.
Paginazione lista documenti
Nel footer della lista documenti sono stati aggiunti i controlli di paginazione con selettore delle righe per pagina: 25 / 50 / 100 / 200. Riduce i tempi di caricamento su workspace con molti documenti.
Ergonomia tastiera nelle righe
- Tab con Enter sull'ultimo campo di una riga sposta il focus sul pulsante “Aggiungi riga”. Un ulteriore Enter aggiunge la riga e il focus passa al primo campo della nuova riga.
- I bottoni Catalogo (apertura dropdown) e Cestino (eliminazione riga) sono ora fuori dal flusso Tab (
tabindex=-1). Così la digitazione rapida non viene interrotta da bottoni non di input.
Aggiornamento strutturale del modulo Documenti: tracciamento modifiche, cestino dedicato alle BOZZE, operazioni massive con validazione delle transizioni di stato. Tutte le novita sono progettate nel rispetto dei vincoli di conservazione fiscale: i documenti emessi restano immutabili.
Soft-delete limitato alle BOZZE
L'eliminazione di un documento segue ora regole differenti in base allo stato:
- BOZZA: eliminazione = soft-delete (il documento va nel cestino, e ripristinabile).
- EMESSO / CONFERMATO / INVIATO / PAGATO / ARCHIVIATO: eliminazione non consentita (errore 409). Per annullare un documento fiscale usare lo stato ANNULLATO, che preserva numerazione e tracciabilita.
Questa distinzione e fondamentale per la conservazione fiscale: una fattura emessa non puo sparire dal database, deve restare con stato ANNULLATO se ritirata.
Cestino e ripristino
Nel footer della lista documenti e ora presente il pulsante 🗑 Cestino. Premendolo la lista mostra solo le bozze cancellate con i metadati di eliminazione (data e autore).
Per ogni bozza nel cestino sono disponibili due azioni nella colonna Azioni:
- ↺ Ripristina: la bozza torna nella lista attiva.
- ✗ Definitivo: eliminazione fisica irreversibile, riservata ad utenti ADMIN o SUPERADMIN. Blocca se il documento e referenziato altrove.
Audit log automatico
Ogni modifica a un documento (PUT su campi fiscali o PATCH sullo stato) viene registrata nella tabella log_modifiche_documenti con valore precedente, valore nuovo, utente e data/ora.
I campi tracciati includono: numero, serie, data documento, stato, soggetto, tipo documento, totali (imponibile, IVA, lordo), dati di trasporto, sconto, condizioni di pagamento, agente di riferimento. Lo storico e accessibile via API GET /api/documenti/:id/audit-log.
Timeline del documento
L'endpoint GET /api/documenti/:id/timeline restituisce una vista aggregata: modifiche dell'audit, scadenze (rate di pagamento), movimenti di magazzino generati dal documento e provvigioni maturate, ordinati per data decrescente.
Operazioni massive (selezione multipla)
La barra azioni che appare quando si selezionano piu documenti include ora:
- Cambio stato massivo (Inviato, Pagato, Archivia, Annulla): il backend valida ogni transizione. I documenti con stato incompatibile vengono ignorati e riportati come
invalidinella risposta. - Cestino: sposta nel cestino solo le BOZZE selezionate. Gli altri documenti vengono riportati come
bloccati. - Fatt. Riepilogativa (solo filtro DDT): invariato.
Tecnicamente, le operazioni passano ora da un singolo endpoint POST /api/documenti/bulk che gestisce sia cambia-stato sia soft-delete. La validazione delle transizioni e centralizzata lato server.
Matrice delle transizioni di stato
| Da | Verso (consentite) |
|---|---|
| BOZZA | EMESSO, CONFERMATO, ANNULLATO |
| EMESSO | CONFERMATO, INVIATO, ANNULLATO |
| CONFERMATO | INVIATO, PAGATO, ARCHIVIATO, ANNULLATO |
| INVIATO | PAGATO, ARCHIVIATO, ANNULLATO |
| PAGATO | ARCHIVIATO |
| ANNULLATO | — (terminale) |
| ARCHIVIATO | — (terminale) |
calcolaBollo=true, (b) il bollo virtuale è attivo nei Parametri azienda, (c) l'imponibile esente IVA è superiore a 77,47 € (DM 17/06/2014). L'importo viene incluso nel totale e nel XML FatturaPA (blocco 2.1.1.8).10+10+5 nel campo Sconto% della riga. Il sistema calcola lo sconto equivalente (23,05%) e lo applica all'importo, ma preserva la notazione originale nel campo scontoMultiplo. Al rientro nel documento si vede sempre “10+10+5” e non il valore calcolato.GET /api/documenti/:id/audit-log e inclusa nella timeline del documento.invalidi nella risposta del bulk.bloccati. Dal cestino le bozze possono essere ripristinate o eliminate definitivamente (solo ADMIN).• Pacchetto
FATTURAZIONE attivo sul workspace (configurabile da SUPERADMIN in /admin/pacchetti)
• Profilo attività compatibile: Tutti i profili (richiede pacchetto FATTURAZIONE)
• Permesso utente abilitato in Modifica Utente → Moduli
I tre livelli si applicano in intersezione. Dettagli completi in Gerarchia Pacchetti+Profilo+Utente.
A partire dalla versione 2.2, il modulo Documenti adotta lo standard di certificazione NOX con i seguenti presidi:
Cestino e soft-delete
Gli elementi cancellati non vengono rimossi fisicamente ma spostati in un cestino interno (campi cancellatoIl / cancellatoDa). Dalla toolbar il pulsante Cestino alterna tra vista attivi e vista cestino. Dal cestino è possibile:
- Ripristinare l'elemento (riportarlo nella lista attiva) — operazione riservata ad amministratori.
- Eliminare definitivamente con motivazione obbligatoria — azione irreversibile, riservata ad amministratori, tracciata nell'audit log.
Azioni massive (bulk)
È possibile selezionare più elementi con le checkbox della prima colonna. Appare una barra inferiore con le azioni disponibili: Cambio stato, Invia, Storna. Stato CONFERMATO/EMESSO blocca modifica dati fiscali. La risposta indica N operazioni riuscite / M fallite; i dettagli delle fallite compaiono nella console browser (F12).
Storico modifiche (audit log)
L'icona history nelle azioni di riga apre un modal con la storia completa delle modifiche: data, campo, valore precedente, valore nuovo, operatore, eventuale motivazione. I record di audit non sono modificabili né eliminabili via UI. Conservazione: indefinita (art. 2220 c.c. — 10 anni minimo).
Mascheramento dati sensibili (GDPR art. 32)
Se i campi modificati contengono dati sensibili (IBAN, Codice Fiscale, Partita IVA, password/token), l'audit log salva il valore mascherato anziché in chiaro:
| Campo | Esempio originale | Nel log |
|---|---|---|
| IBAN | IT60X0542811101000000123456 | IT60****3456 |
| Codice Fiscale (PF) | RSSMRA80A01H501Z | RSSMRA****501Z |
| Partita IVA | 12345678901 | 123****901 |
| Password / token | (qualsiasi) | ***REDACTED*** |
Timeline aggregata
Per ciascun elemento è disponibile una vista Timeline che aggrega in ordine cronologico audit, eventi del ciclo di vita ed eventuali entità collegate (es. documenti, movimenti, storni).
RBAC uniforme
Tutte le azioni distruttive o massive (soft-delete, ripristino, eliminazione definitiva, bulk, storno) richiedono il ruolo ADMIN o superiore. Gli operatori possono continuare a creare / modificare / consultare secondo le proprie abilitazioni.
Estensione del pacchetto FATTURAZIONE con le funzionalità operative più richieste dal mercato italiano. Tutti gli endpoint sono montati sotto /api/fatturazione/*. Le feature riguardano la vita del documento: dalla generazione automatica (ricorrenti, DDT raggruppati) allo storno, dalla liquidazione IVA differita ai template di stampa.
#1 Fatture ricorrenti / abbonamenti
Permette di definire un documento template che verrà emesso automaticamente a intervalli regolari (mensile, bimestrale, trimestrale, semestrale, annuale). Uno scheduler cron attivo su tutti i workspace (5 4 * * * UTC — 04:05) controlla ogni notte le ricorrenti scadute (prossima_emissione <= oggi) e genera la fattura corrispondente.
- Tabella:
fatture_ricorrenti+ loglog_emissioni_ricorrenti - Campi: frequenza, giorno del mese (cap 28 per sicurezza su febbraio), fine validità (NULL = illimitato), auto invio email
- Endpoint:
GET /api/fatturazione/ricorrenti(elenco + cestino),POST /ricorrenti,PUT /ricorrenti/:id,DELETE(soft-delete),POST /ripristina,POST /:id/esegui-ora(test manuale),GET /:id/log - Soft-delete integrato: elementi cancellati vanno in cestino con
cancellato_il+cancellato_da, ripristino tramite endpoint dedicato
#2 Raggruppamento DDT → Fattura differita (TD24)
Consente di emettere entro il 15 del mese successivo una unica fattura TD24 che raggruppi tutti i DDT consegnati a un soggetto (art. 21 c.4 DPR 633/72).
- Nuovi campi su
documenti:fatturatoIl(timestamp) efatturaRaggruppataId(FK alla fattura cumulativa) GET /api/fatturazione/ddt-fatturabili?soggettoId=X&dataFinoA=YYYY-MM-DD— lista DDT emessi, non cancellati, non ancora fatturatiPOST /api/fatturazione/raggruppa-ddtbody{soggettoId, ddtIds:[], dataFattura}— crea TD24 con righe aggregate e marca i DDT come fatturati- Ogni riga della nuova fattura riporta in testa il riferimento DDT (numero, anno, data) per tracciabilità
#3 Storno con Nota di Credito collegata (TD04)
Genera automaticamente una TD04 con righe negate (imponibile/IVA/totale invertiti) collegata al documento originale. La nota di credito può stornare tutte le righe o solo un sottoinsieme (storno parziale).
- Nuovi campi su
documenti:documentoOriginaleId(FK) emotivazioneStorno POST /api/fatturazione/storno/:docIdbody{righeDaStornare?: [ids], motivazione, dataNC}- La descrizione della NC riporta in automatico: "Nota di credito per TD01 12/2026: <motivazione>"
#4 Split payment PA automatico (art. 17-ter)
Flag isPA + codiceIpa sul soggetto. Quando si emette una fattura verso un soggetto marcato PA, l'esigibilità IVA va impostata a S (scissione pagamenti): l'IVA non viene incassata dal fornitore ma versata direttamente dalla PA all'Erario.
PATCH /api/fatturazione/soggetto/:id/is-pabody{isPA:true, codiceIpa:"UFXXXX"}GET /api/fatturazione/soggetti-pa— elenco enti PA attivi
#6 IVA per cassa (art. 32-bis DL 83/2012)
Regime opzionale per piccole imprese: l'IVA diventa esigibile solo al pagamento della fattura (non all'emissione), con limite massimo di 12 mesi dall'emissione. Due nuovi campi su documenti:
ivaPerCassa(boolean) — marca il documento come soggetto al regimeivaPerCassaVersataIl(timestamp) — data pagamento → IVA diventa esigibilePATCH /api/fatturazione/iva-per-cassa/:docId(attiva/disattiva flag)POST /api/fatturazione/iva-per-cassa/:docId/versata— marca l'IVA come esigibileGET /api/fatturazione/iva-per-cassa/pendenti— fatture con IVA ancora sospesa
#7 Log invio email documenti
Ogni email inviata relativa a un documento (manuale o automatica) lascia traccia in log_invio_email_documento.
- Eventi tracciati:
MANUALE,AUTO_EMESSO,AUTO_SOLLECITO,AUTO_RICORRENTE - Esiti:
OK,ERRORE,BOUNCE - Flag allegati:
allegato_pdf,allegato_xml POST /api/fatturazione/invio-email/:docIdbody{destinatario, oggetto, corpo, allegatoPdf, allegatoXml, evento}GET /api/fatturazione/invio-email/:docId/log
#8 Sezionali multipli (numerazione per serie)
Numerazione progressiva indipendente per tipologia/sezionale. Formato generato: 2026/A/0001 con separatore personalizzabile. Il progressivo si resetta automaticamente ad ogni cambio d'anno.
- Tabella:
sezionali_documento, FK sudocumenti.sezionaleId - Seed iniziale: sezionale
DEFAULTcreato automaticamente GET /api/fatturazione/sezionali,POST /sezionali(ADMIN),POST /sezionali/:id/next-progressivo- Un sezionale può essere universale (
tipo_documento=NULL) o legato a un tipo specifico (TD01, TD04, DDT...)
#9 Bonus edilizi (art. 121 DL 34/2020)
Gestione sconto in fattura + cessione del credito per i vari bonus edilizi (110%, 65%, 50%, bonus facciate, ecc.).
- Nuovi campi su
documenti:scontoInFattura(numerico),tipoBonusEdilizio(es. "110", "65", "facciate"),cessionarioCredito,dataCessioneCredito PATCH /api/fatturazione/bonus-edilizi/:docIdbody{scontoInFattura, tipoBonusEdilizio, cessionarioCredito, dataCessioneCredito}GET /api/fatturazione/bonus-edilizi?anno=2026— report annuale bonus applicati
#12 Template di stampa per tipo documento
Layout configurabili per ciascun tipo di documento con CSS personalizzato e blocchi JSON. Seed iniziale: template standard per TD01, TD04, DDT, PRV.
- Tabella:
template_stampa_documentoconlayout_json(blocchi:intestazione_azienda,intestazione_cliente,tabella_righe,totali,scadenze...) + CSS personalizzato - Un template può essere default per tipo o universale (
tipo_documento=NULL) - CRUD completo:
GET /template-stampa,POST,PUT /:id,DELETE /:id(disattiva) - Filtri:
?tipoDocumento=TD01restituisce template specifici + universali ordinati per default
Completa il pacchetto FATTURAZIONE con le 9 macro-funzionalità residue ritenute indispensabili dal mercato italiano: ritenuta d'acconto, rivalsa INPS, bollo virtuale automatico, cassa previdenziale, collegamento acconti, multimoneta, solleciti, autofattura e esterometro. Tutte le novità sono montate sotto /api/fatturazione/* (router fatturazione-v22-wave7.routes.js).
A. Ritenuta d'acconto (art. 25 DPR 600/73)
Applica e calcola automaticamente la ritenuta d'acconto sulla fattura in emissione. Campi documenti: ritenutaAttiva, aliquotaRitenuta (default 20%), baseCalcoloRitenuta, tipoRitenuta (codice tributo: 1040 professionisti, 1046 prov. agenti, 1050 lav. occasionali, 1019 cap. sociale), causaleRitenuta (A/B/C/D/H come tabella CU), importoRitenuta (calcolato).
PATCH /api/fatturazione/ritenuta/:docIdbody{attiva, aliquota, baseCalcolo, tipoRitenuta, causaleRitenuta}GET /api/fatturazione/ritenuta/report?anno=2026&soggettoId=X— riepilogo per CU/770
B. Rivalsa INPS 4% (art. 1 c. 212 L. 662/1996)
Per professionisti iscritti alla gestione separata INPS: rivalsa addebitata al cliente in fattura, non concorre a base IVA, aliquota max 4%.
- Campi:
rivalsaInps(importo),aliquotaRivalsaInps - Sul soggetto:
aliquotaRivalsaInpsDefault,tipoProfessionista(INPS_GS / CNPADC / ENPAP / ENPAM / ENPAV / EPAP) PATCH /api/fatturazione/rivalsa-inps/:docIdbody{aliquota}
C. Bollo virtuale automatico (DM 17/06/2014)
Calcolo automatico del bollo di € 2,00 su fatture con totale operazioni esenti/escluse/non soggette ≥ € 77,47. Il sistema somma gli imponibili delle righe con natura IVA N1..N7 e applica la soglia.
- Campi:
bolloAutoCalcolato(boolean),motivazioneBollo(testo con dettaglio calcolo) POST /api/fatturazione/bollo/auto-calcola/:docId— valuta soglia e applica bollo
D. Cassa previdenziale (codici TC01..TC22 FE)
Gestione strutturata delle 22 casse previdenziali professionali con i relativi codici Fattura Elettronica. Seed automatico: Cassa Forense (TC01), CNPADC (TC02), Geometri, INARCASSA, Notariato, CNPR, ENASARCO (TC07), ENPACL, ENPAM (TC09), ENPAF, ENPAV, ENPAP (TC12), ENPAPI, EPPI, EPAP (TC15), ENPAB, INPGI, ENPPI, INPS Gestione Separata (TC21), INPS (TC22).
- Tabella:
categorie_cassa_previdenzacon flagconcorre_imponibile_iva(false per TC07/TC21/TC22) - Campi documenti:
tipoCassaPrevidenza(codice),aliquotaCassaPrevidenza,cassaPrevidenza(importo) GET /cassa-prev/categorie,PATCH /cassa-prev/:docIdGET /calcolo-netto/:docId— ritorna breakdown completo: imponibile + cassa + IVA + rivalsa + bollo − ritenuta = netto
E. Acconti TD02/TD03 → fattura finale TD01
Collega uno o più acconti (TD02 acconto su fattura, TD03 acconto su parcella) alla fattura finale TD01 che li incorpora. Il sistema verifica che acconti e fattura siano dello stesso soggetto e che gli acconti non siano già legati altrove.
- Campi:
documentoAccontoId(FK TD01 dal TD02/TD03),importoAcconto(totale acconti detratti sulla TD01) GET /api/fatturazione/acconto/disponibili?soggettoId=X— acconti non ancora legatiPOST /api/fatturazione/acconto/lega/:fatturaIdbody{accontoIds: [ids]}
F. Multimoneta — cambi valuta + totale in valuta estera
Registra documenti in valuta straniera con cambio storico. La tabella cambi_valuta_storici mantiene lo storico dei cambi (fonte: manuale / BCE / API ECB). Seed iniziale: USD, GBP, CHF, JPY, CNY.
- Campi documenti:
valuta(ISO 4217),cambio,dataCambio,totaleInValutaEstera(calcolato auto) GET /multimoneta/cambi?valuta=USD&data=2026-04-15— ritorna il cambio valido a quella dataPOST /multimoneta/cambio[ADMIN] — inserisce/aggiorna un cambio storicoPATCH /multimoneta/:docIdbody{valuta, cambio?, dataCambio?}— secambionon passato, viene recuperato dallo storico alladataDocumento
G. Solleciti automatici con interessi legali
Template configurabili per 4 livelli (cortese, secondo, terzo, diffida ex art. 1454 c.c.). Gli interessi legali sono calcolati automaticamente al tasso BCE vigente (2026: 5%) sui giorni di ritardo effettivi. Sostituzioni di variabili nell'oggetto e corpo: {NUMERO}, {ANNO}, {DATA_DOC}, {DATA_SCAD}, {IMPORTO}, {INTERESSI}, {SOGGETTO}, {GIORNI_RITARDO}.
- Tabelle:
template_sollecito(4 livelli seed),solleciti_documento(log invii) GET /solleciti/templates,PUT /solleciti/templates/:id[ADMIN]POST /solleciti/invia/:docIdbody{livello, scadenzaId?, destinatarioOverride?}GET /solleciti/log/:docId— storico sollecitiGET /solleciti/scaduti?giorni=N— cruscotto scadenze pendenti ≥ N giorni
H. Autofattura TD17/TD19/TD20/TD21 (reverse charge)
Genera automaticamente un'autofattura di regolarizzazione TD20 (art. 6 c.8 D.Lgs 471/97) a partire da una fattura originale con righe copiate e flag autofatturaDenuncia = true. Per TD17/19/21 è disponibile un endpoint di marca manuale.
- Campi:
autofatturaDenuncia(boolean),fatturaOrigineAutofatturaId(FK alla fattura originale per TD20) POST /autofattura/td20/:fatturaOrigineId[ADMIN] body{motivazione}— genera TD20PATCH /autofattura/marca/:docId— marca TD17/19/21 come autofattura + esterometroGET /autofattura/lista— elenco autofatture emesse
I. Esterometro trimestrale
Raccolta e comunicazione trimestrale dei documenti verso/da esteri (TD17 servizi esteri, TD18 beni UE, TD19 beni extra-UE).
- Tabella:
esterometro_comunicazioni(periodo UNIQUE, num_cessioni, num_acquisti, stato BOZZA/INVIATO/ACCETTATO/SCARTATO) - Campi documenti:
esterometroFlag,esterometroComunicatoIl,esterometroPeriodo("2026-Q1") GET /esterometro/candidati?periodo=2026-Q1— documenti candidati del trimestrePOST /esterometro/comunica[ADMIN] body{periodo, documentiIds:[]}— marca documenti + crea comunicazioneGET /esterometro/comunicazioni— storico comunicazioni
Chiusura definitiva dei residui aperti: invio SMTP reale solleciti, parsing XML FatturaPA robusto + contabilizzazione automatica fatture passive con reverse charge, generazione XML Esterometro e Intrastat UE. Router fatturazione-v22-wave8.routes.js, dipendenza aggiunta xml2js.
1. SMTP reale per solleciti
Sostituisce il log-only di wave7 con invio reale tramite nodemailer usando la configurazione SMTP salvata nei parametri aziendali (smtpHost, smtpPort, smtpUser, smtpPass, smtpSecure, smtpFrom, flag smtpTestato).
POST /api/fatturazione/solleciti-smtp/invia/:docIdbody{livello, scadenzaId?, destinatarioOverride?, allegaPdf?}— invio singolo con sostituzione variabili + interessi legali BCEPOST /api/fatturazione/solleciti-smtp/invia-bulk[ADMIN] body{livello, giorniRitardoMinimo, limiteInvii}— invio massivo a tutte le scadenze candidate, esclude destinatari già sollecitati a livello ≥ N- Registra in
solleciti_documentoElog_invio_email_documento(eventoAUTO_SOLLECITO)
2. SDI fatture passive — parsing XML + contabilizzazione
Parsing robusto del XML FatturaElettronica con xml2js (sostituisce il regex parser precedente). Estrae DettaglioLinee, DatiRiepilogo, dati cedente e totali. Popola la nuova tabella fattura_passiva_righe.
POST /api/fatturazione/sdi-passive/:id/parse-xml[ADMIN] — esegue parsing e salva righeGET /api/fatturazione/sdi-passive/candidati-contab— fatture passive ricevute/verificate non ancora contabilizzatePOST /api/fatturazione/sdi-passive/:id/contabilizza[ADMIN] body{contoAcquisti?, contoIvaCredito?, contoFornitore?, forza?}
Pattern contabile applicato (prima_nota_righe generate automaticamente)
| Scenario | Dare | Avere |
|---|---|---|
| TD01/TD04 standard | Acquisti + IVA credito | Debito vs fornitore (lordo) |
| TD17/TD18/TD19 reverse charge | Acquisti + IVA credito reverse | IVA debito reverse + Debito vs fornitore estero |
Le registrazioni vengono create con stato = PROVVISORIO, tipo = AUTO, causale ACQUISTO. Il numero registrazione è progressivo annuale AAAA/N. Il flag contabilizzataIl sulla fattura passiva previene la doppia contabilizzazione (override con forza=true).
3. XML Esterometro reale
Genera l'XML effettivo della comunicazione "Dati fatture transfrontaliere" (schema Agenzia Entrate v3.0) con sezioni DTE (cessioni TD17) e DTR (acquisti TD18/TD19). File salvato in /app/xml-generati/, hash SHA-256 + archivio inline (< 500KB) nella nuova tabella xml_generati_archivio.
POST /api/fatturazione/esterometro-xml/genera/:periodo[ADMIN] (es.2026-Q1)GET /api/fatturazione/esterometro-xml/download/:id— download del file XML generato- Aggiorna
esterometro_comunicazioni.stato = INVIATOe salvafile_xml_path
4. Intrastat UE — dichiarazioni cessioni / acquisti
Nuove tabelle intrastat_dichiarazioni (UNIQUE periodo + tipo) e intrastat_righe per registrare le operazioni intra-UE. Generazione XML secondo schema INTRA-1bis (cessioni) / INTRA-2bis (acquisti).
GET/POST /api/fatturazione/intrastat/dichiarazioni[ADMIN POST] — CRUD dichiarazioni periodichePOST /api/fatturazione/intrastat/righe/:dichiarazioneId[ADMIN] — inserisce riga con paese, codice NC8, valore statistico, massa netta, natura transazione, condizioni consegna (EXW/FOB/CIF…), modo trasportoGET /api/fatturazione/intrastat/righe/:dichiarazioneId— elenco righePOST /api/fatturazione/intrastat/genera-xml/:dichiarazioneId[ADMIN] — produce XML, stato → PRESENTATA, data presentazione = oggi
Archivio XML centralizzato
Nuova tabella xml_generati_archivio che raccoglie tutti gli XML generati (Esterometro, Intrastat, Autofattura future). Ogni record include path file, dimensione byte, hash SHA-256, contenuto inline se < 500KB, generato_il/generato_da.
GET /api/fatturazione/archivio-xml?tipo=ESTEROMETRO&periodo=2026-Q1
firma-cades.service.js).Il pacchetto BOLLETTAZIONE completo il ciclo DDT/Spedizioni con 13 feature di priorità ALTA + MEDIA. Vedere il manuale dedicato spedizioni-u.html per la documentazione completa. Di seguito un riepilogo delle feature che toccano il documento (DDT/fattura).
Impatti sul documento
- Nuovi campi su
documenti:resoTipo(RESO_CLIENTE | RESO_FORNITORE),resoDocumentoOrigineId,resoMotivazione,resoNotaCreditoId,fatturaAccompagnatoriaFlag - DDT di reso — endpoint
POST /api/bollettazione/ddt-reso/:docOrigineIdgenera DDT con causale RESO_DA_CLIENTE / RESO_A_FORNITORE e opzionale NC TD04 collegata - Fattura accompagnatoria — flag su TD01 che incorpora i dati trasporto (alternativa a DDT + fattura differita TD24)
- Magazzino auto — il DDT emesso triggera automaticamente i movimenti di magazzino con
POST /api/bollettazione/magazzino-auto/ddt/:docId - Conto deposito/visione/lavorazione (art. 53 DPR 633/72) — workflow completo con data scadenza rientro, firma fornitore, stato APERTO → RIENTRATO → FATTURATO
Etichette, CMR, DAU, POD
Documentazione di supporto generata automaticamente per spedizioni: etichette PDF 10x15 con QR/Code128, CMR internazionale (Ginevra 1956), bolle doganali DAU (export extra-UE) con certificati origine EUR1/ATR, POD firma digitale con hash SHA-256 integrità.
Corrieri + tracking real-time
Adapter pattern per 6 provider (MOCK funzionante, DHL/SDA/GLS/BRT/TNT stub). Eventi tracking real-time con webhook pubblico per ricevere push dai corrieri integrati.
/api/bollettazione/*. Vedere spedizioni-u.html per la documentazione completa dei 13 endpoint.Restyling completo del form di modifica documento per migliorare leggibilità, uniformità e produttività dell'operatore. Nessun impatto funzionale: i dati, le validazioni e il flusso rimangono invariati.
Header documento (barra superiore)
- Sfondo blu navy gradient
#1a3a6e → #2a548e(prima era quasi nero#1a1a2e) - Etichetta "Nuovo/Modifica Documento": 14px → 18px, peso 800 (molto bold)
- Numero documento (badge dorato): 13px → 18px, font
Segoe UIsans-serif (invece del Courier monospace) - Stato documento (BOZZA / EMESSO / CONFERMATO / ...): badge + dropdown ingranditi a 15px con padding generoso e altezza 36px
Riga testata (Tipo Documento / Data / Serie / Sezionale)
- Tutti e 4 i campi condividono lo stesso stile: label 12px weight 800, input 16px peso 500, altezza fissa 40px, font
Segoe UI, colore#0f2349 - Tipo Documento: cella
flex: 0 1 240px(ridotta da 380px il 6 Maggio 2026 per non troncare il Sezionale). - Sezionale: dropdown che lista i sezionali attivi per il Tipo Documento e Anno scelti, con auto-selezione del default. Per ogni opzione mostra anteprima del prossimo numero (es.
5_2026F,5/2026A). Su documenti già emessi compare il lucchetto 🔒 e il bottone «↺ Cambia» che apre un dialog modale per il cambio sezionale a posteriori (con motivazione e log audit). Vedi anche Tabelle Sezionali in Manuale Tabelle § 11.
Banner «Cosa vuoi fare adesso?» (compatto, 6 Maggio 2026)
Sopra il form documento, in modifica di un documento esistente con conversioni disponibili, appare un banner verde-azzurro con i pulsanti per il passo successivo del ciclo di vendita (es. PRV → ORD, ORD → DDT, DDT → FT, oppure Reso/Nota Credito, Emetti Acconto). Layout reso più compatto: pulsanti orizzontali con icona+label+codice in fila, altezza dimezzata per non rubare spazio al form.
Tab Scadenzario — hint dinamico spese banca/bolli
Nel tab Scadenzario, quando le rate generate hanno spese banca o bolli aggiunti dalla condizione di pagamento, NOX mostra un hint colorato per chiarire il trattamento fiscale:
- 🏦 Hint azzurro — modalità «In scadenzario»: «Spese banca/bolli a carico del cliente in fase di incasso». Indica che le rate includono X € di spese che la banca addebiterà al cliente al momento dell'incasso (RIBA / SEPA / tratta). Non vanno in fattura: non sono ricavi e non rientrano nell'imponibile fatturato.
- 📋 Hint ambra — modalità «In fattura»: «Spese incluse in fattura come riga automatica». NOX ha aggiunto automaticamente le righe Spese bancarie e/o Bolli su tratta al documento (aliquota 0%, natura N1 escluso art. 15 DPR 633/72).
Validazione importo scadenze: il banner di errore «Scadenzario disallineato: totale scadenze X € ≠ totale documento Y €» ora scorpora correttamente le spese banca/bolli dalla somma rate prima del confronto, evitando falsi allarmi quando la condizione di pagamento ha includeSpeseBanca/includeSpeseBolli attivi e modalità IN_SCADENZARIO.
Righe documento — colonne a larghezza fissa
Tutte le colonne della tabella righe ora hanno larghezza fissa preimpostata, eccetto la DESCRIZIONE che occupa lo spazio residuo (1fr). Le larghezze sono definite in documento.component.ts nel metodo righeGridColumns.
| Colonna | Larghezza | Note |
|---|---|---|
| # | 28px | Numero riga |
| DESCRIZIONE | 1fr | Riempie lo spazio disponibile, va a capo se necessario |
| U.M. | 48px | Unità di misura (pz, kg, ...) |
| QTÀ | 64px | Quantità |
| PREZZO | 90px | Prezzo unitario |
| SC.% | 60px | Sconto percentuale |
| IVA % | 52px | Aliquota IVA |
| OMAG. | 48px | Tipo omaggio (— / S/R / C/R) |
| IMPORTO | 150px | Fissa per contenere 123.456.789,00 € |
| AZIONI | 62px | Catalogo + cestino |
Altezze riga uniformi e stretch automatico
Tutte le celle della riga (descrizione, quantità, prezzo, importo, ecc.) hanno altezza minima uniforme 22px e line-height: 18px. La riga usa display: grid con align-items: stretch: quando la textarea descrizione va a capo, tutte le altre celle crescono di altezza in modo proporzionale mantenendo l'allineamento visivo.
Formato prezzo italiano sempre attivo
La colonna PREZZO mostra sempre il formato italiano 1.234,00 (punto migliaia + virgola decimale), anche durante l'editing al focus. La formattazione è ora implementata manualmente con regex /\B(?=(\d{3})+(?!\d))/g invece di toLocaleString('it-IT'), per evitare problemi di rendering del separatore migliaia su browser/runtime ICU.
// documento.component.ts
formatPrezzoIT(value: number | null | undefined): string {
if (value == null || isNaN(value)) return '';
const negativo = value < 0;
const fixed = Math.abs(value).toFixed(2);
const [intPart, decPart] = fixed.split('.');
const withThousands = intPart.replace(/\B(?=(\d{3})+(?!\d))/g, '.');
return (negativo ? '-' : '') + withThousands + ',' + decPart;
}
Tab (Pagamento, Trasporto, Magazzino, Scadenzario, ...)
In vista espansa le tab sono mostrate tutte in pagina sotto forma di accordion. Nuove funzionalità:
- Priorità automatica: tab con dati all'inizio, tab vuote in fondo (ogni tab conserva comunque l'ordine custom dell'utente)
- Auto-collapse: tab vuote vengono chiuse automaticamente al caricamento del documento
- Indicatore ⚠️ su tab collassate con dati: quando una tab è chiusa ma contiene informazioni, viene evidenziata con sfondo arancione chiaro, bordo sinistro arancione (3px) e icona attenzione pulsante. Utile per capire subito quali sezioni "nascoste" hanno contenuto senza dover espandere tutto.
- Totali sempre in fondo: il box dei totali (riga nera con imponibile/IVA/totale) usa
order: 9999in flex per essere sempre l'ultimo elemento del form, indipendentemente dall'ordine delle tab
Pulsanti "Configura vista" spostati
I pulsanti Configura vista modifica (tune) e Mostra tutte le sezioni (view_agenda/stream) sono stati spostati dalla barra tab alla riga del titolo SOGGETTO, allineati a destra. Liberano spazio nell'area principale e restano sempre visibili nell'intestazione.
Cella IMPORTO con bordi e background
La cella IMPORTO ora ha aspetto coerente con le altre celle di input: bordo 0.5px solid #ddd, border-radius: 3px, background #fafafa, padding 1px 8px, min-height 22px. L'allineamento del numero è a destra con font Courier monospace.
Colonne righe — ordine nel codice
Fonte di verità per le larghezze delle colonne: righeGridColumns in documento.component.ts. L'array colonneRigheDisponibili (stesso file) deve avere lo stesso ordine dei tag HTML delle celle, altrimenti i binari della CSS grid vengono assegnati a colonne sbagliate. Durante questa ondata è stato corretto un bug in cui importo precedeva omaggio nell'array ma nel template HTML era l'inverso.
documento.component.ts, documento.component.html, documento.component.css.Le preferenze di visualizzazione del modulo Documenti (Configura vista modifica e Mostra tutte le sezioni in pagina) sono ora memorizzate per combinazione utente + workspace, non più globalmente per browser.
Preferenze interessate e livelli di scoping
| Preferenza | Cosa salva | Scoping |
|---|---|---|
| Vista espansa | Toggle "Mostra tutte le sezioni in pagina" (accordion) | user + ws + tipo doc |
| Colonne righe | Quali colonne (#, Descrizione, U.M., Qtà, ...) sono visibili | user + ws + tipo doc |
| Ordine tab | Ordine di priorità delle tab | user + ws + tipo doc |
| Template modifica | Configurazioni salvate dell'intero layout modifica documento | user + ws (globali) |
| Template lista | Configurazioni salvate della lista documenti (filtri + colonne + sort) | user + ws (globali) |
Scoping a 3 livelli
Le preferenze "per tipo" (colonne righe, vista espansa, ordine tab) usano una chiave a 4 segmenti, quelle globali (template) una chiave a 3 segmenti:
// Per tipo documento (specifico)
doc_colonneRighe__admin__af0e086a-21f2-4784__RIC // Ricetta
doc_colonneRighe__admin__af0e086a-21f2-4784__TD01 // Fattura
doc_colonneRighe__admin__af0e086a-21f2-4784__DDT // Documento di trasporto
// Globale user+ws (template)
doc_templateModifica__admin__af0e086a-21f2-4784
Caso d'uso tipico — Ricetta vs Fattura
Lo stesso utente, nello stesso ambiente, apre una Ricetta e nasconde Prezzo, QTÀ, IMPORTO (non rilevanti per prescrizioni mediche). Poi apre una Fattura: le stesse 3 colonne riappaiono automaticamente perché la preferenza è memorizzata per tipo documento.
Fallback in caso di nuovo tipo documento
Se l'utente apre un tipo documento per il quale non ha ancora configurato preferenze (prima apertura), il sistema applica la seguente strategia a cascata:
- Preferenza per tipo specifico (es.
...__RIC) → se esiste la usa. - Altrimenti preferenza user+ws generica → fallback ragionevole.
- Altrimenti default di sistema (tutte colonne visibili, ordine tab standard).
Al primo salvataggio dopo aver modificato la configurazione su un tipo specifico, la nuova preferenza viene scritta con la chiave per-tipo, senza toccare il fallback generico.
Trigger di ricarica preferenze
Le preferenze per-tipo vengono ricaricate automaticamente in 2 momenti:
- Quando l'utente apre un documento esistente (il tipo è letto dal DB e applicato)
- Quando l'utente cambia il tipo documento nella select in alto al form (metodo
onTipoDocumentoChange)
Migrazione soft delle preferenze esistenti
Al primo accesso dopo l'aggiornamento, la vecchia chiave non-scoped viene letta come fallback e automaticamente copiata nella nuova chiave user-scoped. Nessuna perdita di configurazione esistente. Le vecchie chiavi restano in localStorage (non vengono rimosse per non causare problemi se l'utente effettua un downgrade).
localStorage del browser: cambiando computer/browser le preferenze restano vuote (primo avvio). Per una sincronizzazione cross-device servirebbe un endpoint backend dedicato (non implementato in questa versione).
File modificati
src/app/auth/auth.service.ts: aggiunto metodo pubblicogetCurrentUser()src/app/pages/documenti/documento.component.ts: rimossa inizializzazione inline di 3 preferenze; aggiunti helperscopedKey(),readScopedLs(),writeScopedLs(); aggiunto metodocaricaPreferenzeVistaUtente()chiamato inngOnInit
Quando l'utente digita nel campo descrizione di una riga documento mentre sta creando una Ricetta, il dropdown dei risultati del catalogo mostra un layout a 4 colonne incolonnate pensato appositamente per la prescrizione medica. Per gli altri tipi documento (Fattura, DDT, ecc.) il dropdown mantiene il layout precedente (codice + descrizione + produttore + posologia inline).
Colonne visualizzate (solo Ricetta)
| Colonna | Campo | Stile |
|---|---|---|
| Descrizione | v.descrizione | Grassetto colore principale |
| Produttore | produttoreOf(v) (cascata: dettaglioFarmaco.produttore → dettaglioArticolo.produttore → marca) | Colore viola |
| Indicazioni terapeutiche | v.indicazioni | Corsivo grigio scuro |
| Note prescrizione | v.notePrescrizione | Colore verde (tipografico) |
Se un campo è vuoto, viene mostrato il placeholder —.
Layout
- Grid CSS a 4 colonne con larghezze proporzionali (descrizione 1.3fr, produttore 0.8fr, indicazioni 1.4fr, note 1.1fr).
- Header sticky in cima al dropdown con i titoli delle 4 colonne.
- Testi multi-riga: ogni cella può andare a capo su 2 righe (
-webkit-line-clamp: 2), poi ellissi. - Larghezza minima dropdown: 680px per garantire leggibilità delle 4 colonne.
Attivazione
Il layout a 4 colonne si attiva automaticamente quando isRicetta è true (tipo documento con codice RIC). Per gli altri tipi il dropdown usa il layout inline tradizionale.
Dalla sezione superiore del form Documento (intestazione soggetto) l'utente ha adesso un accesso diretto alla scheda di modifica del soggetto selezionato, senza passaggi intermedi.
Tre modi per aprire la scheda
- Click sul nome: il nome del soggetto è cliccabile e apre la modale di modifica.
- Pulsantino «Scheda»: pill navy con icona
assignment_indaccanto al nome — affordance immediata (l'utente riconosce il punto d'ingresso senza esplorare il flusso). - Icona matita: la tradizionale «edit» continua a funzionare (invariata).
Modale di modifica — miglioramenti
- Pulsante «×» nell'header: chiusura dedicata della modale in alto a destra.
- Header non scorre: in modale l'header sticky resta fissato in cima (
top:0) invece di lasciare spazio alla topbar della pagina; i campi non scorrono più sotto l'header. - Autocomplete Luogo di Nascita robusto: la tendina filtrata dei comuni in
position:fixednon viene più clippata dalla modale. Vedi soggetti-u.html §3.
Messaggio errore 409 Conflict leggibile
In precedenza, al salvataggio di un soggetto con codice fiscale già esistente, compariva il messaggio criptico «Http failure response for …: 409 Conflict». Adesso viene mostrato il messaggio parlante restituito dal backend (es. «CF <codice> già assegnato al soggetto <id>»).
È ora possibile assegnare scorciatoie di tastiera a qualsiasi voce del menu, direttamente dalla modale di ricerca globale Ctrl+K. Gli shortcut funzionano ovunque nel gestionale e sono cross-platform: Windows, Linux, macOS.
Come assegnare uno shortcut
- Premere Ctrl+K (ovunque).
- Digitare qualche carattere per trovare la voce menu desiderata.
- Fare click sull'icona tastiera (a destra della voce).
- Premere la lettera (A–Z) da associare e confermare con OK.
- La combinazione è salvata: lasciare vuoto per rimuoverla.
Come usare gli shortcut
- Windows / Linux:
Alt + Shift + <lettera> - macOS:
⌥ + ⇧ + <lettera>(Option + Shift + lettera)
Gli shortcut non si attivano quando l'utente sta scrivendo in un campo di testo (input, textarea, select, contenteditable): in questo modo non interferiscono con la digitazione.
Collisioni e rimozione
- Collisione: se si assegna la stessa lettera a una seconda voce, il sistema chiede conferma prima di sovrascrivere.
- Badge visivo: ogni voce di Ctrl+K con shortcut configurato mostra un badge blu con la combinazione corrente (es. ⌥⇧ D).
- Rimozione: click sull'icona tastiera e inserire stringa vuota.
- Persistenza: le assegnazioni sono salvate nel browser (
localStorage), scoped sulla macchina/browser dell'utente. Un cambio di browser o una pulizia dei dati del sito richiede nuova configurazione.
Quando si restringe manualmente la finestra del browser, i pulsanti del footer del form Documento (Salva/Aggiorna, modello stampa, Stampa, Anteprima, XML SDI, Email, Informativa, Fattura Diretta, Ricette, Spedizione, conversioni, Ricorrente, +30gg) si rimpiccioliscono progressivamente e poi vanno a capo invece di sovrapporsi.
Comportamento per dimensioni finestra
- ≥ 1281 px: layout completo, bottoni a 34 px di altezza.
- ≤ 1280 px: bottoni 32 px, padding e font ridotti, select del modello più compatta.
- ≤ 1024 px: bottoni 30 px, icone 15 px, font 11 px.
- ≤ 820 px: navigazione precedente/successivo a sinistra e gruppo destro su due righe a piena larghezza.
- ≤ 480 px (mobile): pulsanti secondari (Stampa, Anteprima, Email, Informativa, ecc.) nascosti automaticamente, restano i principali (Salva, Ricette).
1.234,00 — allineamento globale
In alcuni runtime/browser i valori monetari del frontend e dei PDF stampati comparivano come
1234,00 (senza punto migliaia). Il formato corretto italiano è 1.234,00:
punto come separatore migliaia, virgola come decimale.
Frontend
Allineate 16 funzioni di formattazione in tutta la suite: dettaglio Agente (Fatturato anno, Provvigioni maturate/liquidate, tabella mensile, tutte le tab), dashboard Contabilità/Magazzino/Spedizioni, archivio e dettaglio SDI, pipeline e archivio CRM, form Documento (riga catalogo) e form Soggetto (Fido massimo).
PDF stampati (backend)
Allineati i seguenti generatori PDF lato server:
- Dichiarazione IVA annuale (quadri VE, VF, VJ, VL).
- Modello Redditi (ricavi, costi, ammortamenti, plus/minus, reddito).
- Report Fatture verso PA (split-payment).
- Certificazione Unica (compensi, ritenute per percipienti).
- Registro beni ammortizzabili (tabella + totali + frase finale).
/noteOltre al pannello postit giallo embedded nelle schede (Documento, Soggetto, Catalogo, Distinta, Ordine produzione), è disponibile una pagina centralizzata per consultare e gestire tutte le note del workspace in un unico posto.
Come accedere
Sidebar → AMMINISTRAZIONE → Note. La voce è visibile a tutti i
ruoli ADMIN+ (la sezione AMMINISTRAZIONE è già gated). Il SUPERADMIN può
nasconderla per workspace specifici dal pannello "Permessi del Ruolo" (chiave note).
Cosa fa
- Tabella ERP-style con badge colorato per ciascuna entità: Documento (blu), Soggetto (verde), Catalogo (giallo), Distinta base (viola), Ordine produzione (rosso), Generica (giallo postit).
- Filtri: ricerca testo libero, entità, autore (username), range date dal-al.
- Tab Cestino visibile solo a ADMIN/SUPERADMIN: lista delle note soft-deletate con bottone "Ripristina".
- Click sulla riga → modale dettaglio con metadati (autore, data, ultimo aggiornamento), testo completo in box giallo postit + chip "Apri record" che porta al documento/soggetto/ordine collegato.
- Modifica e cancella consentite solo a chi ha scritto la nota (o a ADMIN/SUPERADMIN).
- Bottone "+ Nuova nota" apre una modale di creazione con select entità + ID record opzionale. Per note libere senza target lasciare entità "Generica".
Differenza pannello postit vs pagina Note
- Pannello postit (giallo, drag, persistente): comodo durante il lavoro su un singolo record — le note rimangono in vista e non occupano la pagina principale.
- Pagina Note centralizzata: utile per un'overview di tutto il lavoro annotato, ricerca cross-record (es. "tutte le note dove ho scritto consegna prevista"), gestione ADMIN del cestino.
Promozione automatica BOZZA → EMESSO sulla stampa
Cliccando Stampa su un documento ancora in BOZZA, il sistema mostra una conferma:
Il documento è in BOZZA. Vuoi marcarlo come EMESSO prima di stampare? (assegna numero ufficiale e blocca ulteriori modifiche)
- Sì: il documento passa a EMESSO — numero ufficiale assegnato dal sezionale, provvigioni dell'agente maturate server-side, documento entra nel registro IVA e nel ciclo scadenze. La stampa parte subito dopo.
- No: stampa la BOZZA così com'è (utile per anteprime cartacee senza impegnare il numero).
- Se la promozione fallisce per permessi o stato non consentito, la stampa parte comunque.
Multischermo: aprire più pagine in finestre/schede separate
È possibile mantenere aperte più aree dell'applicazione contemporaneamente (es. Documenti aperto e Soggetti in un'altra scheda) usando i modificatori da tastiera mentre si seleziona una voce di menù:
| Combinazione | Effetto |
|---|---|
| Ctrl + click (Windows/Linux) o Cmd + click (Mac) | Apre la voce in una nuova scheda del browser |
| Shift + click | Apre la voce in una nuova finestra del browser |
| Alt + click (Windows/Linux) o Option + click (Mac) | Apre in una nuova scheda (alternativa a Ctrl) |
Funziona su:
- Voci della sidebar sinistra (Documenti, Soggetti, Magazzino, ecc.)
- Voci della modale di ricerca rapida Ctrl+K (tutti i risultati)
- Card della dashboard e link nei report
Selezione DDT per fattura riepilogativa — modale in primo piano + refresh
Quando crei una fattura riepilogativa TD24 dai DDT, si apre una modale "Seleziona DDT da raggruppare nella fattura riepilogativa" sopra la modale del documento. La modale è ora sempre in primo piano rispetto al documento sottostante.
- Bottone "↻ Aggiorna" nell'header per ricaricare la lista DDT senza chiudere la modale (utile se nel frattempo sono stati creati nuovi DDT in un'altra scheda).
- Lista filtrata escludendo i DDT già collegati a una fattura riepilogativa precedente e quelli ANNULLATO.
- Modalità di aggregazione righe: Righe originali per DDT / Aggregate per articolo / Una riga per DDT / Totali per DDT.
"Ultimi clienti" sempre del workspace corrente
Aprendo il selettore Cliente in fase di nuovo documento, la sezione Ultimi clienti mostra le 10 anagrafiche selezionate più di recente. Da questa versione la lista è scoped per workspace: cambiando workspace dalla topbar non vedrai più clienti di altre aziende.
📊 Aggiornamenti
Stati documento — etichette per famiglia
La stessa chiave di stato viene mostrata con label diverse a seconda del tipo di documento, per togliere ambiguità tra "EMESSO" / "CONFERMATO" / "EVASO" / "FATTURATO":
- Preventivo: Bozza → Inviato al cliente → Evaso (→ ordine) → Rifiutato.
- Ordine: Bozza → Confermato → Evaso (→ DDT/fattura) → Annullato.
- DDT: Bozza → Consegnato → Fatturato → Annullato.
- Fattura: Bozza → Emessa (numerata) → Inviata SDI → Pagata → Archiviata.
Il dropdown del cambio stato è ora filtrato per tipo: una fattura non mostra "CONFERMATO", un preventivo non mostra "INVIATO" SDI.
Conversioni guidate — padre auto-evaso
Convertendo un documento (Preventivo→Ordine, Ordine→DDT, DDT→Fattura) il documento padre passa automaticamente a stato EVASO (o FATTURATO per i DDT) e il banner "Cosa vuoi fare adesso?" sparisce. Il figlio è ora collegato al padre tramite il campo documentoPadre: l'icona "documenti collegati" si popola correttamente in entrambe le direzioni.
"Fattura Diretta" da Ricetta — ora in BOZZA
Premendo "Fattura Diretta" da una RIC, la fattura nasce in BOZZA e la ricetta origine resta anch'essa in BOZZA. La numerazione progressiva ufficiale e la promozione a EMESSO avvengono al momento della stampa (prompt automatico "Vuoi marcarlo come EMESSO prima di stampare?"). Toast aggiornato: "Fattura creata in BOZZA (numero definitivo alla stampa)".
"Configura vista modifica" — impostazione del tipo documento
Le preferenze del pannello "Configura Vista" del form documento (colonne righe visibili, ordine tab, vista espansa, template salvati) sono ora associate al tipo documento e condivise con tutti gli utenti del workspace. Esempio: se imposti le colonne preferite per "Ricetta", la stessa configurazione si applica a tutte le ricette future per qualsiasi utente. Hint nel pannello: "Impostazioni del tipo documento — valgono per tutti gli utenti del workspace."
Modale "Sfoglia Catalogo" — allineamento a colonne
Il modale che si apre dal pulsante 📦 Sfoglia catalogo nelle righe documento mostra ora le voci incolonnate con layout fisso: icona | descrizione | posologia | produttore. L'allineamento verticale rimane corretto anche quando alcune voci non hanno indicazioni o produttore.
Banner "Voce non in catalogo"
Quando inserisci una voce nelle righe del documento scrivendo a mano (descrizione + prezzo) senza selezionarla dall'autocomplete catalogo, sopra l'header delle righe appare un banner gold:
- "X voci non sono nel catalogo. Vuoi salvarle con i dati che hai inserito?"
- Bottone "Salva nel catalogo" → conferma con elenco voci → ogni voce viene aggiunta a Catalogo con descrizione, prezzo, IVA, U.M., e la riga del documento viene collegata automaticamente alla nuova voce.
Comportamento contestuale per Ricette (RIC): in una ricetta i prodotti spesso non hanno prezzo, quindi il banner appare anche se il prezzo è 0 o assente. Il tipo di voce di default è scelto in base al profilo attività:
- Studio di Naturopatia / Discipline Olistiche → INTEGRATORE
- Studio Medico (o altri profili sanitari) → FARMACO
- Documenti diversi dalla ricetta → ARTICOLO
Puoi sempre raffinire il tipo (es. da INTEGRATORE → OMEOPATICO/FITOTERAPICO/VITAMINA) dalla scheda Catalogo.
Il banner si nasconde automaticamente sui documenti definitivi (EMESSO, INVIATO, EVASO, FATTURATO, PAGATO, ARCHIVIATO).
Conversione parziale Ordine → DDT
Quando converti un ordine cliente in DDT, ora puoi spedire solo parte della merce ordinata. Click «Converti in DDT»: si apre un dialog con le righe e le quantità pre-impostate al residuo. Per spedire meno togli la spunta su una riga (resta sull'ordine) oppure inserisci nella colonna «Resta in ordine» la quantità che NON spedisci. La colonna verde «Va in DDT» mostra la quantità effettivamente trasferita.
Click «Crea DDT»: l'ordine passa a stato PARZIALE. Può essere riconvertito più volte fino a evasione completa (stato EVASO).
Visualizzazione ordini PARZIALI: banner ambra («X righe ancora da evadere»); per ogni riga già toccata l'input quantità mostra il residuo (sfondo arancio, read-only) e sotto la descrizione la scritta in rosso «Ordinato: 10 e evaso: 6».
Nel dialog di conversione c'è un toggle «Genera back-order per le quantità non spedite» (acceso di default): le quantità non spedite vengono tracciate in Magazzino > Back-Order.
Reso e Nota di Credito (TD04)
Pulsante rosso «Reso / Nota Credito» nel banner azioni di fatture/DDT/parcelle. Dialog con tutte le righe + checkbox «Rendi»: scegli quali rendere e inserisci motivazione obbligatoria. Click «Crea Nota di Credito» → TD04 in BOZZA con totali in negativo, collegata al documento padre.
Acconto TD02 + Saldo
Pulsante ambra «Emetti Acconto» nel banner azioni di preventivi e ordini. Dialog con tab Percentuale (10/20/30/50/70 con un click) o Importo libero; IVA pre-popolata e modificabile. Crea TD02 in BOZZA con riga «Acconto X% su PRV ###/anno». Quando emetti la fattura finale TD01 puoi legare gli acconti già emessi e l'importo viene detratto.
Fatturazione differita TD24
Voce sidebar Vendite > Fattura Differita TD24: pagina dedicata per raggruppare in un'unica fattura mensile più DDT dello stesso cliente. Cerchi il cliente, imposti data limite (default fine mese), vedi i DDT non fatturati già pre-selezionati, deselezioni eventuali esclusi e generi la TD24. I DDT inclusi vengono marcati come fatturati.
Le fatture devono essere trasmesse al Sistema di Interscambio entro 12 giorni dalla data documento (Art. 21 DPR 633/72). Sanzione: 90% IVA, minimo 500 € (riducibile a 250 € con ravvedimento).
NOX ti avvisa in 3 punti:
- Dashboard: banner rosso critico nelle notifiche se ci sono fatture fuori termine; cliccando si va in /sdi filtrato.
- Pagina /sdi: banner riepilogo in cima a 3 livelli (rosso scaduti, arancione ≤2gg, giallo ≤5gg).
- Righe tabella: badge inline pulsante con giorni rimanenti/ritardo per ogni fattura DA_INVIARE.
Soglie: 🚨 SCADUTO (> 12gg) · ⚠️ Imminente (≤ 2gg) · ⏳ Attenzione (≤ 5gg).