Aller au contenu principal
EN 16931 · catégories de TVA

Erreurs BR-E-10, BR-AE-10, BR-IC-10 et BR-G-10 : le motif d'exonération de TVA

Chaque ventilation de TVA d'une facture électronique porte une catégorie : S pour le taux normal, E pour exonéré, AE pour autoliquidation, K pour livraison intracommunautaire, G pour exportation, O pour hors champ, Z pour taux zéro. Cinq de ces catégories exigent d'indiquer pourquoi il n'y a pas de TVA, et deux l'interdisent. C'est la règle numéro 10 de chaque famille, et elle échoue lorsque la catégorie ne correspond pas à la taxe Odoo.

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
5 min

Les sept règles, avec le texte du Schematron EN 16931 (validation-1.3.17). Toutes sont fatales :

RègleCatégorieTexte
BR-E-10E, exonéréA VAT breakdown (BG-23) with VAT Category code (BT-118) "Exempt from VAT" shall have a VAT exemption reason code (BT-121) or a VAT exemption reason text (BT-120).
BR-AE-10AE, autoliquidationA VAT breakdown (BG-23) with VAT Category code (BT-118) "Reverse charge" shall have a VAT exemption reason code (BT-121), meaning "Reverse charge" or the VAT exemption reason text (BT-120) "Reverse charge" (or the equivalent standard text in another language).
BR-IC-10K, intracommunautaireA VAT breakdown (BG-23) with the VAT Category code (BT-118) "Intra-community supply" shall have a VAT exemption reason code (BT-121), meaning "Intra-community supply" or the VAT exemption reason text (BT-120) "Intra-community supply" (or the equivalent standard text in another language).
BR-G-10G, exportationA VAT breakdown (BG-23) with the VAT Category code (BT-118) "Export outside the EU" shall have a VAT exemption reason code (BT-121), meaning "Export outside the EU" or the VAT exemption reason text (BT-120) "Export outside the EU" (or the equivalent standard text in another language).
BR-O-10O, hors champA VAT breakdown (BG-23) with VAT Category code (BT-118) " Not subject to VAT" shall have a VAT exemption reason code (BT-121), meaning " Not subject to VAT" or a VAT exemption reason text (BT-120) " Not subject to VAT" (or the equivalent standard text in another language).
BR-S-10S, normalA VAT breakdown (BG-23) with VAT Category code (BT-118) "Standard rate" shall not have a VAT exemption reason code (BT-121) or VAT exemption reason text (BT-120).
BR-Z-10Z, taux zéroA VAT breakdown (BG-23) with VAT Category code (BT-118) "Zero rated" shall not have a VAT exemption reason code (BT-121) or VAT exemption reason text (BT-120).

Le motif peut être donné sous forme de code (BT-121, issu de la liste VATEX) ou de texte (BT-120). Pour E, l'un ou l'autre suffit ; pour AE, K, G et O, le code ou le texte doit signifier exactement cela : « Reverse charge », « Intra-community supply »… Les autres règles de chaque famille (BR-E-08, BR-AE-08 et suivantes) portent sur les montants ; ici, seul le motif est concerné.

Fiche des règles de motif d'exonération d'EN 16931
Cinq catégories exigent un motif (E, AE, K, G, O) et deux l'interdisent (S, Z).

Comment Odoo détermine la catégorie

