Wzory tak, jak zapisuje je Schematron
| Reguła | Tekst 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). |
Wszystkie sześć są krytyczne. Czytaj je jako łańcuch: pozycje sumują się do podstawy każdej stawki (BR-S-08), każda podstawa razy jej stawka daje VAT tej stawki (BR-CO-17 i BR-S-09), VAT według stawek sumuje się do VAT całkowitego (BR-CO-14), podstawa plus VAT daje wartość brutto (BR-CO-15), a wartość brutto minus zapłacona kwota plus zaokrąglenie daje kwotę pozostałą do zapłaty (BR-CO-16).

Które reguły zauważają jeden grosz
Nie wszystkie liczą grosze. BR-CO-17 i BR-S-09 porównują VAT każdej stawki (BT-117) z podstawą razy stawka, ale Schematron daje im margines 1 € w obie strony. BR-S-08 porównuje podstawy, więc zaokrąglenie VAT na nią nie wpływa. BR-CO-14, BR-CO-15 i BR-CO-16 porównują sumy zaokrąglone do dwóch miejsc po przecinku, bez marginesu: tam jeden grosz to już błąd.
Grosz pojawia się, gdy VAT można policzyć na dwa sposoby. Odoo liczy go zgodnie z metodą zaokrąglania podatków ustawioną w firmie (Tax Calculation Rounding Method):
| Wersja Odoo | Opcje | Domyślnie |
|---|---|---|
| Odoo 17 i 18 | Round per Line lub Round Globally | Na linię |
| Odoo 19 i 20 | Round per Tax lub Round per Line | Na podatek |
Przy zaokrągleniu na linię Odoo zaokrągla VAT każdej pozycji, a potem sumuje. Na fakturze z wieloma drobnymi pozycjami ta suma może różnić się o grosz od VAT policzonego od podstawy każdej stawki. Jeśli wszystkie liczby w pliku pochodzą z tego samego obliczenia, sumy się zgadzają. Jeśli plik zawiera VAT całkowity z Odoo obok rozbicia przeliczonego na stawki, pada BR-CO-14; jeśli zawiera wartość brutto z Odoo obok przeliczonego VAT, pada BR-CO-15. Żeby zadziałała BR-CO-17, różnica musi przekroczyć 1 €.
Metoda zaokrąglania to ustawienie firmy, a nie faktury: zmiana wpływa na podatki liczone od tego momentu. Rób ją między fakturami, nigdy w połowie jednej.
Co robi Factur-X z Odoo
W Factur-X (CII) w Odoo 18, 19 i 20 wartość brutto (BT-112) zapisywana jest jako suma podstawy (BT-109) i VAT (BT-110), które już są w pliku, dokładnie po to, by spełnić BR-CO-15. To zabezpiecza regułę sumy; reszta łańcucha nadal zależy od tego, czy rozbicie się zgadza.
Z naszym modułem XRechnung i ZUGFeRD
Moduł buduje XML własnym kodem i obecnie łączy oba obliczenia. VAT każdej stawki (BT-117) liczy jako podstawę razy stawkę, a wartość brutto (w UBL) lub VAT całkowity (w CII) kopiuje z faktury Odoo. Przy zaokrągleniu na linię wystarczy grosz różnicy: XML wychodzi z BR-CO-15 w XRechnung UBL i z BR-CO-14 w XRechnung CII, czyli w formacie domyślnym modułu. Sprawdziliśmy to walidatorem KoSIT. W Odoo 17 i 18 zaokrąglanie na linię jest domyślne.
Przy płatności częściowej pada BR-CO-16: kwota do zapłaty (BT-115) to to, co w Odoo jeszcze otwarte, ale plik nie zawiera kwoty już zapłaconej (BT-113).

W Odoo 18, 19 i 20, z subskrypcją FlexigoTech Cloud, każdy XRechnung i każdy ZUGFeRD EN 16931 generowany przez moduł przechodzi przez reguły KoSIT, które obejmują tych sześć. Jeśli któraś zawiedzie, zostaje zapisana na fakturze, w Validation Errors, a faktura nie jest oznaczana jako Ready to send. W Odoo 17 opublikowana wersja nie waliduje: plik wychodzi z błędem i bez ostrzeżenia.
Co zrobić
- Sprawdź w raporcie, która reguła pada jako pierwsza: BR-S-08 wskazuje podstawy, BR-CO-14 rozbicie, BR-CO-15 sumę, a BR-CO-17 VAT jednej stawki.
- Sprawdź metodę zaokrąglania firmy i, jeśli wystawiasz e-faktury z wieloma pozycjami, omów zaokrąglanie na podatek z księgowym.
- BR-CO-16 pojawia się przy płatnościach częściowych lub zaokrągleniu gotówkowym: kwota zapłacona i kwota zaokrąglenia muszą być w pliku. Z naszym modułem generuj XRechnung przed zarejestrowaniem jakiejkolwiek płatności.
- Popraw i wygeneruj ponownie; nie edytuj XML ręcznie.
Czytaj dalej
Sprawdzone w kodzie źródłowym modułu (wersja 17.0 i 20.0) i w podlinkowanych źródłach
Źródła
- github.com/ConnectingEurope/eInvoicing-EN16931/releases/tag/validation-1.3.17
- Kod modułu: flexigo_germany_xrechnung 20.0 (446f2f68): lib/generators/ubl_generator.py
- Kod modułu: flexigo_germany_xrechnung 20.0 (446f2f68): lib/generators/cii_generator.py
- Kod modułu: 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_
- Kod modułu: flexigo_germany_xrechnung 20.0 (446f2f68): models/xrechnung_cloud.py
- Kod modułu: flexigo_germany_xrechnung 20.0 (446f2f68): models/account_move.py
- Kod modułu: flexigo_germany_xrechnung 17.0 (ad05de8f): __manifest__.py
