XSDHub

BR-S-08 : Base imposable incohérente

Pour la même catégorie de TVA et le même taux, additionnez les montants nets des lignes et les frais au niveau du document, puis soustrayez les remises au niveau du document. Dans cet exemple : 100,00 + 0,00 − 0,00 = 100,00 EUR, et non 102,00 EUR.

Champs : BT-102, BT-103, BT-116, BT-118, BT-119, BT-131, BT-151, BT-152, BT-92, BT-95, BT-96, BT-99.

Conditions sources et champs

UBL en16931 : le contexte /*/cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory[normalize-space(cbc:ID) = 'S'][cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT'] sélectionne les nœuds contrôlés ; la condition porte sur Percent, InvoiceLine, Item, ClassifiedTaxCategory, ID, AllowanceCharge, TaxCategory, TaxableAmount, LineExtensionAmount, ChargeIndicator.

context: /*/cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory[normalize-space(cbc:ID) = 'S'][cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT']
test: every $rate in xs:decimal(cbc:Percent) satisfies (((exists(//cac:InvoiceLine[cac:Item/cac:ClassifiedTaxCategory/normalize-space(cbc:ID) = 'S'][cac:Item/cac:ClassifiedTaxCategory/xs:decimal(cbc:Percent) =$rate]) or exists(//cac:AllowanceCharge[cac:TaxCategory/normalize-space(cbc:ID)='S'][cac:TaxCategory/xs:decimal(cbc:Percent) = $rate])) and ((../xs:decimal(cbc:TaxableAmount - 1) < (sum(../../../cac:InvoiceLine[cac:Item/cac:ClassifiedTaxCategory/normalize-space(cbc:ID)='S'][cac:Item/cac:ClassifiedTaxCategory/xs:decimal(cbc:Percent) =$rate]/xs:decimal(cbc:LineExtensionAmount)) + sum(../../../cac:AllowanceCharge[cbc:ChargeIndicator=true()][cac:TaxCategory/normalize-space(cbc:ID)='S'][cac:TaxCategory/xs:decimal(cbc:Percent) = $rate]/xs:decimal(cbc:Amount)) - sum(../../../cac:AllowanceCharge[cbc:ChargeIndicator=false()][cac:TaxCategory/normalize-space(cbc:ID)='S'][cac:TaxCategory/xs:decimal(cbc:Percent) = $rate]/xs:decimal(cbc:Amount)))) and (../xs:decimal(cbc:TaxableAmount + 1) > (sum(../../../cac:InvoiceLine[cac:Item/cac:ClassifiedTaxCategory/normalize-space(cbc:ID)='S'][cac:Item/cac:ClassifiedTaxCategory/xs:decimal(cbc:Percent) =$rate]/xs:decimal(cbc:LineExtensionAmount)) + sum(../../../cac:AllowanceCharge[cbc:ChargeIndicator=true()][cac:TaxCategory/normalize-space(cbc:ID)='S'][cac:TaxCategory/xs:decimal(cbc:Percent) = $rate]/xs:decimal(cbc:Amount)) - sum(../../../cac:AllowanceCharge[cbc:ChargeIndicator=false()][cac:TaxCategory/normalize-space(cbc:ID)='S'][cac:TaxCategory/xs:decimal(cbc:Percent) = $rate]/xs:decimal(cbc:Amount)))))) or (exists(//cac:CreditNoteLine[cac:Item/cac:ClassifiedTaxCategory/normalize-space(cbc:ID) = 'S'][cac:Item/cac:ClassifiedTaxCategory/xs:decimal(cbc:Percent) =$rate]) or exists(//cac:AllowanceCharge[cac:TaxCategory/normalize-space(cbc:ID)='S'][cac:TaxCategory/xs:decimal(cbc:Percent) = $rate])) and ((../xs:decimal(cbc:TaxableAmount - 1) < (sum(../../../cac:CreditNoteLine[cac:Item/cac:ClassifiedTaxCategory/normalize-space(cbc:ID)='S'][cac:Item/cac:ClassifiedTaxCategory/xs:decimal(cbc:Percent) =$rate]/xs:decimal(cbc:LineExtensionAmount)) + sum(../../../cac:AllowanceCharge[cbc:ChargeIndicator=true()][cac:TaxCategory/normalize-space(cbc:ID)='S'][cac:TaxCategory/xs:decimal(cbc:Percent) = $rate]/xs:decimal(cbc:Amount)) - sum(../../../cac:AllowanceCharge[cbc:ChargeIndicator=false()][cac:TaxCategory/normalize-space(cbc:ID)='S'][cac:TaxCategory/xs:decimal(cbc:Percent) = $rate]/xs:decimal(cbc:Amount)))) and (../xs:decimal(cbc:TaxableAmount + 1) > (sum(../../../cac:CreditNoteLine[cac:Item/cac:ClassifiedTaxCategory/normalize-space(cbc:ID)='S'][cac:Item/cac:ClassifiedTaxCategory/xs:decimal(cbc:Percent) =$rate]/xs:decimal(cbc:LineExtensionAmount)) + sum(../../../cac:AllowanceCharge[cbc:ChargeIndicator=true()][cac:TaxCategory/normalize-space(cbc:ID)='S'][cac:TaxCategory/xs:decimal(cbc:Percent) = $rate]/xs:decimal(cbc:Amount)) - sum(../../../cac:AllowanceCharge[cbc:ChargeIndicator=false()][cac:TaxCategory/normalize-space(cbc:ID)='S'][cac:TaxCategory/xs:decimal(cbc:Percent) = $rate]/xs:decimal(cbc:Amount))))))

CII en16931 : le contexte //ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax/ram:CategoryCode[.='S'] sélectionne les nœuds contrôlés ; la condition porte sur RateApplicablePercent, BasisAmount, CrossIndustryInvoice, SupplyChainTradeTransaction, IncludedSupplyChainTradeLineItem, SpecifiedLineTradeSettlement, ApplicableTradeTax, CategoryCode, SpecifiedTradeSettlementLineMonetarySummation, LineTotalAmount.

context: //ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax/ram:CategoryCode[.='S']
test: every $rate in ../ram:RateApplicablePercent/xs:decimal(.) satisfies (../ram:BasisAmount = (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement[ram:ApplicableTradeTax/ram:CategoryCode = 'S' and ram:ApplicableTradeTax/xs:decimal(ram:RateApplicablePercent) =$rate]/ram:SpecifiedTradeSettlementLineMonetarySummation/xs:decimal(ram:LineTotalAmount)) * 10 * 10) div 100 + round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true() and ram:CategoryTradeTax/ram:CategoryCode='S' and ram:CategoryTradeTax/xs:decimal(ram:RateApplicablePercent)=$rate]/xs:decimal(ram:ActualAmount[1])) * 10 * 10) div 100 - round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false() and ram:CategoryTradeTax/ram:CategoryCode='S' and ram:CategoryTradeTax/xs:decimal(ram:RateApplicablePercent)=$rate]/xs:decimal(ram:ActualAmount[1])) * 10 * 10) div 100))

