«AN26000001» diu més que «S00001»: és un pressupost, és del 2026 i és el primer. Moltes empreses, sobretot les que passen d’un sistema més antic a Odoo, volen conservar els seus números de document exactament així. Odoo numera els pressupostos, les comandes i els albarans amb seqüències pròpies (S00001, WH/OUT/00001, P00001) i les factures amb el prefix del diari i l’any (INV/2026/00001).
Per això hem escrit el mòdul Document Numbering by Prefix and Year (document_number_prefix_year) per a Odoo 19. Està disponible a GitHub com a programari lliure sota la llicència LGPL-3:
github.com/Alex0176/odoo-document-number-prefix-year
Una valoració honesta per endavant: Nosaltres no utilitzem el mòdul a Biricon IT Services. El publiquem perquè està acabat, documentat i amb proves, i pot estalviar feina a altres. Qui l’utilitzi hauria de llegir les seccions sobre els límits i Proves .
L’esquema de numeració
Cada número consta de tres parts: un prefix per tipus de document, l’any i un comptador amb un nombre fix de xifres. El prefix, el format de l’any (26 o 2026) i el nombre de xifres s’estableixen per empresa a Configuració → Numeració de documents.
Es tracten els pressupostos, les comandes de client, les factures de client i els abonaments, els albarans, les recepcions de mercaderies i les comandes de compra. Els prefixos de la il·lustració són només exemples: AN, AU, RE, GU, LI, WE, BE. Qui deixa un prefix buit conserva per a aquest tipus de document la numeració estàndard d’Odoo. Per tant, el mòdul no fa res fins que el configureu.
Com es comporten els números
- Cada any de nou. El comptador torna a començar per 1 amb el canvi d’any.
- Continuar després dels números importats. El mòdul cerca el número més alt existent del mateix prefix i any, sense importar la seva longitud. Si a la base de dades hi ha
AN26119del sistema antic, el pressupost següent seràAN26000120. Aquest és el motiu pel qual el mòdul serveix per a migracions: els documents antics s’importen amb els seus números originals i els documents nous hi enllacen sense discontinuïtat. - Número de comanda nou en confirmar. Un pressupost confirmat rep, si es vol, un número de la seqüència de comandes. El número de pressupost es conserva al camp Número de pressupost de la comanda i és visible al formulari, a la llista i a la cerca.
- Factures en comptabilitzar. Les factures de client i els abonaments reben el seu número només en comptabilitzar-se, no en crear-se. Els esborranys eliminats, per tant, no deixen cap buit. L’any prové de la data de factura: una factura del 30.12.2025 que es comptabilitza el 2.1.2026 es diu
RE25…. - Tota la resta es manté. Les factures de proveïdor, els pagaments, els assentaments comptables i les ordres de fabricació conserven les seqüències estàndard d’Odoo. Els noms existents no es reescriuen mai, ni tan sols si torneu a desactivar el mòdul.
La part delicada: dos usuaris alhora
Una numeració pròpia sembla senzilla: cercar el número més alt i sumar-hi u. Però deixa de ser-ho quan dos usuaris creen un pressupost en el mateix moment. Tots dos llegeixen «número més alt = 0», tots dos assignen AN26000001. Per a les seves pròpies seqüències, Odoo té seqüències de base de dades. En un número fet a casa això manca, i per als pressupostos i les comandes de compra, a Odoo tampoc no hi ha cap comprovació d’unicitat sobre el nom: dos documents amb el mateix número simplement es desen.
La protecció òbvia és un bloqueig. El mòdul pren, per empresa, prefix i any, un bloqueig de la base de dades (PostgreSQL Advisory Lock) que dura fins al final de la transacció. El segon usuari espera fins que el primer ha acabat. Però això no n’hi ha prou, i ho vam descobrir amb un experiment sobre una còpia de la base de dades de producció:
Odoo treballa amb el nivell d’aïllament REPEATABLE READ. L’estat de la base de dades que veu una transacció es congela a la seva primera consulta. L’usuari B ja té aquest estat abans que A hagi acabat. Si B després espera el bloqueig i l’obté, llegeix amb el seu estat antic «número més alt = 0» i assigna el número per segona vegada. El bloqueig ha regulat l’ordre, però no ha actualitzat el coneixement.
La solució és una segona lectura a través d’un accés propi i de vida curta a la base de dades, que veu totes les files ja confirmades. El més gran dels dos valors guanya. La primera lectura continua sent necessària, perquè només ella coneix els números que la mateixa transacció ja ha assignat però encara no ha confirmat, per exemple en importar diversos documents d’una tirada.
Ho vam comprovar amb dues transaccions en què la segona va prendre comprovadament el seu estat abans del commit de la primera i després va esperar el bloqueig. Sense la segona lectura, totes dues comandes van rebre el mateix número; amb ella, els números 1 i 2.
Important per situar-ho: Aquest experiment és una comprovació manual. No forma part de les proves automàtiques, perquè requereix dues connexions reals a la base de dades, que l’entorn de proves d’Odoo (una sola transacció per prova) no proporciona.
Implementació tècnica
| Document | Punt d’enganxament |
|---|---|
| Pressupost | sale.order.create, si el nom és buit, / o New |
| Comanda de client | sale.order.action_confirm, abans de la confirmació estàndard |
| Factura, abonament | account.move._set_next_sequence, es crida en comptabilitzar |
| Albarà, recepció de mercaderies | stock.picking.create segons el tipus d’operació |
| Comanda de compra | purchase.order.create |
- Comptador. El número més alt el troba una expressió regular (
^<arrel>([0-9]{1,15})$, l’arrel s’emmascara) per empresa, incloent-hi els noms sense empresa. - Factures.
_set_next_sequenceescriu el nom i crida_compute_split_sequence, perquè la lògica de seqüències d’Odoo (prefix, número, detecció de l’any per a la factura següent del diari) continuï sent coherent. - Configuració. Els camps d’empresa
document_number_*es reflecteixen ares.config.settings. La configuració rebutja els prefixos amb espais o amb una xifra al final. - Traducció. S’inclou la traducció alemanya.
Instal·lació i configuració
- Col·locar la carpeta
document_number_prefix_yearal camí d’addons. - Actualitzar la llista d’aplicacions i instal·lar el mòdul. Són requisits Vendes, Compres, Inventari i Comptabilitat.
- A Configuració → Numeració de documents, introduir els prefixos, el format de l’any i el nombre de xifres.
- Provar-ho primer en una còpia. El número d’un document no es pot revertir automàticament més endavant i, en les factures, el número comporta l’obligació de conservació i de comprovació.
límits
- Els pressupostos es numeren en crear-se. Els pressupostos eliminats o cancel·lats deixen buits. El mateix val per a cada comanda de client que creï un altre mòdul: els carrets de la compra de la botiga web (
website_sale) són comandes en estat Pressupost i consumeixen un número cadascun. Només les factures i els abonaments no tenen buits, perquè es numeren en comptabilitzar-se. - No canvieu el format de l’any en ple funcionament. Amb l’arrel
AN26, el mòdul llegeix unAN2026000001existent com a comptador26000001. Definiu el format abans del primer document. - Comptador de 15 xifres com a màxim. Les seqüències de xifres més llargues després de l’arrel s’ignoren en cercar el número més alt.
- Cap sèrie separada per diari o magatzem. El comptador val per empresa, prefix i any. Diversos diaris de vendes comparteixen el comptador de factures.
- Els prefixos no poden contenir cap espai ni acabar en una xifra; en cas contrari, ja no es poden separar el prefix, l’any i el comptador.
- Només es tracten els tipus de document esmentats.
Proves
El mòdul inclou deu proves automàtiques. Comproven:
- Pressupost i confirmació: número de pressupost i de comanda, conservació del número de pressupost
- Continuar el recompte després d’un número importat (
AN26119→AN26000120) - cap renumeració posterior dels documents existents
- Factura, abonament i canvi d’any segons la data de factura
- Comanda de compra i albarans
- prefix buit: es conserva el número estàndard d’Odoo
- any de quatre xifres
- Prefix amb caràcters especials
- diversos números en una transacció
- les seqüències de xifres molt llargues s’ignoren
Crida:
odoo-bin -d <Testdatenbank> -i document_number_prefix_year --test-enable --test-tags=/document_number_prefix_year --stop-after-init
Les proves s’executen amb transaccions ordinàries. El comportament en la creació simultània per part de dos usuaris no en forma part; es va comprovar a mà amb una còpia de la base de dades, tal com s’ha descrit més amunt. Qui utilitzi el mòdul en un sistema amb molts usuaris simultanis hauria de repetir aquest experiment a la seva pròpia base de dades.
Avís legal sobre el número de factura
Segons el § 11 UStG, les factures han de portar un número correlatiu assignat de manera única per identificar la factura. El mòdul numera les factures en comptabilitzar-les i amb un comptador propi per prefix i any, cosa que hi encaixa. Si la vostra configuració concreta (diversos diaris, abonaments amb prefix propi, canvi d’any) compleix els requisits del vostre assessor fiscal, ho heu d’aclarir amb ell. Aquest article no constitueix assessorament jurídic.
Preguntes freqüents
Per què no adaptar simplement les seqüències d’Odoo?
Per a les factures això és possible mitjançant el prefix del diari. Però per als pressupostos, les comandes, els albarans i les comandes de compra no hi ha cap esquema comú de prefix, any i comptador amb canvi d’any, i el comptador no coneix números antics importats. Aquí és on actua el mòdul.
Se sobreescriu la numeració existent?
No. El mòdul només assigna números nous. Els noms ja desats romanen sense canvis, també en desactivar-lo.
Com el torno a desactivar?
Buideu el prefix del tipus de document. Aleshores Odoo el torna a numerar pel seu compte. Desinstal·lar-lo tampoc no canvia els números ja assignats.
L’utilitzeu vosaltres?
No. A nosaltres hi funcionen els números estàndard d’Odoo. Hem provat el mòdul amb les proves automàtiques i l’experiment manual descrit, però no en un entorn real amb molts usuaris.
Funciona amb Odoo 17 o 18?
Només l’hem provat amb Odoo 19.0 Community. Per a altres versions pot encaixar o no; no l’hem comprovat.
Sota quina llicència es troba?
Sota la LGPL-3. Els errors i les millores són benvinguts com a issue al repositori de GitHub .
Suport de Biricon IT Services
Gestionem instal·lacions d’Odoo per a petites i mitjanes empreses: des de la implantació, passant per les adaptacions i les migracions, fins a l’explotació contínua. Si voleu conservar els vostres números de document en migrar, fer revisar l’assignació de números sota càrrega o posar amb seguretat un mòdul com aquest a la vostra instància de producció, us ajudarem amb gust. Altres desenvolupaments propis: Firmenbuch i verificació d’adreces per a clients austríacs, Conjunts de productes al pressupost com a secció i Web RBL, la llista de bloqueig per al trànsit d’atac.
Poseu-vos en contacte amb nosaltres
Data: 3 de novembre de 2026. Versió del mòdul 19.0.1.0.0. Tots els números dels exemples i de les il·lustracions són d’elecció lliure.