# 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.

- Layer: EN 16931
- Severity: fatal (the document is invalid)
- Topics: VAT, Totals
- Official definition: https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-DEC-19/
- Explanation last updated: 2026-09-28

## 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.

| Term | Meaning | UBL element |
|---|---|---|
| BT-116 | VAT category taxable amount | `cac: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.

## 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

```xml
<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

```xml
<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

- The failing invoice reports **BR-DEC-19** and [UBL-DT-01](https://ironfang.com/docs/finance/rules/UBL-DT-01.md). The corrected document passes every layer with no findings.
  - [Download the failing XML](https://ironfang.com/finance/rule-examples/BR-DEC-19-invalid.xml)
  - [Download the corrected XML](https://ironfang.com/finance/rule-examples/invoice-rich.xml)

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.

## Related rules

- [UBL-DT-01 reports the taxable amount of the breakdown alongside this rule](https://ironfang.com/docs/finance/rules/UBL-DT-01.md)
- [BR-DEC-20 applies the same limit to the tax amount of each breakdown](https://ironfang.com/docs/finance/rules/BR-DEC-20.md)
- [BR-S-08 checks the standard-rated taxable amount against the lines, allowances and charges](https://ironfang.com/docs/finance/rules/BR-S-08.md)
- [BR-CO-17 checks each breakdown tax amount against this taxable amount and the rate](https://ironfang.com/docs/finance/rules/BR-CO-17.md)

## 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](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/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.

## Links

- [This rule as a web page](https://ironfang.com/docs/finance/rules/BR-DEC-19)
- [Free Peppol invoice validator](https://ironfang.com/tools/peppol-validator)
- [Rule index](https://ironfang.com/docs/finance/rules.md)
- [Ironfang Finance API docs](https://ironfang.com/docs/finance)
- The same rule is available to MCP clients as the tool `finance.rule.get` on https://mcp.ironfang.com/mcp
