Różnice zaokrągleń w fakturach UBL

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ć.

Dlaczego powstają różnice zaokrągleń?

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.

Jak UBL obsługuje różnice zaokrągleń
Liczba miejsc po przecinku: aktualne i przyszłe zasady

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):

  • BT-129 Invoiced quantity: 4 miejsca po przecinku.
  • BT-146 Item net price, BT-147 Item price discount, BT-148 Item gross price: minor unit ISO 4217 + 2 dodatkowe miejsca po przecinku.
  • BT-149 Item price base quantity: 2 miejsca po przecinku.
  • Pola procentowe (m.in. BT-138 procent rabatu, BT-152 stawka VAT): 2 miejsca po przecinku.

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.

Liczba miejsc dziesiętnych: aktualna i przyszła reguła

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):

  • BT-129 Invoiced quantity: 4 miejsca dziesiętne.
  • BT-146 Item net price, BT-147 Item price discount, BT-148 Item gross price: minor unit ISO 4217 + 2 dodatkowe miejsca dziesiętne.
  • BT-149 Item price base quantity: 2 miejsca dziesiętne.
  • Pola procentowe (m.in. BT-138 procent rabatu, BT-152 stawka VAT): 2 miejsca dziesiętne.

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.

PayableRoundingAmount

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.

Zaokrąglanie VAT według stawki

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ń.

Ceny z VAT

W przypadku cen zawierających VAT należy obliczyć kwotę netto. Standardowe podejście jest następujące:

  1. Obliczyć kwotę netto dla pozycji: brutto / (1 + stawka VAT/100)
  2. Zaokrąglić do 2 miejsc po przecinku
  3. LineExtensionAmount to ta kwota netto
  4. Różnica między sumą wszystkich kwot netto pozycji a łączną kwotą brutto minus VAT może skutkować różnicą zaokrąglenia
  5. Tę różnicę absorbuje PayableRoundingAmount
<!-- 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.

Jak eConnect radzi sobie z tą sytuacją

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.

Praktyczne zasady
  1. Obliczać VAT według stawki, nie według pozycji. Najpierw zsumować wszystkie kwoty pozycji według stawki VAT, a następnie obliczyć VAT od tej sumy.
  2. Zaokrąglać dopiero na końcu. Wewnętrznie pracować z więcej niż dwoma miejscami po przecinku i zaokrąglać dopiero przy wypełnianiu elementów XML.
  3. Używać PayableRoundingAmount dla ostatniego grosza. Jeśli pomimo prawidłowego zaokrąglania pozostaje niewielka różnica, należy ją zaabsorbować tym elementem.
  4. Sprawdzać sumę. TaxExclusiveAmount + TaxAmount musi być równe TaxInclusiveAmount. A TaxInclusiveAmount minus PrepaidAmount plus PayableRoundingAmount musi być równe PayableAmount.
  5. Testować za pomocą walidatora eConnect. Przed wysłaniem faktury należy ją przepuścić przez walidator. Sprawdza on wszystkie reguły obliczeniowe.
Najczęściej zadawane pytania
Jak zapobiec różnicom zaokrągleń w fakturze?

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.

Czym jest 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.

Czy eConnect może automatycznie naprawiać różnice zaokrągleń?

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ę