Skip to content

Commit 12000d5

Browse files
Add invoice ZIP request methods
1 parent 9a53e6b commit 12000d5

4 files changed

Lines changed: 159 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [1.4.0] - 2026-08-12
9+
10+
### Added
11+
12+
- Add `invoices.createZipRequest(Map<String, Object> data)` for `POST /invoices/zip-requests`.
13+
- Add `invoices.listZipRequests(Map<String, ?> params)` for `GET /invoices/zip-requests`.
14+
- Add `invoices.retrieveZipRequest(String id)` for `GET /invoices/zip-requests/{id}`.
15+
- Add `invoices.downloadZipRequest(String id)` for streaming `GET /invoices/zip-requests/{id}/zip`.
16+
817
## [1.3.0] - 2026-06-07
918

1019
### Added

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
<groupId>io.facturapi</groupId>
77
<artifactId>facturapi-java</artifactId>
8-
<version>1.3.0</version>
8+
<version>1.4.0</version>
99
<name>facturapi-java</name>
1010
<description>Official Java SDK for Facturapi</description>
1111
<url>https://github.com/facturapi/facturapi-java</url>

src/main/java/io/facturapi/resources/InvoicesResource.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,63 @@ public InputStream downloadZipStream(String id) {
142142
return client.getStream("/invoices/" + id + "/zip");
143143
}
144144

