O que diz cada regra
As quatro são fatais no Schematron da EN 16931 (validation-1.3.17):
- UBL-SR-48
- «Invoice lines shall have one and only one classified tax category.» É uma regra da sintaxe UBL: uma linha, uma categoria.
- BR-CO-04
- «Each Invoice line (BG-25) shall be categorized with an Invoiced item VAT category code (BT-151).» O outro lado: nenhuma linha sem categoria.
- BR-25
- «Each Invoice line (BG-25) shall contain the Item name (BT-153).» Cada linha com nome.
- BR-16
- «An Invoice shall have at least one Invoice line (BG-25)» Pelo menos uma linha.

O aviso do Odoo
O Odoo não espera pelo validador. Antes de gerar o UBL percorre as linhas e, se uma não tiver exatamente um imposto, para com: «Each invoice line shall have one and only one tax.» Acontece nas quatro versões, com uma nuance:
- Odoo 17: conta os impostos da linha deixando de fora os de valor fixo, como as ecotaxas; tem de ficar um.
- Odoo 18, 19 e 20: conta as categorias de imposto que vão ser escritas na linha do ficheiro; tem de haver uma.
No mesmo passo verifica BR-25: uma linha sem produto nem descrição para com «Each invoice line should have a product or a label.»
Os casos que o provocam
| Caso no Odoo | O que fazer |
|---|---|
| Linha sem imposto, por exemplo uma despesa repercutida | Atribua-lhe o imposto correspondente, mesmo que seja de 0 % ou isento. |
| Dois impostos de IVA na mesma linha | Deixe um: se forem duas taxas diferentes, parta a linha em duas. |
| IVA mais um agravamento ou retenção na linha | Verifique se esse segundo imposto deve ir na fatura eletrónica como imposto ou de outra forma; a resposta correta depende do seu país. |
| Linha de texto sem produto nem descrição | Escreva a descrição ou transforme-a em nota. |
As secções e notas do Odoo não contam como linhas, por isso não provocam o aviso.
Com o nosso módulo XRechnung e ZUGFeRD
O módulo gera o XML com código próprio e não faz a verificação do Odoo: uma linha sem imposto ou com dois chega ao ficheiro tal como está. Verificámo-lo com o validador da KoSIT:
- Linha sem imposto: sai sem categoria de IVA. Em XRechnung UBL dá UBL-SR-48, BR-CO-04 e BR-Z-08; em XRechnung CII, o formato por defeito do módulo, BR-CO-04, BR-Z-01 e BR-Z-08.
- Linha com dois impostos: em UBL só se escreve o primeiro com percentagem, mas o total com IVA leva os dois, e dispara BR-CO-15. Em CII vão os dois na linha e o IVA total não bate com o desdobramento, e dispara BR-CO-14.
- Linha com um imposto de 0 %: em UBL sai como Z e a KoSIT aceita-a. Em CII sai como S, e a KoSIT dá BR-S-05, além de BR-Z-01 e BR-Z-08.
Reveja os impostos de cada linha antes de gerar.

No Odoo 18, 19 e 20, com a subscrição do FlexigoTech Cloud, cada XRechnung e cada ZUGFeRD EN 16931 é validado com as regras da KoSIT e as regras que falhem ficam em Validation Errors. No Odoo 17 a versão publicada não valida: estes ficheiros saem sem aviso.
Passos
- Leia o aviso: diz se é o imposto ou o nome da linha.
- Abra a fatura em rascunho e reveja a coluna de impostos linha a linha.
- Corrija, confirme e volte a gerar o ficheiro.
Continue a ler
Verificado no código do módulo (versão 17.0 e 20.0) e nas fontes indicadas
Fontes
- Código do módulo: flexigo_germany_xrechnung 20.0 (446f2f68): lib/generators/ubl_generator.py
- Código do módulo: flexigo_germany_xrechnung 20.0 (446f2f68): lib/generators/cii_generator.py
- Código do módulo: flexigo_germany_xrechnung 20.0 (446f2f68): models/res_company.py
- github.com/odoo/odoo/blob/6f00fdadb875342de2d14a179f25431f93cd63c9/addons/account_edi_ubl_
- github.com/odoo/odoo/blob/2982b5f44af03fae6a9888f20632c1cc19f623ba/addons/account_edi_ubl_
- github.com/odoo/odoo/blob/4d2d4b5895db70596863df941d9a1f0beeb117f8/addons/account_edi_ubl_
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/account_edi_ubl_
- github.com/odoo/odoo/blob/6f00fdadb875342de2d14a179f25431f93cd63c9/addons/account_edi_ubl_
- github.com/odoo/odoo/blob/2982b5f44af03fae6a9888f20632c1cc19f623ba/addons/account_edi_ubl_
- github.com/odoo/odoo/blob/4d2d4b5895db70596863df941d9a1f0beeb117f8/addons/account_edi_ubl_
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/account_edi_ubl_
- Código do módulo: flexigo_germany_xrechnung 20.0 (446f2f68): models/xrechnung_cloud.py
- Código do módulo: flexigo_germany_xrechnung 17.0 (ad05de8f): __manifest__.py
- github.com/ConnectingEurope/eInvoicing-EN16931/releases/tag/validation-1.3.17
