Ves al contingut

Números de document d’Odoo 19 amb prefix, any i comptador – el mòdul document_number_prefix_year i la trampa de la creació simultània

3 de novembre de 2026 | Odoo 19 Community | Desenvolupament propi
3 de novembre de 2026 per
Números de document d’Odoo 19 amb prefix, any i comptador – el mòdul document_number_prefix_year i la trampa de la creació simultània

Mòdul document_number_prefix_year per a Odoo 19: números de document amb prefix, any i comptador

«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.

Estructura del número de document AN26000001 amb prefix, any i comptador, amb taula dels tipus de document

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 AN26119 del 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ó:

Cronologia de dos usuaris: sense segona lectura, tots dos assignen el mateix número; amb segona lectura, el segon rep el número següent

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

DocumentPunt d’enganxament
Pressupostsale.order.create, si el nom és buit, / o New
Comanda de clientsale.order.action_confirm, abans de la confirmació estàndard
Factura, abonamentaccount.move._set_next_sequence, es crida en comptabilitzar
Albarà, recepció de mercaderiesstock.picking.create segons el tipus d’operació
Comanda de comprapurchase.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_sequence escriu 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 a res.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ó

  1. Col·locar la carpeta document_number_prefix_year al camí d’addons.
  2. Actualitzar la llista d’aplicacions i instal·lar el mòdul. Són requisits Vendes, Compres, Inventari i Comptabilitat.
  3. A Configuració → Numeració de documents, introduir els prefixos, el format de l’any i el nombre de xifres.
  4. 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

Sis límits del mòdul: carrets de la compra, format de l’any, una sèrie per empresa, regles de prefix, poques proves, només els documents esmentats

  • 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 un AN2026000001 existent com a comptador 26000001. 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.