Le formule, come le scrive lo Schematron
| Regola | Testo di 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). |
Tutte e sei sono bloccanti. Leggile come una catena: le righe sommano la base di ciascuna aliquota (BR-S-08), ogni base per la sua aliquota dà l'IVA di quella aliquota (BR-CO-17 e BR-S-09), le IVA per aliquota sommano l'IVA totale (BR-CO-14), base più IVA dà il totale (BR-CO-15) e il totale meno quanto pagato più l'arrotondamento dà quanto resta da pagare (BR-CO-16).

Quali regole notano un centesimo
Non tutte contano i centesimi. BR-CO-17 e BR-S-09 confrontano l'IVA di ogni aliquota (BT-117) con la base per l'aliquota, ma lo Schematron concede loro un margine di 1 € in un senso o nell'altro. BR-S-08 confronta basi, quindi l'arrotondamento dell'IVA non la riguarda. BR-CO-14, BR-CO-15 e BR-CO-16 confrontano somme arrotondate a due decimali, senza margine: lì un centesimo è già un errore.
Il centesimo compare quando ci sono due modi di calcolare l'IVA. Odoo la calcola secondo il Tax Calculation Rounding Method dell'azienda:
| Versione di Odoo | Opzioni | Predefinita |
|---|---|---|
| Odoo 17 e 18 | Round per Line o Round Globally | Per riga |
| Odoo 19 e 20 | Round per Tax o Round per Line | Per imposta |
Con l'arrotondamento per riga, Odoo arrotonda l'IVA di ogni riga e poi le somma. In una fattura con molte righe di importi piccoli, quella somma può finire a un centesimo dall'IVA calcolata sulla base di ciascuna aliquota. Se tutte le cifre del file provengono dallo stesso calcolo, le somme quadrano. Se il file riporta l'IVA totale di Odoo accanto a un riepilogo ricalcolato per aliquota, fallisce BR-CO-14; se riporta il totale con IVA di Odoo accanto a un'IVA ricalcolata, fallisce BR-CO-15. Perché scatti BR-CO-17, la differenza deve superare 1 €.
Il metodo di arrotondamento è un'impostazione dell'azienda, non della singola fattura: cambiarlo incide sulle imposte calcolate da quel momento in poi. Fallo tra una fattura e l'altra, mai con una a metà.
Cosa fa il Factur-X di Odoo
Nel Factur-X (CII) di Odoo 18, 19 e 20, il totale con IVA (BT-112) viene scritto come somma della base (BT-109) e dell'IVA (BT-110) già presenti nel file, proprio per rispettare BR-CO-15. Questo assicura la regola della somma; il resto della catena dipende ancora dal fatto che il riepilogo quadri.
Con il nostro modulo XRechnung e ZUGFeRD
Il modulo genera l'XML con il proprio codice e oggi mescola i due calcoli. Calcola l'IVA di ogni aliquota (BT-117) come base per aliquota, e copia il totale con IVA (in UBL) o l'IVA totale (in CII) dalla fattura di Odoo. Con l'arrotondamento per riga, basta un centesimo di differenza: l'XML esce con BR-CO-15 in XRechnung UBL e con BR-CO-14 in XRechnung CII, il formato predefinito del modulo. Lo abbiamo verificato con il validatore di KoSIT. In Odoo 17 e 18, l'arrotondamento per riga è il valore predefinito.
Con un pagamento parziale fallisce BR-CO-16: l'importo da pagare (BT-115) è ciò che risulta ancora aperto in Odoo, ma il file non riporta l'importo già pagato (BT-113).

In Odoo 18, 19 e 20, con l'abbonamento a FlexigoTech Cloud, ogni XRechnung e ogni ZUGFeRD EN 16931 che il modulo genera passa dalle regole di KoSIT, che includono queste sei. Se una fallisce, viene scritta sulla fattura, in Validation Errors, e la fattura non viene segnata come Ready to send. In Odoo 17 la versione pubblicata non valida: il file esce con l'errore e senza avviso.
Cosa fare
- Guarda nel rapporto quale regola fallisce per prima: BR-S-08 indica le basi, BR-CO-14 il riepilogo, BR-CO-15 il totale e BR-CO-17 l'IVA di un'aliquota.
- Controlla il metodo di arrotondamento dell'azienda e, se emetti fatture elettroniche con molte righe, valuta con il tuo commercialista l'arrotondamento per imposta.
- BR-CO-16 compare con pagamenti parziali o con arrotondamento di cassa: l'importo pagato e quello di arrotondamento devono essere nel file. Con il nostro modulo, genera la XRechnung prima di registrare qualsiasi pagamento.
- Correggi e genera di nuovo; non modificare l'XML a mano.
Continua a leggere
Verificato nel codice del modulo (versione 17.0 e 20.0) e nelle fonti collegate
Fonti
- github.com/ConnectingEurope/eInvoicing-EN16931/releases/tag/validation-1.3.17
- Codice del modulo: flexigo_germany_xrechnung 20.0 (446f2f68): lib/generators/ubl_generator.py
- Codice del modulo: flexigo_germany_xrechnung 20.0 (446f2f68): lib/generators/cii_generator.py
- Codice del modulo: 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_
- Codice del modulo: flexigo_germany_xrechnung 20.0 (446f2f68): models/xrechnung_cloud.py
- Codice del modulo: flexigo_germany_xrechnung 20.0 (446f2f68): models/account_move.py
- Codice del modulo: flexigo_germany_xrechnung 17.0 (ad05de8f): __manifest__.py
