Budowa faktury UBL

Pełna budowa faktury UBL wyjaśniona krok po kroku: od nagłówka i stron, przez pozycje fakturowe, po sumy VAT.

Faktura UBL składa się ze stałego zestawu bloków. Niezależnie od tego, czy wysyłają Państwo faktury za pośrednictwem platformy eConnect, przez PSB API, czy budują własną integrację, niezwykle pomocna jest wiedza o tym, jakie elementy zawiera faktura UBL i w jakiej kolejności są ułożone. Niniejszy artykuł omawia strukturę od początku do końca.

Ogólny zarys

UBL Invoice (wersja 2.1) składa się z czterech głównych obszarów, zawsze w następującej kolejności:

  1. Poziom faktury: identyfikacja, typ, daty i odniesienia
  2. Strony: kto wysyła, kto odbiera i opcjonalnie kto otrzymuje płatność
  3. Informacje o płatności i dostawie: jak i kiedy następuje płatność
  4. Blok finansowy: sumy VAT, sumy fakturowe i poszczególne pozycje faktury

W ramach każdego głównego obszaru elementy następują w stałej kolejności XML. Kolejność ta jest narzucona przez standard UBL. Zmiana kolejności powoduje odrzucenie faktury podczas walidacji.

1. Poziom faktury
Identyfikacja i typ

Każda faktura zaczyna się od kilku obowiązkowych elementów identyfikujących fakturę jako całość:

<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID>
<cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>
<cbc:ID>F-2026-00042</cbc:ID>
<cbc:IssueDate>2026-03-08</cbc:IssueDate>
<cbc:DueDate>2026-04-07</cbc:DueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>

CustomizationID informuje odbiorcę, jaki profil stosuje faktura (na przykład NLCIUS lub BIS Billing V3). ProfileID identyfikuje proces biznesowy. InvoiceTypeCode wskazuje, czy jest to zwykła faktura (380), wariant noty kredytowej (381) czy faktura self-billing (389).

Wskazówka: eConnect automatycznie rozpoznaje profil na podstawie CustomizationID. Nie trzeba niczego konfigurować.

Odniesienia

Po identyfikacji następują opcjonalne odniesienia. Najczęstsze to numer zamówienia (OrderReference), ale można również odwoływać się do kontraktu, projektu lub wcześniej wysłanej faktury:

<cac:OrderReference>
  <cbc:ID>PO-2026-1234</cbc:ID>
</cac:OrderReference>
<cac:ContractDocumentReference>
  <cbc:ID>CT-2025-5678</cbc:ID>
</cac:ContractDocumentReference>

Dla organizacji odbierających, które przetwarzają faktury automatycznie (dotyczy to dużych korporacji i instytucji publicznych), numer zamówienia jest często obowiązkowy. Bez numeru zamówienia faktura nie zostaje zaakceptowana.

Załączniki

Wiele faktur zawiera PDF jako załącznik wizualny. Jest on umieszczany jako plik zakodowany w base64 w elemencie AdditionalDocumentReference (EmbeddedDocumentBinaryObject). eConnect może automatycznie dodać ten załącznik podczas wysyłki.

Czy osadzony PDF jest pokazywany na platformie eConnect jako PDF faktury (widok faktury na dashboardzie), zależy od dokładnej wartości wykrywania w tym bloku:

  • cbc:DocumentDescription = CommercialInvoice (camelCase, bez spacji), lub
  • DocumentType = PrimaryImage

Tekst "Commercial Invoice" oznacza to samo, ale wykrywanie platformy podąża wyłącznie za dokładnym literałem powyżej. Bez tego tagu PDF liczy się jako zwykły załącznik zamiast widoku faktury. Zobacz Statusy — faktura przychodząca tylko XML czy także PDF?.

2. Strony

Faktura UBL przewiduje co najmniej dwie strony i opcjonalnie trzecią oraz czwartą.

Dostawca (AccountingSupplierParty)

Nadawca faktury. Dane obowiązkowe to nazwa, adres i co najmniej jeden numer identyfikacji podatkowej (numer VAT lub numer rejestrowy). W Holandii numer KvK jest podstawowym identyfikatorem Peppol:

