# BR-O-02

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
- Statement language: en
- Last verified: 2026-10-18

## Official statement

> An Invoice that contains an Invoice line (BG-25) where the Invoiced item VAT category code (BT-151) is "Not subject to VAT" shall not contain the Seller VAT identifier (BT-31), the Seller tax representative VAT identifier (BT-63) or the Buyer VAT identifier (BT-48).

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

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

If an invoice line uses VAT category "Not subject to VAT", the invoice must not contain the seller VAT identifier (BT-31), the seller tax representative VAT identifier (BT-63), or the buyer VAT identifier (BT-48). The official message says "shall not contain" and writes "identifier" with a lowercase i. It names BG-25. It does not name BT-32 or BT-47. The published test looks for a line category code O whose tax scheme is VAT, and it requires those three company identifiers to be absent. The line category comparison is normalize-space(cbc:ID) = 'O' with spaces around =. The line tax-scheme comparison is cbc:ID)='VAT' with no space before =. Each identifier check writes (normalize-space(upper-case(cbc:ID)) = 'VAT') with spaces around =. The negative branch is not(//cac:ClassifiedTaxCategory...) and does not call exists.

## What to change

On a line coded O, leave out BT-31, BT-63, and BT-48.

## Illustration

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

**Fails the stated condition.** A line uses category code O, and BT-31, BT-63, or BT-48 is present.

**Passes the stated condition.** A line uses O, and BT-31, BT-63, and BT-48 are absent.

## Published context and test

Copied from the source. Not reimplemented on this page.

```
/ubl:Invoice | /cn:CreditNote
```

```
(exists(//cac:ClassifiedTaxCategory[normalize-space(cbc:ID) = 'O'][cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT']) and (not(//cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme[cac:TaxScheme/(normalize-space(upper-case(cbc:ID)) = 'VAT')]/cbc:CompanyID) and not(//cac:TaxRepresentativeParty/cac:PartyTaxScheme[cac:TaxScheme/(normalize-space(upper-case(cbc:ID)) = 'VAT')]/cbc:CompanyID) and not(//cac:AccountingCustomerParty/cac:Party/cac:PartyTaxScheme[cac:TaxScheme/(normalize-space(upper-case(cbc:ID)) = 'VAT')]/cbc:CompanyID))) or not(//cac:ClassifiedTaxCategory[normalize-space(cbc:ID) = 'O'][cac:TaxScheme/normalize-space(upper-case(cbc:ID))='VAT'])
```

[All rule notes](https://einvoicegoblin.com/rules/index.md) · [JSON](https://einvoicegoblin.com/rules/BR-O-02.json) · [HTML](https://einvoicegoblin.com/rules/BR-O-02/) · [llms.txt](https://einvoicegoblin.com/llms.txt) · [Invoice page](https://einvoicegoblin.com/) · [Privacy](https://einvoicegoblin.com/privacy.html)
