Compte
Français

BR-CO-17: La TVA par catégorie (BT-117) n'est pas égale à la base fois le taux

Règle de base EN 16931 · Erreur · UBL, CII

NormeEN 16931-1 (modèle sémantique européen de la facture électronique)GravitéErreur: la facture est rejetéeSyntaxeUBL, CIITermes métier
  • BT-116 VAT category taxable amount
  • BT-117 VAT category tax amount
  • BT-119 VAT category rate
S'applique àToute facture EN 16931 : Factur-X / ZUGFeRD 2.x (profils EN 16931, EXTENDED, XRECHNUNG), XRechnung, Peppol BIS Billing 3.0 et les CIUS nationales.

Texte officiel de la règle

[BR-CO-17] VAT category tax amount (BT-117) = VAT category taxable amount (BT-116) x (VAT category rate (BT-119) / 100), rounded to two decimals.

Le texte normatif est en anglais ; il est cité tel quel.

Pourquoi cette erreur apparaît

Dans chaque ventilation de la TVA, le montant de taxe (BT-117) doit être égal à la base d'imposition (BT-116) multipliée par le taux (BT-119) et divisée par 100, arrondi à deux décimales ; le schematron tolère un écart inférieur à 1.00 pour tenir compte de l'arrondi par ligne. Si le taux est 0, le montant de taxe doit être 0. La règle lit cac:TaxSubtotal/cbc:TaxAmount, cbc:TaxableAmount et cac:TaxCategory/cbc:Percent (UBL) ou ram:ApplicableTradeTax/ram:CalculatedAmount, ram:BasisAmount et ram:RateApplicablePercent (CII). Elle se déclenche lorsque le pourcentage est écrit sous forme de fraction (0.19), lorsque des catégories à taux différents sont regroupées dans un même sous-total, ou lorsque la base a été modifiée après le calcul de la taxe.

Comment corriger

Formule : BT-117 = round(BT-116 x BT-119 / 100, 2). Écrivez le taux sous forme de pourcentage (19, 7, 0) et non 0.19. Créez un cac:TaxSubtotal (ram:ApplicableTradeTax) par combinaison de code de catégorie et de taux, additionnez les montants nets de ligne ainsi que les remises et majorations de niveau document correspondants dans cbc:TaxableAmount / ram:BasisAmount, et calculez cbc:TaxAmount / ram:CalculatedAmount à partir de cette base. Pour les catégories E, AE, K, G, O et Z, le taux est 0 et le montant de taxe doit être 0.00.

Exemple (valide)

<cac:TaxSubtotal>
  <cbc:TaxableAmount currencyID="EUR">245.90</cbc:TaxableAmount>
  <cbc:TaxAmount currencyID="EUR">46.72</cbc:TaxAmount>
  <cac:TaxCategory><cbc:ID>S</cbc:ID><cbc:Percent>19</cbc:Percent><cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme></cac:TaxCategory>
</cac:TaxSubtotal>

Ce que le validateur vérifie

Élément vérifié (contexte):

UBL

cac:TaxTotal/cac:TaxSubtotal

Test (XPath):

(round(cac:TaxCategory[cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT']/xs:decimal(cbc:Percent)) = 0 and (round(xs:decimal(cbc:TaxAmount)) = 0)) or (round(cac:TaxCategory[cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT']/xs:decimal(cbc:Percent)) != 0 and ((abs(xs:decimal(cbc:TaxAmount)) - 1 < round(abs(xs:decimal(cbc:TaxableAmount)) * (cac:TaxCategory[cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT']/xs:decimal(cbc:Percent) div 100) * 10 * 10) div 100 ) and (abs(xs:decimal(cbc:TaxAmount)) + 1 > round(abs(xs:decimal(cbc:TaxableAmount)) * (cac:TaxCategory[cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT']/xs:decimal(cbc:Percent) div 100) * 10 * 10) div 100 )))  or (not(exists(cac:TaxCategory[cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT']/xs:decimal(cbc:Percent))) and (round(xs:decimal(cbc:TaxAmount)) = 0))

CII

//ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax

Test (XPath):

(round(.[normalize-space(upper-case(ram:TypeCode)) = 'VAT']/xs:decimal(ram:RateApplicablePercent)) = 0 and (round(xs:decimal(ram:CalculatedAmount)) = 0)) or (round(.[normalize-space(upper-case(ram:TypeCode)) = 'VAT']/xs:decimal(ram:RateApplicablePercent)) != 0 and ((abs(xs:decimal(ram:CalculatedAmount)) - 1 <= round(abs(xs:decimal(ram:BasisAmount)) * (.[normalize-space(upper-case(ram:TypeCode)) = 'VAT']/xs:decimal(ram:RateApplicablePercent) div 100) * 10 * 10) div 100 ) and (abs(xs:decimal(ram:CalculatedAmount)) + 1 >= round(abs(xs:decimal(ram:BasisAmount)) * (.[normalize-space(upper-case(ram:TypeCode)) = 'VAT']/xs:decimal(ram:RateApplicablePercent) div 100) * 10 * 10) div 100 ))) or (not(exists(.[normalize-space(upper-case(ram:TypeCode))='VAT']/xs:decimal(ram:RateApplicablePercent))) and (round(xs:decimal(ram:CalculatedAmount)) = 0))

Corriger automatiquement

Cette erreur peut être corrigée automatiquement : après confirmation, le vérificateur recalcule les totaux et la TVA à partir des lignes.

Corriger ma facture →

La même vérification par API:

curl -F file=@invoice.xml https://einvoicechecker.com/v1/validate

Règles liées

Questions fréquentes

Que signifie BR-CO-17 ?

BR-CO-17 est une règle de base en 16931 : VAT category tax amount (BT-117) = VAT category taxable amount (BT-116) x (VAT category rate (BT-119) / 100), rounded to two decimals.

Ma facture sera-t-elle rejetée à cause de BR-CO-17 ?

Oui. BR-CO-17 est classée « bloquante » ; les validateurs (plateformes agréées, points d'accès Peppol, KoSIT, KSeF) rejettent la facture tant qu'elle n'est pas corrigée.

À quels formats s'applique BR-CO-17 ?

Toute facture EN 16931 : Factur-X / ZUGFeRD 2.x (profils EN 16931, EXTENDED, XRECHNUNG), XRechnung, Peppol BIS Billing 3.0 et les CIUS nationales. Syntaxe : UBL et CII.

Source: EN 16931-1:2017 schematron (CEN TC434, via Peppol BIS 3.0.20). Catalogue généré à partir des jeux de règles officiels le 2026-10-15.