VAT categories

BR-S-08: VAT taxable amount (BT-116) per rate is wrong

For each VAT rate, the taxable amount must equal the sum of the lines with that rate.

Fact sheet

Rule
BR-S-08
Severity
Error – the invoice is invalid
Rule set
EN 16931 – applies to XRechnung and ZUGFeRD/Factur-X
Affected fields
BT-116, BT-119, BG-23, BT-131
Syntax
CII & UBL

Check your invoice now

Upload a PDF or XML – free, without sign-up, against the official rule sets.

Open the online validator

Official wording

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

Source: official EN 16931 Schematron (CEN), as also applied to XRechnung and ZUGFeRD/Factur-X.

What the rule requires

For each VAT rate of category S (standard rated – in Germany 19 % and 7 %, in France 20 %, 10 %, 5.5 % and 2.1 %) the invoice needs its own VAT breakdown (BG-23). Its taxable amount (BT-116) must be exact:

sum of the invoice line net amounts with this rate
+ document-level charges with this rate
− document-level allowances with this rate

The rule is part of EN 16931 and applies to XRechnung, ZUGFeRD and Factur-X. The other categories have equivalent rules, such as BR-Z-08 (zero rated), BR-E-08 (exempt) and BR-AE-08 (reverse charge).

Common causes

  • Lines with different rates (e.g. 19 % and 7 %) were combined into one breakdown.
  • A discount on the whole invoice was subtracted in the breakdown but not given as an allowance (BG-20) with a VAT rate – or the other way round.
  • An allowance without a VAT rate cannot be assigned to a rate when rates are mixed.
  • The base was computed from unrounded line values.

What it looks like in XML

✗ CII – wrong (both rates in one breakdown)
<!-- lines: 300.00 at 19 %, 50.00 at 7 % -->
<ram:ApplicableTradeTax>
    <ram:CalculatedAmount>66.50</ram:CalculatedAmount>
    <ram:TypeCode>VAT</ram:TypeCode>
    <ram:BasisAmount>350.00</ram:BasisAmount>
    <ram:CategoryCode>S</ram:CategoryCode>
    <ram:RateApplicablePercent>19</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
✓ CII – correct
<ram:ApplicableTradeTax>
    <ram:CalculatedAmount>57.00</ram:CalculatedAmount>
    <ram:TypeCode>VAT</ram:TypeCode>
    <ram:BasisAmount>300.00</ram:BasisAmount>
    <ram:CategoryCode>S</ram:CategoryCode>
    <ram:RateApplicablePercent>19</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>
<ram:ApplicableTradeTax>
    <ram:CalculatedAmount>3.50</ram:CalculatedAmount>
    <ram:TypeCode>VAT</ram:TypeCode>
    <ram:BasisAmount>50.00</ram:BasisAmount>
    <ram:CategoryCode>S</ram:CategoryCode>
    <ram:RateApplicablePercent>7</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>

In UBL each breakdown is a cac:TaxSubtotal with cbc:TaxableAmount.

Fix in C#

Group the lines by VAT rate and add one breakdown per group. With the Facturexa Creator (without document-level allowances and charges):

C#
// One breakdown per VAT rate: base = sum of the lines with that rate
foreach (var rate in invoice.TradeLineItems.GroupBy(l => l.TaxPercent))
{
    var basis = rate.Sum(l => l.LineTotalAmount);
    var vat = Math.Round(basis * rate.Key / 100m, 2, MidpointRounding.AwayFromZero);
    invoice.AddApplicableTradeTax(basis, rate.Key, vat, TaxTypeCode.VAT, TaxCategoryCode.S);
}

Related rules

All explained validation rules