- BR-23, fatal «An Invoice line (BG-25) shall have an Invoiced quantity unit of measure code (BT-130).» A linha tem de levar unidade.
- BR-CL-23, fatal «Unit code MUST be coded according to the UN/ECE Recommendation 20 with Rec 21 extension» A unidade tem de ser um código da lista.
- PEPPOL-EN16931-R130, fatal «Unit code of price base quantity MUST be same as invoiced quantity.» Se o preço for por uma quantidade base, a sua unidade é a mesma que a da linha.
As duas primeiras são da EN 16931 (Schematron validation-1.3.17). A terceira é da Peppol BIS (3.0.22) e o XRechnung também a aplica.

De onde o Odoo tira o código
O código que o Odoo escreve no ficheiro vem de um sítio diferente consoante a versão:
- Odoo 17, 18 e 19: tem uma tabela que relaciona as unidades do Odoo (pelo seu identificador externo) com códigos UN/ECE. Uma unidade que criou você não está na tabela e sai como C62, unidade.
- Odoo 20: cada unidade de medida tem o seu próprio campo de código UN/ECE, e é esse código que vai para o ficheiro. O Odoo passa-o para maiúsculas, mas não o compara com a lista.
A BR-CL-23 dispara quando o código do ficheiro não está na lista. No Odoo 20 basta um código mal escrito na unidade de medida. No Odoo 17 a 19 a tabela dá sempre um código da lista, por isso a regra só dispara se o código chegar por outro caminho, como um módulo que o altere.
Há ainda um problema que nenhuma regra vê: uma unidade própria («palete», «caixa de doze») que no Odoo 17 a 19 se converte em C62 sem avisar. O ficheiro passa a BR-CL-23, porque C62 está na lista, mas o seu cliente recebe «unidades» onde você vendeu caixas.
Para quem recebe a fatura, o código conta: o seu programa lê-o para cruzar a linha com a sua encomenda e com a entrada de mercadoria. Se encomendou caixas e a fatura diz unidades, a quantidade não bate com o que recebeu mesmo que o valor seja o mesmo, e a fatura fica parada na sua revisão.
Com o nosso módulo XRechnung e ZUGFeRD
O módulo traz a sua própria tabela, editável, de unidades do Odoo para códigos UN/ECE, para que cada unidade sua tenha o seu código em BT-130. Uma unidade que não esteja nessa tabela sai como C62, tal como no Odoo 17 a 19, e o único aviso fica no registo do servidor, que não se vê a partir da fatura. Uma linha sem unidade também sai como C62.

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 um código fora da lista aparece como BR-CL-23 em Validation Errors. No Odoo 17 a versão publicada não valida.
O que rever
- Veja que unidade leva a linha no XML (atributo unitCode).
- No Odoo 20, abra a unidade de medida e defina o seu código UN/ECE.
- No Odoo 17, 18 e 19, se usar unidades próprias, tenha em conta que saem como C62. Com o nosso módulo, em qualquer versão, acrescente cada uma à sua tabela: as que faltarem também saem como C62.
- Se o preço for por quantidade base (por exemplo, por cada cem unidades), a sua unidade tem de ser a mesma que a da linha.
- Gere o ficheiro outra vez e verifique o atributo unitCode de cada linha antes de o enviar.
Continue a ler
Verificado no código do módulo (versão 17.0 e 20.0) e nas fontes indicadas
Fontes
- 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_uom_mapping.py
- 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/itplr-kosit/xrechnung-schematron/releases/tag/v2.6.0
- github.com/ConnectingEurope/eInvoicing-EN16931/releases/tag/validation-1.3.17
- docs.peppol.eu/poacc/billing/3.0/rules/ubl-peppol/PEPPOL-EN16931-R130/
