Skip to content

Ironfang Finance - Rule reference

BR-DEC-19: Write each VAT breakdown taxable amount with no more than two decimals

A VAT breakdown gives its cbc:TaxableAmount with more than two digits after the decimal point. Write the base each VAT category is taxed on to two decimals.

EN 16931Fatal: the document is invalidVATTotals

On this page

The short answer

BR-DEC-19 fails when the cbc:TaxableAmount of a cac:TaxSubtotal has more than two characters after the decimal point. Write the taxable amount of that VAT category with two decimals at most: 58.50, not 58.500.

There is one finding per breakdown, located at the cac:TaxSubtotal concerned, so with several VAT categories the location tells you which one to correct. UBL-DT-01 reports its cbc:TaxableAmount as well.

What the rule checks

The rule runs once for every cac:TaxSubtotal inside a cac:TaxTotal and counts the characters after the decimal point in its cbc:TaxableAmount. When tried with both breakdowns of the recorded invoice padded, to 58.500 and 10.000, it reported this rule twice and UBL-DT-01 twice.

The VAT category makes no difference. When tried, padding only the zero-rated breakdown to 10.000 reported this rule at the second cac:TaxSubtotal.

An unrounded taxable amount can slip past the VAT arithmetic but not past this rule. When tried, 58.504 reported only this rule and UBL-DT-01: BR-S-08 accepts a standard-rated taxable amount less than 1.00 away from the sum it calculates, and BR-CO-17 checks the tax amount of 11.70 with a margin of its own.

TermMeaningUBL element
BT-116VAT category taxable amountcac:TaxTotal/cac:TaxSubtotal/cbc:TaxableAmount

How an integration ends up here

Possible causes, from the shape of the rule rather than from measured usage:

  • The taxable amount is added up from line net amounts before each is rounded.
  • A document allowance or charge is shared out across VAT categories and the shares are written with three decimals.
  • The tax engine returns the taxable base at its internal precision and the mapping writes it unchanged.

How to fix it

  1. For each VAT category, add the rounded line net amounts and the rounded document charges, subtract the rounded document allowances, and round the result to two decimals.
  2. Write it to cbc:TaxableAmount in that cac:TaxSubtotal with at most two decimals and no whitespace.
  3. Calculate the tax amount of the breakdown from the rounded taxable amount, and write it with two decimals as well, since BR-DEC-20 holds it to the same limit.

Validate your corrected invoice

Before and after

These are fragments, not complete documents. The complete synthetic documents they come from are linked below.

Fragment of the failing invoice: the standard-rated breakdown gives its taxable amount as 58.500

<cac:TaxSubtotal>
  <cbc:TaxableAmount currencyID="GBP">58.500</cbc:TaxableAmount>
  <cbc:TaxAmount currencyID="GBP">11.70</cbc:TaxAmount>
  <cac:TaxCategory>
    <cbc:ID>S</cbc:ID>
    <!-- rate and tax scheme omitted from this fragment -->
  </cac:TaxCategory>
</cac:TaxSubtotal>
<cac:TaxSubtotal>
  <cbc:TaxableAmount currencyID="GBP">10.00</cbc:TaxableAmount>
  <cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
  <!-- zero-rated tax category omitted from this fragment -->
</cac:TaxSubtotal>

Fragment of the corrected invoice: the same taxable amount written as 58.50

<cac:TaxSubtotal>
  <cbc:TaxableAmount currencyID="GBP">58.50</cbc:TaxableAmount>
  <cbc:TaxAmount currencyID="GBP">11.70</cbc:TaxAmount>
  <cac:TaxCategory>
    <cbc:ID>S</cbc:ID>
    <!-- rate and tax scheme omitted from this fragment -->
  </cac:TaxCategory>
</cac:TaxSubtotal>
<cac:TaxSubtotal>
  <cbc:TaxableAmount currencyID="GBP">10.00</cbc:TaxableAmount>
  <cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
  <!-- zero-rated tax category omitted from this fragment -->
</cac:TaxSubtotal>

The standard-rated breakdown states its taxable amount as 58.500 in the failing invoice and 58.50 in the corrected one; the zero-rated breakdown of 10.00, the tax amount of 11.70 and every total are the same in both. With the value unchanged, BR-S-08 and BR-CO-17 pass. The failing document reports BR-DEC-19 at the first cac:TaxSubtotal and UBL-DT-01 at its cbc:TaxableAmount. UBL-DT-01 is the general two-decimal check for elements named as amounts, which leaves out only the item net price and the amounts of a price-level allowance, so the taxable amount of a breakdown always draws both findings.

What the validator reported

Recorded on phive 12.1.0 / phive-rules-peppol 4.5.6 / Saxon-HE 12.10, the engine behind the free validator, using synthetic data. A recorded result is regression evidence for these documents; it is not a certification.

Where it applies

  • Applies to UBL Invoice and CreditNote. When tried, a credit note with a standard-rated taxable amount of 58.500 reported the same two findings.
  • Every breakdown is in scope whatever its VAT category, and the currency plays no part in the count.

Scope and source

Written for Peppol BIS Billing 3.0.21 (May 2026), EN 16931 1.3.16, as applied to UBL 2.1 Invoice and CreditNote documents. Other profiles, syntaxes and releases can define this identifier differently. Guidance version 2026-09-28.1: source checked 2026-09-28, explanation last updated 2026-09-28.

The official definition of BR-DEC-19 carries the normative wording and test. This page is our explanation of it, not a copy.

Guidance does not change the engine verdict. Fixing this finding does not mean the document passes every layer, and validation does not certify legal or tax compliance or transmit a document over Peppol.