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 validatorOfficial 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
<!-- 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>
<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):
// 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);
}