1. Faktura KSeF XML w 'świecie' EDI
2. EDI INVOICE a Faktura KSeF XML
3. Mapowanie EDI INVOICE na pola KSeF FA(3)
4. Reguły walidacyjne
5. Tematy powiązane
1. Faktura KSeF XML w 'świecie' EDI
Faktury KSeF sa jedynym dokumentem stwierdzającym transakcje. (#KSeF)
Firmy, które wymieniały dane transakcyjne przy pomocy komunikatów EDI
teraz muszą włączyć się do wymiany faktur KSeF - wystawiać faktury sprzedaży
i pobierać faktury zakupu.
Włączenie KSeF do 'świata EDI' zostało zarysowane w artykule:
KSeF. Faktury a komunikaty EDI
Podstawowe tezy:
- Komunikaty EDI typu ORDER, DESADV, INVRPT itp. nie są częścią KSeF.
Pozostają w gestii systemów ERP i platform EDI.
- EDI nadal będzie wykorzystywane do wymiany danych handlowych i logistycznych,
które nie są fakturami.
- Firmy będą musiały zintegrować swoje systemy ERP/EDI z KSeF, aby faktury
były przesyłane zgodnie z nowymi przepisami, ale pozostałe komunikaty będą
nadal przesyłane jak dotychczas - np. przez AS2, FTP, API czy e-mail.
- Konieczna jest integracja ERP z KSeF - zarówno do wysyłania, jak i odbierania faktur.
- EDI pozostaje ważnym kanałem komunikacji, ale jego rola zmienia się - staje się uzupełnieniem,
a nie głównym nośnikiem faktury.
- KSeF nie zawiera wprost danych rozszerzonych, takich jak numery seryjne,
lokalizacja magazynowa, dane techniczne.
- Jeśli klient wymaga danych rozszerzonych (np. numery seryjne, kody partii, dane logistyczne),
ERP może wygenerować dodatkowy komunikat EDI (np. INVOICE) zawierający te informacje.
- Jezeli klient wymaga danych rozszerzonych to skuteczną i prostszą metodą jest włączenie
tych danych do faktury KSeF w sekcji: DodatkowyOpis
2. EDI INVOICE a Faktura KSeF XML
W Polsce wprowadza się Clearance e-invoicing model.
Polega na tym, że faktury przechodzą przez platformy rządowe aby urzędy podatkowe
miały bieżący (real-time) wgląd do transakcji.
Taki scentralizowany model istnieje w Polsce, Rumunii i we Włoszech.
W takim modelu traci rację bytu EDI INVOICE. Zostaje zastąpione przez fakturę KSeF.
Firmy pobierają dane faktury z FA(3), a brakujące dane procesowe uzupełniaja przez <DodatkowyOpis>.
Firmy nie chcą utrzymywać dwóch równoległych strumieni tej samej faktury (KSeF + EDI INVOICE).
Gdy platforma państwowa jest 'źródłem prawdy', EDI INVOICE staje się zbędne jako nośnik faktury.
Takie podejście już jest częste w krajach, które mają lub wprowadzają model Clearance e-invoicing model.
Wtedy wiele firm zaczyna traktować XML z platformy rządowej jako główne źródło danych faktury,
a klasyczny EDI INVOICE bywa ograniczany albo wyłączany.
W wielu firmach układ docelowy wygląda tak:
* KSeF (lub inna platforma) = prawny i księgowy dokument faktury
* EDI = reszta łańcucha supply chain (zamówienia, dostawy, rozliczenia)
Dlaczego firmy uzupełniają dane przez: <DodatkowyOpis> ?
To jest sposób na 'wstrzyknięcie' do faktury danych, które kiedyś często były w EDI
albo w dodatkowych uzgodnieniach (np. NumerPozycjiZamowienia, IDTowaruWgNabywcy)
To zmniejsza liczbę kanałów integracji, ale:
* wymaga bardzo dobrego mapowania danych (zamówienie -> pozycje faktury, KIM -> ID nabywcy),
* i dyscypliny formatów (np. numery pozycji, zamówień).
3. Mapowanie EDI INVOICE na pola KSeF FA(3)
Na przykładzie specyfikacji: Grupa Kingfisher plc
Marki: Castorama, Brico Dépôt, B&Q, Screwfix, Koçtaş, TradePoint.
Teza:
KSeF FA(3) + uzupełnienia w `<DodatkowyOpis>` może funkcjonalnie zastąpić komunikat
EDI INVOICE, bo w ich przewodniku wprost wymagają pól, które w EDI zwykle były krytyczne
do automatycznego dopasowania (zamówienie, ASN/WZ, GLN dostawy) oraz dopisują brakujące
atrybuty pozycji przez `<DodatkowyOpis>` .
3.1 Mapowanie EDI INVOICE na pola KSeF FA(3) (Castorama)
Nagłówek
* `InvoiceNumber` -> `<Fa><P_2>` (numer faktury)
* `InvoiceDate` -> `<Fa><P_1>` (data wystawienia)
* `SalesDate` / `DeliveryDate` (jeśli wspólne) -> `<Fa><P_6>` (data dostawy/sprzedaży, gdy wspólna)
* `InvoiceCurrency` -> `<Fa><KodWaluty>`
* `BuyerOrderNumber`, `BuyerOrderDate` -> `<Fa><WarunkiTransakcji><Zamowienia><NrZamowienia>` i `<DataZamowienia>`
* Uwaga: NrZamowienia ma mieć dokładnie 10 znaków, dopełnianie zerami z przodu
* `DespatchNumber` (ASN) -> `<Fa><WZ>` (numer dokumentu magazynowego ASN)
* `DeliveryLocationNumber` (GLN dostawy) -> `<Fa><WarunkiTransakcji><Transport><WysylkaDo><GLN>`
Strony (GLN)
Castorama wymaga też GLN w nagłówkach podmiotów:
* GLN dostawcy -> `<Podmiot1><Adres><GLN>`
* GLN Castorama -> `<Podmiot2><Adres><GLN>`
Pozycje: EDI -> KSeF + brakujące pola w `<DodatkowyOpis>`
To, co w EDI i da się przenieść wprost do `<FaWiersz>`
W FA(3) pozycja ma m.in.:
* `LineNumber` -> `<FaWiersz><NrWierszaFa>`
* `ItemDescription` -> `<FaWiersz><P_7>`
* `SupplierItemCode` -> `<FaWiersz><Indeks>`
* `EAN` -> `<FaWiersz><GTIN>`
* `UnitOfMeasure` -> `<FaWiersz><P_8A>`
* `InvoiceQuantity` -> `<FaWiersz><P_8B>`
* `InvoiceUnitNetPrice` -> `<FaWiersz><P_9A>`
* `TaxRate` -> `<FaWiersz><P_12>`
To, czego NIE ma w EDI, a Castorama chce w `<DodatkowyOpis>`
Castorama wymaga użycia `<DodatkowyOpis>`
(często per wiersz, z `<NrWiersza>` wskazującym numer pozycji faktury) dla kluczy takich jak:
* `IDTowaruWgNabywcy` (ID towaru wg nabywcy)
* `NumerPozycjiZamowienia` (numer pozycji zamówienia, max 5 znaków)
* `LiczbaWJednostceZbiorczej`
* `JmWJednostceZbiorczej`
oraz (nagłówkowo):
* `Numer noty`
* `NumerFSC`
Przykład sposobu zapisu (z `<NrWiersza>`):
Wniosek praktyczny: jeżeli do tej pory te dane szły w EDI innymi kanałami
(ORDERS/PRICAT/uzgodnienia) albo były 'domyślane', to przy przejściu na KSeF
trzeba je skądś zasilić w generowanym XML (z zamówienia Castoramy, kartoteki indeksów wg nabywcy,
danych logistycznych itd.).
3.2 Czy można zastąpić EDI INVOICE ?
* Tak, jeśli Castorama faktycznie procesuje faktury wyłącznie z KSeF FA(3)
i wymaga uzupełnienia brakujących pól przez `<DodatkowyOpis>` oraz wymagane pola zamówienie/ASN/GLN.
Wtedy KSeF staje się nośnikiem danych faktury jak INVOICE.
* Nie w pełni, jeśli EDI INVOICE było elementem szerszego obiegu (np. automatyczne
rozliczenie płatności/komunikaty zwrotne/rozbieżności).
KSeF tego nie zastępuje 'z definicji' - to zależy od procesów Castoramy poza samą fakturą.
Uzupełnienie opisu mapowania:
NumerPozycjiZamowienia bierze sie z zamówienia [ZL]
IDTowaruWgNabywcy bierze się z kartoteki: Kody u odbiorców (wg KIM) (169: OfIndeks C 20)
4. Reguły walidacyjne
Oznaczenia
BLOCK = nie pozwól wysłać do KSeF, WARN = pozwól wysłać, ale pokaż ostrzeżenie
4.1 Walidacja 1
0) Zasada nadrzędnaBLOCK, jeśli brakuje któregokolwiek z 'kluczy dopasowania':
NrZamowienia (10 znaków), WZ/ASN, GLN dostawy,
oraz na każdej pozycji: NumerPozycjiZamowienia i IDTowaruWgNabywcy1) Walidacje nagłówka (FA)1.1 Zamówienie
* BLOCK: brak `NrZamowienia` w `WarunkiTransakcji/Zamowienia`
* BLOCK: `NrZamowienia` po normalizacji nie ma dokładnie 10 znaków cyfr
(zastosuj dopełnienie zerami z lewej)
* WARN: `DataZamowienia` pusta albo > `DataWystawienia` (często błąd danych)
1.2 WZ / ASN
* BLOCK: brak `WZ` (ASN)
* BLOCK: długość `WZ` > 16 znaków
* WARN: `WZ` ma znaki inne niż [A-Z0-9/-]
1.3 GLN-y
* BLOCK: brak GLN sprzedawcy (`Podmiot1/Adres/GLN`) i/lub GLN odbiorcy (`Podmiot2/Adres/GLN`)
* BLOCK: brak GLN dostawy (`Transport/WysylkaDo/GLN`)
* BLOCK: GLN nie ma 13 cyfr (bez spacji)
* WARN: GLN dostawy # GLN nabywcy (bywa OK, ale warto sygnalizować)
1.4 Daty i waluta
* BLOCK: brak `P_1` (data wystawienia) lub `P_2` (nr faktury)
* WARN: `P_6` (data dostawy/sprzedaży wspólna) jest pusta mimo że u Was
zwykle jest dostawa tego samego dnia
* WARN: waluta # PLN (jeśli odbiorca oczekuje PLN w tym procesie)
2) Walidacje pozycji (FaWiersz + DodatkowyOpis)2.1 Spięcie NrWiersza
* BLOCK: `NrWierszaFa` nie jest unikalny lub nie jest liczbą > 0
* BLOCK: jest `DodatkowyOpis/NrWiersza`, który nie pasuje do żadnego `NrWierszaFa`
* WARN: numery wierszy nie są ciągłe 1..N (technicznie może przejść, ale utrudnia diagnostykę)
2.2 Wymagane klucze na każdej pozycji
Dla każdego `NrWierszaFa`:
* BLOCK: brak `DodatkowyOpis` z kluczem `IDTowaruWgNabywcy`
* BLOCK: `IDTowaruWgNabywcy` > 35 znaków albo puste
* BLOCK: brak `DodatkowyOpis` z kluczem `NumerPozycjiZamowienia`
* BLOCK: `NumerPozycjiZamowienia` > 5 znaków albo puste
* WARN: `NumerPozycjiZamowienia` zawiera litery/spacje (zwykle powinno być numeryczne)
2.3 Opakowania zbiorcze (jeśli wymagane w Waszym strumieniu)
* WARN -> BLOCK (jeśli odbiorca wymaga zawsze):
brak `LiczbaWJednostceZbiorczej` lub `JmWJednostceZbiorczej`
* BLOCK: `LiczbaWJednostceZbiorczej` 0
* WARN: `JmWJednostceZbiorczej` `P_8A` (nie zawsze błąd, ale często)
2.4 Dane towaru i ilości/ceny
* BLOCK: brak `P_7` (nazwa) lub `P_8A` (JM) lub `P_8B` (ilość) lub `P_9A`
(cena netto) albo wartości niepoprawne (<=0, nienumeryczne)
* WARN: brak GTIN/Indeks, jeśli u Was normalnie są (nie zawsze wymagane, ale pomaga w sporach)
2.5 Spójność z zamówieniem (Twoje źródła danych)
Skoro masz numer pozycji zamówienia w zamówieniu:
* BLOCK: `NumerPozycjiZamowienia` nie istnieje w zamówieniu dla `NrZamowienia`
* WARN: ilość na fakturze > ilość zamówiona (jeśli u Was to bywa dopuszczalne, zostaw WARN)
* WARN: ten sam `NumerPozycjiZamowienia` pojawia się na wielu wierszach faktury
(może być OK przy podziale, ale warto oznaczyć)
Skoro `IDTowaruWgNabywcy` jest w KIM:
* BLOCK: brak mapowania w KIM dla danego indeksu/GTIN -> nie generuj faktury do odbiorcy
* WARN: mapowanie jest, ale nieaktywne / wygasłe (jeśli macie daty obowiązywania)
3) Walidacje sum i VAT (żeby KSeF i odbiorca liczyli tak samo)
* BLOCK: suma pozycji netto # `P_13_x` (z tolerancją np. 0,01 po zaokrągleniach)
* BLOCK: VAT z pozycji # `P_14_x` (tolerancja 0,01)
* BLOCK: brutto # netto+VAT (tolerancja 0,01)
* WARN: na fakturze są stawki VAT inne niż spodziewane dla tego kontrahenta/asortymentu (np. 23/8/0)
4) Walidacje 'porządku danych' (bardzo praktyczne)
* BLOCK: w `DodatkowyOpis` występuje ten sam `Klucz` wielokrotnie dla tego samego `NrWiersza`
(albo przyjmij regułę: bierz ostatni i WARN)
* WARN: znaki specjalne w wartościach (np. nowe linie, taby) - znormalizuj do spacji
* WARN: nadmiarowe spacje w `NrZamowienia`, `WZ`, GLN - trim/normalizacja przed wysyłką
5) Minimalny 'profil' decyzji BLOCK/WARN (proponowany)BLOCK (krytyczne dla dopasowania):
* brak/format: NrZamowienia (10), WZ (16), GLN-y (13), klucze pozycji `IDTowaruWgNabywcy`
i `NumerPozycjiZamowienia`, spięcie NrWiersza
* niespójne sumy/VAT
WARN (kontrola jakości / spory):
* daty nietypowe, brak GTIN, ilość > zamówiona, duplikaty numerów pozycji zamówienia, rozjazdy JM opakowań
4.2 Walidacja 2
Walidacje BLOCK/WARN w trzech punktach procesuPunkt 1: przy zapisie ZL (zamówienia)BLOCK
1. ZL bez numeru zamówienia OBI (bo potem nie zbudujesz `NrZamowienia`)
WARN
2. Numer zamówienia ma nietypowy format (np. spacje) -> normalizuj (trim)
Komunikat (przykład):
* `OBI: Brak numeru zamówienia (ZL). Uzupełnij numer zamówienia OBI - wymagany do KSeF.`
Punkt 2: przy zamykaniu / zatwierdzaniu ROBLOCK
1. RO nie jest powiązany dokładnie z jednym ZL (złamane 1:1)
2. RO bez numeru WZ/rozchodu (bo wymagane do `Fa/WZ`)
Komunikat:
* `OBI: RO musi wynikać z jednego ZL (1:1). Popraw powiązania.`
* `OBI: Brak numeru WZ/RO. Uzupełnij numer rozchodu - wymagany w polu FA/WZ.`
Punkt 3: przed eksportem/wysłaniem FA do KSeF (najważniejsze)BLOCK (krytyczne dla OBI)
1. Brak `Fa/WZ`
2. Brak `NrZamowienia` w `WarunkiTransakcji/Zamowienia`
3. Brak `IDDostawcyWgNabywcy=123456654321` w `DodatkowyOpis` (nagłówek)
4. Brak Podmiot3 (`Rola=2` + `IDWew=01234321`)
5. Na jakiejkolwiek pozycji brak `IDTowaruWgNabywcy` w `DodatkowyOpis`
z poprawnym `NrWiersza` (OBI uznaje numer artykułu za niezbędny)
6. `DodatkowyOpis/NrWiersza` wskazuje nieistniejący `NrWierszaFa` (błąd przypięcia)
WARN (rekomendowane)
7) Numer faktury przekracza 16 znaków lub ma znaki specjalne -
OBI może obcinać/usuwać znaki, co psuje uzgodnienia
8) Brak GTIN przy pozycji (jeśli u Was zawsze jest)
9) ILOŚĆ/CENA = 0 lub ujemne (zwykle błąd)
Komunikaty (proponowane, 'serwisowalne')
* `OBI/KSeF: Brak IDDostawcyWgNabywcy. Uzupełnij w kartotece kontrahenta
OBI (wartość: 123456654321).`
* `OBI/KSeF: Brak Podmiot3 (Rola=2) z IDWew=01234321. Uzupełnij identyfikację marketu.`
* `OBI/KSeF: Pozycja {nr}: Brak IDTowaruWgNabywcy (nr artykułu OBI) w KIM. Uzupełnij kartotekę i ponów.`
* `OBI/KSeF: Niespójna numeracja pozycji - DodatkowyOpis NrWiersza={x} nie pasuje do NrWierszaFa.`
* `OBI: Numer faktury zawiera znaki specjalne / jest dłuższy niż 16. Zalecana zmiana numeracji dla OBI.`