<cac:AccountingSupplierParty>
  <cac:Party>
    <cbc:EndpointID schemeID="0106">12345678</cbc:EndpointID>
    <cac:PartyName>
      <cbc:Name>Voorbeeldbedrijf B.V.</cbc:Name>
    </cac:PartyName>
    <cac:PostalAddress>
      <cbc:StreetName>Kerkstraat 1</cbc:StreetName>
      <cbc:CityName>Woerden</cbc:CityName>
      <cbc:PostalZone>3441 AB</cbc:PostalZone>
      <cac:Country>
        <cbc:IdentificationCode>NL</cbc:IdentificationCode>
      </cac:Country>
    </cac:PostalAddress>
    <cac:PartyTaxScheme>
      <cbc:CompanyID>NL123456789B01</cbc:CompanyID>
      <cac:TaxScheme>
        <cbc:ID>VAT</cbc:ID>
      </cac:TaxScheme>
    </cac:PartyTaxScheme>
    <cac:PartyLegalEntity>
      <cbc:RegistrationName>Voorbeeldbedrijf B.V.</cbc:RegistrationName>
      <cbc:CompanyID schemeID="0106">12345678</cbc:CompanyID>
    </cac:PartyLegalEntity>
  </cac:Party>
</cac:AccountingSupplierParty>
Odbiorca (AccountingCustomerParty)

Odbiorca faktury. Struktura jest identyczna jak dostawcy. EndpointID to adres Peppol, pod który faktura jest kierowana.

Strony opcjonalne

W niektórych przypadkach występują dodatkowe strony:

  • PayeeParty: gdy kwota ma być przekazana stronie innej niż dostawca (np. przy faktoringu)
  • TaxRepresentativeParty: gdy przedstawiciel podatkowy odprowadza VAT w imieniu dostawcy (występuje przy zagranicznych dostawcach zobowiązanych do VAT w Holandii)
3. Płatność i dostawa
Metoda płatności (PaymentMeans)

Ten blok opisuje sposób płatności za fakturę. Zawiera metodę płatności (przelew, polecenie zapłaty), numer rachunku bankowego i opcjonalnie identyfikator płatności:

<cac:PaymentMeans>
  <cbc:PaymentMeansCode>30</cbc:PaymentMeansCode>
  <cbc:PaymentID>RF71 2348 2367</cbc:PaymentID>
  <cac:PayeeFinancialAccount>
    <cbc:ID>NL91ABNA0417164300</cbc:ID>
    <cbc:Name>Voorbeeldbedrijf B.V.</cbc:Name>
  </cac:PayeeFinancialAccount>
</cac:PaymentMeans>

Kod 30 oznacza przelew bankowy, 49 polecenie zapłaty automatyczne, 58 polecenie zapłaty SEPA. Pełna lista kodów jest zdefiniowana w UNCL4461.

Warunki płatności (PaymentTerms)

Pole tekstowe z opisem warunków płatności. Niektóre systemy wykorzystują je również do skonta (rabatu za wcześniejszą płatność).

Informacje o dostawie (Delivery)

Opcjonalne. Zawiera datę dostawy i adres dostawy, istotne przy dostawach towarów.

4. Blok finansowy
Dopłaty i rabaty na poziomie faktury (AllowanceCharge)

Przed sumami VAT umieszczane są ewentualne rabaty lub dopłaty na poziomie faktury. Każdy element ma wskaźnik (true = dopłata, false = rabat), kwotę i kategorię VAT:

<cac:AllowanceCharge>
  <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
  <cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
  <cbc:AllowanceChargeReason>Korting</cbc:AllowanceChargeReason>
  <cbc:Amount currencyID="EUR">50.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>

AllowanceCharge może również występować w elemencie Price pozycji fakturowej, aby pokazać różnicę między ceną brutto a ceną jednostkową netto. Na poziomie ceny obowiązuje ograniczenie: dozwolone są wyłącznie rabaty (ChargeIndicator=false), nie dopłaty. Ponadto reguła walidacji BR-28 stanowi, że cena brutto nie może być ujemna. Więcej szczegółów znajduje się w artykule o dopłatach i rabatach.

Sumy VAT (TaxTotal)

VAT jest podsumowany według stawki. Każda stawka otrzymuje własny TaxSubtotal z podstawą opodatkowania i obliczoną kwotą VAT:

<cac:TaxTotal>
  <cbc:TaxAmount currencyID="EUR">42.00</cbc:TaxAmount>
  <cac:TaxSubtotal>
    <cbc:TaxableAmount currencyID="EUR">200.00</cbc:TaxableAmount>
    <cbc:TaxAmount currencyID="EUR">42.00</cbc:TaxAmount>
    <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:TaxSubtotal>
</cac:TaxTotal>

Kategoria VAT S oznacza stawkę standardową. Inne często używane kody to Z (stawka zerowa), E (zwolniony), AE (odwrotne obciążenie krajowe), K (wewnątrzwspólnotowy) i G (eksport).

Sumy faktury (LegalMonetaryTotal)

Blok zamykający fakturę. Tutaj znajdują się wszystkie kwoty, które razem tworzą kwotę do zapłaty:

