AttestwireRule referenceBR-DEC-23

BR-DEC-23 An invoice line net amount may have at most two decimals

noun · EN 16931 · fatal · BT-131

For a sample invoice, the library reports: The allowed maximum number of decimals for the Invoice line net amount (BT-131) is 2, but the document writes on line 1 "1500.000", which has 3.

Business term
BT-131
Severity
fatal

The fix

Serialise the amount with exactly two decimal places. This is almost always a formatting setting rather than a data problem — a ledger or ORM emitting its native decimal scale (six places is the usual default) straight into the XML. Fixing it at the point of serialisation fixes every amount in the document at once.

A passing value

the shape this field expects
<cbc:LineExtensionAmount>1500.00</cbc:LineExtensionAmount>

What the library returns

The full error returned by @attestwire/en16931. It includes the rule ID, affected field and suggested correction. Developers can use this object in their application:

TeachingError
{
  "rule": "BR-DEC-23",
  "field": "BT-131",
  "severity": "fatal",
  "message": "The allowed maximum number of decimals for the Invoice line net amount (BT-131) is 2, but the document writes on line 1 \"1500.000\", which has 3. BR-DEC rules are measured on the serialised value, not on the number behind it: trailing zeros count, so \"1500.000\" fails even though it is arithmetically identical to a two-decimal amount and every total in the document still balances. A line amount is exactly where decimals accumulate, because it is a quantity multiplied by a price and then adjusted by allowances and charges. EN 16931 requires the line to be rounded once, at the end, to two decimals.",
  "fix": "Serialise the amount with exactly two decimal places. This is almost always a formatting setting rather than a data problem — a ledger or ORM emitting its native decimal scale (six places is the usual default) straight into the XML. Fixing it at the point of serialisation fixes every amount in the document at once.",
  "example": "<cbc:LineExtensionAmount>1500.00</cbc:LineExtensionAmount>",
  "xpath": "/ubl:Invoice/cac:InvoiceLine[1]/cbc:LineExtensionAmount",
  "docsUrl": "https://attestwire.com/rules/BR-DEC-23"
}

xpath is always a UBL path. On a CII invoice, look for the matching CII field instead.