Kiedy KSeF uznaje fakturę za duplikat
KSeF wykrywa duplikaty globalnie, na wszystkich fakturach zapisanych w systemie. Decyduje połączenie trzech pól:
- NIP sprzedawcy,
Podmiot1:NIP; - rodzaj faktury,
RodzajFaktury; - numer faktury,
P_2, który według schematu FA(3) ma jednoznacznie identyfikować fakturę.
Unikalność obowiązuje przez 10 pełnych lat, liczonych od końca roku, w którym wystawiono fakturę. Liczy się zawsze NIP sprzedawcy: gdy w imieniu jednej firmy faktury wystawia kilka oddziałów albo jednostek, muszą uzgodnić numerację.

Co jest w odpowiedzi, a co w Odoo
W odpowiedzi KSeF status 440 ma opis „Duplikat faktury” i dwa pola w extensions: originalKsefNumber, czyli numer KSeF faktury, która już jest w systemie, oraz originalSessionReferenceNumber, czyli sesja, w której trafiła. Przykład z dokumentacji API ma w details komunikat w rodzaju „Duplikat faktury. Faktura o numerze KSeF: … została już prawidłowo przesłana do systemu w sesji: …”.
W Odoo 18, 19 i 20 moduł l10n_pl_edi ustawia „KSeF Status” na Rejected i dopisuje do historii „Status KSeF: Odrzucono (Kod: 440). Powielona faktura.” (18 i 19 po polsku) albo „KSeF Status: Rejected (Code: 440). Duplicate invoice.” (20, bez tłumaczenia). Pól extensions Odoo nie zapisuje, więc numeru KSeF oryginału w fakturze nie zobaczysz. Jako P_2 Odoo wpisuje numer faktury z Odoo.
Skąd duplikat przy fakturach z Odoo
| Sytuacja | Co się dzieje |
|---|---|
| Faktura trafiła już do KSeF innym kanałem, a potem wysłano ją z Odoo | Oryginał jest w KSeF, nowa wysyłka dostaje 440. |
| Ten sam NIP wystawia w dwóch bazach albo firmach Odoo z identycznymi seriami | Dwie różne faktury mają ten sam rodzaj i numer. |
| Oddziały jednej firmy prowadzą osobne numeracje, które się pokrywają | KSeF liczy NIP sprzedawcy, nie oddział. |
Odoo wysyła tylko faktury bez stanu KSeF. Faktury w stanie Sent albo Accepted nie da się więc przypadkiem wysłać drugi raz z tego samego Odoo.
Jak to rozwiązać
- Ustal, gdzie jest oryginał: numer KSeF z
originalKsefNumberalbo faktura o tym numerze w KSeF. - Jeśli to ta sama faktura, wysłana wcześniej innym kanałem, nie wysyłaj jej znowu. Każda kolejna wysyłka pod tym numerem da 440.
- Jeśli to inna faktura z tym samym numerem, problem leży w numeracji: ustal z księgowością osobne serie dla każdej bazy, firmy albo oddziału z tym samym NIP.
Czy po kodzie 440 faktura jest w KSeF?
Tak, w KSeF jest faktura pierwotna, ta z originalKsefNumber. Odrzucona została tylko nowa wysyłka.
Jak długo KSeF pamięta numer faktury?
Przez 10 pełnych lat od końca roku wystawienia. Do tego czasu ten sam NIP, rodzaj i numer dadzą 440.

Z naszym modułem
Poland KSeF 2.0 Validator nie wysyła faktur, ale ma przycisk „Oznacz jako przyjętą przez KSeF” (w angielskim interfejsie „Mark accepted by KSeF”) dla faktury wgranej do KSeF poza Odoo, z numerem KSeF, który nadał system. Jeśli taką fakturę później wyśle jeszcze l10n_pl_edi i KSeF ją odrzuci, moduł zostawia ją jako przyjętą i dopisuje: „KSeF odrzucił ponowną wysyłkę tej faktury przez l10n_pl_edi, już przyjętej przez KSeF z numerem KSeF …: pozostaje przyjęta.”. W pozostałych przypadkach przejmuje od l10n_pl_edi stan Rejected, bez kodu 440.
Czytaj dalej
Sprawdzone w kodzie źródłowym modułu (wersja 20.0) i w podlinkowanych źródłach
Źródła
- Kod modułu: flexigo_poland_ksef_2_0_e_invoice_connector_and_migrati 20.0 (ba7c60f1): i18n/pl.po
- github.com/CIRFMF/ksef-api/blob/ce3670ea042de380039de4c5849fd6455811b292/open-api.json
- github.com/CIRFMF/ksef-api/blob/ce3670ea042de380039de4c5849fd6455811b292/faktury/weryfikac
- github.com/CIRFMF/ksef-client-csharp/blob/a66cbc669814e6c2a615748a13a0a04a650ba04f/KSeF.Cl
- github.com/CIRFMF/ksef-api/blob/ce3670ea042de380039de4c5849fd6455811b292/faktury/schemy/FA
- github.com/odoo/odoo/blob/2982b5f44af03fae6a9888f20632c1cc19f623ba/addons/l10n_pl_edi/mode
- github.com/odoo/odoo/blob/4d2d4b5895db70596863df941d9a1f0beeb117f8/addons/l10n_pl_edi/mode
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/mode
- github.com/odoo/odoo/blob/2982b5f44af03fae6a9888f20632c1cc19f623ba/addons/l10n_pl_edi/i18n
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/i18n
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/data
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/mode
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/mode
- github.com/odoo/odoo/blob/2fec20391a8a61ea3a3bf15e9f24d59dba910a8d/addons/l10n_pl_edi/mode
- Kod modułu: flexigo_poland_ksef_2_0_e_invoice_connector_and_migrati 20.0 (ba7c60f1): models/account_move.py
- Kod modułu: flexigo_poland_ksef_2_0_e_invoice_connector_and_migrati 20.0 (ba7c60f1): views/account_move_views.xml
