Przejdź do głównej zawartości

Przykład: Faktura sprzedaży (OINV)

Ten rozdział przeprowadza krok po kroku przez profil OINV_FA3_SERVICE_LAYER_FULL — referencyjny profil mapowania dla standardowej faktury sprzedaży SAP B1 (tabela OINV) do formatu FA(3) KSeF.

Profil wykorzystuje 12 źródeł danych, wykonywanych w kolejności:

Główne dane nagłówka faktury z Service Layer:

Invoices({DocEntry})?$select=DocEntry,DocNum,DocDate,DocDueDate,TaxDate,
CardCode,CardName,DocTotal,DocTotalFC,VatSum,VatSumFC,
DocCurrency,Comments,PaymentMethod,...

Zwraca: numer dokumentu, daty, kwoty, walutę, kontrahenta.

Dane walutowe — używane gdy faktura jest w walucie obcej:

Invoices({DocEntry})?$select=DocTotalFC,VatSumFC,DocRate

Dane sprzedawcy z endpointu CompanyInfo:

CompanyInfo?$select=CompanyName,TaxIdNumber,AddressLine1,City,ZipCode,Country

Zwraca: NIP firmy, nazwę, adres.

Dane nabywcy z BusinessPartners:

BusinessPartners('{invoice.CardCode}')?$select=CardCode,CardName,
FederalTaxID,BPAddresses,Country,...

Zwraca: NIP kontrahenta, nazwę, adres.

Sprawdzenie czy kraj nabywcy jest w UE:

Countries('{buyer.Country}')?$select=Code,EU

Zwraca: EU = "tYES" lub "tNO".

Rozszerzone dane nabywcy UE — numer VAT UE:

BusinessPartners('{invoice.CardCode}')?$select=UnifiedFederalTaxID

Warunki płatności:

PaymentTermsTypes({invoice.PaymentGroupCode})?$select=PaymentTermsGroupName,NumberOfAdditionalDays

Rozszerzone informacje o płatności (termin, metoda).

Konto bankowe sprzedawcy:

CompanyInfo?$select=DefaultBankAccount,IBAN

Szczegóły banku — kod SWIFT, nazwa banku.

Pozycje faktury:

Invoices({DocEntry})/DocumentLines?$select=VisualOrder,ItemDescription,
Quantity,Price,GrossTotal,LineTotal,VatGroup,VatPercent,MeasureUnit,...

Tablica — każdy wiersz generuje element FaWiersz w XML.

Podsumowanie VAT pogrupowane po stawce:

Invoices({DocEntry})/DocumentLines?$select=VatPercent,
&$apply=groupby((VatPercent),aggregate(LineTotal with sum as NetTotal, ...))

Tablica — każdy wiersz generuje sekcję podsumowania P_13/P_14.

Ścieżka XMLŹródłoTransformacjaWynik
Faktura.Naglowek.KodFormularzaCONST("FA")FA
Faktura.Naglowek.WariantFormularzaCONST("3")3
Faktura.Naglowek.DataWytworzeniaFainvoiceTaxDate2026-03-15
Faktura.Naglowek.SystemInfoCONST("BizFlowNH")BizFlowNH
Ścieżka XMLŹródłoPoleOpis
Faktura.Fa.KodWalutyinvoiceDocCurrencyWaluta (PLN, EUR…)
Faktura.Fa.P_1invoiceTaxDateData wystawienia
Faktura.Fa.P_2invoiceDocDateData sprzedaży
Faktura.Fa.P_6invoiceDocNum|PREFIX("FV/")Numer faktury
Ścieżka XMLŹródłoPole
Faktura.Podmiot1.DaneIdentyfikacyjne.NIPsellerTaxIdNumber|REGEX("[^0-9]","")
Faktura.Podmiot1.DaneIdentyfikacyjne.NazwasellerCompanyName|TRIM
Faktura.Podmiot1.Adres.KodKrajusellerCONST("PL")
Faktura.Podmiot1.Adres.AdresL1sellerAddressLine1|TRIM
Faktura.Podmiot1.Adres.MiejscowoscLsellerCity|TRIM
Faktura.Podmiot1.Adres.KodPocztowyLsellerZipCode|TRIM
Ścieżka XMLŹródłoPole
Faktura.Podmiot2.DaneIdentyfikacyjne.NIPbuyerFederalTaxID|REGEX("[^0-9]","")
Faktura.Podmiot2.DaneIdentyfikacyjne.NazwabuyerCardName|TRIM
Faktura.Podmiot2.Adres.KodKrajubuyerCountry
Faktura.Podmiot2.Adres.AdresL1buyerStreet|TRIM