CII facturx : le contexte //ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax/ram:CategoryCode[.='S'] sélectionne les nœuds contrôlés ; la condition porte sur RateApplicablePercent, BasisAmount, CrossIndustryInvoice, SupplyChainTradeTransaction, IncludedSupplyChainTradeLineItem, SpecifiedLineTradeSettlement, ApplicableTradeTax, CategoryCode, SpecifiedTradeSettlementLineMonetarySummation, LineTotalAmount.

context: //ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax/ram:CategoryCode[.='S']
test: every $rate in ../ram:RateApplicablePercent/xs:decimal(.) satisfies (../ram:BasisAmount = (round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement[ram:ApplicableTradeTax/ram:CategoryCode = 'S' and ram:ApplicableTradeTax/xs:decimal(ram:RateApplicablePercent) =$rate]/ram:SpecifiedTradeSettlementLineMonetarySummation/xs:decimal(ram:LineTotalAmount)) * 10 * 10) div 100 + round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=true() and ram:CategoryTradeTax/ram:CategoryCode='S' and ram:CategoryTradeTax/xs:decimal(ram:RateApplicablePercent)=$rate]/xs:decimal(ram:ActualAmount)) * 10 * 10) div 100 - round(sum(/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator=false() and ram:CategoryTradeTax/ram:CategoryCode='S' and ram:CategoryTradeTax/xs:decimal(ram:RateApplicablePercent)=$rate]/xs:decimal(ram:ActualAmount)) * 10 * 10) div 100))

