Les set regles, amb el text del Schematron de EN 16931 (validation-1.3.17). Totes són fatals:
| Regla | Categoria | Text |
|---|---|---|
| BR-E-10 | E, exempta | A VAT breakdown (BG-23) with VAT Category code (BT-118) "Exempt from VAT" shall have a VAT exemption reason code (BT-121) or a VAT exemption reason text (BT-120). |
| BR-AE-10 | AE, inversió | A VAT breakdown (BG-23) with VAT Category code (BT-118) "Reverse charge" shall have a VAT exemption reason code (BT-121), meaning "Reverse charge" or the VAT exemption reason text (BT-120) "Reverse charge" (or the equivalent standard text in another language). |
| BR-IC-10 | K, intracomunitària | A VAT breakdown (BG-23) with the VAT Category code (BT-118) "Intra-community supply" shall have a VAT exemption reason code (BT-121), meaning "Intra-community supply" or the VAT exemption reason text (BT-120) "Intra-community supply" (or the equivalent standard text in another language). |
| BR-G-10 | G, exportació | A VAT breakdown (BG-23) with the VAT Category code (BT-118) "Export outside the EU" shall have a VAT exemption reason code (BT-121), meaning "Export outside the EU" or the VAT exemption reason text (BT-120) "Export outside the EU" (or the equivalent standard text in another language). |
| BR-O-10 | O, fora de l'àmbit | A VAT breakdown (BG-23) with VAT Category code (BT-118) " Not subject to VAT" shall have a VAT exemption reason code (BT-121), meaning " Not subject to VAT" or a VAT exemption reason text (BT-120) " Not subject to VAT" (or the equivalent standard text in another language). |
| BR-S-10 | S, general | A VAT breakdown (BG-23) with VAT Category code (BT-118) "Standard rate" shall not have a VAT exemption reason code (BT-121) or VAT exemption reason text (BT-120). |
| BR-Z-10 | Z, tipus zero | A VAT breakdown (BG-23) with VAT Category code (BT-118) "Zero rated" shall not have a VAT exemption reason code (BT-121) or VAT exemption reason text (BT-120). |
El motiu pot anar com a codi (BT-121, de la llista VATEX) o com a text (BT-120). Per a E n'hi ha prou amb qualsevol dels dos; per a AE, K, G i O, el codi o el text han de significar justament allò: «Reverse charge», «Intra-community supply»… Les regles de les altres famílies (BR-E-08, BR-AE-08 i següents) són les d'imports; aquí només hi va el motiu.

Com decideix Odoo la categoria
Aquí és on les versions es separen:
- Odoo 17 i 18: de sèrie, l'impost no porta camp de categoria i Odoo la dedueix: a un client espanyol amb codi postal que comença per 35 o 38 (Canàries), L, i per 51 o 52 (Ceuta i Melilla), M; E si l'impost és del 0 % i venedor i client són del mateix país; AE en l'autoliquidació de cocontractant belga o en l'autofactura amb impost d'inversió; amb NIF del venedor i impost al 0 %, K si els dos són de l'EEE i G si només ho és un; a la resta, S si l'impost té percentatge i E si és del 0 %. El mòdul estàndard account_edi_ubl_cii_tax_extension (Tax extension for UBL/CII), que no s'instal·la sol, afegeix a l'impost Tax Category Code i Tax Exemption Reason Code: amb la categoria posada, Odoo usa aquesta en lloc de deduir-la.
- Odoo 19: cada impost té Tax Category Code (AE, E, S, Z, G, O, K, L, M, B) i Tax Exemption Reason Code, amb la llista VATEX.
- Odoo 20: els mateixos dos camps i, a més, Tax Exemption Reason, un text lliure.
- En les quatre versions: si una categoria E es queda sense motiu, Odoo escriu el text «Exempt from tax», que compleix BR-E-10.
La trampa típica d'Odoo 17 i 18 sense aquest mòdul és un impost del 0 % per a un servei fora de l'àmbit de l'IVA, que la deducció mai marca com O, o una venda nacional amb inversió del subjecte passiu: la categoria surt diferent de la que esperaria el teu assessor.
Amb el nostre mòdul XRechnung i ZUGFeRD
El generador del mòdul publicat només coneix dues categories, S i Z. En XRechnung UBL escriu S quan l'impost té percentatge i Z quan és del 0 %. En XRechnung CII, el seu format per defecte, cada línia surt com a S, també amb un impost del 0 %, i el validador de KoSIT la rebutja amb BR-S-05 (ho hem comprovat). Una factura amb inversió del subjecte passiu, intracomunitària, d'exportació o exempta no surt amb AE, K, G ni E. A Odoo 18, 19 i 20, amb la subscripció a FlexigoTech Cloud, el mòdul valida el resultat amb les regles de KoSIT i deixa a Validation Errors qualsevol regla que falli. Per a aquestes factures, avui, l'exportació d'Odoo és la que coneix les categories. A Odoo 17, la versió publicada no valida.

Com arreglar-ho
- Identifica la categoria que surt al desglossament del XML (BT-118) i compara-la amb l'operació real.
- A Odoo 19 i 20, obre l'impost i posa'n el Tax Category Code i, si és E, AE, K, G o O, el Tax Exemption Reason Code.
- A Odoo 17 i 18, instal·la account_edi_ubl_cii_tax_extension i posa a cada impost la seva categoria i, si aquesta categoria el demana, el seu motiu. Sense aquest mòdul, revisa el país del client, el seu codi postal, el seu NIF i la posició fiscal: són les dades de les quals Odoo dedueix la categoria.
- Un motiu d'exempció en una línia al tipus general provoca BR-S-10: lleva'l de l'impost.
- Genera el fitxer de nou.
Continua llegint
Comprovat al codi del mòdul (versió 17.0 i 20.0) i a les fonts enllaçades
Fonts
- 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/6f00fdadb875342de2d14a179f25431f93cd63c9/addons/account_edi_ubl_
- Codi del mòdul: flexigo_germany_xrechnung 20.0 (446f2f68): lib/generators/cii_generator.py
- Codi del mòdul: 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/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_
- Codi del mòdul: flexigo_germany_xrechnung 20.0 (446f2f68): lib/generators/ubl_generator.py
- Codi del mòdul: flexigo_germany_xrechnung 20.0 (446f2f68): models/xrechnung_cloud.py
- Codi del mòdul: flexigo_germany_xrechnung 17.0 (ad05de8f): __manifest__.py
- github.com/ConnectingEurope/eInvoicing-EN16931/releases/tag/validation-1.3.17
