«AN26000001» dice más que «S00001»: es un presupuesto, corresponde a 2026 y es el primero. Muchas empresas, especialmente las que migran a Odoo desde un sistema antiguo, quieren conservar exactamente ese formato de numeración de documentos. Odoo numera los presupuestos, los pedidos y los albaranes con sus propias secuencias (S00001, WH/OUT/00001, P00001), y las facturas con el prefijo del diario y el año (INV/2026/00001).
Para ello hemos desarrollado el módulo Document Numbering by Prefix and Year (document_number_prefix_year) para Odoo 19. Está disponible en GitHub como software libre bajo la licencia LGPL-3:
github.com/Alex0176/odoo-document-number-prefix-year
Una valoración honesta de entrada: en Biricon IT Services no utilizamos el módulo. Lo publicamos porque está terminado, documentado y dotado de pruebas, y puede ahorrar trabajo a otros. Quien lo utilice debería leer las secciones sobre Limitaciones y Pruebas .
El esquema de numeración
Cada número consta de tres partes: un prefijo por tipo de documento, el año y un contador con un número fijo de dígitos. El prefijo, el formato del año (26 o 2026) y el número de dígitos se configuran para cada empresa en Ajustes → Numeración de documentos.
Se incluyen presupuestos, pedidos de venta, facturas de cliente y facturas rectificativas, albaranes, recepciones de mercancías y pedidos de compra. Los prefijos de la imagen son solo ejemplos: AN, AU, RE, GU, LI, WE, BE. Si deja un prefijo vacío, se mantiene la numeración estándar de Odoo para ese tipo de documento. Por tanto, el módulo no hace nada hasta que se configura.
Cómo funciona la numeración
- Reinicio cada año. El contador vuelve a empezar en 1 al cambiar de año.
- Continuación a partir de los números importados. El módulo busca el número más alto existente con el mismo prefijo y año, independientemente de su longitud. Si la base de datos contiene
AN26119, importado del sistema antiguo, el siguiente presupuesto seráAN26000120. Por eso el módulo resulta útil en las migraciones: los documentos antiguos se importan con sus números originales y los nuevos continúan la numeración sin interrupciones. - Nuevo número de pedido al confirmar. Si se configura esta opción, al confirmar un presupuesto se le asigna un número de la secuencia de pedidos. El número del presupuesto se conserva en el campo Número de presupuesto del pedido y está visible en el formulario, la lista y la búsqueda.
- Facturas al contabilizar. Las facturas y las notas de crédito de clientes reciben su número solo al contabilizarse, no al crearse. Por eso, los borradores eliminados no dejan ningún hueco. El año procede de la fecha de factura: una factura del 30.12.2025 que se contabiliza el 2.1.2026 se llama
RE25…. - El resto se mantiene. Las facturas de proveedor, los pagos, los asientos contables y las órdenes de fabricación conservan las secuencias estándar de Odoo. Los nombres existentes nunca se modifican, ni siquiera si se desactiva el módulo.
La parte delicada: dos usuarios al mismo tiempo
Asignar números mediante un sistema propio parece sencillo: buscar el número más alto y sumarle uno. Deja de serlo cuando dos usuarios crean un presupuesto al mismo tiempo. Ambos leen «número más alto = 0» y ambos asignan AN26000001. Para sus propias secuencias, Odoo utiliza secuencias de base de datos. Una numeración personalizada no dispone de ese mecanismo y, además, Odoo no comprueba que el nombre sea único en los presupuestos ni en los pedidos de compra: simplemente guarda dos documentos con el mismo número.
La protección más evidente es un bloqueo. El módulo establece un bloqueo de base de datos (PostgreSQL Advisory Lock) por empresa, prefijo y año, que se mantiene hasta el final de la transacción. El segundo usuario espera a que termine el primero. Pero eso no basta, como descubrimos al hacer una prueba con una copia de la base de datos de producción:
Odoo trabaja con el nivel de aislamiento REPEATABLE READ. La vista de la base de datos que utiliza una transacción queda fijada en su primera consulta. El usuario B ya dispone de esa vista antes de que termine A. Si después B espera a que se libere el bloqueo y lo obtiene, sigue leyendo «número más alto = 0» en su vista antigua y asigna el mismo número por segunda vez. El bloqueo ha ordenado los accesos, pero no ha actualizado la información disponible.
La solución consiste en una segunda lectura mediante una conexión independiente y de corta duración a la base de datos, que permite ver todas las filas ya confirmadas. Se toma el mayor de los dos valores. La primera lectura sigue siendo necesaria, porque es la única que conoce los números que la propia transacción ya ha asignado pero todavía no ha confirmado, por ejemplo, al importar varios documentos de una vez.
Lo comprobamos con dos transacciones, verificando que la segunda había obtenido su vista antes de la confirmación de la primera y que después había esperado al bloqueo. Sin la segunda lectura, ambos pedidos recibían el mismo número; con ella, recibían los números 1 y 2.
Una precisión importante: Esta comprobación es manual. No forma parte de las pruebas automatizadas, porque requiere dos conexiones reales a la base de datos, algo que el entorno de pruebas de Odoo no ofrece, ya que utiliza una única transacción por prueba.
Implementación técnica
| Documento | Punto de integración |
|---|---|
| Presupuesto | sale.order.create, cuando el nombre está vacío o es / o New |
| Pedido de venta | sale.order.action_confirm, antes de la confirmación estándar |
| Factura, factura rectificativa | account.move._set_next_sequence, se invoca al contabilizar |
| Albarán, recepción de mercancías | stock.picking.create, según el tipo de operación |
| Pedido de compra | purchase.order.create |
- Contador. El número más alto se localiza mediante una expresión regular (
^<Stamm>([0-9]{1,15})$, escapando la parte fija) para cada empresa, incluidos los nombres sin empresa asignada. - Facturas.
_set_next_sequenceestablece el nombre e invoca_compute_split_sequencepara mantener la coherencia de la lógica de secuencias de Odoo (prefijo, número e identificación del año para la siguiente factura del diario). - Ajustes. Los campos de empresa
document_number_*se reflejan enres.config.settings. La configuración rechaza los prefijos que contienen espacios o terminan en un dígito. - Traducción. Incluye traducción al alemán.
Instalación y configuración
- Coloque la carpeta
document_number_prefix_yearen la ruta de complementos. - Actualice la lista de aplicaciones e instale el módulo. Se requieren Ventas, Compra, Inventario y Contabilidad.
- Introduzca los prefijos, el formato del año y el número de dígitos en Ajustes → Numeración de documentos.
- Pruébelo primero en una copia. El número de un documento no puede restablecerse automáticamente después y, en las facturas, está vinculado a las obligaciones de conservación y comprobación.
Limitaciones
- Los presupuestos se numeran al crearlos. Los presupuestos eliminados o cancelados dejan saltos en la numeración. Lo mismo ocurre con cualquier pedido de venta creado por otro módulo: los carritos de la tienda en línea (
website_sale) son pedidos en estado Presupuesto y consumen un número cada uno. Solo las facturas y las facturas rectificativas tienen una numeración sin saltos, porque se numeran al contabilizarlas. - No cambie el formato del año con el sistema en uso. Con la parte fija
AN26, el módulo interpreta un número existenteAN2026000001como el contador26000001. Defina el formato antes de crear el primer documento. - Contador de un máximo de 15 dígitos. Las secuencias de dígitos más largas que siguen a la parte fija se ignoran al buscar el número más alto.
- Sin series independientes por diario o almacén. El contador se aplica por empresa, prefijo y año. Varios diarios de ventas comparten el contador de facturas.
- Los prefijos no pueden contener espacios ni terminar en un dígito, ya que eso impediría distinguir el prefijo, el año y el contador.
- Solo se incluyen los tipos de documento indicados.
Pruebas
El módulo incluye diez pruebas automatizadas. Comprueban lo siguiente:
- Presupuesto y confirmación: números de presupuesto y pedido, conservación del número de presupuesto
- Continuación de la numeración a partir de un número importado (
AN26119→AN26000120) - Los documentos existentes no se renumeran
- Factura, factura rectificativa y cambio de año según la fecha de factura
- Pedido de compra y albaranes
- Prefijo vacío: se mantiene el número estándar de Odoo
- Año de cuatro dígitos
- Prefijo con caracteres especiales
- Varios números en una misma transacción
- Se ignoran las secuencias de dígitos muy largas
Comando:
odoo-bin -d <Testdatenbank> -i document_number_prefix_year --test-enable --test-tags=/document_number_prefix_year --stop-after-init
Las pruebas se ejecutan con transacciones normales. No incluyen el comportamiento cuando dos usuarios crean documentos al mismo tiempo; como se ha explicado, este se comprobó manualmente en una copia de la base de datos. Si utiliza el módulo en un sistema con muchos usuarios simultáneos, debería repetir esa prueba con su propia base de datos.
Aviso legal sobre el número de factura
Según el artículo 11 de la UStG, las facturas deben llevar un número correlativo, asignado una sola vez para identificar cada factura. El módulo numera las facturas al contabilizarlas y utiliza un contador propio por prefijo y año, lo que se ajusta a ese criterio. Debe consultar con su asesor fiscal si su configuración concreta (varios diarios, facturas rectificativas con prefijo propio, cambio de año) cumple los requisitos que este le indique. Este artículo no constituye asesoramiento jurídico.
Preguntas frecuentes
¿Por qué no adaptar simplemente las secuencias de Odoo?
En las facturas puede hacerse mediante el prefijo del diario. Sin embargo, para presupuestos, pedidos de venta, albaranes y pedidos de compra no existe un esquema común de prefijo, año y contador que se reinicie cada año, y el contador no tiene en cuenta los números antiguos importados. Ahí es donde interviene el módulo.
¿Se sobrescribe la numeración existente?
No. El módulo solo asigna números nuevos. Los nombres ya guardados permanecen intactos, incluso al desactivarlo.
¿Cómo puedo desactivarlo?
Deje vacío el prefijo del tipo de documento. Odoo volverá a encargarse de su numeración. La desinstalación tampoco modifica los números ya asignados.
¿Lo utilizan ustedes mismos?
No. Nosotros utilizamos la numeración estándar de Odoo. Hemos comprobado el módulo con las pruebas automatizadas y la prueba manual descrita, pero no en un entorno de producción con muchos usuarios.
¿Funciona con Odoo 17 o 18?
Solo lo hemos probado con Odoo 19.0 Community. Puede que funcione con otras versiones o que no; no lo hemos comprobado.
¿Qué licencia tiene?
Se distribuye bajo la licencia LGPL-3. Puede comunicar errores y proponer mejoras abriendo una incidencia en el repositorio de GitHub .
Asistencia de Biricon IT Services
Nos encargamos de instalaciones de Odoo para pequeñas y medianas empresas: desde la implantación hasta el funcionamiento diario, pasando por adaptaciones y migraciones. Si desea conservar sus números de documento al migrar, comprobar la asignación de números bajo carga o incorporar un módulo como este de forma segura a su instancia de producción, estaremos encantados de ayudarle. Otros desarrollos propios: Registro Mercantil y validación de direcciones para clientes de Austria, Conjuntos de productos como sección en el presupuesto y Web RBL, la lista de bloqueo del tráfico malicioso.
Actualizado a 3 de noviembre de 2026. Versión del módulo: 19.0.1.0.0. Todos los números de los ejemplos y las imágenes son ficticios.