Les champs sont localisés par contexte source → sélecteur ; les alternatives et conditions de syntaxe restent explicites.

BT/BGUBLCIISource
BG-23Invoice/CreditNote → cac:TaxTotal/cac:TaxSubtotal/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ → ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTaxBR-S-08
BT-92Invoice/CreditNote → cac:AllowanceCharge[cbc:ChargeIndicator="false"]/cbc:Amount/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ → ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator="false"]/ram:ActualAmountBR-S-08
BT-95Invoice/CreditNote → cac:AllowanceCharge[cbc:ChargeIndicator="false"]/cac:TaxCategory/cbc:ID/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ → ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator="false"]/ram:CategoryTradeTax/ram:CategoryCodeBR-S-08
BT-96Invoice/CreditNote → cac:AllowanceCharge[cbc:ChargeIndicator="false"]/cac:TaxCategory/cbc:Percent/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ → ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator="false"]/ram:CategoryTradeTax/ram:RateApplicablePercentBR-S-08
BT-99Invoice/CreditNote → cac:AllowanceCharge[cbc:ChargeIndicator="true"]/cbc:Amount/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ → ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator="true"]/ram:ActualAmountBR-S-08
BT-102Invoice/CreditNote → cac:AllowanceCharge[cbc:ChargeIndicator="true"]/cac:TaxCategory/cbc:ID/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ → ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator="true"]/ram:CategoryTradeTax/ram:CategoryCodeBR-S-08
BT-103Invoice/CreditNote → cac:AllowanceCharge[cbc:ChargeIndicator="true"]/cac:TaxCategory/cbc:Percent/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ → ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeAllowanceCharge[ram:ChargeIndicator/udt:Indicator="true"]/ram:CategoryTradeTax/ram:RateApplicablePercentBR-S-08
BT-116cac:TaxTotal/cac:TaxSubtotal → exists(cbc:TaxableAmount)//ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax → (ram:BasisAmount)BR-45
BT-118cac:TaxTotal/cac:TaxSubtotal → exists(cac:TaxCategory[cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT']/cbc:ID)//ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax → (.[upper-case(ram:TypeCode) = 'VAT']/ram:CategoryCode)BR-47
BT-119cac:TaxTotal/cac:TaxSubtotal → exists(cac:TaxCategory[cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT']/cbc:Percent) or (cac:TaxCategory[cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT']/normalize-space(cbc:ID)='O')//ram:ApplicableHeaderTradeSettlement/ram:ApplicableTradeTax → (.[upper-case(ram:TypeCode) = 'VAT']/ram:RateApplicablePercent) or (.[upper-case(ram:TypeCode) = 'VAT']/ram:CategoryCode = 'O')BR-48
BT-131cac:InvoiceLine | cac:CreditNoteLine → exists(cbc:LineExtensionAmount)//ram:IncludedSupplyChainTradeLineItem → (ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeSettlementLineMonetarySummation/ram:LineTotalAmount)BR-24
BT-151cac:InvoiceLine | cac:CreditNoteLine → (cac:Item/cac:ClassifiedTaxCategory[cac:TaxScheme/(normalize-space(upper-case(cbc:ID))='VAT')]/cbc:ID)//ram:IncludedSupplyChainTradeLineItem → (ram:SpecifiedLineTradeSettlement/ram:ApplicableTradeTax[upper-case(ram:TypeCode) = 'VAT']/ram:CategoryCode)BR-CO-04
BT-152Invoice/CreditNote → cac:InvoiceLine/cac:Item/cac:ClassifiedTaxCategory/cbc:Percent | cac:CreditNoteLine/cac:Item/cac:ClassifiedTaxCategory/cbc:Percent/rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction/ → ram:IncludedSupplyChainTradeLineItem/ram:SpecifiedLineTradeSettlement/ram:ApplicableTradeTax/ram:RateApplicablePercentBR-S-08

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:TaxTotal/cac:TaxSubtotal[1]/cbc:TaxableAmount : valeur erronée '102.00', valeur restaurée '100.00'. Le document UBL erroné passe XSD et produit BR-S-08 ; sa correction passe EN 16931 rules 1.3.16. Autres codes déclenchés : 0.

Taxable base shown: 102.00 EUR. Expected: line net 100.00 + document charges 0.00 − document allowances 0.00 = 100.00 EUR for category S at 21%. Difference: 2.00 EUR. Amounts are shown to two decimal places; this example exceeds the pinned rule’s tolerance.

Fragment erroné

<cac:TaxSubtotal 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:TaxableAmount currencyID="EUR">102.00</cbc:TaxableAmount>
            <cbc:TaxAmount currencyID="EUR">21.00</cbc:TaxAmount>
            <cac:TaxCategory>
                <cbc:ID>S</cbc:ID>
                <cbc:Percent>21</cbc:Percent>
                <cac:TaxScheme>
                    <cbc:ID>VAT</cbc:ID>
                </cac:TaxScheme>
            </cac:TaxCategory>
        </cac:TaxSubtotal>
    

Fragment corrigé

<cac:TaxSubtotal 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:TaxableAmount currencyID="EUR">100.00</cbc:TaxableAmount>
            <cbc:TaxAmount currencyID="EUR">21.00</cbc:TaxAmount>
            <cac:TaxCategory>
                <cbc:ID>S</cbc:ID>
                <cbc:Percent>21</cbc:Percent>
                <cac:TaxScheme>
                    <cbc:ID>VAT</cbc:ID>
                </cac:TaxScheme>
            </cac:TaxCategory>
        </cac:TaxSubtotal>
    

XML erroné complet · XML corrigé complet

Messages communs dans nos mutations

Dans les 1 338 mutations synthétiques enregistrées, BR-S-08 apparaît dans 281 essais (ubl/en16931 203, ubl/xrechnung 17, cii/en16931 43, cii/xrechnung 18). Les mêmes essais produisent aussi : BR-CO-10: 80; BR-CO-04: 39; BR-S-05: 39; BR-CL-18: 21; UBL-SR-48: 18; BR-AE-01: 17; BR-AE-02: 17; BR-AE-05: 17; BR-E-01: 17; BR-E-05: 17; BR-O-01: 17; BR-O-02: 17.

Protocole synthétique, groupes et comptage

Champs et règles associés

Diagnostic et emplacement dans le rapport

[BR-S-08]-For each different value of VAT category rate (BT-119) where the VAT category code (BT-118) is "Standard rated", the VAT category taxable amount (BT-116) in a VAT breakdown (BG-23) shall equal the sum of Invoice line net amounts (BT-131) plus the sum of document level charge amounts (BT-99) minus the sum of document level allowance amounts (BT-92) where the VAT category code (BT-151, BT-102, BT-95) is "Standard rated" and the VAT rate (BT-152, BT-103, BT-96) equals the VAT category rate (BT-119).

/*:Invoice[namespace-uri()='urn:oasis:names:specification:ubl:schema:xsd:Invoice-2'][1]/*:TaxTotal[namespace-uri()='urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2'][1]/*:TaxSubtotal[namespace-uri()='urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2'][1]/*:TaxCategory[namespace-uri()='urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-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