Korekta techniczna faktury offline
20.08.2025
Opis funkcjonalności
Korekta techniczna umożliwia ponowne przesłanie faktury wystawionej w trybie offline, która po przesłaniu do systemu KSeF została odrzucona z powodu błędów technicznych, np.:
- niezgodność ze schematem,
- przekroczenie dopuszczalnego rozmiaru pliku,
- duplikat faktury,
- inne błędy walidacji technicznej uniemożliwiające nadanie
numeru KSeF.
Uwaga!
- Korekta techniczna nie dotyczy sytuacji związanych z brakiem uprawnień podmiotów występujących na fakturze (np. samofakturowanie, walidacja relacji dla JST lub grup VAT).
- W tym trybie nie jest dozwolona korygowanie treści faktury – korekta techniczna dotyczy wyłącznie problemów technicznych uniemożliwiających jej przyjęcie w systemie KSeF.
- Korekta techniczna może być przesyłana wyłącznie w sesji interaktywnej, natomiast może dotyczyć faktur offline odrzuconych zarówno w sesji interaktywnej, jak i w sesji wsadowej.
- Niedozwolone jest korygowanie technicznie faktury offline, dla której została już przyjęta inna prawidłowa korekta.
Przykładowy przebieg korekty technicznej faktury offline
Sprzedawca wystawia fakturę w trybie offline.
- Faktura zawiera dwa kody QR:
- Kod QR I – umożliwia weryfikację faktury w systemie KSeF,
- Kod QR II – umożliwia potwierdzenie autentyczności wystawcy na podstawie certyfikatu KSeF.
- Faktura zawiera dwa kody QR:
Klient otrzymuje wizualizację faktury (np. w postaci wydruku).
- Po zeskanowaniu kodu QR I klient uzyskuje informację, że faktura nie została jeszcze przesłana do systemu KSeF.
- Po zeskanowaniu kodu QR II klient uzyskuje informację o certyfikacie KSeF, który potwierdza autentyczność wystawcy.
Sprzedawca przesyła fakturę offline do systemu KSeF.
- System KSeF weryfikuje dokument.
- Faktura zostaje odrzucona z powodu błędu technicznego (np. niepoprawna zgodność ze schematem XSD).
Sprzedawca aktualizuje swoje oprogramowanie i ponownie generuje fakturę o tej samej treści, ale zgodną ze schematem.
- Ponieważ zawartość XML różni się od wersji pierwotnej, skrót SHA-256 pliku faktury jest inny.
Sprzedawca wysyła poprawioną fakturę jako korektę techniczną.
- Wskazuje w polu
hashOfCorrectedInvoiceskrót SHA-256 pierwotnej, odrzuconej faktury offline. - Parametr
offlineModeustawiony jest natrue.
- Wskazuje w polu
System KSeF poprawnie przyjmuje fakturę.
- Dokument otrzymuje numer KSeF.
- Faktura zostaje powiązana z pierwotną fakturą offline, której skrót został wskazany w polu
hashOfCorrectedInvoice. - Dzięki temu możliwe jest przekierowanie klienta ze „starego” kodu QR I do poprawionej faktury.
Klient korzysta z kodu QR I umieszczonego na pierwotnej fakturze.
- System KSeF informuje, że pierwotna faktura została technicznie poprawiona.
- Klient otrzymuje metadane nowej, poprawnie przetworzonej faktury i ma możliwość jej pobrania z systemu.
Wysłanie korekty
Korekta przesyłana jest zgodnie z zasadami opisanymi w dokumencie sesja interaktywna, z dodatkowym ustawieniem:
offlineMode: true,hashOfCorrectedInvoice– skrót faktury pierwotnej.
Przykład w języku C#: KSeF.Client.Tests.Core\E2E\OnlineSession\OnlineSessionE2ETests.cs
var sendOnlineInvoiceRequest = SendInvoiceOnlineSessionRequestBuilder
.Create()
.WithInvoiceHash(invoiceMetadata.HashSHA, invoiceMetadata.FileSize)
.WithEncryptedDocumentHash(
encryptedInvoiceMetadata.HashSHA, encryptedInvoiceMetadata.FileSize)
.WithEncryptedDocumentContent(Convert.ToBase64String(encryptedInvoice))
.WithOfflineMode(true)
.WithHashOfCorrectedInvoice(hashOfCorrectedInvoice)
.Build();Przykład w języku Java: OnlineSessionController#sendTechnicalCorrection.java
SendInvoiceOnlineSessionRequest sendInvoiceOnlineSessionRequest = new SendInvoiceOnlineSessionRequestBuilder()
.withInvoiceHash(invoiceMetadata.getHashSHA())
.withInvoiceSize(invoiceMetadata.getFileSize())
.withEncryptedInvoiceHash(encryptedInvoiceMetadata.getHashSHA())
.withEncryptedInvoiceSize(encryptedInvoiceMetadata.getFileSize())
.withEncryptedInvoiceContent(Base64.getEncoder().encodeToString(encryptedInvoice))
.withOfflineMode(true)
.withHashOfCorrectedInvoice(hashOfCorrectedInvoice)
.build();