Se rendre au contenu

Numéros de pièces Odoo 19 composés d'un préfixe, de l'année et d'un compteur – module document_number_prefix_year et le piège de la création simultanée

3 novembre 2026 | Odoo 19 Community | Développement interne
3 novembre 2026 par
Numéros de pièces Odoo 19 composés d'un préfixe, de l'année et d'un compteur – module document_number_prefix_year et le piège de la création simultanée

Module Odoo 19 document_number_prefix_year : numéros de pièces composés d'un préfixe, de l'année et d'un compteur

« AN26000001 » en dit plus que « S00001 » : c'est un devis, il date de 2026 et c'est le premier. De nombreuses entreprises, surtout celles qui passent d'un ancien système à Odoo, veulent conserver exactement ainsi leurs numéros de pièces. Odoo numérote lui-même les devis, commandes et bons de livraison avec ses propres séquences (S00001, WH/OUT/00001, P00001) et les factures avec le préfixe du journal et l'année (INV/2026/00001).

Nous avons écrit pour cela le module Document Numbering by Prefix and Year (document_number_prefix_year) pour Odoo 19. Il est disponible sur GitHub, en tant que logiciel libre sous licence LGPL-3 :

github.com/Alex0176/odoo-document-number-prefix-year

Une mise au point honnête au préalable : nous n'utilisons pas ce module chez Biricon IT Services. Nous le publions parce qu'il est terminé, documenté et doté de tests, et qu'il peut faire gagner du travail à d'autres. Quiconque l'utilise devrait lire les sections sur les limites et Tests .

Le schéma de numérotation

Chaque numéro se compose de trois parties : un préfixe par type de pièce, l'année et un compteur d'un nombre fixe de chiffres. Le préfixe, le format de l'année (26 ou 2026) et le nombre de chiffres se règlent par société sous Paramètres → Numérotation des pièces.

Structure du numéro de pièce AN26000001 composé d'un préfixe, de l'année et d'un compteur, avec tableau des types de pièces

Sont traités : les devis, commandes clients, factures clients et avoirs, bons de livraison, réceptions et bons de commande d'achat. Les préfixes de l'illustration ne sont que des exemples : AN, AU, RE, GU, LI, WE, BE. Si vous laissez un préfixe vide, la numérotation standard d'Odoo est conservée pour ce type de pièce. Le module ne fait donc rien tant que vous ne le configurez pas.

Comportement des numéros

  • Nouveau chaque année. Le compteur repart de 1 au changement d'année.
  • Poursuite après les numéros importés. Le module recherche le numéro le plus élevé existant pour le même préfixe et la même année, quelle que soit sa longueur. Si AN26119 provenant de l'ancien système se trouve dans la base de données, le devis suivant sera AN26000120. C'est la raison pour laquelle le module convient aux migrations : les anciennes pièces sont importées avec leurs numéros d'origine, et les nouvelles s'y rattachent sans rupture.
  • Nouveau numéro de commande à la confirmation. Un devis confirmé reçoit, sur demande, un numéro issu de la séquence des commandes. Le numéro de devis est conservé dans le champ Numéro de devis de la commande et est visible dans le formulaire, la liste et la recherche.
  • Factures lors de la comptabilisation. Les factures clients et avoirs ne reçoivent leur numéro qu'à la comptabilisation, pas à la création. Les brouillons supprimés ne laissent donc aucun trou. L'année provient de la date de facture : une facture du 30/12/2025 comptabilisée le 2/1/2026 s'appelle RE25….
  • Tout le reste est conservé. Les factures fournisseurs, paiements, écritures comptables et ordres de fabrication conservent les séquences standard d'Odoo. Les noms existants ne sont jamais réécrits, pas même si vous désactivez à nouveau le module.

Le point délicat : deux utilisateurs en même temps

Une attribution de numéros maison semble simple : chercher le numéro le plus élevé, ajouter un. Ce ne l'est plus dès que deux utilisateurs créent un devis au même instant. Tous deux lisent « numéro le plus élevé = 0 », tous deux attribuent AN26000001. Pour ses propres séquences, Odoo dispose pour cela de séquences de base de données. Pour un numéro construit soi-même, cela fait défaut, et pour les devis et bons de commande d'achat, Odoo n'a en outre aucun contrôle d'unicité sur le nom : deux pièces portant le même numéro sont simplement enregistrées.

