BR-CO-15 : Total TTC incohérent
Recalculez le total TTC et arrondissez à deux décimales. Dans cet exemple : 100,00 EUR HT + 21,00 EUR de TVA = 121,00 EUR TTC, et non 121,01 EUR.
Champs : BT-109, BT-110, BT-112.
Conditions sources et champs
UBL en16931 : le contexte /ubl:Invoice | /cn:CreditNote sélectionne les nœuds contrôlés ; la condition porte sur DocumentCurrencyCode, TaxTotal, TaxAmount, LegalMonetaryTotal, TaxInclusiveAmount, TaxExclusiveAmount.
context: /ubl:Invoice | /cn:CreditNote
test: every $Currency in cbc:DocumentCurrencyCode satisfies (count(cac:TaxTotal/xs:decimal(cbc:TaxAmount[@currencyID=$Currency])) eq 1) and (cac:LegalMonetaryTotal/xs:decimal(cbc:TaxInclusiveAmount) = round( (cac:LegalMonetaryTotal/xs:decimal(cbc:TaxExclusiveAmount) + cac:TaxTotal/xs:decimal(cbc:TaxAmount[@currencyID=$Currency])) * 10 * 10) div 100)CII en16931 : le contexte /rsm:CrossIndustryInvoice sélectionne les nœuds contrôlés ; la condition porte sur CrossIndustryInvoice, SupplyChainTradeTransaction, ApplicableHeaderTradeSettlement, InvoiceCurrencyCode, SpecifiedTradeSettlementHeaderMonetarySummation, TaxTotalAmount, GrandTotalAmount, TaxBasisTotalAmount.
context: /rsm:CrossIndustryInvoice
test: every $Currency in /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:InvoiceCurrencyCode satisfies ( ( count(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:TaxTotalAmount[@currencyID = $Currency]) = 1 and xs:decimal((/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:GrandTotalAmount)[1]) = round( ( xs:decimal((/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:TaxBasisTotalAmount)[1]) + xs:decimal((/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:TaxTotalAmount[@currencyID = $Currency])[1]) ) * 100 ) div 100 ) or ( xs:decimal((/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:GrandTotalAmount)[1]) = xs:decimal((/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:TaxBasisTotalAmount)[1]) ) )Les champs sont localisés par contexte source → sélecteur ; les alternatives et conditions de syntaxe restent explicites.
| BT/BG | UBL | CII | Source |
|---|---|---|---|
| BT-109 | cac:LegalMonetaryTotal → exists(cbc:TaxExclusiveAmount) | //ram:SpecifiedTradeSettlementHeaderMonetarySummation → (ram:TaxBasisTotalAmount) | BR-13 |
| BT-110 | Invoice/CreditNote → cac:TaxTotal/cbc:TaxAmount[@currencyID=/*/cbc:DocumentCurrencyCode] | /rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ → ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:TaxTotalAmount[@currencyID=../../ram:InvoiceCurrencyCode] | BR-CO-15 |
| BT-112 | cac:LegalMonetaryTotal → exists(cbc:TaxInclusiveAmount) | //ram:SpecifiedTradeSettlementHeaderMonetarySummation → (ram:GrandTotalAmount) | BR-14 |
Cette condition vient des artefacts européens EN 16931 ; XRechnung ajoute des contraintes nationales et Factur-X dispose de ses propres règles CII par profil.
Exemple contrôlé
La modification value porte directement sur /*/cac:LegalMonetaryTotal/cbc:TaxInclusiveAmount : valeur erronée '121.01', valeur restaurée '121.00'. Le document UBL erroné passe XSD et produit BR-CO-15 ; sa correction passe EN 16931 rules 1.3.16. Autres codes déclenchés : 1.
Gross total shown: 121.01 EUR. Expected: net 100.00 + VAT 21.00 = 121.00 EUR. Difference: 0.01 EUR. Round the result to two decimal places.
Fragment erroné
<cac:LegalMonetaryTotal xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:ubl="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
<cbc:LineExtensionAmount currencyID="EUR">100.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="EUR">100.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">121.01</cbc:TaxInclusiveAmount>
<cbc:PayableAmount currencyID="EUR">121.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
Fragment corrigé
<cac:LegalMonetaryTotal xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:ubl="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
<cbc:LineExtensionAmount currencyID="EUR">100.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="EUR">100.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">121.00</cbc:TaxInclusiveAmount>
<cbc:PayableAmount currencyID="EUR">121.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
Messages communs dans nos mutations
Dans les 1 338 mutations synthétiques enregistrées, BR-CO-15 apparaît dans 34 essais (ubl/en16931 11, ubl/xrechnung 11, cii/xrechnung 12). Les mêmes essais produisent aussi : BR-CO-13: 9; BR-CO-16: 9; BR-CL-04: 6; BR-CO-14: 6; BR-05: 3; BR-13: 3; BR-14: 3; BR-CO-18: 2; BR-S-01: 2; PEPPOL-EN16931-R008: 2; PEPPOL-EN16931-R054: 2; PEPPOL-EN16931-R053: 1.
Champs et règles associés
Diagnostic et emplacement dans le rapport
[BR-CO-15]-Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110).
/*:Invoice[namespace-uri()='urn:oasis:names:specification:ubl:schema:xsd:Invoice-2'][1]Le rapport JSON expose ce message dans errors[] ou warnings[] avec ce code et ce chemin ; l’interface l’affiche dans le rapport des règles métier.