<cac:LegalMonetaryTotal>
  <cbc:LineExtensionAmount currencyID="EUR">250.00</cbc:LineExtensionAmount>
  <cbc:TaxExclusiveAmount currencyID="EUR">200.00</cbc:TaxExclusiveAmount>
  <cbc:TaxInclusiveAmount currencyID="EUR">242.00</cbc:TaxInclusiveAmount>
  <cbc:AllowanceTotalAmount currencyID="EUR">50.00</cbc:AllowanceTotalAmount>
  <cbc:PayableAmount currencyID="EUR">242.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

Obliczenie: LineExtensionAmount (suma wszystkich kwot pozycji) minus AllowanceTotalAmount (rabaty) plus ChargeTotalAmount (dopłaty) = TaxExclusiveAmount. Do tego VAT = TaxInclusiveAmount. Minus ewentualne przedpłaty (PrepaidAmount) = PayableAmount. Obliczenie musi być dokładnie poprawne, w przeciwnym razie walidacja kończy się niepowodzeniem.

Pozycje faktury (InvoiceLine)

Każda faktura ma co najmniej jedną pozycję. Pozycja zawiera numer porządkowy, fakturowaną ilość, kwotę pozycji, opis artykułu i informacje o VAT:

<cac:InvoiceLine>
  <cbc:ID>1</cbc:ID>
  <cbc:InvoicedQuantity unitCode="EA">10</cbc:InvoicedQuantity>
  <cbc:LineExtensionAmount currencyID="EUR">250.00</cbc:LineExtensionAmount>
  <cac:Item>
    <cbc:Name>Consultancy-uren maart 2026</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">25.00</cbc:PriceAmount>
  </cac:Price>
</cac:InvoiceLine>

Pozycja fakturowa może również zawierać rabat lub dopłatę (poprzez zagnieżdżony element AllowanceCharge), odwoływać się do pozycji zamówienia oraz zawierać dodatkowe dane artykułu, takie jak numery artykułów lub informacje księgowe.

Techniczne: pole AccountingCost na pozycji faktury jest często używane do przekazania centrum kosztów lub wymiaru. Systemy odbierające takie jak AFAS, Unit4 i SAP mogą odczytać to pole w celu automatycznego księgowania. Szczególnym zastosowaniem jest Referentiegrootboekschema (RGS): umieszczając numer referencyjny RGS w AccountingCost, oprogramowanie księgowe odbiorcy może automatycznie zaksięgować kwotę na właściwym koncie księgowym. PSB transportuje element AccountingCost bez zmian w UBL.

Wszystko musi się zgadzać

Siła faktury UBL tkwi w wewnętrznej spójności. Sumy VAT muszą dokładnie odpowiadać VAT na każdej pozycji. Sumy faktury muszą być dokładnie sumą kwot pozycji minus rabaty plus dopłaty. Jeśli jest różnica choćby o grosz, faktura zostaje odrzucona podczas walidacji.

eConnect automatycznie waliduje każdą fakturę przy jej przesyłaniu i w przypadku rozbieżności podaje jasny komunikat o błędzie. Tam, gdzie to możliwe, małe odchylenia (takie jak brakujące pole, które można wywnioskować z kontekstu) są automatycznie naprawiane.

Często zadawane pytania
Co się stanie, jeśli moja faktura zostanie odrzucona podczas walidacji?

eConnect podaje jasny komunikat o błędzie wskazujący, który element jest nieprawidłowy. Najczęstszymi przyczynami są błędy obliczeniowe w sumach VAT, brakujące pola obowiązkowe lub nieprawidłowe kody. Niewielkie odchylenia (takie jak brakujące pole, które można wydedukować) są automatycznie korygowane tam, gdzie to możliwe.

Czy muszę samodzielnie wypełnić wszystkie elementy faktury UBL?

To zależy od sposobu fakturowania. Jeśli tworzy Państwo faktury na platformie eConnect, wszystkie wymagane elementy są wypełniane automatycznie. Przy wysyłce przez API trzeba samodzielnie podać wymagane pola, ale eConnect waliduje wszystko i podaje jasną informację zwrotną o brakujących lub nieprawidłowych danych.

Czy mogę użyć wielu stawek VAT na jednej fakturze?

Tak. Każda pozycja faktury ma własną kategorię VAT i stawkę procentową. W bloku TaxTotal stawki są automatycznie grupowane w oddzielne TaxSubtotals. W ten sposób można łączyć na jednej fakturze pozycje z 21%, 9%, 0% lub zwolnionym VAT.


Chcą Państwo lepiej zrozumieć konkretną część faktury? Poniższe artykuły szczegółowo omawiają najczęstsze scenariusze.

Wskazówka: prosimy skorzystać z bezpłatnego Walidatora eConnect, aby sprawdzić fakturę przed wysłaniem. Walidator sprawdza nie tylko strukturę schematu, ale również wszystkie reguły obliczeniowe i listy kodów.

Zwaliduj swoją fakturę

Powiązane