Counterfoil rule note

BR-AF-09

Quoted from a public specification. This page is not a validator, and it is not tax, legal, or accounting advice.

Country
EU
Syntax
UBL
Severity
fatal
Last verified
2026-10-18

Official statement

The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where VAT category code (BT-118) is "IGIC" shall equal the VAT category taxable amount (BT-116) multiplied by the VAT category rate (BT-119).

Source: https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-AF-09/

Peppol BIS Billing 3.0, May 2026 release, EN 16931 model bound to UBL

Severity note: fatal, from the Flag column of the Peppol BIS Billing 3.0 UBL rules index retrieved 2026-10-18.

Plain-language reading

The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where VAT category code (BT-118) is "IGIC" must equal the VAT category taxable amount (BT-116) multiplied by the VAT category rate (BT-119). The message omits "the" before "VAT category code". The published test compares category code L, divides the percent by 100, rounds that product to two decimal places, uses absolute values, and allows the tax amount and that rounded product to differ by less than 1. The official test has two spaces before each round. The stored test keeps one. It also keeps a single space before the closing parenthesis after div 100.

What to change

Set BT-117 on the L breakdown to BT-116 multiplied by BT-119 as a percentage. The published test divides the percent by 100 and allows a difference of less than 1.

Illustration

Illustration of the condition in the official statement. Not an example published by the source.

Fails the stated condition. An L breakdown has taxable amount 100, category rate 0, and tax amount 50.

Passes the stated condition. That breakdown has taxable amount 100, category rate 0, and tax amount 0.

Published context and test

Copied from the source. Not reimplemented on this page.

/*/cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory[normalize-space(cbc:ID) = 'L'][cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT']
(abs(xs:decimal(../cbc:TaxAmount)) - 1 < round((abs(xs:decimal(../cbc:TaxableAmount)) * (xs:decimal(cbc:Percent) div 100)) * 10 * 10) div 100 ) and (abs(xs:decimal(../cbc:TaxAmount)) + 1 > round((abs(xs:decimal(../cbc:TaxableAmount)) * (xs:decimal(cbc:Percent) div 100)) * 10 * 10) div 100 )

All rule notes · JSON · Markdown · llms.txt · Invoice page · Privacy