As fórmulas, tal como o Schematron as escreve
| Regra | Texto da EN 16931 (Schematron validation-1.3.17) |
|---|---|
| BR-CO-15 | Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110). |
| BR-CO-14 | Invoice total VAT amount (BT-110) = Σ VAT category tax amount (BT-117). |
| BR-CO-16 | Amount due for payment (BT-115) = Invoice total amount with VAT (BT-112) -Paid amount (BT-113) +Rounding amount (BT-114). |
| BR-CO-17 | VAT category tax amount (BT-117) = VAT category taxable amount (BT-116) x (VAT category rate (BT-119) / 100), rounded to two decimals. |
| BR-S-08 | For each different value of VAT category rate (BT-119) where the VAT category code (BT-118) is "Standard rated", the VAT category taxable amount (BT-116) in a VAT breakdown (BG-23) shall equal the sum of Invoice line net amounts (BT-131) plus the sum of document level charge amounts (BT-99) minus the sum of document level allowance amounts (BT-92) where the VAT category code (BT-151, BT-102, BT-95) is "Standard rated" and the VAT rate (BT-152, BT-103, BT-96) equals the VAT category rate (BT-119). |
| BR-S-09 | The VAT category tax amount (BT-117) in a VAT breakdown (BG-23) where VAT category code (BT-118) is "Standard rated" shall equal the VAT category taxable amount (BT-116) multiplied by the VAT category rate (BT-119). |
As seis são fatais. Leia-as como uma cadeia: as linhas somam a base de cada taxa (BR-S-08), cada base vezes a sua taxa dá o IVA dessa taxa (BR-CO-17 e BR-S-09), o IVA por taxa soma o IVA total (BR-CO-14), base mais IVA dá o total (BR-CO-15) e o total menos o pago mais o arredondamento dá o que fica por pagar (BR-CO-16).

Que regras notam um cêntimo
Nem todas contam cêntimos. BR-CO-17 e BR-S-09 comparam o IVA de cada taxa (BT-117) com a base vezes a taxa, mas o Schematron dá-lhes uma margem de 1 € para cima ou para baixo. BR-S-08 compara bases, pelo que o arredondamento do IVA não lhe afeta. BR-CO-14, BR-CO-15 e BR-CO-16 comparam somas arredondadas a duas casas decimais, sem margem: aí um cêntimo já é um erro.
O cêntimo aparece quando há duas maneiras de calcular o IVA. O Odoo calcula-o segundo o método de arredondamento de impostos da empresa (Tax Calculation Rounding Method):
| Versão do Odoo | Opções | Por defeito |
|---|---|---|
| Odoo 17 e 18 | Round per Line ou Round Globally | Por linha |
| Odoo 19 e 20 | Round per Tax ou Round per Line | Por imposto |
Com o arredondamento por linha, o Odoo arredonda o IVA de cada linha e depois soma. Numa fatura com muitas linhas de valores pequenos, essa soma pode ficar a um cêntimo do IVA calculado sobre a base de cada taxa. Se todos os valores do ficheiro saírem do mesmo cálculo, as somas batem certo. Se o ficheiro levar o IVA total do Odoo ao lado de um desdobramento refeito por taxa, falha BR-CO-14; se levar o total com IVA do Odoo ao lado de um IVA refeito, falha BR-CO-15. Para que dispare BR-CO-17, a diferença tem de passar de 1 €.
O método de arredondamento é uma definição da empresa, não de cada fatura: alterá-lo afeta os impostos calculados a partir desse momento. Faça-o entre faturas, nunca com uma a meio.
O que faz o Factur-X do Odoo
No Factur-X (CII) do Odoo 18, 19 e 20, o total com IVA (BT-112) é escrito como a soma da base (BT-109) e do IVA (BT-110) que já vão no ficheiro, precisamente para cumprir BR-CO-15. Isso garante a regra da soma; o resto da cadeia continua a depender de o desdobramento bater certo.
Com o nosso módulo XRechnung e ZUGFeRD
O módulo gera o XML com o seu próprio código e hoje mistura os dois cálculos. O IVA de cada taxa (BT-117) calcula-o como base vezes taxa; o total com IVA (em UBL) e o IVA total (em CII) copia-os da fatura do Odoo. Com o arredondamento por linha, basta um cêntimo de diferença: o XML sai com BR-CO-15 na XRechnung UBL e com BR-CO-14 na XRechnung CII, o formato que o módulo usa por defeito. Verificámo-lo com o validador da KoSIT. No Odoo 17 e 18, o arredondamento por linha é o valor por defeito.
Com um pagamento parcial falha BR-CO-16: o valor a pagar (BT-115) é o que fica pendente no Odoo, mas o ficheiro não leva o valor já pago (BT-113).

No Odoo 18, 19 e 20, com a subscrição do FlexigoTech Cloud, cada XRechnung e cada ZUGFeRD EN 16931 que o módulo gera passa pelas regras da KoSIT, que incluem estas seis. Se alguma falhar, fica escrita na fatura, em Validation Errors, e a fatura não é marcada como Ready to send. No Odoo 17 a versão publicada não valida: o ficheiro sai com a falha e sem aviso.
O que fazer
- Veja no relatório que regra falha primeiro: BR-S-08 aponta para as bases, BR-CO-14 para o desdobramento, BR-CO-15 para o total e BR-CO-17 para o IVA de uma taxa.
- Reveja o método de arredondamento da empresa e, se emite faturas eletrónicas com muitas linhas, avalie o arredondamento por imposto com o seu contabilista.
- BR-CO-16 aparece com pagamentos parciais ou com arredondamento de caixa: o valor pago e o de arredondamento têm de ir no ficheiro. Com o nosso módulo, gere a XRechnung antes de registar qualquer pagamento.
- Corrija e gere de novo; não edite o XML à mão.
Continue a ler
Verificado no código do módulo (versão 17.0 e 20.0) e nas fontes indicadas
Fontes
- github.com/ConnectingEurope/eInvoicing-EN16931/releases/tag/validation-1.3.17
- 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/models/c
- github.com/odoo/odoo/blob/2982b5f44af03fae6a9888f20632c1cc19f623ba/addons/account/models/c
- github.com/odoo/odoo/blob/4d2d4b5895db70596863df941d9a1f0beeb117f8/addons/account/models/c
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/account/models/c
- 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 20.0 (446f2f68): models/account_move.py
- Código do módulo: flexigo_germany_xrechnung 17.0 (ad05de8f): __manifest__.py
