Counterfoil rule note
Quoted from a public specification. This page is not a validator, and it is not tax, legal, or accounting advice.
An Invoice that contains a VAT breakdown group (BG-23) with a VAT category code (BT-118) "Not subject to VAT" shall not contain Document level charges (BG-21) where Document level charge VAT category code (BT-102) is not "Not subject to VAT".
Source: https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-O-14/
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.
If a VAT breakdown uses the category "Not subject to VAT", the invoice must not contain document-level charges (BG-21) whose VAT category code (BT-102) is not "Not subject to VAT". The official message says "Document level charges" in the plural and omits "the" before "Document level charge VAT category code". It says "shall not contain" those charges. It does not say the charge shall not contain a VAT rate, and it does not name BT-31, BT-63, or BT-48. The quoted category name has no space after the opening quote. The published test passes when no O VAT breakdown exists. The negative branch is not(...) and does not call exists. When an O breakdown exists, the count of charge tax categories whose code is not O must be 0. The count selects AllowanceCharge where ChargeIndicator=true() with no space before =. The positive branch calls exists.
When a VAT breakdown is category O, set every document-level charge VAT category to O, or remove the charge that uses another category.
Illustration of the condition in the official statement. Not an example published by the source.
Fails the stated condition. An O VAT breakdown is present and a document-level charge uses a tax category that is not O.
Passes the stated condition. Every document-level charge uses O, or the invoice has no O breakdown.
Copied from the source. Not reimplemented on this page.
/ubl:Invoice | /cn:CreditNote
(exists(cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory[cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT']/cbc:ID[normalize-space(.) = 'O']) and count(//cac:AllowanceCharge[cbc:ChargeIndicator=true()]/cac:TaxCategory[normalize-space(cbc:ID) != 'O'][cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT']) = 0) or not(cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory[cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT']/cbc:ID[normalize-space(.) = 'O'])
All rule notes · JSON · Markdown · llms.txt · Invoice page · Privacy