BR-AG-09: The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where VAT category code…
Peppol BIS Billing 3.0.21 · UBL
Original rule text
[BR-AG-09]-The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where VAT category code (BT-118) is "IPSI" shall equal the VAT category taxable amount (BT-116) multiplied by the VAT category rate (BT-119).
(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 )BR-AG-09 is a fatal rule in the business layer of Peppol BIS Billing 3.0.21 · UBL. An invoice that breaks it is rejected. It refers to BT-117, BG-23, BT-118, BT-116, BT-119.
What this rule requires
The message states that where VAT category code (BT-118) is "IPSI", the VAT category tax amount (BT-117) must equal the taxable amount (BT-116) multiplied by the rate (BT-119). In UBL the selector instead requires cac:TaxCategory/cbc:ID to be 'M', not "IPSI", and the test checks that cbc:TaxAmount is within ±1 currency unit of cbc:TaxableAmount * cbc:Percent / 100, rounded to two decimal places. In CII the test is true(), so the calculation is not enforced there.
How to fix
In UBL, for the cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory with cbc:ID = 'M' and VAT tax scheme, set cbc:TaxAmount to approximately cbc:TaxableAmount * cbc:Percent / 100, rounded to two decimal places, ensuring the difference is less than 1 currency unit. If the invoice uses cbc:ID = 'IPSI', the rule as given would not select it; check whether your validator uses a different condition. In CII, no change is required by this rule because the test always passes.
Guidance on this rule. The original text above is authoritative.
Where to go next
No published Peppol BIS Billing UBL release comparison lists a change to BR-AG-09.
Validate an invoice against these rules · All release changes