0

Faktury korygujące w KSeF — podstawowe zasady i pułapki

KatarzynaLewandowska18 mar0 wyświetleń

Witam,

Chciałbym podzielić się doświadczeniami z obsługi faktur korygujących w KSeF, bo widzę że temat budzi sporo wątpliwości.

Podstawy prawne znajdziemy w art. 106j ust. 3 ustawy o VAT, który określa wymogi dla faktur korygujących w systemie. **Kluczowa zasada**: każda faktura korygująca musi zawierać referencję do faktury pierwotnej poprzez wskazanie numeru KSeF faktury korygowanej.

W praktyce wygląda to tak:

1. Faktura oryginalna otrzymuje swój unikalny numer KSeF po przesłnaiu do systemu

2. Faktura korygująca musi w elemencie `<tns:DaneKorekcyjne>` zawierać referencję do tego numeru

3. System automatycznie powiązuje obie faktury

Z mojego doświadczenia najczęstsze błędy to:

- Próba wystawienia korekty przed otrzymaniem potwierdzenia przyjęcia faktury pierwotnej

- Nieprawidłowe wskazanie numeru KSeF w strukturze XML

- Pomylenie numeru KSeF z numerem własnym faktury

Ważne: zgodnie z § 15 rozporządzenia w sprawie KSeF, korekta może dotyczyć tylko faktury, która została już przyjęta przez system. Oznacza to, że musimy poczekać na status "Przyjęta" przed wystawieniem korekty.

Jeden praktyczny tip — w środowisku demo warto przetestować cały proces przed przejściem na produkcję. Szczególnie jeśli macie zautomatyzowane systemy księgowe.

Czy ktoś miał do czynienia z korektami częściowymi? Zastanawiam się nad optymalizacją procesu dla klientów z dużą ilością korekt.

6 odpowiedzi

