Skip to content

Commit 2fa0eaa

Browse files
adrian.bakk-wysocki-bl
authored andcommitted
RC5.6 java example
1 parent 94ce0d6 commit 2fa0eaa

File tree

10 files changed

+255
-104
lines changed

10 files changed

+255
-104
lines changed

certyfikaty-KSeF.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ Przykład w języku Java:
275275
```java
276276
QueryCertificatesRequest request = new CertificateMetadataListRequestBuilder().build();
277277

278-
CertificateMetadataListResponse response = ksefClient.getCertificateMetadataList(request, 10, 0, accessToken);
278+
CertificateMetadataListResponse response = ksefClient.getCertificateMetadataList(request, pageSize, pageOffset, accessToken);
279279

280280

281281
```

faktury/sesja-sprawdzenie-stanu-i-pobranie-upo.md

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,12 @@ Przykład w języku Java:
4242
SessionsQueryRequest request = new SessionsQueryRequest();
4343
request.setSessionType(SessionType.ONLINE);
4444
request.setStatuses(List.of(CommonSessionStatus.INPROGRESS));
45-
SessionsQueryResponse sessionsQueryResponse = ksefClient.getSessions(request, 10, null, accessToken);
4645

46+
SessionsQueryResponse sessionsQueryResponse = ksefClient.getSessions(request, pageSize, continuationToken, accessToken();
47+
48+
while (Strings.isNotBlank(activeSessions.getContinuationToken())) {
49+
sessionsQueryResponse = ksefClient.getSessions(pageSize, sessionsQueryResponse.getContinuationToken(), accessToken);
50+
}
4751
```
4852

4953
### 2. Sprawdzenie stanu sesji
@@ -105,8 +109,11 @@ Przykład w języku Java:
105109
[OnlineSessionIntegrationTest.java](https://github.com/CIRFMF/ksef-client-java/blob/main/demo-web-app/src/integrationTest/java/pl/akmf/ksef/sdk/OnlineSessionIntegrationTest.java)
106110

107111
```java
108-
SessionInvoicesResponse sessionInvoices = ksefClient.getSessionInvoices(referenceNumber,continuationtoken, 10, authToken);
112+
SessionInvoicesResponse sessionInvoices = ksefClient.getSessionInvoices(referenceNumber,continuationtoken, pageSize, authToken);
109113

114+
while (Strings.isNotBlank(sessionInvoices.getContinuationToken())) {
115+
sessionInvoices = ksefClient.getSessions(pageSize, sessionInvoices.getContinuationToken(), accessToken);
116+
}
110117
```
111118
### 4. Pobranie informacji o pojedynczej fakturze
112119

@@ -216,6 +223,10 @@ Przykład w języku Java:
216223

217224
```java
218225
SessionInvoicesResponse response = ksefClient.getSessionFailedInvoices(referenceNumber, continuationToken, pageSize, authToken);
226+
227+
while (Strings.isNotBlank(response.getContinuationToken())) {
228+
response = ksefClient.getSessionFailedInvoices(pageSize, response.getContinuationToken(), accessToken);
229+
}
219230
```
220231

221232
Endpoint umożliwia selektywne pobranie wyłącznie odrzuconych faktur, co ułatwia analizę błędów w sesjach zawierających dużą liczbę faktur.

kody-qr.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ Przykład w języku Java:
202202
[QrCodeOnlineIntegrationTest.java](https://github.com/CIRFMF/ksef-client-java/blob/main/demo-web-app/src/integrationTest/java/pl/akmf/ksef/sdk/QrCodeOnlineIntegrationTest.java)
203203

204204
```java
205-
qrOnline = qrCodeService.addLabelToQrCode(qrOnline, invoiceKsefNumber);
205+
byte[] qrOnline = qrCodeService.addLabelToQrCode(qrOnline, invoiceKsefNumber);
206206
```
207207

208208
![QR Certyfikat](qr/qr-cert.png)

limity/limity.md

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,28 @@ GET [/limits/context](https://ksef-test.mf.gov.pl/docs/v2/index.html#tag/Limity-
5454

5555
Zwraca wartości obowiązujących limitów sesji interaktywnych i wsadowych dla bieżącego kontekstu.
5656

57+
Przykład w języku Java:
58+
59+
[ContextLimitIntegrationTest.java](https://github.com/CIRFMF/ksef-client-java/blob/main/demo-web-app/src/integrationTest/java/pl/akmf/ksef/sdk/ContextLimitIntegrationTest.java)
60+
61+
```java
62+
GetContextLimitResponse response = ksefClient.getContextSessionLimit(accessToken);
63+
```
64+
5765
### Pobranie limitów dla bieżącego podmiotu ###
5866

5967
GET [/limits/subject](https://ksef-test.mf.gov.pl/docs/v2/index.html#tag/Limity-i-ograniczenia/paths/~1api~1v2~1limits~1subject/get)
6068

6169
Zwraca obowiązujące limity certyfikatów i wniosków certyfikacyjnych dla bieżącego podmiotu uwierzytelnionego.
6270

71+
Przykład w języku Java:
72+
73+
[SubjectLimitIntegrationTest.java](https://github.com/CIRFMF/ksef-client-java/blob/main/demo-web-app/src/integrationTest/java/pl/akmf/ksef/sdk/SubjectLimitIntegrationTest.java)
74+
75+
```java
76+
GetSubjectLimitResponse response = ksefClient.getSubjectCertificateLimit(accessToken);
77+
```
78+
6379
## Modyfikacja limitów na środowisku testowym ##
6480

6581
Na **środowisku testowym** udostępniono zestaw metod umożliwiających zmianę oraz przywracanie limitów do wartości domyślnych.
@@ -69,18 +85,62 @@ Operacje te dostępne są wyłącznie dla uwierzytelnionych podmiotów i nie maj
6985

7086
POST [/testdata/limits/context/session](https://ksef-test.mf.gov.pl/docs/v2/index.html#tag/Limity-i-ograniczenia/paths/~1api~1v2~1testdata~1limits~1context~1session/post)
7187

88+
Przykład w języku Java:
89+
90+
[ContextLimitIntegrationTest.java](https://github.com/CIRFMF/ksef-client-java/blob/main/demo-web-app/src/integrationTest/java/pl/akmf/ksef/sdk/ContextLimitIntegrationTest.java)
91+
92+
```java
93+
ChangeContextLimitRequest request = new ChangeContextLimitRequest();
94+
OnlineSessionLimit onlineSessionLimit = new OnlineSessionLimit();
95+
onlineSessionLimit.setMaxInvoiceSizeInMB(4);
96+
onlineSessionLimit.setMaxInvoiceWithAttachmentSizeInMB(5);
97+
onlineSessionLimit.setMaxInvoices(6);
98+
99+
BatchSessionLimit batchSessionLimit = new BatchSessionLimit();
100+
batchSessionLimit.setMaxInvoiceSizeInMB(4);
101+
batchSessionLimit.setMaxInvoiceWithAttachmentSizeInMB(5);
102+
batchSessionLimit.setMaxInvoices(6);
103+
104+
request.setOnlineSession(onlineSessionLimit);
105+
request.setBatchSession(batchSessionLimit);
106+
107+
ksefClient.changeContextLimitTest(request, accessToken);
108+
```
109+
72110
### Przywrócenie limitów sesji dla kontekstu do wartości domyślnych ###
73111

74112
DELETE [/testdata/limits/context/session](https://ksef-test.mf.gov.pl/docs/v2/index.html#tag/Limity-i-ograniczenia/paths/~1api~1v2~1testdata~1limits~1context~1session/delete)
75113

114+
[ContextLimitIntegrationTest.java](https://github.com/CIRFMF/ksef-client-java/blob/main/demo-web-app/src/integrationTest/java/pl/akmf/ksef/sdk/ContextLimitIntegrationTest.java)
115+
116+
```java
117+
ksefClient.resetContextLimitTest(accessToken);
118+
```
119+
76120
### Zmiana limitów certyfikatów dla bieżącego podmiotu ###
77121

78122
POST [/testdata/limits/subject/certificate](https://ksef-test.mf.gov.pl/docs/v2/index.html#tag/Limity-i-ograniczenia/paths/~1api~1v2~1testdata~1limits~1subject~1certificate/post)
79123

124+
[SubjectLimitIntegrationTest.java](https://github.com/CIRFMF/ksef-client-java/blob/main/demo-web-app/src/integrationTest/java/pl/akmf/ksef/sdk/SubjectLimitIntegrationTest.java)
125+
126+
```java
127+
ChangeSubjectCertificateLimitRequest request = new ChangeSubjectCertificateLimitRequest();
128+
request.setCertificate(new CertificateLimit(15));
129+
request.setEnrollment(new EnrollmentLimit(15));
130+
request.setSubjectIdentifierType(ChangeSubjectCertificateLimitRequest.SubjectType.NIP);
131+
132+
ksefClient.changeSubjectLimitTest(request, accessToken);
133+
```
134+
80135
### Przywrócenie limitów certyfikatów dla podmiotu do wartości domyślnych ###
81136

82137
DELETE [/testdata/limits/subject/certificate](https://ksef-test.mf.gov.pl/docs/v2/index.html#tag/Limity-i-ograniczenia/paths/~1api~1v2~1testdata~1limits~1subject~1certificate/delete)
83138

139+
[SubjectLimitIntegrationTest.java](https://github.com/CIRFMF/ksef-client-java/blob/main/demo-web-app/src/integrationTest/java/pl/akmf/ksef/sdk/SubjectLimitIntegrationTest.java)
140+
141+
```java
142+
ksefClient.resetSubjectCertificateLimit(accessToken);
143+
```
84144

85145
Powiązane dokumenty:
86146
- [Limity żądań api](limity-api.md)

pobieranie-faktur/pobieranie-faktur.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ InvoiceQueryFilters request = new InvoiceQueryFiltersBuilder()
6464
OffsetDateTime.now()))
6565
.build();
6666

67-
QueryInvoiceMetadataResponse response = ksefClient.queryInvoiceMetadata(0, 10, request, accessToken);
67+
QueryInvoiceMetadataResponse response = ksefClient.queryInvoiceMetadata(pageOffset, pageSize, SortOrder.ASC, request, accessToken);
6868

6969

7070
```

pobieranie-faktur/przyrostowe-pobieranie-faktur.md

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,33 @@ foreach (ExportTask task in exportTasks)
5050

5151
// Dalsza obsługa eksportu...
5252
```
53+
Przykład w języku ```java```:
54+
[IncrementalInvoiceRetrieveIntegrationTest.java](https://github.com/CIRFMF/ksef-client-java/blob/main/demo-web-app/src/integrationTest/java/pl/akmf/ksef/sdk/IncrementalInvoiceRetrieveIntegrationTest.java)
55+
56+
57+
```java
58+
Map<InvoiceQuerySubjectType, OffsetDateTime> continuationPoints = new HashMap<>();
59+
60+
List<TimeWindows> timeWindows = buildIncrementalWindows(batchCreationStart, batchCreationCompleted);
61+
List<InvoiceQuerySubjectType> subjectTypes = Arrays.stream(InvoiceQuerySubjectType.values())
62+
.filter(x -> x != InvoiceQuerySubjectType.SUBJECTAUTHORIZED)
63+
.toList();
64+
65+
List<ExportTask> exportTasks = timeWindows.stream()
66+
.flatMap(window -> subjectTypes.stream()
67+
.map(subjectType -> new ExportTask(window.getFrom(), window.getTo(), subjectType)))
68+
.sorted(Comparator.comparing(ExportTask::getFrom)
69+
.thenComparing(ExportTask::getSubjectType))
70+
.toList();
71+
exportTasks.forEach(task -> {
72+
EncryptionData encryptionData = defaultCryptographyService.getEncryptionData();
73+
OffsetDateTime effectiveFrom = getEffectiveStartDate(continuationPoints, task.getSubjectType(), task.getFrom());
74+
String operationReferenceNumber = initiateInvoiceExportAsync(effectiveFrom, task.getTo(),
75+
task.getSubjectType(), accessToken, encryptionData.encryptionInfo());
76+
77+
// Dalsza obsługa eksportu...
78+
```
79+
5380

5481
### Zalecane wielkości okien
5582

@@ -112,6 +139,25 @@ OperationResponse response = await KsefRateLimitWrapper.ExecuteWithRetryAsync(
112139
cancellationToken: CancellationToken);
113140
```
114141

142+
Przykład w języku ```java```:
143+
[IncrementalInvoiceRetrieveIntegrationTest.java](https://github.com/CIRFMF/ksef-client-java/blob/main/demo-web-app/src/integrationTest/java/pl/akmf/ksef/sdk/IncrementalInvoiceRetrieveIntegrationTest.java)
144+
145+
146+
```java
147+
EncryptionData encryptionData = defaultCryptographyService.getEncryptionData();
148+
InvoiceExportFilters filters = new InvoiceExportFilters();
149+
filters.setSubjectType(subjectType);
150+
filters.setDateRange(new InvoiceQueryDateRange(
151+
InvoiceQueryDateType.PERMANENTSTORAGE, windowFrom, windowTo)
152+
);
153+
154+
InvoiceExportRequest request = new InvoiceExportRequest();
155+
request.setFilters(filters);
156+
request.setEncryption(encryptionInfo);
157+
158+
InitAsyncInvoicesQueryResponse response = ksefClient.initAsyncQueryInvoice(request, accessToken);
159+
```
160+
115161
## Pobieranie i przetwarzanie paczek
116162

117163
Po zakończeniu eksportu paczka faktur jest dostępna do pobrania jako zaszyfrowane archiwum ZIP dzielone na części. Proces pobierania i przetwarzania obejmuje:
@@ -172,6 +218,29 @@ foreach ((string fileName, string content) in unzippedFiles)
172218
}
173219
```
174220

221+
Przykład w języku ```java```:
222+
[IncrementalInvoiceRetrieveIntegrationTest.java](https://github.com/CIRFMF/ksef-client-java/blob/main/demo-web-app/src/integrationTest/java/pl/akmf/ksef/sdk/IncrementalInvoiceRetrieveIntegrationTest.java)
223+
224+
225+
```java
226+
List<InvoicePackagePart> parts = invoiceExportStatus.getPackageParts().getParts();
227+
byte[] mergedZip = FilesUtil.mergeZipParts(
228+
encryptionData,
229+
parts,
230+
part -> ksefClient.downloadPackagePart(part),
231+
(encryptedPackagePart, key, iv) -> defaultCryptographyService.decryptBytesWithAes256(encryptedPackagePart, key, iv)
232+
);
233+
Map<String, String> downloadedFiles = FilesUtil.unzip(mergedZip);
234+
235+
String metadataJson = downloadedFiles.keySet()
236+
.stream()
237+
.filter(fileName -> fileName.endsWith(".json"))
238+
.findFirst()
239+
.map(downloadedFiles::get)
240+
.orElse(null);
241+
InvoicePackageMetadata invoicePackageMetadata = objectMapper.readValue(metadataJson, InvoicePackageMetadata.class);
242+
```
243+
175244
## Obsługa obciętych paczek (IsTruncated)
176245

177246
Flaga `IsTruncated = true` jest ustawiana, gdy podczas budowy paczki osiągnięto limity algorytmu (liczba faktur lub rozmiar danych po kompresji). W takim przypadku w statusie operacji dostępna jest właściwość `LastPermanentStorageDate` - data ostatniej faktury ujętej w paczce.
@@ -204,6 +273,22 @@ private static void UpdateContinuationPointIfNeeded(
204273
}
205274
```
206275

276+
Przykład w języku ```java```:
277+
[IncrementalInvoiceRetrieveIntegrationTest.java](https://github.com/CIRFMF/ksef-client-java/blob/main/demo-web-app/src/integrationTest/java/pl/akmf/ksef/sdk/IncrementalInvoiceRetrieveIntegrationTest.java)
278+
279+
280+
```java
281+
private void updateContinuationPointIfNeeded(Map<InvoiceQuerySubjectType, OffsetDateTime> continuationPoints,
282+
InvoiceQuerySubjectType subjectType,
283+
InvoiceExportPackage invoiceExportPackage) {
284+
if (Boolean.TRUE.equals(invoiceExportPackage.getIsTruncated()) && Objects.nonNull(invoiceExportPackage.getLastPermanentStorageDate())) {
285+
continuationPoints.put(subjectType, invoiceExportPackage.getLastPermanentStorageDate());
286+
} else {
287+
continuationPoints.remove(subjectType);
288+
}
289+
}
290+
```
291+
207292
## Deduplikacja faktur
208293

209294
### Strategia deduplikacji
@@ -223,6 +308,21 @@ hasDuplicates = packageResult.MetadataSummaries
223308
.Any(summary => !uniqueInvoices.TryAdd(summary.KsefNumber, summary));
224309
```
225310

311+
Przykład w języku ```java```:
312+
[IncrementalInvoiceRetrieveIntegrationTest.java](https://github.com/CIRFMF/ksef-client-java/blob/main/demo-web-app/src/integrationTest/java/pl/akmf/ksef/sdk/IncrementalInvoiceRetrieveIntegrationTest.java)
313+
314+
315+
```java
316+
hasDuplicates.set(packageProcessingResult.getInvoiceMetadataList()
317+
.stream()
318+
.anyMatch(summary -> uniqueInvoices.containsKey(summary.getKsefNumber())));
319+
320+
packageProcessingResult.getInvoiceMetadataList()
321+
.stream()
322+
.distinct()
323+
.forEach(summary -> uniqueInvoices.put(summary.getKsefNumber(), summary));
324+
```
325+
226326
## Powiązane dokumenty
227327

228328
- [Limity API](../limity/limity-api.md)

sesja-interaktywna.md

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -102,26 +102,25 @@ Przykład w języku Java:
102102
[OnlineSessionIntegrationTest.java](https://github.com/CIRFMF/ksef-client-java/blob/main/demo-web-app/src/integrationTest/java/pl/akmf/ksef/sdk/OnlineSessionIntegrationTest.java)
103103

104104
```java
105-
String invoiceTemplate = ""; // xml z fakturą
105+
byte[] invoice = "";
106106

107-
byte[] invoice = invoiceTemplate.getBytes(StandardCharsets.UTF_8);
107+
byte[] encryptedInvoice = defaultCryptographyService.encryptBytesWithAES256(invoice,
108+
encryptionData.cipherKey(),
109+
encryptionData.cipherIv());
108110

109-
byte[] encryptedInvoice = cryptographyService.encryptBytesWithAES256(invoice,
110-
encryptionData.cipherKey(),
111-
encryptionData.cipherIv());
112-
113-
FileMetadata invoiceMetadata = cryptographyService.getMetaData(invoice);
114-
FileMetadata encryptedInvoiceMetadata = cryptographyService.getMetaData(encryptedInvoice);
111+
FileMetadata invoiceMetadata = defaultCryptographyService.getMetaData(invoice);
112+
FileMetadata encryptedInvoiceMetadata = defaultCryptographyService.getMetaData(encryptedInvoice);
115113

116114
SendInvoiceOnlineSessionRequest sendInvoiceOnlineSessionRequest = new SendInvoiceOnlineSessionRequestBuilder()
117-
.withInvoiceHash(invoiceMetadata.getHashSHA())
118-
.withInvoiceSize(invoiceMetadata.getFileSize())
119-
.withEncryptedInvoiceHash(encryptedInvoiceMetadata.getHashSHA())
120-
.withEncryptedInvoiceSize(encryptedInvoiceMetadata.getFileSize())
121-
.withEncryptedInvoiceContent(Base64.getEncoder().encodeToString(encryptedInvoice))
122-
.build();
115+
.withInvoiceHash(invoiceMetadata.getHashSHA())
116+
.withInvoiceSize(invoiceMetadata.getFileSize())
117+
.withEncryptedInvoiceHash(encryptedInvoiceMetadata.getHashSHA())
118+
.withEncryptedInvoiceSize(encryptedInvoiceMetadata.getFileSize())
119+
.withEncryptedInvoiceContent(Base64.getEncoder().encodeToString(encryptedInvoice))
120+
.build();
123121

124122
SendInvoiceResponse sendInvoiceResponse = ksefClient.onlineSessionSendInvoice(sessionReferenceNumber, sendInvoiceOnlineSessionRequest, accessToken);
123+
125124
```
126125

127126
### 3. Zamknięcie sesji

0 commit comments

Comments
 (0)