Skip to content

Ironfang Finance - Rule reference

BR-DEC-25: Write the base amount of a line allowance with no more than two decimals

A line allowance has a cbc:BaseAmount with more than two digits after the decimal point. Write the base the percentage was applied to with two at most.

EN 16931Fatal: the document is invalidAllowances and chargesLines and prices

On this page

The short answer

BR-DEC-25 fails when an allowance on a line, a cac:AllowanceCharge inside cac:InvoiceLine or cac:CreditNoteLine with cbc:ChargeIndicator of false, has a cbc:BaseAmount with more than two digits after the decimal point. Write the amount the allowance percentage was applied to with two decimals at most, such as 40.00.

In the recorded example only the base is at fault: the allowance amount of 2.00 and the percentage of 5 were already acceptable. The same element also brings UBL-DT-01, so one padded base produces two findings.

What the rule checks

The rule selects each allowance directly inside a line and counts the characters after the first full stop in its cbc:BaseAmount; three or more fail. An allowance given as a fixed amount, with no base, has nothing to count and passes.

Only the written form counts, not the value. When tried, a base amount of 40 validated cleanly, while 40.004 failed in the same way as the recorded 40.000.

The base of a discount on the price is the item gross price, in cac:Price/cac:AllowanceCharge/cbc:BaseAmount, and this rule does not reach it. When tried, a gross price written as 15.000 passed every layer.

The Peppol percentage check reads the same element, but by value. When tried, a base of 40.500, which no longer gives the 2.00 allowance at 5 percent, also brought PEPPOL-EN16931-R040; 40.004 stayed within its tolerance of 0.02 and did not.

TermMeaningUBL element
BT-137Invoice line allowance base amountcac:InvoiceLine/cac:AllowanceCharge/cbc:BaseAmount (cac:CreditNoteLine/cac:AllowanceCharge/cbc:BaseAmount 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 base is the gross line value, quantity times a unit price held to three or four decimals, and it is serialised at that precision.
  • The allowance amount is rounded before it is written, but the base it was calculated from is passed through untouched.
  • The base is stored in a decimal column with a scale of three, and the serialiser writes every stored digit, turning 40 into 40.000.

How to fix it

  1. Round the base amount to two decimals when the allowance is calculated, and apply the percentage to the rounded figure.
  2. Write the result to cbc:BaseAmount in the line cac:AllowanceCharge, after cbc:Amount, with no digits beyond the second decimal and no whitespace.
  3. Check the allowance amount against the rounded base: PEPPOL-EN16931-R040 lets it differ from base times percentage divided by 100 by 0.02 at most.
  4. If the discount was really given on the unit price, model it in cac:Price/cac:AllowanceCharge instead, where the gross price may keep its extra decimals.

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: a 5 percent line discount whose base is written as 40.000

<cac:InvoiceLine>
  <cbc:ID>1</cbc:ID>
  <!-- note, quantity, line net amount, 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.00</cbc:Amount>
    <cbc:BaseAmount currencyID="GBP">40.000</cbc:BaseAmount>
  </cac:AllowanceCharge>
  <!-- line charge, item and price omitted from this fragment -->
</cac:InvoiceLine>

Fragment of the corrected invoice: the same base written as 40.00

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

The failing and corrected invoices differ in one element: the line allowance cbc:BaseAmount reads 40.000 in one and 40.00 in the other. Five percent of either is the 2.00 allowance both documents carry, so the Peppol percentage check and the line net amount of 58.00 are satisfied in each. The failing document reports BR-DEC-25 at the line cac:AllowanceCharge and UBL-DT-01 at the cbc:BaseAmount itself, because a base amount is an amount element like any other and is not among those UBL-DT-01 exempts. Two decimals clear both.

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 cac:InvoiceLine in an Invoice and cac:CreditNoteLine in a CreditNote. When tried, a credit note with a line allowance base of 40.000 reported the same two findings.
  • Only allowances are selected. The base of a line charge belongs to BR-DEC-28, and the base of a document-level allowance to BR-DEC-02.
  • A base amount without a percentage is a separate problem. When tried, removing cbc:MultiplierFactorNumeric from the failing line added PEPPOL-EN16931-R042 to the two findings.

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