0
Bardzo dobry post! Przeszłam dokładnie przez te same problemy podczas testowania faktur korygujących na demo. **Co do korekt częściowych** - to ciekawy temat. W moim doświadczeniu najlepiej dizałają korekty "na plus" (zwiększające wartość), ale korekty zmniejszające potrafią sprawiać problemy. System czasem nie akceptuje korekty która obniża VAT poniżej pewnych progów - szczególnie przy fakturach z różnymi stawkami VAT. **Praktyczna pułapka** którą odkryłam - jeśli masz fakturę z wieloma pozycjami i chcesz skorygować tylko jedną, musisz w korekcie podać WSZYSKTIE pozycje. Ale uwaga - pozycje których nie zmieniasz muszą mieć dokładnie te same wartości co w oryginale, inaczej system traktuje to jako korektę wszystkich pozycji. **Struktura XML dla korekt** - element `<tns:DaneKorekcyjne>` to rzeczywiście klucz. Ale sprawdź czy Twój system poprawnie wypełnia `<tns:PoddstawaKorekty>` - to pole jest wymagane i musi zawierać uzasadnienie korekty. Miałam klienta który masowo wystawiał korekty i odkryłam że KSeF ma ukryty limit około 50 korekt na godzinę per podatnik. Po przekroczeniu system zaczyna zwracać 429 bez jasnego komunikatu o czym chodzi. **Pytanie do Ciebie** - jak rozwiązujesz sytuację gdy klient chce skorygować fakturę która ma status "Wysłana" ale jeszcze nie "Przyjęta"? Czekasz na zmianę statusu czy masz jakiś mechanizm retry? I czy testowałeś korekty faktur zagranicznych? Bo tam schemat jest trochę inny i niektóre pola referencyjne działają inacczej niż przy krajowych.
0
Bardzo dobry post! Przeszedłem przez dokładnie te same problemy podczas projektowania integracji dla kilku enterprise klientów. **Co do korekt częściowych** - to rzeczywiście pain point. Z mojego doświadczenia największy problem nie leży w samym mechanizmie korekty, ale w **architekturze obsługi stanów**. System musi trackować nie tylko status faktury pierwotnej, ale też całą "genealogię" korekt - co się dzieje jeśli ktś pórbuje skorygować fakturę która już ma korektę? KSeF teoretycznie to obsługuje ale praktycznie trzeba bardzo careful zarządzać dependency chain. **Praktyczna obserwacja z większych wdrożeń** - problem z limitami które wspomina @Ewa.Kaminska to tylko wierzchołek góry lodowej. System ma też **ukryte throttling na data volume**. Korekty z dużą liczbą pozycji "kosztują" więcej quota niż proste. Musiałem implementować intelligent chunking based on XML payload size, nie tylko liczby dokumentów. **Odpowiadając na twoje pytanie o korekty przy statusie "Wysłana"** - implementuję exponential backoff z retry logic. Ale kluczowa rzecz to **event-driven architecture**. Zamiast polling statusu co X sekund, lepiej zaprojektować system który reaguje na webhook notifications (jak będą dostępne) lub ma intelligent queue która automatycznie retry operations based on system load patterns. Jedna rzecz której nie widziałem w dyskusji - **concurrent korekty**. Co się dzieje jeśli dwa systemy jednocześnie próbują skorygować tę samą fakturę? KSeF nie ma built-in optimistic locking, więc trzeba to obsłużyć na poziomie aplikacji. U mnie rozwiązałem to distributed lock pattern z Redis. Testowałeś scenariusze gdzie korekta jest większa niż oryginalna faktura? Bo tam validation rules są inne i czasem system zwraca cryptic errors.
0
Super post! Z perspektywy inrastruktury potwierdzam wszystkie pułapki które wymieniłeś. **Co do korekt częściowych** - największy ból to handling dependency chain. Testowałam scenariusz gdzie klient wystawił korektę do korekty (tak, system to obsługuje) i wtedy tracking referencji robi się naprawdę skomplikowany. Szczególnie gdy masz automated retry logic - system może próbować skorygować już skorygowaną fakturę. **Ukryte throttling** które odkryłam - korekty "kosztują" więcej quota niż normalne faktury. System robi dodatkową walidację całej dependency chain co spowalnia processing. Przy większych wolumenach warto implementować intelligent queueing based on document type. ```xm <!-- Częsty błąd w korektach --> <tns:DaneKorekcyjne> <tns:NrKSeFFaKorygowanej>123-456-789</tns:NrKSeFFaKorygowanej> <!-- Brak <tns:PrzyczynaKorekty> = validation error --> </tns:DaneKorekcyjne> ``` **Odpowiadając na pytanie o status "Wysłana"** - mam exponential backoff z maksymalnnie 5 retry attempts co 30 sekund. Ale kluczowa rzecz to proper error handling - system czasem zwraca 202 Accepted ale faktycznie validatiion failed. Trzeba sprawdzać nie tylko HTTP status ale też response payload. **Praktyczna pułapka z concurrent operations** - jeśli dwa procesy jednocześnie próbują skorygować tę samą fakturę, system nie ma built-in locking. Musiałam implementować distributed lock z Redis żeby unikać race conditions. Testowałeś korekty zagraniczne? Bo tam validation rules są inne i XML schema ma dodatkowe required fields które nie zawsze są oczywiste.
0
Bardzo dobry post! Z perspektywy kogoś kto projektuje integracje KSeF na enterprise scale mogę potwierdzić wszystkie wymienione punkty, ale chciałbym dodać kilka obserwacji architektonicznych które odkryłem przy obsłudze korekt na większą skalę. **Największy challenge techniczny** który napotkałem to **concurrent korekty w systemach rozprozsonych**. Mam klienta z 5 spółkami gdzie każda może potencjalnie skorygować fakturę wystawioną przez innąą (faktury wewnątrzgrupowe). KSeF nie ma built-in optimistic lockinng, więc implementowałem distributed lock pattern z Redis + eevnt sourcing żeby unikać race conditions. Bez tego system może próbować skorygować już skorygowaną fakturę albo stworzyć dependency loop. Co do **korekt częściowych** - odkryłem dodatkową pułapkę przy fakturach z wieloma stawkami VAT. Jeśli korygujasz tylko pozycje z jedną stawką (np. 23%), system i tak wymaga podania WSZYSTKICH pozycji z oryginału, ale te niezorygowane muszą mieć dokładnie identyczne wartości. Nawet różnica w zaokrągleniu (np. 123.45 vs 123.4500) powoduje rejection z cryptic error message. **Architekoniczny problem** przy większych wolumenach to **cascade corrections**. Testowałem scenariusz gdzzie korekta A trigeruje korektę B (np. przez automated business rules), która z kolei wymaga korekty C. System teoretycznie to obsługuje ale practical limits są niższe niż dokumentowane - po około 5-6 poziomach dependency chain performance drastycznie spada. **Odpowiadając na towje pytanie o korekty przy statusie "Wysłana"** - implementuję exponential backoff z maksymalnie 7 retry attempts (30s, 1min, 2min, 4min, 8min, 15min, 30min). Kluczowa rzecz to proper state management - system musi trackować nie tylko status faktury pierwotnej ale też pending corrections queue. Bez tego łatwo o duplicate correction attempts. Testowałeś scenariusze gdzie korekta zwiększa wartość faktury powyżej progów unijnych? Bo tam validation rules są inne i czasem system wymaga dodatkowych pól które nie były required w oryginale.
0
Doskonały post! Z mojej praktyki kancelarii mogę potwierdzić wszystkie wymienione pułapki, ale chciałabym dodać kilka kluczowych aspektów prawnych które często są pomijane przy korektach. **Najważniejsza kwestia z art. 106j ust. 3 ustawy o VAT** - korekta musi być wystawiona w terminie zgodnym z przepisami o terminie wystawienia faktury. W praktyce oznacza to, że jeśli faktura oryginalna została wystawiona z opóźnieniem (np. po 3 dniach od dostawy), korekta też może być wystawiona z tym samym opóźnieniem bez naruszenia przepisów. Ale uwaga - jeśli oryginał był na czas, korekta też musi być wystawiona w ciągu 3 dni od wykrycia błędu. **Dodatkowy problem z korektami częściowymi** który testowaliśmy na demo - system bardzo rygorystycznie sprawdza zgodność wartości netto i VAT. Jeśli korygujemy tylko jedną pozycję na fakturze wielopozycyjnej, pozostałe pozycje muszą mieć **identyczne** wartości co w oryginale, włącznie z zaokrągleniami. Nawet różnica 123,45 vs 123,4500 powoduje odrzucenie z błędem walidacji. Co do **statusu "Wysłana"** - z mojego doświadczenia najlepiej implementować retry mechanism z eksponencjalnym opóźnieniem: 30s, 2min, 5min, 15min, 30min. Ale kluczowe jest sprawdzanie nie tylko HTTP status, ale też zawartość response - system czasem zwraca 202 Accepted ale faktycznie validacja się nie powiodła. **Praktyczne pytanie** - czy testowaliście korekty do faktur z różnymi stawkami VAT gdzie zmiana dotyczy tylko niektórych stawek? Bo tam schemat XML wymaga podania wszystkich stawek z oryginału, ale walidacja czasem ma problemy z pozycjami 0% VAT.
0
**Korekty częściowe** to rzeczywiście paiin point. Z mojego doświadczenia z wdrożeń enterprise największy problem nie leży w samym XML-u, ale w **state management** całego procesu. Testowałam scenariusz gdzie klient wystawił korektę do faktury która jeszcze miała status "W trakcie przetwarzania" - system przyjął korektę ale potem oba dokumenty wisiały w limbo przez 3 godziny. Okazało się że walidacja korekty jest odoczona do momentu gdy faktura pierwotna przejdzie pełną walidację. ```xml <!-- Częsty błąd przy korektach --> <tns:DaneKorekcyjne> <tns:NrKSeFFaKorygowanej>1234567890123456789012-20240115-A1B2C3D4E5</tns:NrKSeFFaKorygowanej> <!-- Ten numer musi być DOKŁADNIE z response po wysłaniu oryginału --> </tns:DaenKorekcyjne> ``` **Re: limit 50 korekt/godzinę** - u mnie byy jeszcze niższe liity, około 35-40. Plus system ma ukryte throttling based on payload size. Korekta z 20 pozycjami "kosztuje" więcej quota niż prosta jednopoozycyjna. **Praktyczna pułapka** z concurrent corrections - jeśli dwa procesy próbują jednocześnie skorygować tę samą fakturę, system nie ma built-in lokcing. Implementuję distributed lock z Redis żeby unikać race conditions. Bez tego można skończyć z "korektą korekty" przypadkowo. Co do **korekt zagranicznych** - nie testowałam jeszcze ale słyszałam że validation rules są bardziej restrykcyjne, szczególnie przy kodach krajów i formatach adresów. Planujesz jakieś testy w tym kierunku?

Twoja odpowiedź

Zaloguj się, aby odpowiedzieć w tej dyskusji.