AllowanceCharge w fakturach UBL: różnica między poziomem dokumentu a poziomem pozycji, obliczanie VAT i przykłady XML.
Niemal każda organizacja stosuje rabaty lub dopłaty na fakturach. Rabat ilościowy, koszty transportu, rabat za wczesną rezerwację, opłaty środowiskowe: to wszystko kwoty, które wpływają na końcową sumę faktury. W fakturze UBL są one rejestrowane za pomocą elementu AllowanceCharge, który może występować na dwóch poziomach. Różnica między tymi poziomami jest kluczowa dla prawidłowego obliczenia faktury.
UBL przewiduje dopłaty i rabaty w dwóch miejscach:
Poziom dokumentu: element AllowanceCharge znajduje się bezpośrednio pod elementem głównym faktury, przed podsumowaniami VAT. Rabaty na poziomie dokumentu obniżają łączną kwotę faktury. Dopłaty na poziomie dokumentu ją zwiększają. Oba typy są uwzględniane w obliczeniu VAT.
Poziom pozycji: element AllowanceCharge znajduje się wewnątrz InvoiceLine. Rabaty i dopłaty na poziomie pozycji są już uwzględnione w LineExtensionAmount danej pozycji. Wpływają na kwotę pozycji, a nie na sumę faktury jako taką.
Różnica jest subtelna, ale istotna. Rabat na poziomie dokumentu jest widoczny osobno w podsumowaniach faktury (w AllowanceTotalAmount). Rabat na poziomie pozycji jest wliczony w kwotę pozycji i niewidoczny w podsumowaniach.
Każdy rabat lub dopłata na poziomie dokumentu zawiera co najmniej następujące elementy:
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
<cbc:AllowanceChargeReason>Rabat ilościowy Q1 2026</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="EUR">150.00</cbc:Amount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>21.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:AllowanceCharge>
ChargeIndicator określa, czy jest to dopłata (true) czy rabat (false). AllowanceChargeReasonCode to kod z listy UNCL5189 (dla rabatów) lub UNCL7161 (dla dopłat). Najczęściej używane kody to:
Wskazówka: jeśli żaden ze standardowych kodów nie pasuje dokładnie, należy użyć kodu 95 (rabat) lub najbardziej odpowiedniego kodu dopłaty i opisać powód w
AllowanceChargeReason.
Rabaty i dopłaty na poziomie dokumentu są odzwierciedlone w LegalMonetaryTotal:
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="EUR">1000.00</cbc:LineExtensionAmount>
<cbc:AllowanceTotalAmount currencyID="EUR">150.00</cbc:AllowanceTotalAmount>
<cbc:TaxExclusiveAmount currencyID="EUR">850.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">1028.50</cbc:TaxInclusiveAmount>
<cbc:PayableAmount currencyID="EUR">1028.50</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
Obliczenie: 1.000 (suma pozycji) minus 150 (rabat) = 850 netto. Plus 178,50 VAT (21% od 850) = 1.028,50 brutto.
Na poziomie pozycji mechanizm działa inaczej. Rabat lub dopłata jest już uwzględniony w LineExtensionAmount. Element AllowanceCharge na pozycji służy jako informacja objaśniająca:
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="EA">100</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">850.00</cbc:LineExtensionAmount>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
<cbc:AllowanceChargeReason>Rabat progowy</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="EUR">150.00</cbc:Amount>
<cbc:BaseAmount currencyID="EUR">1000.00</cbc:BaseAmount>
</cac:AllowanceCharge>
<cac:Item>
<cbc:Name>Widget standard</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>21.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="EUR">8.50</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
LineExtensionAmount wynosi 850 euro: 100 sztuk x 10 euro = 1.000 euro, minus 150 euro rabatu progowego. BaseAmount w AllowanceCharge pokazuje pierwotną kwotę przed rabatem. PriceAmount (8,50) to efektywna cena jednostkowa po rabacie.
Uwaga:
LineExtensionAmountmusi zawsze odpowiadać kwocie netto po rabacie/dopłacie. AllowanceCharge na pozycji ma charakter informacyjny. Nie należy go ponownie odejmować od kwoty pozycji, ponieważ wówczas faktura nie będzie się zgadzać.
Jeśli faktura zawiera zarówno rabaty na poziomie pozycji, jak i rabaty na poziomie dokumentu, podstawy opodatkowania VAT oblicza się następująco:
LineExtensionAmount (już z uwzględnieniem rabatów na poziomie pozycji)TaxableAmount w TaxSubtotalVAT jest naliczany od tej podstawy netto. Dlatego niezbędne jest, aby każdy rabat i dopłata na poziomie dokumentu miały przypisaną kategorię VAT: system musi wiedzieć, do której stawki należy rabat.
Gdy AllowanceCharge na poziomie dokumentu dotyczy faktury z pozycjami w różnych stawkach VAT (na przykład 9% i 21%), kwota rabatu lub dopłaty musi zostać rozdzielona proporcjonalnie między kategorie VAT. Oznacza to: proporcjonalnie do udziału każdej kategorii w łącznej kwocie podstaw opodatkowania.
Załóżmy, że faktura zawiera 2.000 euro pozycji z VAT 21% i 1.000 euro pozycji z VAT 9%. Rabat na poziomie dokumentu w wysokości 300 euro należy ująć jako dwa oddzielne elementy AllowanceCharge: 200 euro przy 21% (dwie trzecie) i 100 euro przy 9% (jedna trzecia). Podstawa opodatkowania dla każdej kategorii jest wówczas obliczana prawidłowo.
Oprócz poziomu dokumentu i pozycji, UBL przewiduje trzecie miejsce dla rabatów: wewnątrz elementu Price pozycji faktury. Mechanizm ten pokazuje różnicę między ceną brutto a ceną jednostkową netto.
<cac:Price>
<cbc:PriceAmount currencyID="EUR">8.50</cbc:PriceAmount>
<cbc:BaseQuantity unitCode="EA">1</cbc:BaseQuantity>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:Amount currencyID="EUR">1.50</cbc:Amount>
<cbc:BaseAmount currencyID="EUR">10.00</cbc:BaseAmount>
</cac:AllowanceCharge>
</cac:Price>
W tym przykładzie cena brutto (BaseAmount) wynosi 10,00 euro. Po odliczeniu rabatu 1,50 euro pozostaje cena jednostkowa netto (PriceAmount) w wysokości 8,50 euro.
Na poziomie ceny dozwolone jest wyłącznie ChargeIndicator=false (rabat). Dopłaty (ChargeIndicator=true) nie są w tym miejscu dozwolone. Ponadto reguła walidacji BR-28 stanowi, że cena brutto (BaseAmount) nie może być ujemna. Jeśli chcą Państwo zastosować dopłatę do ceny jednostkowej, należy ją ująć jako AllowanceCharge na poziomie pozycji lub podać podwyższoną cenę bezpośrednio jako PriceAmount.
Szczególny przypadek występuje, gdy rabat na poziomie pozycji (AllowanceCharge na pozycji) przekracza cenę artykułu. Reguła walidacji Peppol R120 sprawdza, czy LineExtensionAmount = (Quantity × PriceAmount ÷ BaseQuantity) + dopłaty − rabaty. R120 nie zabrania wprost kwot ujemnych; walidacja kończy się niepowodzeniem, gdy to obliczenie nie jest spójne. Gdy rabat przekracza cenę, istnieje duże prawdopodobieństwo, że obliczenie nie będzie poprawne.
Taki scenariusz występuje w praktyce przy notach kredytowych z wysokimi rabatami. Rozwiązanie: należy użyć kwoty netto kredytu (różnicy między ceną a rabatem) bezpośrednio jako PriceAmount i pominąć element AllowanceCharge na pozycji. Oryginalną cenę i zastosowany rabat można podać informacyjnie w polu Item/Name lub w elemencie Note na pozycji faktury.
Uwaga: to obejście jest przeznaczone dla sytuacji, w których rabat przekracza cenę. Przy standardowych rabatach, które nie przekraczają ceny, należy normalnie stosować element AllowanceCharge na pozycji.
Skonto za wcześniejszą płatność to coś zupełnie innego niż rabat na fakturze. Rabat na fakturze poprzez AllowanceCharge jest bezwarunkowy i bezpośrednio obniża kwotę faktury. Skonto jest warunkowe (zależy od terminu płatności) i nie jest uwzględniane w kwocie faktury. Szczegóły znajdą Państwo w artykule o skoncie za wcześniejszą płatność.
Wskazówka: jeśli mają Państwo wątpliwości, czy AllowanceCharge został prawidłowo ujęty, należy przesłać fakturę przez bezpłatny Walidator eConnect. Sprawdza on, czy podstawy opodatkowania VAT są prawidłowo obliczane po odliczeniu rabatów i dopłat.
Zweryfikuj fakturę