Aller au contenu principal
EN 16931 · lignes

Erreur UBL-SR-48 : une ligne de facture avec deux taxes ou aucune

Sur la facture électronique européenne, chaque ligne porte une catégorie de TVA, et une seule. Dans Odoo, une ligne peut avoir plusieurs taxes ou aucune, d'où le conflit fréquent : c'est UBL-SR-48 dans le fichier, et Odoo l'arrête avant la génération avec son propre message. BR-CO-04, BR-25 et BR-16 appartiennent au même groupe.

FlexigoTech · Responsable : Víctor Gómez · Mis à jour le 4 novembre 2026

L'essentiel

Versions
Odoo 17, 18, 19 et 20
Vérifié
dans le code du module, version 17.0 et 20.0 · dans les sources citées à la fin
Lecture
3 min

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.
Fiche de la règle UBL-SR-48 d'EN 16931
Une catégorie de TVA par ligne (BT-151), avec BR-CO-04, BR-25 et BR-16.

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 OdooQue faire
Ligne sans taxe, par exemple une dépense refacturéeMets-lui la taxe qui convient, même si elle est à 0 % ou exonérée.
Deux taxes de TVA sur la même ligneN'en garde qu'une : si ce sont deux taux différents, scinde la ligne.
TVA plus une surtaxe ou une retenue sur la ligneVé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.

Facture Odoo 20 avec l'onglet XRechnung / ZUGFeRD du module
Résultat de la validation et Ready to send sur la facture. Capture d'Odoo 20 avec des données de démonstration ; le rapport affiché sur la capture est un rapport de test.

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

  1. Lis le message : il indique s'il s'agit de la taxe ou du nom de la ligne.
  2. Ouvre la facture en brouillon et vérifie la colonne des taxes ligne par ligne.
  3. Corrige, valide et génère de nouveau le fichier.

À lire aussi

Erreurs BR-E-10, BR-AE-10, BR-IC-10 et BR-G-10 : le motif d'exonération de TVABR-E-10, BR-AE-10, BR-IC-10, BR-G-10 et BR-O-10 exigent le motif d'exonération ; BR-S-10 et BR-Z-10 l'interdisent. Odoo 17 à 20 et où le modifier.Erreur BR-CL-23 : l'unité de mesure de la ligne n'est pas un code UN/ECEBR-CL-23 exige des codes UN/ECE pour l'unité de chaque ligne, BR-23 qu'elle existe et PEPPOL-EN16931-R130 qu'elle corresponde au prix. Voici d'où Odoo la tire.Erreur BR-CO-15 sur la facture électronique : le total TTC n'est pas HT plus TVABR-CO-15, BR-CO-14, BR-CO-16 et BR-CO-17 vérifient que les totaux de la facture électronique concordent. Ce que chacune additionne et lesquelles échouent pour un centime.
Vérifié dans le code du module (version 17.0 et 20.0) et dans les sources citées

Sources