145+
/**
146+
* Creates a ZIP request or returns the existing request for the same criteria.
147+
*
148+
* @param data ZIP request criteria.
149+
* @return ZIP request data.
150+
* @see <a href="https://docs.facturapi.io/api#tag/Invoices">API reference</a>
151+
*/
152+
public Map<String, Object> createZipRequest(Map<String, Object> data) {
153+
return post(
154+
"/invoices/zip-requests",
155+
data,
156+
null,
157+
new TypeReference<Map<String, Object>>() {}
158+
);
159+
}
160+
161+
/**
162+
* Gets a paginated list of ZIP requests.
163+
*
164+
* @param params Search and pagination parameters.
165+
* @return Paginated ZIP request result.
166+
* @see <a href="https://docs.facturapi.io/api#tag/Invoices">API reference</a>
167+
*/
168+
public SearchResult<Map<String, Object>> listZipRequests(Map<String, ?> params) {
169+
return get(
170+
"/invoices/zip-requests",
171+
params,
172+
new TypeReference<SearchResult<Map<String, Object>>>() {}
173+
);
174+
}
175+
176+
/**
177+
* Gets a ZIP request by id.
178+
*
179+
* @param id ZIP request id.
180+
* @return ZIP request data.
181+
* @see <a href="https://docs.facturapi.io/api#tag/Invoices">API reference</a>
182+
*/
183+
public Map<String, Object> retrieveZipRequest(String id) {
184+
return get(
185+
"/invoices/zip-requests/" + id,
186+
null,
187+
new TypeReference<Map<String, Object>>() {}
188+
);
189+
}
190+
191+
/**
192+
* Downloads the ZIP generated for a request.
193+
*
194+
* @param id ZIP request id.
195+
* @return ZIP stream. Caller owns closing it.
196+
* @see <a href="https://docs.facturapi.io/api#tag/Invoices">API reference</a>
197+
*/
198+
public InputStream downloadZipRequest(String id) {
199+
return client.getStream("/invoices/zip-requests/" + id + "/zip");
200+
}
201+
145202
/**
146203
* Downloads the cancellation receipt XML file.
147204
*

src/test/java/io/facturapi/FacturapiResourcesTest.java

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,98 @@ void invoicePdfCanBeStreamed() throws Exception {
112112
assertEquals("/v2/invoices/inv_1/pdf", request.uri().getPath());
113113
}
114114

115+
@Test
116+
void invoiceZipRequestCanBeCreated() {
117+
StubHttpClient httpClient = new StubHttpClient();
118+
httpClient.enqueueJson(200, "{\"id\":\"zip_1\",\"status\":\"pending\"}");
119+
120+
Facturapi sdk = new Facturapi(
121+
FacturapiConfig.builder("sk_test")
122+
.httpClient(httpClient.client())
123+
.build()
124+
);
125+
126+
var response = sdk.invoices().createZipRequest(
127+
Map.of(
128+
"year", 2025,
129+
"month", 3,
130+
"issuer_type", "issuing",
131+
"invoice_types", java.util.List.of("I", "E")
132+
)
133+
);
134+
135+
assertEquals("zip_1", response.get("id"));
136+
var request = httpClient.requests().get(0);
137+
assertEquals("POST", request.method());
138+
assertEquals("/v2/invoices/zip-requests", request.uri().getPath());
139+
assertTrue(request.bodyUtf8().contains("\"issuer_type\":\"issuing\""));
140+
}
141+
142+
@Test
143+
void invoiceZipRequestsCanBeListed() {
144+
StubHttpClient httpClient = new StubHttpClient();
145+
httpClient.enqueueJson(
146+
200,
147+
"{\"page\":1,\"total_pages\":1,\"total_results\":1,\"data\":[{\"id\":\"zip_1\"}]}"
148+
);
149+
150+
Facturapi sdk = new Facturapi(
151+
FacturapiConfig.builder("sk_test")
152+
.httpClient(httpClient.client())
153+
.build()
154+
);
155+
156+
var response = sdk.invoices().listZipRequests(
157+
Map.of("year", 2025, "month", 3, "status", "finished", "limit", 20, "page", 1)
158+
);
159+
160+
assertEquals("zip_1", response.getData().get(0).get("id"));
161+
var request = httpClient.requests().get(0);
162+
assertEquals("GET", request.method());
163+
assertEquals("/v2/invoices/zip-requests", request.uri().getPath());
164+
assertTrue(request.uri().getQuery().contains("year=2025"));
165+
assertTrue(request.uri().getQuery().contains("status=finished"));
166+
}
167+
168+
@Test
169+
void invoiceZipRequestCanBeRetrieved() {
170+
StubHttpClient httpClient = new StubHttpClient();
171+
httpClient.enqueueJson(200, "{\"id\":\"zip_1\",\"status\":\"finished\"}");
172+
173+
Facturapi sdk = new Facturapi(
174+
FacturapiConfig.builder("sk_test")
175+
.httpClient(httpClient.client())
176+
.build()
177+
);
178+
179+
var response = sdk.invoices().retrieveZipRequest("zip_1");
180+
181+
assertEquals("finished", response.get("status"));
182+
var request = httpClient.requests().get(0);
183+
assertEquals("GET", request.method());
184+
assertEquals("/v2/invoices/zip-requests/zip_1", request.uri().getPath());
185+
}
186+
187+
@Test
188+
void invoiceZipRequestCanBeDownloaded() throws Exception {
189+
StubHttpClient httpClient = new StubHttpClient();
190+
httpClient.enqueueBinary(200, "ZIP-CONTENT".getBytes(StandardCharsets.UTF_8), "application/zip");
191+
192+
Facturapi sdk = new Facturapi(
193+
FacturapiConfig.builder("sk_test")
194+
.httpClient(httpClient.client())
195+
.build()
196+
);
197+
198+
try (InputStream stream = sdk.invoices().downloadZipRequest("zip_1")) {
199+
assertEquals("ZIP-CONTENT", new String(stream.readAllBytes(), StandardCharsets.UTF_8));
200+
}
201+
202+
var request = httpClient.requests().get(0);
203+
assertEquals("GET", request.method());
204+
assertEquals("/v2/invoices/zip-requests/zip_1/zip", request.uri().getPath());
205+
}
206+
115207
@Test
116208
void organizationUploadsAcceptBytes() {
117209
StubHttpClient httpClient = new StubHttpClient();

0 commit comments

Comments
 (0)