Dopłaty i rabaty

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.

Dwa poziomy: dokument i pozycja

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.

AllowanceCharge na poziomie dokumentu

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:

KodTypZnaczenie41RabatBonus za wcześniejszą płatność42RabatRabat wprowadzający60RabatRabat producenta95RabatRabat100RabatPorozumienie specjalneABLDopłataKoszty opakowaniaFCDopłataKoszty transportuAEWDopłataDopłata środowiskowa

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.

Wpływ na podsumowania faktury

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.

AllowanceCharge na poziomie pozycji

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: LineExtensionAmount musi 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ć.

Obliczanie VAT przy wielu rabatach

Jeśli faktura zawiera zarówno rabaty na poziomie pozycji, jak i rabaty na poziomie dokumentu, podstawy opodatkowania VAT oblicza się następująco:

  1. Dla każdej pozycji: LineExtensionAmount (już z uwzględnieniem rabatów na poziomie pozycji)
  2. Dla każdej kategorii VAT: suma wszystkich kwot pozycji w danej kategorii
  3. Minus rabaty na poziomie dokumentu w tej samej kategorii
  4. Plus dopłaty na poziomie dokumentu w tej samej kategorii
  5. Wynik stanowi TaxableAmount w TaxSubtotal

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

Podział proporcjonalny przy wielu stawkach VAT

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.

AllowanceCharge na poziomie ceny

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.

Rabat wyższy niż cena artykułu

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.

Połączenie ze skontem

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ę

Powiązane