- BR-23, fatal « An Invoice line (BG-25) shall have an Invoiced quantity unit of measure code (BT-130). » La ligne doit porter une unité.
- BR-CL-23, fatal « Unit code MUST be coded according to the UN/ECE Recommendation 20 with Rec 21 extension » L'unité doit être un code de la liste.
- PEPPOL-EN16931-R130, fatal « Unit code of price base quantity MUST be same as invoiced quantity. » Si le prix s'applique à une quantité de base, son unité est la même que celle de la ligne.
Les deux premières proviennent d'EN 16931 (Schematron validation-1.3.17). La troisième vient de Peppol BIS (3.0.22), et XRechnung l'applique aussi.

D'où Odoo tire le code
Le code qu'Odoo écrit dans le fichier provient d'un endroit différent selon la version :
- Odoo 17, 18 et 19 : une table fait correspondre les unités d'Odoo (par leur identifiant externe) à des codes UN/ECE. Une unité que vous avez créée vous-même n'est pas dans la table et sort en C62, unité.
- Odoo 20 : chaque unité de mesure possède son propre champ de code UN/ECE, et c'est ce code qui va dans le fichier. Odoo le met en majuscules, mais ne le compare pas à la liste.
BR-CL-23 se déclenche lorsque le code du fichier ne figure pas dans la liste. Sur Odoo 20, un code mal saisi sur l'unité de mesure suffit. Sur Odoo 17 à 19, la table donne toujours un code de la liste, donc la règle ne se déclenche que si le code arrive par un autre chemin, comme un module qui le modifie.
Il existe aussi un problème qu'aucune règle ne voit : une unité personnalisée (« palette », « carton de douze ») que Odoo 17 à 19 convertit en C62 sans avertissement. Le fichier passe BR-CL-23, puisque C62 figure dans la liste, mais votre client reçoit « unités » là où vous aviez vendu des cartons.
Pour celui qui reçoit la facture, le code compte : son logiciel le lit pour rapprocher la ligne de sa commande et de sa réception de marchandises. S'il a commandé des cartons et que la facture indique des unités, la quantité ne correspond pas à ce qu'il a reçu, même si le montant est identique, et la facture reste bloquée lors de son contrôle.
Avec notre module XRechnung et ZUGFeRD
Le module embarque sa propre table modifiable d'unités Odoo vers des codes UN/ECE, afin que chacune de vos unités ait son code en BT-130. Une unité absente de cette table sort en C62, comme sur Odoo 17 à 19, et le seul avertissement se trouve dans le journal du serveur, que vous ne voyez pas depuis la facture. Une ligne sans unité sort également en C62.

Sur Odoo 18, 19 et 20, avec l'abonnement FlexigoTech Cloud, chaque XRechnung et chaque ZUGFeRD EN 16931 est validé selon les règles de KoSIT, et un code hors liste apparaît comme BR-CL-23 dans Validation Errors. Sur Odoo 17, la version publiée ne valide pas.
Ce qu'il faut vérifier
- Regardez quelle unité la ligne porte dans le XML (attribut unitCode).
- Sur Odoo 20, ouvrez l'unité de mesure et renseignez son code UN/ECE.
- Sur Odoo 17, 18 et 19, si vous utilisez des unités personnalisées, gardez à l'esprit qu'elles sortent en C62. Avec notre module, sur n'importe quelle version, ajoutez chacune à sa table : celles qui manquent sortent aussi en C62.
- Si le prix s'applique à une quantité de base (par exemple, par cent unités), son unité doit être la même que celle de la ligne.
- Générez à nouveau le fichier et vérifiez l'attribut unitCode de chaque ligne avant de l'envoyer.
À lire aussi
Vérifié dans le code du module (version 17.0 et 20.0) et dans les sources citées
Sources
- github.com/odoo/odoo/blob/6f00fdadb875342de2d14a179f25431f93cd63c9/addons/account_edi_ubl_
- github.com/odoo/odoo/blob/2982b5f44af03fae6a9888f20632c1cc19f623ba/addons/account_edi_ubl_
- github.com/odoo/odoo/blob/4d2d4b5895db70596863df941d9a1f0beeb117f8/addons/account_edi_ubl_
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/account_edi_ubl_
- Code du module : flexigo_germany_xrechnung 20.0 (446f2f68): models/xrechnung_uom_mapping.py
- Code du module : flexigo_germany_xrechnung 20.0 (446f2f68): models/xrechnung_cloud.py
- Code du module : flexigo_germany_xrechnung 17.0 (ad05de8f): __manifest__.py
- github.com/itplr-kosit/xrechnung-schematron/releases/tag/v2.6.0
- github.com/ConnectingEurope/eInvoicing-EN16931/releases/tag/validation-1.3.17
- docs.peppol.eu/poacc/billing/3.0/rules/ubl-peppol/PEPPOL-EN16931-R130/
