# BR-DEC-24: Write the line allowance amount with no more than two decimals

An allowance on an invoice line has a `cbc:Amount` with more than two digits after the decimal point. Round the line allowance to two decimals.

- Layer: EN 16931
- Severity: fatal (the document is invalid)
- Topics: Allowances and charges, Lines and prices
- Official definition: https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-DEC-24/
- Explanation last updated: 2026-09-24

## The short answer

`BR-DEC-24` fails when a `cac:AllowanceCharge` on a line, with `cbc:ChargeIndicator` of `false`, has a `cbc:Amount` with more than two digits after the decimal point. Write the line allowance amount with two decimals at most, such as `2.00`.

A discount on the price is not a line allowance. An allowance inside `cac:Price` explains how the net price was reached and may keep more decimals, like the price itself.

## What the rule checks

The rule selects every allowance directly inside a `cac:InvoiceLine` or `cac:CreditNoteLine` and allows at most two characters after the decimal point in its `cbc:Amount`. The recorded `2.000` fails on the third character alone.

Allowances inside `cac:Price` are outside its reach, and outside `UBL-DT-01` as well. When tried, a price allowance of `0.005` on a gross price of `20.000` validated cleanly.

Line charges and the allowance base amount have their own rules, `BR-DEC-27` and `BR-DEC-25`. When tried, a line charge written as `0.010` reported `BR-DEC-27` and `UBL-DT-01`, not this rule.

The percentage in `cbc:MultiplierFactorNumeric` is not an amount. When tried, writing it as `5.000` passed every layer.

| Term | Meaning | UBL element |
|---|---|---|
| BT-136 | Invoice line allowance amount | `cac:InvoiceLine/cac:AllowanceCharge/cbc:Amount (cac:CreditNoteLine/cac:AllowanceCharge/cbc:Amount in a credit note), where cbc:ChargeIndicator is false` |

## How an integration ends up here

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

- The line discount is computed as a percentage of quantity times a price with three decimals and written unrounded.
- The same formatter writes the price and the line allowance, and it is set to the precision of the price.
- A discount recorded against the price in the source system is mapped to a line allowance without being rounded again.

## How to fix it

1. Decide whether the discount belongs to the price or to the line. A price discount goes in `cac:Price/cac:AllowanceCharge` and may keep the precision of the price; a line allowance reduces the line net amount and takes two decimals.
2. For a line allowance, round the amount to two decimals when it is calculated and write it to `cbc:Amount` with no more.
3. Write the base amount of a percentage allowance with two decimals too, and keep the amount consistent with base times percentage.
4. Recalculate the line net amount with the rounded allowance, so it still agrees with quantity, price and charges.

## Before and after

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

Fragment of the failing invoice: a 5 percent line discount on 40.00 written as 2.000

```xml
<cac:InvoiceLine>
  <cbc:ID>1</cbc:ID>
  <!-- note omitted from this fragment -->
  <cbc:InvoicedQuantity unitCode="C62">3</cbc:InvoicedQuantity>
  <cbc:LineExtensionAmount currencyID="GBP">58.00</cbc:LineExtensionAmount>
  <!-- accounting cost and order line reference omitted from this fragment -->
  <cac:AllowanceCharge>
    <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
    <cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
    <cbc:AllowanceChargeReason>Example discount</cbc:AllowanceChargeReason>
    <cbc:MultiplierFactorNumeric>5</cbc:MultiplierFactorNumeric>
    <cbc:Amount currencyID="GBP">2.000</cbc:Amount>
    <cbc:BaseAmount currencyID="GBP">40.00</cbc:BaseAmount>
  </cac:AllowanceCharge>
  <!-- line charge, item and price omitted from this fragment -->
</cac:InvoiceLine>
```

Fragment of the corrected invoice: the same discount written as 2.00

```xml
<cac:AllowanceCharge>
  <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
  <cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
  <cbc:AllowanceChargeReason>Example discount</cbc:AllowanceChargeReason>
  <cbc:MultiplierFactorNumeric>5</cbc:MultiplierFactorNumeric>
  <cbc:Amount currencyID="GBP">2.00</cbc:Amount>
  <cbc:BaseAmount currencyID="GBP">40.00</cbc:BaseAmount>
</cac:AllowanceCharge>
```

Only the line allowance amount is written differently: `2.000` in the failing invoice and `2.00` in the corrected one. The line net amount of 58.00 already reflects a 2.00 discount, so no other figure changes. The failing document reports `BR-DEC-24` at the line `cac:AllowanceCharge` and `UBL-DT-01` at the `cbc:Amount` inside it. `UBL-DT-01` caps the decimals of every amount element in the document other than item prices and allowances on a price, and an allowance on the line is not exempt, so the two findings come as a pair. Rewriting the amount clears both.

### What the validator reported

- The failing invoice reports **BR-DEC-24** and [UBL-DT-01](https://ironfang.uk/docs/finance/rules/UBL-DT-01.md). The corrected document passes every layer with no findings.
  - [Download the failing XML](https://ironfang.uk/finance/rule-examples/BR-DEC-24-invalid.xml)
  - [Download the corrected XML](https://ironfang.uk/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 `cac:InvoiceLine` in an `Invoice` and `cac:CreditNoteLine` in a `CreditNote`. When tried, the credit note version reported the same pair of findings.
- Document-level allowances are not in scope here; `BR-DEC-01` holds them to the same limit.
- The line number in the finding location identifies which line to correct when several carry allowances.

## Related rules

- [UBL-DT-01 reports the same line allowance amount as part of its limit on all amounts](https://ironfang.uk/docs/finance/rules/UBL-DT-01.md)
- [BR-DEC-01 is the same limit for document-level allowances](https://ironfang.uk/docs/finance/rules/BR-DEC-01.md)
- [PEPPOL-EN16931-R120 checks that the line net amount accounts for this allowance](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R120.md)
- [PEPPOL-EN16931-R046 covers the discount inside the price, which is not limited to two decimals](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R046.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-24.1: source checked 2026-09-24, explanation last updated 2026-09-24.

[The official definition of BR-DEC-24](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-DEC-24/) 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.uk/docs/finance/rules/BR-DEC-24)
- [Free Peppol invoice validator](https://ironfang.uk/tools/peppol-validator)
- [Rule index](https://ironfang.uk/docs/finance/rules.md)
- [Ironfang Finance API docs](https://ironfang.uk/docs/finance)
- The same rule is available to MCP clients as the tool `finance.rule.get` on https://mcp.ironfang.uk/mcp