C'est ici que les versions divergent :

  • Odoo 17 et 18 : par défaut, la taxe n'a pas de champ de catégorie et Odoo la déduit : pour un client espagnol dont le code postal commence par 35 ou 38 (îles Canaries), L, et par 51 ou 52 (Ceuta et Melilla), M ; E si la taxe est à 0 % et que vendeur et client sont dans le même pays ; AE pour l'autoliquidation d'un co-contractant belge ou pour l'autofacturation avec une taxe d'autoliquidation ; avec le numéro de TVA du vendeur et une taxe à 0 %, K si les deux sont dans l'EEE et G si un seul l'est ; sinon, S si la taxe a un taux et E si elle est à 0 %. Le module standard account_edi_ubl_cii_tax_extension (Tax extension for UBL/CII), qui ne s'installe pas automatiquement, ajoute à la taxe Tax Category Code et Tax Exemption Reason Code : une fois la catégorie renseignée, Odoo l'utilise au lieu de la déduire.
  • Odoo 19 : chaque taxe dispose de Tax Category Code (AE, E, S, Z, G, O, K, L, M, B) et de Tax Exemption Reason Code, avec la liste VATEX.
  • Odoo 20 : les mêmes deux champs et, en plus, Tax Exemption Reason, un texte libre.
  • Dans les quatre versions : si une catégorie E se retrouve sans motif, Odoo écrit le texte « Exempt from tax », qui respecte BR-E-10.

Le piège habituel d'Odoo 17 et 18 sans ce module est une taxe à 0 % pour une prestation hors champ de la TVA, que la déduction ne marque jamais O, ou une vente nationale en autoliquidation : la catégorie obtenue diffère de celle qu'attend votre expert-comptable.

Avec notre module XRechnung et ZUGFeRD

Le générateur du module publié ne connaît que deux catégories, S et Z. En XRechnung UBL, il écrit S lorsque la taxe a un pourcentage et Z lorsqu'elle est à 0 %. En XRechnung CII, son format par défaut, chaque ligne sort en S, y compris avec une taxe à 0 %, et le validateur de KoSIT la rejette avec BR-S-05 (nous l'avons vérifié). Une facture en autoliquidation, intracommunautaire, d'exportation ou exonérée ne sort ni avec AE, ni K, ni G, ni E. Sous Odoo 18, 19 et 20, avec l'abonnement FlexigoTech Cloud, le module valide le résultat avec les règles de KoSIT et laisse toute règle en échec sous Validation Errors. Pour ces factures, aujourd'hui, c'est l'export natif d'Odoo qui connaît les catégories. Sous Odoo 17, la version publiée ne valide pas.

Journal d'audit du module XRechnung dans Odoo 20
Envois avec leur format et le résultat de la validation, dont un en échec. Capture d'Odoo 20 avec des données de démonstration ; les résultats sont des tests.

Comment le corriger

  1. Repérez la catégorie dans la ventilation de TVA du XML (BT-118) et comparez-la à l'opération réelle.
  2. Sous Odoo 19 et 20, ouvrez la taxe et renseignez son Tax Category Code et, si c'est E, AE, K, G ou O, son Tax Exemption Reason Code.
  3. Sous Odoo 17 et 18, installez account_edi_ubl_cii_tax_extension et renseignez sur chaque taxe sa catégorie et, si cette catégorie l'exige, son motif. Sans ce module, vérifiez le pays du client, son code postal, son numéro de TVA et la position fiscale : ce sont les données à partir desquelles Odoo déduit la catégorie.
  4. Un motif d'exonération sur une ligne au taux normal provoque BR-S-10 : retirez-le de la taxe.
  5. Générez de nouveau le fichier.

À lire aussi

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.Erreur BR-CO-09 : le numéro de TVA du vendeur ou du client n'a pas de préfixe paysBR-CO-09 rejette un numéro de TVA sans préfixe pays ; BR-CO-26, BR-S-02, BR-AE-02 et BR-IC-02 exigent celui du vendeur ou du client. Message Odoo et correction.Erreur UBL-SR-48 : une ligne de facture avec deux taxes ou aucuneUBL-SR-48 et BR-CO-04 exigent une catégorie de TVA, et une seule, sur chaque ligne de la facture électronique. Le message d'Odoo 17, 18, 19 et 20, avec BR-25 et BR-16.
Vérifié dans le code du module (version 17.0 et 20.0) et dans les sources citées

Sources