Ir al contenido

Números de documento de Odoo 19 con prefijo, año y contador – módulo document_number_prefix_year y la trampa de la creación simultánea

3 de noviembre de 2026 | Odoo 19 Community | Desarrollo propio
3 de noviembre de 2026 por
Números de documento de Odoo 19 con prefijo, año y contador – módulo document_number_prefix_year y la trampa de la creación simultánea

Módulo document_number_prefix_year para Odoo 19: números de documento con prefijo, año y contador

«AN26000001» dice más que «S00001»: es un presupuesto, es de 2026 y es el primero. Muchas empresas, sobre todo las que migran de un sistema más antiguo a Odoo, quieren conservar sus números de documento exactamente así. Odoo numera los presupuestos, los pedidos y los albaranes con secuencias propias (S00001, WH/OUT/00001, P00001) y las facturas con el prefijo del diario y el año (INV/2026/00001).

Para ello hemos escrito 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 Límites 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 por empresa en Ajustes → Numeración de documentos.

Estructura del número de documento AN26000001 a partir de prefijo, año y contador, con tabla de tipos de documento

Se gestionan presupuestos, pedidos de clientes, facturas y notas de crédito de clientes, albaranes, recepciones de mercancías y pedidos de compra. Los prefijos de la ilustración son solo ejemplos: AN, AU, RE, GU, LI, WE, BE. Quien deje un prefijo vacío conserva para ese tipo de documento la numeración estándar de Odoo. Por lo tanto, el módulo no hace nada hasta que usted lo configure.

Cómo se comportan los números

  • Cada año de nuevo. El contador vuelve a empezar en 1 con el cambio de año.
  • Continuar tras los números importados. El módulo busca el número más alto existente con el mismo prefijo y año, sea cual sea su longitud. Si en la base de datos hay AN26119 del sistema antiguo, el siguiente presupuesto será AN26000120. Esta es la razón por la que el módulo sirve para las migraciones: los documentos antiguos se importan con sus números originales y los nuevos continúan sin interrupción.
  • Nuevo número de pedido al confirmar. Un presupuesto confirmado recibe, si se desea, un número de la secuencia de pedidos. El número de presupuesto se conserva en el campo Número de presupuesto del pedido y es 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….
  • Todo lo demás 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 reescriben, ni siquiera si vuelve a desactivar el módulo.

La parte delicada: dos usuarios a la vez

Una asignación de números propia parece sencilla: buscar el número más alto y sumar uno. No lo es en cuanto dos usuarios crean un presupuesto en el mismo instante. Ambos leen «número más alto = 0», ambos asignan AN26000001. Para sus propias secuencias, Odoo dispone de secuencias de base de datos. En un número construido a mano eso falta y, además, para presupuestos y pedidos de compra Odoo no tiene ninguna comprobación de unicidad sobre el nombre: dos documentos con el mismo número simplemente se guardan.

La protección más obvia es un bloqueo. El módulo toma, por empresa, prefijo y año, un bloqueo de la base de datos (PostgreSQL Advisory Lock) que se mantiene hasta el final de la transacción. El segundo usuario espera hasta que el primero termine. Pero eso no basta, y lo descubrimos mediante una prueba en una copia de la base de datos de producción:

Desarrollo temporal de dos usuarios: sin segunda lectura ambos asignan el mismo número, con segunda lectura el segundo recibe el siguiente número

Odoo trabaja con el nivel de aislamiento REPEATABLE READ. El estado de la base de datos que ve una transacción se congela en su primera consulta. El usuario B ya tiene ese estado antes de que A termine. Si B espera después el bloqueo y lo obtiene, lee con su estado antiguo «número más alto = 0» y asigna el número por segunda vez. El bloqueo ha regulado el orden, pero no ha actualizado el conocimiento.

La solución es una segunda lectura a través de un acceso a la base de datos propio y de corta duración, que ve todas las filas ya confirmadas. Gana el mayor de los dos valores. La primera lectura sigue siendo necesaria, porque solo ella conoce los números que la misma transacción ya ha asignado pero aún no ha confirmado, por ejemplo al importar varios documentos de una vez.

Lo comprobamos con dos transacciones en las que la segunda, de forma demostrable, tomó su estado antes del commit de la primera y después esperó el bloqueo. Sin la segunda lectura, ambos pedidos recibían el mismo número; con ella, los números 1 y 2.

Importante para valorarlo: esta prueba es una comprobación manual. No forma parte de las pruebas automáticas, porque requiere dos conexiones reales a la base de datos, que el entorno de pruebas de Odoo (una única transacción por prueba) no proporciona.

Implementación técnica

DocumentoPunto de enganche
Presupuestosale.order.create, si el nombre está vacío, es / o New
Pedido de clientesale.order.action_confirm, antes de la confirmación estándar
Factura, nota de créditoaccount.move._set_next_sequence, se llama al contabilizar
Albarán, recepción de mercancíasstock.picking.create según el tipo de operación
Pedido de comprapurchase.order.create
  • Contador. El número más alto lo encuentra una expresión regular (^<Stamm>([0-9]{1,15})$, la raíz se escapa) por empresa, incluidos los nombres sin empresa.
  • Facturas. _set_next_sequence escribe el nombre y llama a _compute_split_sequence, para que la lógica de secuencias de Odoo (prefijo, número, detección del año para la siguiente factura del diario) siga siendo coherente.
  • Ajustes. Los campos de empresa document_number_* se reflejan en res.config.settings. Los ajustes rechazan los prefijos con espacios o con un dígito al final.
  • Traducción. Se incluye la traducción al alemán.

