Jak zapobiegać i prawidłowo obsługiwać różnice zaokrągleń w fakturach UBL: PayableRoundingAmount, zaokrąglanie VAT i ceny z VAT.
Jeden z najbardziej frustrujących komunikatów o błędzie podczas wysyłania e-faktur dotyczy różnicy zaokrągleń. Sumy VAT nie zgadzają się z kwotami w pozycjach lub łączna kwota faktury różni się o grosz od obliczonej sumy. Rezultat: faktura zostaje odrzucona podczas walidacji. Niniejszy artykuł wyjaśnia, skąd biorą się różnice zaokrągleń i jak im zapobiegać lub je rozwiązywać.
Różnice zaokrągleń wynikają z połączenia trzech czynników: mnożenia, dzielenia i zaokrąglania do dwóch miejsc po przecinku. Oto kilka przykładów:
Cena jednostkowa z wieloma miejscami dziesiętnymi. Cena 3,333... euro za sztukę x 3 sztuki = 9,999 euro. Po zaokrągleniu to 10,00 euro. Ale jeśli najpierw zaokrąglimy cenę jednostkową do 3,33 i pomnożymy: 3,33 x 3 = 9,99. Jeden grosz różnicy.
VAT na pozycję a VAT od sumy. Jeśli VAT jest obliczany i zaokrąglany dla każdej pozycji faktury osobno, a następnie sumowany, suma może się różnić od VAT obliczonego od łącznej kwoty. Przy 21% VAT od 33,33 euro otrzymujemy 7,00 euro (zaokrąglone). Ale 21% od 3 x 33,33 = 21% od 99,99 = 21,00 euro. Natomiast 3 x 7,00 = 21,00 euro. W tym przypadku wynik jest prawidłowy, ale przy innych kwotach może się nie zgadzać.
Ceny z VAT. Niektóre branże (handel detaliczny, gastronomia) pracują z cenami zawierającymi VAT. Kwota netto musi zostać obliczona wstecz, co wprowadza dodatkowy moment zaokrąglenia.
EN 16931-1:2017 (aktualna wersja produkcyjna) nakazuje zaokrąglanie wszystkich kwot do 2 miejsc po przecinku, niezależnie od waluty.
Rewizja EN 16931-1:2026 (zatwierdzenie CEN 13 marca 2026, urn:cen.eu:en16931:2026) zastępuje to liczbą miejsc po przecinku zależną od waluty: liczba miejsc po przecinku = kolumna „minor unit” normy ISO 4217 dla używanej waluty. Implementacja Peppol przez OpenPeppol jest planowana jako BIS Billing 4.0 (orientacyjnie 2027). Do momentu uruchomienia tej wersji obowiązuje bieżąca zasada 2 miejsc po przecinku.
Wyjątki w 2026 roku (stałe, niezależnie od waluty):
Wpływ na eConnect: faktury wychodzące są zawsze wystawiane w euro (minor unit 2) — brak zmian. Faktury przychodzące mogą zawierać waluty z minor unit do 4 — przetwarzanie musi obsługiwać do 4 miejsc po przecinku. Zobacz również EN 16931-1:2026 główne zmiany dla pełnego przeglądu.
EN 16931-1:2017 (aktualna wersja produkcyjna) wymaga, aby wszystkie kwoty były zaokrąglane do 2 miejsc dziesiętnych, niezależnie od waluty.
Rewizja EN 16931-1:2026 (zatwierdzenie CEN 13 marca 2026 r., urn:cen.eu:en16931:2026) zastępuje to walutowo zależną liczbą miejsc dziesiętnych: liczba miejsc dziesiętnych = kolumna „minor unit" normy ISO 4217 dla używanej waluty. Wdrożenie Peppol przez OpenPeppol jest oczekiwane jako BIS Billing 4.0 (orientacyjnie 2027 r.). Do momentu wejścia tej wersji do produkcji obowiązuje aktualna reguła 2 miejsc dziesiętnych.
Wyjątki w 2026 r. (stałe, niezależnie od waluty):
Wpływ na eConnect: faktury wychodzące są zawsze wysyłane w euro (minor unit 2) — bez zmian. Faktury przychodzące mogą zawierać waluty z minor unit do 4 — przetwarzanie musi obsługiwać do 4 miejsc dziesiętnych. Zobacz również EN 16931-1:2026 najważniejsze zmiany dla pełnego przeglądu.
Standard UBL przewiduje specjalny element dla różnic zaokrągleń: PayableRoundingAmount w bloku LegalMonetaryTotal. Ten element absorbuje niewielkie różnice zaokrągleń, dzięki czemu PayableAmount może być okrągłą kwotą:
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="EUR">99.99</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="EUR">99.99</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">120.99</cbc:TaxInclusiveAmount>
<cbc:PayableRoundingAmount currencyID="EUR">0.01</cbc:PayableRoundingAmount>
<cbc:PayableAmount currencyID="EUR">121.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
Różnica 0,01 euro jest wskazana jawnie. Reguły walidacji dopuszczają PayableRoundingAmount, pod warunkiem że różnica jest wystarczająco mała (zazwyczaj maksymalnie 1 euro, w zależności od profilu).
XPath: Invoice/LegalMonetaryTotal/PayableRoundingAmount.
Przykład 1 (zaokrąglenie w górę): TaxInclusiveAmount wynosi 9,99 euro, pożądana kwota do zapłaty to 10,00 euro. Wtedy PayableRoundingAmount = 0,01 euro i PayableAmount = 10,00 euro.
Przykład 2 (brak zmiany PayableAmount): przy obliczeniu ceny z 4 miejscami dziesiętnymi może powstać submikrorozbżność, np. 8,2646 × 1,21 = 10,000166. W takim przypadku PayableAmount pozostaje bez zmian i PayableRoundingAmount nie jest potrzebny.
Obliczanie VAT w fakturze UBL odbywa się według stawki VAT, a nie według pozycji. Wszystkie kwoty pozycji z tą samą stawką VAT są sumowane, tworząc podstawę opodatkowania (TaxableAmount), od której obliczany jest VAT. Zapobiega to zaokrąglaniu dla każdej pozycji z osobna i kumulowaniu się różnic zaokrągleń.
Wzór jest następujący:
TaxableAmount = suma LineExtensionAmount według kategorii VAT
- AllowanceTotalAmount według kategorii VAT
+ ChargeTotalAmount według kategorii VAT
TaxAmount = TaxableAmount × Percent / 100 (zaokrąglone do 2 miejsc po przecinku)
Ważne: VAT należy zawsze obliczać od łącznej podstawy opodatkowania według stawki, nie od poszczególnych pozycji. Obliczanie VAT per pozycja jest najczęstszą przyczyną różnic zaokrągleń.
W przypadku cen zawierających VAT należy obliczyć kwotę netto. Standardowe podejście jest następujące:
brutto / (1 + stawka VAT/100)LineExtensionAmount to ta kwota nettoPayableRoundingAmount<!-- Cena z VAT: €12,10 za sztukę, 3 sztuki -->
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="EA">3</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">30.00</cbc:LineExtensionAmount>
<cac:Price>
<cbc:PriceAmount currencyID="EUR">10.00</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
W tym przykładzie cena z VAT wynosi 12,10 euro. Kwota netto to 10,00 euro za sztukę (12,10 / 1,21). Razy 3 = 30,00 euro. VAT: 21% z 30,00 = 6,30 euro. Łącznie: 36,30 euro. To dokładnie odpowiada 3 x 12,10 euro. Jednak przy cenach, które nie dzielą się równo, powstaje różnica.
eConnect waliduje każdą fakturę pod kątem wewnętrznej spójności. Jeśli występuje niewielka różnica zaokrąglenia mieszcząca się w tolerancji, faktura zostaje zaakceptowana. W przypadku większych odchyleń otrzymają Państwo czytelny komunikat o błędzie wskazujący, gdzie znajduje się różnica.
Funkcja automatycznej naprawy XML w eConnect może w niektórych przypadkach dodać brakujący PayableRoundingAmount, jeśli różnica jest mniejsza od progu tolerancji. Jednak zawsze lepiej jest prawidłowo obsługiwać zaokrąglanie we własnym oprogramowaniu.
TaxExclusiveAmount + TaxAmount musi być równe TaxInclusiveAmount. A TaxInclusiveAmount minus PrepaidAmount plus PayableRoundingAmount musi być równe PayableAmount.Obliczać VAT według stawki (nie według pozycji), wewnętrznie pracować z więcej niż dwoma miejscami po przecinku i zaokrąglać dopiero przy wypełnianiu elementów XML. Jeśli pomimo prawidłowego zaokrąglania pozostaje niewielka różnica, należy ją zaabsorbować elementem PayableRoundingAmount.
To specjalny element UBL, który absorbuje małe różnice zaokrągleń w sumach faktury. Różnica jest jawnie wskazana, dzięki czemu faktura mimo wszystko przechodzi walidację. Większość profili dopuszcza maksymalnie 1 euro.
W niektórych przypadkach funkcja automatycznej naprawy XML może dodać brakujący PayableRoundingAmount, jeśli różnica mieści się w progu tolerancji. Jednak zawsze lepiej jest prawidłowo obsługiwać zaokrąglanie we własnym oprogramowaniu.
Zweryfikuj fakturę