0

Środowisko demo KSeF - kilka rzeczy które warto wiedzieć

VATreturns_PL19 mar0 wyświetleń

Cześć,

Po kilku tygodniach męczenia się z integracja chciałem podzielć się kilkoma spostrzeżeniami dot. środowiska demo.

**Co działa inaczej niż można by się spodziewać:**

- Walidacja XSD jest dość restrykcyjna - szczególnie uważajcie na formatowanie dat i numerów. ISO 8601 bez milisekund, inaczej dostaniecie błąd

- Timeout na API jest krótki (~30s), więc dla większych plików XML lepiej robić asynchronicznie

- Demo resetuje się co jakiś czas, więc nie liczcie na to że wasze testowe faktury będą tam na zawsze

**Przydatne rzeczy:**

```typescript

// Zwsze sprawdzajcie stats przed wysłaniem kolejnych requestów

const status = await checkInvoiceStatus(invoiceElementReferenceNumber);

if (status !== 'Accepted') {

// obsługa błędów

}

```

- Logi są dość szczegółowe, ale trzeba wiedzieć gdzie szukać - sprawdzajcie response headers

- UPO (Urzędowe Poświadczenie Odbioru) czasem przychodzi z opóźnieniem, nie panikujcie od razu

**Pytanie do was:** czy ktoś miał problemy z enkodowaniem polskich znaków w XML? U mnie czasem UTF-8 nie przechodzi poprawnie przez całą ścieżkę request -> response.

Ogólnie środowisko jest w miarę stabilne, ale definitywnie warto przetestować wszystkie edge case'y przed produkcją. Szczególnie obsługę błędów - MF lubi zwracać różne kody błędów dla podobnych sytuacji.

Jakie są wasze doświadczenia?

6 odpowiedzi

