Die Formeln, so wie das Schematron sie schreibt
| Regel | Text von 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). |
Alle sechs sind fatal. Lesen Sie sie als Kette: Die Zeilen ergeben die Basis je Satz (BR-S-08), jede Basis mal ihrem Satz ergibt die USt dieses Satzes (BR-CO-17 und BR-S-09), die USt je Satz ergibt die USt gesamt (BR-CO-14), Basis plus USt ergibt den Gesamtbetrag (BR-CO-15), und der Gesamtbetrag minus Bezahltes plus Rundung ergibt den offenen Betrag (BR-CO-16).

Welche Regeln einen Cent bemerken
Nicht alle zählen Cent. BR-CO-17 und BR-S-09 vergleichen die USt je Satz (BT-117) mit Basis mal Satz, doch das Schematron lässt ihnen 1 € Spielraum in beide Richtungen. BR-S-08 vergleicht Basen, daher beeinflusst die Rundung der USt sie nicht. BR-CO-14, BR-CO-15 und BR-CO-16 vergleichen auf zwei Dezimalstellen gerundete Summen, ohne Spielraum: Dort ist ein Cent schon ein Fehler.
Der Cent entsteht, wenn es zwei Wege gibt, die USt zu berechnen. Odoo berechnet sie nach der Einstellung Tax Calculation Rounding Method des Unternehmens:
| Odoo-Version | Optionen | Standard |
|---|---|---|
| Odoo 17 und 18 | Round per Line oder Round Globally | Pro Zeile |
| Odoo 19 und 20 | Round per Tax oder Round per Line | Pro Steuer |
Bei der Rundung pro Zeile rundet Odoo die USt jeder Zeile und addiert dann. Bei einer Rechnung mit vielen kleinen Zeilen kann diese Summe einen Cent von der USt abweichen, die auf der Basis je Satz berechnet wird. Stammen alle Zahlen der Datei aus derselben Berechnung, stimmen die Summen. Enthält die Datei die USt-Gesamtsumme von Odoo neben einer je Satz neu berechneten Aufstellung, scheitert BR-CO-14; enthält sie den Gesamtbetrag mit USt von Odoo neben einer neu berechneten USt, scheitert BR-CO-15. Damit BR-CO-17 anschlägt, muss die Abweichung 1 € übersteigen.
Die Rundungsmethode ist eine Unternehmenseinstellung, keine Einstellung je Rechnung: Eine Änderung wirkt sich auf die ab diesem Moment berechneten Steuern aus. Nehmen Sie sie zwischen zwei Rechnungen vor, niemals bei einer halb fertigen.
Was die Factur-X von Odoo macht
In der Factur-X (CII) von Odoo 18, 19 und 20 wird der Gesamtbetrag mit USt (BT-112) als Summe aus Basis (BT-109) und USt (BT-110) geschrieben, die bereits in der Datei stehen, eben um BR-CO-15 zu erfüllen. Das sichert die Summenregel; die übrige Kette hängt weiterhin davon ab, dass die Aufstellung aufgeht.
Mit unserem Modul für XRechnung und ZUGFeRD
Das Modul erzeugt das XML mit eigenem Code und vermischt heute beide Berechnungen. Die USt je Satz (BT-117) berechnet es als Basis mal Satz und übernimmt den Gesamtbetrag mit USt (in UBL) bzw. die USt gesamt (in CII) aus der Odoo-Rechnung. Bei der Rundung pro Zeile genügt ein Cent Abweichung: Das XML kommt mit BR-CO-15 in XRechnung UBL und mit BR-CO-14 in XRechnung CII heraus, dem Standardformat des Moduls. Wir haben es mit dem Validator von KoSIT geprüft. In Odoo 17 und 18 ist die Rundung pro Zeile der Standard.
Bei einer Teilzahlung scheitert BR-CO-16: Der offene Betrag (BT-115) ist, was in Odoo noch offen ist, die Datei enthält aber nicht den bereits gezahlten Betrag (BT-113).

In Odoo 18, 19 und 20 durchläuft mit dem Abonnement FlexigoTech Cloud jede XRechnung und jede ZUGFeRD EN 16931, die das Modul erzeugt, die Regeln von KoSIT, zu denen diese sechs gehören. Scheitert eine, wird sie auf der Rechnung unter Validation Errors vermerkt, und die Rechnung wird nicht als Ready to send markiert. In Odoo 17 validiert die veröffentlichte Version nicht: Die Datei geht mit dem Fehler und ohne Warnung hinaus.
Was zu tun ist
- Sehen Sie im Bericht nach, welche Regel zuerst scheitert: BR-S-08 weist auf die Basen, BR-CO-14 auf die Aufstellung, BR-CO-15 auf den Gesamtbetrag und BR-CO-17 auf die USt eines Satzes.
- Prüfen Sie die Rundungsmethode des Unternehmens und besprechen Sie bei vielen Zeilen in E-Rechnungen mit Ihrem Steuerberater die Rundung pro Steuer.
- BR-CO-16 tritt bei Teilzahlungen oder Kassenrundung auf: Der bezahlte Betrag und der Rundungsbetrag müssen in die Datei. Erzeugen Sie mit unserem Modul die XRechnung, bevor Sie eine Zahlung erfassen.
- Korrigieren und neu erzeugen; bearbeiten Sie das XML nicht von Hand.
Weiterlesen
Geprüft im Quellcode des Moduls (Version 17.0 und 20.0) und in den verlinkten Quellen
Quellen
- github.com/ConnectingEurope/eInvoicing-EN16931/releases/tag/validation-1.3.17
- Quellcode des Moduls: flexigo_germany_xrechnung 20.0 (446f2f68): lib/generators/ubl_generator.py
- Quellcode des Moduls: flexigo_germany_xrechnung 20.0 (446f2f68): lib/generators/cii_generator.py
- Quellcode des Moduls: 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_
- Quellcode des Moduls: flexigo_germany_xrechnung 20.0 (446f2f68): models/xrechnung_cloud.py
- Quellcode des Moduls: flexigo_germany_xrechnung 20.0 (446f2f68): models/account_move.py
- Quellcode des Moduls: flexigo_germany_xrechnung 17.0 (ad05de8f): __manifest__.py