Generowane z tablicowego źródła lines:

Ścieżka XMLPoleOpis
Faktura.Fa.FaWiersz.NrWierszaFaEXPR("[VisualOrder] + 1")Numer wiersza
Faktura.Fa.FaWiersz.P_7ItemDescription|TRIMNazwa towaru/usługi
Faktura.Fa.FaWiersz.P_8BQuantityIlość
Faktura.Fa.FaWiersz.P_8AMeasureUnit|TRIMJednostka miary
Faktura.Fa.FaWiersz.P_9APriceCena jednostkowa netto
Faktura.Fa.FaWiersz.P_11LineTotalWartość netto wiersza
Faktura.Fa.FaWiersz.P_11AGrossTotalWartość brutto wiersza
Faktura.Fa.FaWiersz.P_12VatGroup|VATMAPStawka VAT (kategoria KSeF)

Faktura w PLN używa pól DocTotal, VatSum. Faktura walutowa (np. EUR) używa pól DocTotalFC, VatSumFC:

// Kwota brutto — PLN
Faktura.Fa.P_15 → DocTotal|IF_FIELD_EQ("DocCurrency","PLN")
// Kwota brutto — waluta obca
Faktura.Fa.P_15 → DocTotalFC|IF_FIELD_NEQ("DocCurrency","PLN")

System generuje oba mapowania — ale transformacja warunkowa powoduje, że tylko jedno daje wynik.

Dla nabywców z UE dodawane są dodatkowe pola:

// Tylko dla nabywców UE
Faktura.Podmiot2.DaneIdentyfikacyjne.NrVatUE →
UnifiedFederalTaxID|IF_FIELD_EQ("country_info.EU","tYES")|TRIM

Gdy kontrahent nie ma NIPu (np. osoba fizyczna):

// Jeśli NIP jest pusty, ustaw BrakID na 1
Faktura.Podmiot2.DaneIdentyfikacyjne.BrakID →
FederalTaxID|IF_EMPTY|CONST("1")

Pole BrakID = 1 informuje KSeF, że nabywca nie ma numeru identyfikacji podatkowej.

Sekcje P_13/P_14 generowane z tablicowego źródła vat_summary:

// Netto VAT 23%
Faktura.Fa.P_13_1 → NetTotal|VATFILTER("23")|SUM
// Kwota VAT 23%
Faktura.Fa.P_14_1 → VATAmount|VATFILTER("23")|SUM
// Netto VAT 8%
Faktura.Fa.P_13_3 → NetTotal|VATFILTER("8")|SUM
// Kwota VAT 8%
Faktura.Fa.P_14_3 → VATAmount|VATFILTER("8")|SUM

Profil OINV_FA3_SERVICE_LAYER_FULL można eksportować jako JSON i importować u innego klienta:

  • Eksport: otwórz profil — menu — Eksportuj JSON
  • Import: w liście profili — Importuj — wybierz plik JSON

Eksportowany JSON zawiera pełną definicję profilu: źródła danych, mapowania pól i mapowania VAT. Po imporcie należy zweryfikować, że kody VAT i zapytania SQL odpowiadają konfiguracji docelowego SAP.

Profil OINV_FA3_SERVICE_LAYER_FULL jest punktem wyjścia. Dla konkretnego klienta można go dostosować:

  • Zmienić zapytania SQL — jeśli klient używa niestandardowych pól SAP
  • Dodać transformacje — np. REPLACE na nazwie ulicy
  • Zmienić stałe — np. numer wersji formularza
  • Dodać źródła — np. dodatkowe dane z UDF

Zalecany workflow:

  1. Zaimportuj profil bazowy
  2. Uruchom podgląd na istniejącej fakturze
  3. Porównaj z oczekiwanym XML
  4. Dostosuj mapowania tam, gdzie dane się różnią
  5. Przetestuj na kilku fakturach przed włączeniem na produkcji