“AN26000001” dice più di “S00001”: è un preventivo, risale al 2026 ed è il primo. Molte aziende, soprattutto quelle che passano a Odoo da un sistema più vecchio, vogliono mantenere i propri numeri di documento proprio così. Odoo stesso numera preventivi, ordini e bolle di consegna con sequenze proprie (S00001, WH/OUT/00001, P00001) e le fatture con il prefisso del registro e l’anno (INV/2026/00001).
Per questo abbiamo scritto il modulo Document Numbering by Prefix and Year (document_number_prefix_year) per Odoo 19. È disponibile su GitHub come software libero con licenza LGPL-3:
github.com/Alex0176/odoo-document-number-prefix-year
Una premessa sincera: noi non utilizziamo il modulo presso Biricon IT Services. Lo pubblichiamo perché è pronto, documentato e dotato di test e può far risparmiare lavoro ad altri. Chi lo utilizza dovrebbe leggere le sezioni sui limiti e Test .
Lo schema di numerazione
Ogni numero è composto da tre parti: un prefisso per tipo di documento, l’anno e un contatore con un numero fisso di cifre. Il prefisso, il formato dell’anno (26 oppure 2026) e il numero di cifre si impostano per ciascuna azienda in Impostazioni → Numerazione dei documenti.
Vengono gestiti preventivi, ordini cliente, fatture e note di credito cliente, bolle di consegna, entrate merci e ordini d’acquisto. I prefissi nella figura sono solo esempi: AN, AU, RE, GU, LI, WE, BE. Se si lascia vuoto un prefisso, per quel tipo di documento resta la numerazione standard di Odoo. Il modulo quindi non fa nulla finché non lo si configura.
Come si comportano i numeri
- Ogni anno da capo. Il contatore riparte da 1 con il cambio d’anno.
- Prosecuzione dopo i numeri importati. Il modulo cerca il numero più alto esistente con lo stesso prefisso e anno, indipendentemente dalla sua lunghezza. Se nel database c’è
AN26119dal sistema precedente, il preventivo successivo saràAN26000120. È il motivo per cui il modulo è adatto ai passaggi da altri sistemi: i documenti precedenti vengono importati con i loro numeri originali e i nuovi documenti si collegano senza soluzione di continuità. - Nuovo numero d’ordine alla conferma. A richiesta, un preventivo confermato riceve un numero dalla sequenza degli ordini. Il numero di preventivo resta nel campo Numero di preventivo dell’ordine ed è visibile in modulo, elenco e ricerca.
- Fatture alla registrazione. Fatture e note di credito cliente ricevono il numero solo al momento della registrazione, non alla creazione. Le bozze cancellate non lasciano quindi alcun buco. L’anno deriva dalla data della fattura: una fattura del 30.12.2025 registrata il 2.1.2026 si chiama
RE25…. - Tutto il resto resta invariato. Fatture fornitore, pagamenti, registrazioni contabili e ordini di produzione mantengono le sequenze standard di Odoo. I nomi esistenti non vengono mai riscritti, nemmeno se si disattiva di nuovo il modulo.
La parte delicata: due utenti contemporaneamente
Una numerazione propria sembra semplice: cercare il numero più alto e aggiungere uno. Non lo è più non appena due utenti creano un preventivo nello stesso momento. Entrambi leggono “numero più alto = 0”, entrambi assegnano AN26000001. Per le proprie sequenze Odoo usa sequenze del database. In un numero costruito in proprio manca questo meccanismo e, per preventivi e ordini d’acquisto, in Odoo non esiste inoltre alcun controllo di unicità sul nome: due documenti con lo stesso numero vengono semplicemente salvati.
La protezione più ovvia è un blocco. Il modulo acquisisce per ogni azienda, prefisso e anno un blocco del database (PostgreSQL advisory lock) che dura fino alla fine della transazione. Il secondo utente attende che il primo abbia finito. Ma non basta, e lo abbiamo scoperto con una prova su una copia del database di produzione:
Odoo lavora con il livello di isolamento REPEATABLE READ. Lo stato del database che una transazione vede viene congelato alla sua prima interrogazione. L’utente B ha già questo stato prima che A abbia finito. Se B attende poi il blocco e lo ottiene, con il suo vecchio stato legge “numero più alto = 0” e assegna il numero una seconda volta. Il blocco ha regolato l’ordine, ma non ha aggiornato la conoscenza.
La soluzione è una seconda lettura tramite una connessione al database propria e di breve durata, che vede tutte le righe già confermate. Vince il maggiore dei due valori. La prima lettura resta necessaria, perché solo essa conosce i numeri che la stessa transazione ha già assegnato ma non ancora confermato, ad esempio nell’importazione di più documenti in un colpo solo.
Lo abbiamo verificato con due transazioni, in cui la seconda ha dimostrabilmente acquisito il proprio stato prima del commit della prima e poi ha atteso il blocco. Senza la seconda lettura entrambi gli ordini hanno ricevuto lo stesso numero, con essa i numeri 1 e 2.
Importante per inquadrare la cosa: questa prova è una verifica manuale. Non fa parte dei test automatici, perché richiede due vere connessioni al database, che l’ambiente di test di Odoo (una sola transazione per test) non mette a disposizione.
Implementazione tecnica
| Documento | Punto di aggancio |
|---|---|
| Preventivo | sale.order.create, quando il nome è vuoto, / o New |
| Ordine cliente | sale.order.action_confirm, prima della conferma standard |
| Fattura, nota di credito | account.move._set_next_sequence, viene richiamato durante la registrazione |
| Bolla di consegna, entrata merci | stock.picking.create per tipo di operazione |
| Ordine d’acquisto | purchase.order.create |
- Contatore. Il numero più alto viene trovato da un’espressione regolare (
^<Stamm>([0-9]{1,15})$, la radice viene sottoposta a escape) per ciascuna azienda, compresi i nomi senza azienda. - Fatture.
_set_next_sequencescrive il nome e richiama_compute_split_sequence, in modo che la logica di sequenza di Odoo (prefisso, numero, riconoscimento dell’anno per la fattura successiva del registro) resti coerente. - Impostazioni. I campi aziendali
document_number_*vengono rispecchiati inres.config.settings. Le impostazioni rifiutano prefissi con spazi o con una cifra finale. - Traduzione. È inclusa la traduzione tedesca.
Installazione e configurazione
- Collocare la cartella
document_number_prefix_yearnel percorso degli addon. - Aggiornare l’elenco delle app, installare il modulo. Requisiti sono Vendite, Acquisti, Magazzino e Contabilità.
- In Impostazioni → Numerazione dei documenti inserire prefissi, formato dell’anno e numero di cifre.
- Provare prima su una copia. Il numero di un documento non può essere annullato automaticamente in un secondo momento e, per le fatture, al numero sono legati gli obblighi di conservazione e di controllo.
limiti
- I preventivi vengono numerati alla creazione. I preventivi cancellati o annullati lasciano dei buchi. Lo stesso vale per ogni ordine cliente creato da un altro modulo: i carrelli del webshop (
website_sale) sono ordini nello stato Preventivo e consumano un numero ciascuno. Sono senza buchi solo fatture e note di credito, perché vengono numerate alla registrazione. - Non modificare il formato dell’anno durante l’esercizio. Con la radice
AN26il modulo legge unAN2026000001esistente come contatore26000001. Stabilisca il formato prima del primo documento. - Contatore di al massimo 15 cifre. Le sequenze di cifre più lunghe dopo la radice vengono ignorate nella ricerca del numero più alto.
- Nessuna serie separata per registro o magazzino. Il contatore vale per azienda, prefisso e anno. Più registri di vendita condividono il contatore delle fatture.
- I prefissi non devono contenere spazi né terminare con una cifra, altrimenti prefisso, anno e contatore non si possono più separare.
- Vengono gestiti solo i tipi di documento indicati.
Test
Il modulo include dieci test automatici. Verificano:
- preventivo e conferma: numero di preventivo e di ordine, conservazione del numero di preventivo
- prosecuzione dopo un numero importato (
AN26119→AN26000120) - nessuna rinumerazione successiva dei documenti esistenti
- fattura, nota di credito e cambio d’anno in base alla data della fattura
- ordine d’acquisto e bolle di consegna
- prefisso vuoto: resta il numero standard di Odoo
- anno a quattro cifre
- prefisso con caratteri speciali
- più numeri in una transazione
- sequenze di cifre molto lunghe vengono ignorate
Esecuzione:
odoo-bin -d <Testdatenbank> -i document_number_prefix_year --test-enable --test-tags=/document_number_prefix_year --stop-after-init
I test girano con transazioni normali. Il comportamento in caso di creazione simultanea da parte di due utenti non ne fa parte: è stato verificato a mano su una copia del database, come descritto sopra. Chi utilizza il modulo in un sistema con molti utenti contemporanei dovrebbe ripetere questa prova sul proprio database.
Avvertenza legale sul numero di fattura
Ai sensi del § 11 UStG le fatture devono recare un numero progressivo, assegnato una sola volta per identificare la fattura. Il modulo numera le fatture alla registrazione e con un contatore proprio per prefisso e anno, il che è coerente. Se la Sua configurazione concreta (più registri, note di credito con prefisso proprio, cambio d’anno) soddisfi i requisiti, deve chiarirlo con il Suo consulente fiscale. Questo articolo non costituisce consulenza legale.
Domande frequenti
Perché non adattare semplicemente le sequenze di Odoo?
Per le fatture è possibile tramite il prefisso del registro. Per preventivi, ordini, bolle di consegna e ordini d’acquisto, però, non esiste uno schema comune di prefisso, anno e contatore con cambio d’anno, e il contatore non conosce i vecchi numeri importati. È qui che interviene il modulo.
La numerazione esistente viene sovrascritta?
No. Il modulo assegna solo nuovi numeri. I nomi già salvati restano invariati, anche alla disattivazione.
Come lo disattivo?
Svuoti il prefisso del tipo di documento. Allora Odoo lo numera di nuovo da sé. Neanche la disinstallazione modifica i numeri già assegnati.
Lo utilizzate voi stessi?
No. Da noi vengono utilizzati i numeri standard di Odoo. Abbiamo verificato il modulo con i test automatici e con la prova manuale descritta, ma non in un’attività in esercizio con molti utenti.
Funziona con Odoo 17 o 18?
Lo abbiamo testato solo con Odoo 19.0 Community. Per altre versioni può andare bene oppure no: non lo abbiamo verificato.
Con quale licenza è distribuito?
Con la LGPL-3. Errori e miglioramenti sono benvenuti come issue nel repository GitHub .
Supporto da parte di Biricon IT Services
Seguiamo installazioni Odoo per piccole e medie imprese: dall’introduzione alle personalizzazioni e alle migrazioni fino alla gestione operativa. Se desidera mantenere i Suoi numeri di documento durante il passaggio, far verificare l’assegnazione dei numeri sotto carico o portare in sicurezza un modulo come questo nella Sua istanza di produzione, saremo lieti di aiutarLa. Altri sviluppi interni: Firmenbuch e verifica degli indirizzi per clienti austriaci, Set di prodotti nel preventivo come sezione e Web RBL, la blocklist per il traffico di attacco.
Aggiornato al 3 novembre 2026. Versione del modulo 19.0.1.0.0. Tutti i numeri negli esempi e nelle figure sono scelti liberamente.