XSDHub

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/BGUBLCIISource
BT-109cac:LegalMonetaryTotal → exists(cbc:TaxExclusiveAmount)//ram:SpecifiedTradeSettlementHeaderMonetarySummation → (ram:TaxBasisTotalAmount)BR-13
BT-110Invoice/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-112cac: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>
    

XML erroné complet · XML corrigé complet

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.

Protocole synthétique, groupes et comptage

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.

Sources primaires fixes · EUPL / Apache sources