La protection la plus évidente est un verrou. Le module prend, par société, préfixe et année, un verrou de la base de données (PostgreSQL Advisory Lock) qui tient jusqu'à la fin de la transaction. Le deuxième utilisateur attend que le premier ait terminé. Mais cela ne suffit pas, et nous l'avons découvert par un essai sur une copie de la base de production :

Déroulement dans le temps de deux utilisateurs : sans seconde lecture, les deux attribuent le même numéro ; avec une seconde lecture, le deuxième obtient le numéro suivant

Odoo travaille avec le niveau d'isolation REPEATABLE READ. L'état de la base de données qu'une transaction voit est figé lors de sa première requête. L'utilisateur B a déjà cet état avant que A ait terminé. Si B attend ensuite le verrou et l'obtient, il lit avec son ancien état « numéro le plus élevé = 0 » et attribue le numéro une seconde fois. Le verrou a réglé l'ordre, mais n'a pas actualisé la connaissance.

La solution est une seconde lecture via un accès à la base de données distinct et éphémère, qui voit toutes les lignes déjà validées. La plus grande des deux valeurs l'emporte. La première lecture reste nécessaire, car elle seule connaît les numéros que la même transaction a déjà attribués mais pas encore validés, par exemple lors de l'importation de plusieurs pièces d'un seul coup.

Nous l'avons vérifié avec deux transactions dont la seconde, de façon démontrée, a pris son état avant le commit de la première, puis a attendu le verrou. Sans la seconde lecture, les deux commandes ont reçu le même numéro ; avec elle, les numéros 1 et 2.

Important pour la mise en perspective : cet essai est une vérification manuelle. Il ne fait pas partie des tests automatiques, car il nécessite deux véritables connexions à la base de données, que l'environnement de test d'Odoo (une seule transaction par test) ne fournit pas.

Mise en œuvre technique

PiècePoint d'accroche
Devissale.order.create, lorsque le nom est vide, / ou New
Commande clientsale.order.action_confirm, avant la confirmation standard
Facture, avoiraccount.move._set_next_sequence, appelée lors de la comptabilisation
Bon de livraison, réceptionstock.picking.create selon le type d'opération
Bon de commande d'achatpurchase.order.create
  • Compteur. Le numéro le plus élevé est trouvé par une expression régulière (^<racine>([0-9]{1,15})$, la racine est échappée) par société, y compris les noms sans société.
  • Factures. _set_next_sequence écrit le nom et appelle _compute_split_sequence, afin que la logique de séquence d'Odoo (préfixe, numéro, détection de l'année pour la prochaine facture du journal) reste cohérente.
  • Paramètres. Les champs de société document_number_* sont reflétés dans res.config.settings. Les paramètres refusent les préfixes comportant des espaces ou un chiffre à la fin.
  • Traduction. Une traduction allemande est incluse.

Installation et configuration

  1. Placer le dossier document_number_prefix_year dans le chemin des addons.
  2. Actualiser la liste des applications, installer le module. Les prérequis sont Ventes, Achats, Stock et Comptabilité.
  3. Sous Paramètres → Numérotation des pièces, saisir les préfixes, le format de l'année et le nombre de chiffres.
  4. D'abord l'essayer sur une copie. Le numéro d'une pièce ne peut pas être annulé automatiquement par la suite, et pour les factures, le numéro est lié à l'obligation de conservation et de contrôle.

limites

Six limites du module : paniers, format de l'année, une série par société, règles de préfixe, peu de tests, uniquement les pièces citées

  • Les devis sont numérotés à la création. Les devis supprimés ou annulés laissent des trous. Il en va de même pour toute commande client créée par un autre module : les paniers de la boutique en ligne (website_sale) sont des commandes au statut Devis et consomment chacun un numéro. Seules les factures et les avoirs sont sans trou, car ils sont numérotés lors de la comptabilisation.
  • Ne pas modifier le format de l'année en cours d'exploitation. Avec la racine AN26, le module lit un AN2026000001 existant comme le compteur 26000001. Définissez le format avant la première pièce.
  • Compteur de 15 chiffres au maximum. Les suites de chiffres plus longues après la racine sont ignorées lors de la recherche du numéro le plus élevé.
  • Pas de séries distinctes par journal ou par entrepôt. Le compteur s'applique par société, préfixe et année. Plusieurs journaux de ventes se partagent le compteur des factures.
  • Les préfixes ne doivent contenir aucun espace ni se terminer par un chiffre, faute de quoi le préfixe, l'année et le compteur ne peuvent plus être séparés.
  • Seuls les types de pièces cités sont traités.

