Peppol BIS Billing 3.0.21 · UBL

BR-S-08: For each different value of VAT category rate (BT-119) where the VAT category code…

Peppol BIS Billing 3.0.21 · UBL

fatalbusiness

Original rule text

[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).

Stored validation assertion
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))))))

BR-S-08 is a fatal rule in the business layer of Peppol BIS Billing 3.0.21 · UBL. An invoice that breaks it is rejected. It refers to BT-119, BT-118, BT-116, BG-23, BT-131, BT-99, BT-92, BT-151, BT-102, BT-95, BT-152, BT-103, BT-96.

What this rule requires

In UBL, the rule applies to each cac:TaxSubtotal/cac:TaxCategory where cbc:ID is exactly 'S' (Standard rated) and the tax scheme is 'VAT'. For each distinct cbc:Percent (VAT rate), the cbc:TaxableAmount in that tax subtotal must equal (within a tolerance of less than 1.00) the sum of cbc:LineExtensionAmount of invoice or credit note lines whose ClassifiedTaxCategory has cbc:ID='S' and the same cbc:Percent, plus document-level cac:AllowanceCharge amounts where ChargeIndicator is true and tax category S and same rate, minus document-level cac:AllowanceCharge amounts where ChargeIndicator is false and tax category S and same rate. In CII, the rule applies to each ram:ApplicableTradeTax with ram:CategoryCode='S'. For each distinct ram:RateApplicablePercent, the ram:BasisAmount must equal exactly (after rounding components to two decimals) the sum of ram:LineTotalAmount of line items with ram:CategoryCode='S' and the same rate, plus header-level ram:SpecifiedTradeAllowanceCharge with ChargeIndicator=true() and the same S/rate, minus header-level ram:SpecifiedTradeAllowanceCharge with ChargeIndicator=false() and the same S/rate. If the condition does not hold, the invoice is rejected by the validator.

How to fix

Ensure that for each standard-rated VAT rate the taxable amount in the VAT breakdown matches the sum of the line amounts and document-level charges minus allowances for that same rate. In UBL, correct cac:TaxSubtotal/cbc:TaxableAmount to the calculated sum (differences under 1.00 are accepted). In CII, correct ram:ApplicableTradeTax/ram:BasisAmount to exactly the calculated rounded sum. Also check that all line items, charges, and allowances have the correct ClassifiedTaxCategory/CategoryCode (S) and same Percent/RateApplicablePercent value; if a line or charge/allowance is assigned to the wrong rate, move or correct it.

Guidance on this rule. The original text above is authoritative.

Where to go next

No published Peppol BIS Billing UBL release comparison lists a change to BR-S-08.

Validate an invoice against these rules · All release changes