AttestwireRule referenceBR-DEC-20

BR-DEC-20 A VAT category tax amount may have at most two decimals

noun · EN 16931 · fatal · BT-117

For a sample invoice, the library reports: The allowed maximum number of decimals for the VAT category tax amount (BT-117) is 2, but the document writes in VAT breakdown group 1 "285.000", which has 3.

Business term
BT-117
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:TaxAmount>285.00</cbc:TaxAmount>

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-20",
  "field": "BT-117",
  "severity": "fatal",
  "message": "The allowed maximum number of decimals for the VAT category tax amount (BT-117) is 2, but the document writes in VAT breakdown group 1 \"285.000\", which has 3. BR-DEC rules are measured on the serialised value, not on the number behind it: trailing zeros count, so \"285.000\" fails even though it is arithmetically identical to a two-decimal amount and every total in the document still balances. Applying a percentage produces a long decimal nearly every time, which is why BR-CO-17 requires the multiplication to be rounded to two decimals at the group.",
  "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:TaxAmount>285.00</cbc:TaxAmount>",
  "xpath": "/ubl:Invoice/cac:TaxTotal/cac:TaxSubtotal[1]/cbc:TaxAmount",
  "docsUrl": "https://attestwire.com/rules/BR-DEC-20"
}

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