Ce que dit chaque règle
Les quatre sont bloquantes dans le Schematron d'EN 16931 (validation-1.3.17) :
- UBL-SR-48
- « Invoice lines shall have one and only one classified tax category. » Une règle de syntaxe UBL : une ligne, une catégorie.
- BR-CO-04
- « Each Invoice line (BG-25) shall be categorized with an Invoiced item VAT category code (BT-151). » L'autre face : aucune ligne sans catégorie.
- BR-25
- « Each Invoice line (BG-25) shall contain the Item name (BT-153). » Chaque ligne avec un nom.
- BR-16
- « An Invoice shall have at least one Invoice line (BG-25) » Au moins une ligne.

Le message d'Odoo
Odoo n'attend pas le validateur. Avant de générer l'UBL, il parcourt les lignes et, si l'une n'a pas exactement une taxe, s'arrête avec : « Each invoice line shall have one and only one tax. » Cela arrive dans les quatre versions, avec une nuance :
- Odoo 17 : il compte les taxes de la ligne en excluant celles à montant fixe, comme les écotaxes ; il doit en rester une.
- Odoo 18, 19 et 20 : il compte les catégories de taxe qui seront écrites sur la ligne du fichier ; il doit y en avoir une.
Dans la même étape, il vérifie BR-25 : une ligne sans produit ni description s'arrête avec « Each invoice line should have a product or a label. »
Les cas qui le déclenchent
| Cas dans Odoo | Que faire |
|---|---|
| Ligne sans taxe, par exemple une dépense refacturée | Mets-lui la taxe qui convient, même si elle est à 0 % ou exonérée. |
| Deux taxes de TVA sur la même ligne | N'en garde qu'une : si ce sont deux taux différents, scinde la ligne. |
| TVA plus une surtaxe ou une retenue sur la ligne | Vérifie si cette seconde taxe doit figurer dans la facture électronique comme taxe ou autrement ; la bonne réponse dépend de ton pays. |
| Ligne de texte sans produit ni description | Écris la description ou transforme-la en note. |
Les sections et notes d'Odoo ne comptent pas comme des lignes, elles ne déclenchent donc pas le message.
Avec notre module XRechnung et ZUGFeRD
Le module génère le XML avec son propre code et ne fait pas le contrôle d'Odoo : une ligne sans taxe ou avec deux arrive dans le fichier telle quelle. Nous l'avons vérifié avec le validateur de KoSIT :
- Ligne sans taxe : elle sort sans catégorie de TVA. En XRechnung UBL cela donne UBL-SR-48, BR-CO-04 et BR-Z-08 ; en XRechnung CII, le format par défaut du module, BR-CO-04, BR-Z-01 et BR-Z-08.
- Ligne avec deux taxes : en UBL, seule la première taxe en pourcentage est écrite, mais le total avec TVA les contient toutes deux, et BR-CO-15 se déclenche. En CII, les deux vont sur la ligne et la TVA totale ne correspond pas à la ventilation, et BR-CO-14 se déclenche.
- Ligne avec une taxe à 0 % : en UBL elle sort en Z et KoSIT l'accepte. En CII elle sort en S, et KoSIT donne BR-S-05, ainsi que BR-Z-01 et BR-Z-08.
Vérifie les taxes de chaque ligne avant de générer.

Sur Odoo 18, 19 et 20, avec l'abonnement FlexigoTech Cloud, chaque XRechnung et chaque ZUGFeRD EN 16931 est validé avec les règles de KoSIT, et les règles en échec restent sous Validation Errors. Sur Odoo 17, la version publiée ne valide pas : ces fichiers sortent sans avertissement.
Étapes
- Lis le message : il indique s'il s'agit de la taxe ou du nom de la ligne.
- Ouvre la facture en brouillon et vérifie la colonne des taxes ligne par ligne.
- Corrige, valide et génère de nouveau le fichier.
À lire aussi
Vérifié dans le code du module (version 17.0 et 20.0) et dans les sources citées
Sources
- Code du module : flexigo_germany_xrechnung 20.0 (446f2f68): lib/generators/ubl_generator.py
- Code du module : flexigo_germany_xrechnung 20.0 (446f2f68): lib/generators/cii_generator.py
- Code du module : flexigo_germany_xrechnung 20.0 (446f2f68): models/res_company.py
- 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_
- 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_cloud.py
- Code du module : flexigo_germany_xrechnung 17.0 (ad05de8f): __manifest__.py
- github.com/ConnectingEurope/eInvoicing-EN16931/releases/tag/validation-1.3.17