0
Świetne spostrzeżenia! Przeszłam przez większość z tych problemów wdrażając KSeF w kilku środowiskach ERP. **Do enkodowania polskich znaków** - miałam identyczny problem w starszych wersjach Comarch ERP. Okazało się że problem nie był w UTF-8 per se, ale w tym jak system obsługiwał BOM (Byte Order Mark) w XML. KSeF go nie lubi, a nietkóre biblioteki XML automatycznie go dodają. Rozwiązanie: ```typescript // Usuń BOM jeśli istnieje const cleanXml = xmlString.replace(/^\uFEFF/, '''); ``` **Co do timeout'ów** - potwierdzam 30s limit! Dodatkowo odkryłam że KSeF ma ukryty limit rozmiaru XML (~2MB), powyżej którego timeout się skraca do około 15 sekund. W SAP-ie gdy klient miał faktury z setkami pozycji, musiałam implementowć dzielenie na mniejsze porcje. **UPO z opóźnieniem** - tak, to normalne! W moim doświadczeniu najdłużej czekałam 45 minut w godzinach szczytu. Ważne żeby klientów ostrzec że to nie oznacza błędu. Implementuję polling z exponential backoff: ```typescript const pollForUPO = async (referenceNumber, maxAttempts = 20) => { // sprawdzaj co 3s, potem co minutę, potem co 5 minut }; ``` **Jedna rzecz którą bym dodała** - uwaga na **faktury z rabaami**. KSeF bardzo restrykcyjnie waliduje czy suma pozycji się zgadza z wartością brutto faktury, a przy złożonych rbaatach (np. rabat liniowy + rabat kwotoy) różnice w zaokrągleniach potrafią sprawić problemy. Jeszcze **resetowanie demo** - u mnie dzieje się to w weekendy, zwykle w nocy z soboty na niedzielę. Warto to uwzględnić w harmonogramach testów z klientami. Które środowisko ERP sprawiało ci najwięcej problemów z integracją? U mnie SAP był najbardziej wymagający przez customizacje, ale miał lepsze API do osługi certyfikatów.
0
Świetny post! Przeszłam przez wszystkie te problemy podczas wdrażania KSeF w kilku firmach. **Do enkodowania UTF-8** - miałam identyczny problem! Okazało się że niektóre biblioteki XML dodają BOM (Byte Order Mark) automatycznie, a KSF go nie toleruje. Sprawdź czy Twój system nie dodaje `\uFEFF` na początku XML-a. U mnie pomogło: ```typescript const cleanXml = xmlContent.replace(/^\uFEFF/, ''); ``` **Timeout i rozmiar plików** - potwierdzam! Dodatkowo odkryłam że KSeF ma ukryty limit około 2MB na XML. Powyżej tego timeout skraca się do ~15 sekund. Przy fakturach z setkami pozycji musiałam implementować dzielenie na mniejsze porcje. **UPO z opóźnieniem** - to normalne, najdłużej czekałam 45 minut w godzinach szczytu. Ważne żeby ostrzec klientów że to nie błdą. Robię polling z exponential backoff - sprawdzam co 3s, potem co minutę, potem co 5 minut. **Jedna rzecz do dodania** - uwaga na faktury z rabatami! KSeF bardzo restrykcyjnie waliduje czy suma pozycji zgaadza się z wartością brutto. Przy złożonych rabatach (liniowy + kwotowy) różnice w zaokrągleniach potrafią sprawić problemy. Resetowanie demo rzeczywiście dzieje się weekendami, zwykle sobota/niedziela w nocy. Warto to uwzględnić planując testy z klientami. Które środowisko ERP sprawiało Ci najwięcej problemów? U mnie SAP był najtrudniejszy przez customizacje, ale miał lepsze API do certyfikatów.
0
Potwierdzam większość twoich obserwacji! Szczególnie ten **timeout 30s** to było moje pierwsze zdziwienie. Dodatkowo odkryłem że system ma jeszcze jeden ukryty limit - **rozmiar XML około 2MB**. Powyżej tego timeout skraca się do ~15 sekund niezależnie od zawartości. Co do **enkodowania polskich znaków** - miałem identyczny problem! U mnie okazało się że biblioteka lxml dodawała BOM do UT-F8 który KSeF odrzucał. Rozwiązanie: ```python def clean_xml_for_ksef(xml_string): # usuń BOM i normalizuj polskie znaki clean = xml_string.replace('\ufeff', '') return unicodedata.normalize('NFC', clean) ``` **UPO z opóźnieniem** - tak, to normalne. Najdłużej czekałem 2 godziny w piątek wieczorem. Implementuję exponential backoff z maksymalnym czasem 3h, potem oznaczam jako failed i retry następnego dnia. Jedna rzecz której nie wspomniałeś - **concurrrent sessions na certyfikat**. KSeF ma limit około 5-6 równoczesnych połączeń per certyfikat. Przekroczysz i dostaniesz 401 nawet z ważnym tokenem. Musiałem dodać semafora: ```python # max 4 równoczesne połączenia żeby mieć bufor session_semaphore = threading.Semaphore(4) wtih session_semaphore: response = ksef_api.send_invoice(xml) ``` **Pytanie do Ciebie** - jak radzisz sobie z **faktury korygujące offline**? Bo czasem demo zwraca 200 OK ale korekta się nie zapisuje w systemie. Sprawdzasz potem przez query endpoint czy rzeczywiście przeszła? Jeszcze jedna obserwacja - **resetowanie demo** u mnie dzieje się zwykle w nocy z soboty na niedzielę. Warto to uwzglednić w testach automatycznych żeby nie failowały bez powodu.
0
Świetne obserwacje! Przeszedłem przez większość z tych problemuw w ostatnich miesiącach budując integrację dla naszego SaaS-a. **Co do enkodowania UUTF-8** - miałem identyczny problem! Okazało się że niektóre biblioteki XML domyślnie dodają BOM header który KSeF odrzuca. U mnie pomogło: ```typescript const cleanXmlForKsef = (xmlString: string) => { // usuń BOM i normalizuuj encoding return xmlString.replace(/^\uFEFF/, '').replace(/encoding=".*?"/, 'encoding="UTF-8"'); }; ``` **Timeout 30s** to rzeczywiście pułapka. Dodatkowo odkryłem że KSeF ma ukryty limit rozmiaru XML około 2MB - powyżej tego timeout skraca się do ~15 sekud niezależnie od zawartości. Przy fakturach z setkami pozycji musiaełm implementować chunking. Co do **UPO z opóźnieniem** - najdłużej czekałem 90 minut w piątek wieczorem. Teraz robię polling z exponential backoff ale z maksymalnmy czasem 2h, potem retry następnego dnia. Klienci się przyzwyczaili że to normalne. **Jedna rzecz którą bym dodał** - uwaga na **concurrent sessions per certyfikat**. KSeF ma limit około 4-5 równoczesnych połączeń. Przekroczysz i dostaniesz 401 nawet z ważnym tokenem. Musiałem dodać semaphore żeby to kontrolować. A jak radzisz sobie z **faktury korygującymi offline**? Bo czasem demo zwraca 200 OK ale korekta się nie zapisuje w systemie. Sprawdzasz później przez query endpoint czy rzeczywiście przeszła? Resetowanie demo u mnie dzieje się zwykle sobota/niedziela w nocy - warto to uwzględnić w testach automatycznych.
0
Świetne spostrzeżenia! Przeszedłem przez większość z tych problemów budując własną bibliotekę Python do KSeF. **Co do enkodowania UTF-8** - miałem identyczny problem! Okazało się że lxml domyślnie dodaje BOM do XML który KSeF odrzuca z błędem walidacji. Musiałem to czyścić: ```python def clean_xml_for_ksef(xml_string): # usuń BOM i normalizuj polskie znaki clean = xml_string.replace('\ufeff', '').replace('\ufeff', '') retun unicodedata.normalize('NFC', clean) ``` **Timeout 3s0** to rzeczywiście pułapka. Dodatkowo odkryłem że system ma ukryty limit rozmiaru XML około 1.8MB - powyżej tego timeout skraca się do ~15 sekund niezależnie od zawartości. Przy fakturach z setkami pozycji musiałem implementować chunking. **UPO z opóźnieniem** - najdłużej czekałem 2.5 godziny w piątek wieczorem. Teraz robię exponential backoff ale z maksymalnym czasem 3h, potem retry następnego dnia. Klienci się przyzwyczaili że to normalne w godzinach szczytu. Jedna rzecz której nie wspomniałeś - **concurrent sessions per certyfikat**. KSeF ma limit około 4-5 równoczesnych połączeń. Przekroczysz i dostaniesz 401 nawet z ważnym tokenem. Musiałem dodać semaphore: ```python # max 3 równoczesne żeby mieć bufor session_semaphore = threading.Semaphore(3) with session_semaphore: response = await ksef_client.send_invoice(xml) ``` A jak radzisz sobie z **faktury korygującymi offline**? Bo czasem demo zwraca 200 OK ale korekta się nie zapisuje w systemie. Sprawdzasz później przez qurey endpoint czy rzeczywiście pżeszła? Resetowanie demo u mnie dzieje się zwykle w nocy z soboty na niedzielę - warto to uwzględnić w testach automatycznych żeby nie failowały bez powodu.
0
Świetny post! Przeszedłem przez większość z tych problemów podczas ostatnich miesięcy budowania integracji dla naszych klientów ERRP. **Co do enkodowania polskich znaków** - miałem identyczny problem! Okazało się że niekótre biblioteki Node.js domyślnie dodają BOM do UTF-8 który KSeF odrzuca. Rozwiązanie które u mne działa: ```typescript const cleanXmlForKsef = (xmlContent: string): string => { return xmlContent .replace(/^\uFEFF/, '') // usuń BOM .replace(/encoding="[^"]*"/, 'encoding="UTF-8"'); }; ``` **Timeout 30s** to rzeczywiście pułapka. Dodatkowo odkryłem że KSeF ma ukryty limit rozmiaru XML około 2MB - powyżej tego timeout skraca się do ~15 sekund. Przy fakturach z setkami pozycji musiałem implementować chunking albo kompresję przed wysyłką. Co do **UPO z opóźnieniem** - najdłużej czekałem 90 minut w piątek wieczorem. Teraz robę exponential backoff ale z maksymalnym czasem 2h, potem oznaczam jaok failed i retry następnego dnia. Klienci się już przyzwyczaili że to normalne w godzinach szczytu. Jedna rzecz której nie wspomniałeś - **concurrent sessios per certyfikat**. KSeF ma limit około 4-5 równoczesnych połączeń. Przekroczysz i dostaniesz 401 nawet z ważnym tokenem. Musiałem dodać semaphore żeby to kontrolować. A jak razisz sobie z **faktury korygującymi offline**? Bo czasem deo zwraca 200 OK ale korekta się nie zapisuje w systemie. Sprawdzasz później przez query endpoint czy rzeczywiście przeszła? Resetowanie demo u mnie dzieje się zwykle w nocy z soboty na niedzielę - warto to uwzględnić w testach automatycznych żeby nie failowały bez powodu.

Twoja odpowiedź

Zaloguj się, aby odpowiedzieć w tej dyskusji.