Technique

BR-CO-17 EN16931 : erreur d'arrondi TVA dans Factur-X, correction ERP

4 min de lecture Par FacturX API

Guide BR-CO-17 : comprendre l'erreur d'arrondi TVA EN16931 dans Factur-X, vérifier BT-116, BT-117, BT-119 et corriger le calcul ERP.

BR-CO-17 est une erreur de cohérence TVA. Elle apparaît quand le montant de TVA déclaré pour une catégorie ne correspond pas au calcul attendu à partir de la base taxable et du taux.

Dans les ERP, la cause est souvent un décalage d’arrondi : calcul ligne par ligne, calcul global, ventilation par catégorie, ou montant ajusté manuellement.

Réponse courte

Pour chaque catégorie TVA, EN16931 attend une cohérence entre :

Business TermSens
BT-116base taxable de la catégorie
BT-117montant TVA de la catégorie
BT-119taux TVA de la catégorie

La logique attendue est :

BT-117 ≈ BT-116 × BT-119 / 100

Si votre ERP calcule la TVA à un autre niveau d’agrégation, vous pouvez produire un écart d’un centime qui déclenche BR-CO-17.

Exemple simple

Base taxable :

<ram:BasisAmount>99.99</ram:BasisAmount>
<ram:CalculatedAmount>20.01</ram:CalculatedAmount>
<ram:RateApplicablePercent>20.00</ram:RateApplicablePercent>

Calcul attendu :

99.99 × 20 / 100 = 19.998 → 20.00

Le XML déclare 20.01. Le validateur peut déclencher BR-CO-17.

Correction :

<ram:BasisAmount>99.99</ram:BasisAmount>
<ram:CalculatedAmount>20.00</ram:CalculatedAmount>
<ram:RateApplicablePercent>20.00</ram:RateApplicablePercent>

Où se trouve l’erreur dans CII

La ventilation TVA se trouve dans ApplicableTradeTax au niveau du règlement.

XPath simplifié :

rsm:CrossIndustryInvoice
  /rsm:SupplyChainTradeTransaction
  /ram:ApplicableHeaderTradeSettlement
  /ram:ApplicableTradeTax

Champs concernés :

<ram:ApplicableTradeTax>
  <ram:CalculatedAmount>20.00</ram:CalculatedAmount>
  <ram:TypeCode>VAT</ram:TypeCode>
  <ram:BasisAmount>99.99</ram:BasisAmount>
  <ram:CategoryCode>S</ram:CategoryCode>
  <ram:RateApplicablePercent>20.00</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>

Les 4 causes les plus fréquentes

1. TVA calculée globalement au lieu d’être ventilée par catégorie

Si une facture contient plusieurs catégories TVA, le total global ne suffit pas. Il faut une ventilation par catégorie avec base, taux et montant TVA cohérents.

Erreur typique :

  • lignes à 20% et lignes exonérées ;
  • une seule base taxable globale ;
  • un seul montant TVA ;
  • catégories mal séparées.

2. Arrondi ligne vs arrondi catégorie

Deux stratégies peuvent produire un écart :

Stratégie A : calculer TVA ligne par ligne puis sommer
Stratégie B : sommer les bases puis calculer la TVA sur la catégorie

Selon les montants, A et B peuvent différer d’un centime. Le XML doit rester cohérent avec la stratégie attendue par les règles appliquées et avec les montants déclarés.

3. Remise document mal rattachée à la catégorie TVA

Une remise au niveau document doit être rattachée à une catégorie TVA. Si elle réduit le total HT mais pas la base taxable de la catégorie, BT-116 devient incohérent avec les lignes.

Cela peut déclencher BR-CO-17, mais aussi BR-S-08 ou les équivalents selon la catégorie.

4. Ajustement manuel du total TVA

Certains ERP autorisent une correction manuelle du total TVA pour coller à une facture historique ou à un arrondi commercial. Cette correction doit aussi être répercutée dans la ventilation, sinon le XML devient contradictoire.

Comment diagnostiquer

Pour chaque catégorie TVA :

  1. Lister les lignes de cette catégorie.
  2. Additionner les bases HT de ces lignes.
  3. Ajouter les charges document de même catégorie.
  4. Soustraire les remises document de même catégorie.
  5. Comparer au BT-116.
  6. Calculer BT-116 × BT-119 / 100.
  7. Comparer au BT-117.

Table de debug :

CatégorieBase attendueBase XMLTauxTVA attendueTVA XML
S 20%99.9999.9920.0020.0020.01
E 0%40.0040.000.000.000.00

Dans cet exemple, l’erreur est sur le montant TVA de la catégorie S.

Correction côté ERP

La correction durable se fait dans le moteur de calcul ou le mapping XML.

Pseudo-code :

type VatBucket = {
  category: string
  rate: number
  taxableBase: Decimal
}

function computeVatAmount(bucket: VatBucket): Decimal {
  return bucket.taxableBase
    .mul(bucket.rate)
    .div(100)
    .toDecimalPlaces(2)
}

Puis le XML doit reprendre exactement ces valeurs :

const vatAmount = computeVatAmount(bucket)

writeCiiApplicableTradeTax({
  basisAmount: bucket.taxableBase,
  calculatedAmount: vatAmount,
  categoryCode: bucket.category,
  rateApplicablePercent: bucket.rate,
})

Ne calculez pas CalculatedAmount à partir d’un total global si BasisAmount vient d’une ventilation différente.

Peut-on réparer automatiquement ?

Par prudence, BR-CO-17 est rarement une bonne correction automatique sans contexte. Changer un montant TVA change une valeur financière.

Un moteur peut proposer :

  • le montant attendu ;
  • la catégorie concernée ;
  • l’écart ;
  • les lignes impliquées si elles sont lisibles ;
  • une suggestion de correction.

Mais l’application automatique doit être réservée à des cas où votre système source confirme la stratégie d’arrondi.

Erreurs liées

Continuer la lecture

Étape suivante recommandée

Vous voulez retrouver la catégorie TVA qui déclenche BR-CO-17 ?

Voici ce que vous allez obtenir :

  • Montants de base et TVA extraits
  • Catégorie TVA concernée
  • Écart d'arrondi visible
  • Lien vers les erreurs BR-CO liées