Instalación y configuración

  1. Colocar la carpeta document_number_prefix_year en la ruta de addons.
  2. Actualizar la lista de aplicaciones e instalar el módulo. Requisitos: Ventas, Compras, Inventario y Contabilidad.
  3. En Ajustes → Numeración de documentos, introducir prefijos, formato del año y número de dígitos.
  4. Pruébelo primero en una copia. El número de un documento no puede revertirse automáticamente más adelante y, en las facturas, el número está sujeto a obligaciones de conservación y de comprobación.

Límites

Seis límites del módulo: carritos de compra, formato del año, una serie por empresa, reglas de prefijo, pocas pruebas, solo los documentos indicados

  • Los presupuestos se numeran al crearse. Los presupuestos eliminados o cancelados dejan huecos. Lo mismo vale para cada pedido de cliente que cree otro módulo: los carritos de compra de la tienda web (website_sale) son pedidos en estado Presupuesto y consumen un número cada uno. Solo las facturas y las notas de crédito carecen de huecos, porque se numeran al contabilizarse.
  • No cambie el formato del año con el sistema en uso. Con la raíz AN26, el módulo lee un AN2026000001 existente como contador 26000001. Defina el formato antes del primer documento.
  • Contador de 15 dígitos como máximo. Las secuencias de dígitos más largas después de la raíz se ignoran al buscar el número más alto.
  • Sin series separadas 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; de lo contrario, ya no pueden separarse el prefijo, el año y el contador.
  • Solo se gestionan los tipos de documento indicados.

Pruebas

El módulo incluye diez pruebas automáticas. Comprueban:

  • Presupuesto y confirmación: número de presupuesto y de pedido, conservación del número de presupuesto
  • Continuación tras un número importado (AN26119 → AN26000120)
  • ninguna renumeración posterior de documentos existentes
  • Factura, nota de crédito 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 transacción
  • las secuencias de dígitos muy largas se ignoran

Ejecución:

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 ordinarias. El comportamiento ante la creación simultánea por parte de dos usuarios no forma parte de ellas; se comprobó a mano en una copia de la base de datos, como se ha descrito antes. Quien utilice el módulo en un sistema con muchos usuarios simultáneos debería repetir esta prueba en su propia base de datos.

Aviso legal sobre el número de factura

Según el § 11 UStG, las facturas deben llevar un número correlativo que se asigna una sola vez para identificar la factura. El módulo numera las facturas al contabilizarlas y con un contador propio por prefijo y año, lo cual encaja. Si su configuración concreta (varios diarios, notas de crédito con prefijo propio, cambio de año) cumple los requisitos de su asesor fiscal, deberá aclararlo con él. Este artículo no constituye asesoramiento jurídico.

Preguntas frecuentes

¿Por qué no adaptar simplemente las secuencias de Odoo?

Para las facturas es posible mediante el prefijo del diario. Pero para presupuestos, pedidos, albaranes y pedidos de compra no existe un esquema común de prefijo, año y contador con cambio de año, y el contador no conoce los números antiguos importados. Ahí es donde actúa el módulo.

¿Se sobrescribe la numeración existente?

No. El módulo solo asigna números nuevos. Los nombres ya guardados permanecen sin cambios, también al desactivarlo.

¿Cómo lo desactivo de nuevo?

Vacíe el prefijo del tipo de documento. Entonces Odoo vuelve a numerarlo por sí mismo. Tampoco la desinstalación modifica los números ya asignados.

¿Lo utilizan ustedes mismos?

No. En nuestro caso se usan los números estándar de Odoo. Hemos comprobado el módulo con las pruebas automáticas y con la prueba manual descrita, pero no en una explotación real con muchos usuarios.

¿Funciona con Odoo 17 o 18?

Solo lo hemos probado con Odoo 19.0 Community. Para otras versiones puede encajar o no; no lo hemos comprobado.

¿Bajo qué licencia se distribuye?

Bajo la LGPL-3. Los errores y las mejoras son bienvenidos como issue en el repositorio de GitHub .

Asistencia de Biricon IT Services

Gestionamos instalaciones de Odoo para pequeñas y medianas empresas: desde la implantación, pasando por las adaptaciones y las migraciones, hasta la explotación diaria. Si desea conservar sus números de documento al migrar, hacer revisar la asignación de números bajo carga o incorporar con seguridad un módulo como este a su instancia de producción, estaremos encantados de ayudarle. Más desarrollos propios: Registro Mercantil y verificación de direcciones para clientes austriacos, Conjuntos de productos en el presupuesto como sección y Web RBL, la lista de bloqueo para el tráfico de ataque.

Póngase en contacto ahora

Situación a 3 de noviembre de 2026. Versión del módulo 19.0.1.0.0. Todos los números de los ejemplos y de las ilustraciones son de libre elección.