Tests

Le module est livré avec dix tests automatiques. Ils vérifient :

  • Devis et confirmation : numéro de devis et de commande, conservation du numéro de devis
  • Poursuite du comptage après un numéro importé (AN26119 → AN26000120)
  • aucune renumérotation ultérieure des pièces existantes
  • Facture, avoir et changement d'année selon la date de facture
  • Bon de commande d'achat et bons de livraison
  • préfixe vide : le numéro standard d'Odoo est conservé
  • année à quatre chiffres
  • Préfixe avec caractères spéciaux
  • plusieurs numéros dans une transaction
  • les suites de chiffres très longues sont ignorées

Appel :

odoo-bin -d <Testdatenbank> -i document_number_prefix_year --test-enable --test-tags=/document_number_prefix_year --stop-after-init

Les tests s'exécutent avec des transactions ordinaires. Le comportement en cas de création simultanée par deux utilisateurs n'en fait pas partie ; il a été vérifié à la main sur une copie de base de données, comme décrit ci-dessus. Quiconque utilise le module dans un système avec de nombreux utilisateurs simultanés devrait répéter cet essai sur sa propre base de données.

Remarque juridique sur le numéro de facture

Selon le § 11 UStG, les factures doivent porter un numéro séquentiel attribué de façon unique pour identifier la facture. Le module numérote les factures lors de la comptabilisation et avec son propre compteur par préfixe et par année, ce qui correspond. Il vous appartient de clarifier avec votre conseiller fiscal si votre configuration concrète (plusieurs journaux, avoirs avec leur propre préfixe, changement d'année) satisfait à ses exigences. Cet article ne constitue pas un conseil juridique.

Questions fréquentes

Pourquoi ne pas simplement adapter les séquences d'Odoo ?

Pour les factures, c'est possible via le préfixe du journal. Pour les devis, commandes, bons de livraison et bons de commande, il n'existe en revanche aucun schéma commun composé d'un préfixe, d'une année et d'un compteur avec changement d'année, et le compteur ne connaît pas les anciens numéros importés. C'est là que le module intervient.

La numérotation existante est-elle écrasée ?

Non. Le module n'attribue que de nouveaux numéros. Les noms déjà enregistrés restent inchangés, y compris à la désactivation.

Comment le désactiver ?

Videz le préfixe du type de pièce. Odoo la numérote alors de nouveau lui-même. La désinstallation non plus ne modifie aucun numéro attribué.

L'utilisez-vous vous-mêmes ?

Non. Chez nous, les numéros standard d'Odoo sont en service. Nous avons vérifié le module avec les tests automatiques et l'essai manuel décrit, mais pas dans une exploitation réelle avec de nombreux utilisateurs.

Fonctionne-t-il avec Odoo 17 ou 18 ?

Nous ne l'avons testé qu'avec Odoo 19.0 Community. Pour d'autres versions, il peut convenir ou non ; nous ne l'avons pas vérifié.

Sous quelle licence est-il distribué ?

Sous LGPL-3. Les erreurs et améliorations sont les bienvenues sous forme d'issue dans le dépôt GitHub .

Assistance de Biricon IT Services

Nous gérons des installations Odoo pour les petites et moyennes entreprises : de la mise en place aux adaptations et migrations, jusqu'à l'exploitation courante. Si, lors d'une migration, vous souhaitez conserver vos numéros de pièces, faire vérifier l'attribution des numéros sous charge ou installer en toute sécurité un module comme celui-ci dans votre instance de production, nous vous aidons volontiers. Autres développements internes : Firmenbuch et vérification d'adresse pour les clients autrichiens, Ensembles de produits dans le devis sous forme de section et Web RBL, la liste de blocage du trafic d'attaque.

Nous contacter

Situation au 3 novembre 2026. Version du module 19.0.1.0.0. Tous les numéros des exemples et illustrations sont choisis librement.