La règle BR-CO-15 tient en une ligne : le montant total TTC (BT-112) est égal au total HT (BT-109) plus le total de TVA (BT-110). Une évidence comptable. Et pourtant, c'est l'une des causes de rejet les plus fréquentes des flux structurés — parce que l'évidence cache un piège d'implémentation : l'ordre des arrondis.
Le mécanisme de l'échec
Prenez trois lignes à 10,004 € HT, TVA 20 %. Deux stratégies de calcul :
- Arrondir par ligne : 3 × 10,00 = 30,00 HT ; TVA 3 × 2,00 = 6,00 ; TTC 36,00.
- Arrondir en fin de calcul : 30,012 → 30,01 HT ; TVA 6,0024 → 6,00 ; TTC 36,01.
Les deux sont défendables. Mais si votre module de lignes utilise la
première et votre module de totaux la seconde, votre facture affirme
30,01 + 6,00 = 36,00 — et BR-CO-15 la rejette, à raison : le document se
contredit lui-même.
La norme tranche : la TVA se calcule par catégorie et par taux sur la base taxable agrégée (c'est l'objet de la décomposition BG-23, contrôlée par les règles BR-S-08 et sœurs), et les totaux du document doivent boucler avec ces agrégats, au centime.
Les trois variantes du même bug
- Lignes vs en-tête : le cas ci-dessus — deux stratégies d'arrondi dans deux modules.
- Remises et charges de document : une remise globale (BG-20) oubliée dans BT-109 mais répercutée dans BT-112, ou l'inverse.
- Flottants : le calcul en
floatbinaire (0,1 + 0,2 ≠ 0,3) au lieu d'arithmétique décimale. En Python,Decimal; en Java,BigDecimal; en JavaScript, une bibliothèque décimale — jamais le type natif.
S'en débarrasser définitivement
- Une seule fonction de totalisation dans votre code, utilisée par les lignes, la décomposition de TVA et les totaux — pas trois implémentations qui divergent un jour de refactoring.
- De l'arithmétique décimale de bout en bout, l'arrondi (demi-pair ou demi-supérieur, mais choisi et documenté) appliqué à des points définis.
- Un contrôle systématique avant émission : nos règles rejouent exactement les équations de la norme — celles du Schematron officiel du CEN, que notre moteur exécute tel quel — et rendent l'écart au centime près : champ, valeur constatée, valeur attendue.
Le scanner d'essai vous dira en quelques secondes si vos documents bouclent. Et si vous héritez d'un rejet BR-CO-15 d'une plateforme, la fiche du code donne la lecture pas à pas — c'est précisément le genre de code laconique que la réforme va multiplier chez ceux qui découvrent la validation structurée en production.