Skip to content

Commit 575f2cf

Browse files
feat(invoices): agregar métodos ZIP (#11)
* Add invoice ZIP request methods * fix: align ZIP download method naming --------- Co-authored-by: javorosas <javier.rosasb@gmail.com>
1 parent efd9436 commit 575f2cf

3 files changed

Lines changed: 154 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1111

1212
- Add draft support methods for retentions: `retentions.updateDraft(String id, Map<String, Object> data)`, `retentions.copyToDraft(String id)`, `retentions.stampDraft(String id)`, and `retentions.cancel(String id)`.
1313

14+
- Add `invoices.createZipRequest(Map<String, Object> data)` for `POST /invoices/zip-requests`.
15+
- Add `invoices.listZipRequests(Map<String, ?> params)` for `GET /invoices/zip-requests`.
16+
- Add `invoices.retrieveZipRequest(String id)` for `GET /invoices/zip-requests/{id}`.
17+
- Add `invoices.downloadZipRequestStream(String id)` for streaming `GET /invoices/zip-requests/{id}/zip`.
18+
1419
## [1.3.0] - 2026-06-07
1520

1621
### Added

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 downloadZipRequestStream(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
@@ -206,6 +206,98 @@ void retentionDraftCancelAndListUseExpectedPaths() {
206206
assertEquals("/v2/retentions?status=draft", listRequest.uri().getPath() + "?" + listRequest.uri().getQuery());
207207
}
208208

209+
@Test
210+
void invoiceZipRequestCanBeCreated() {
211+
StubHttpClient httpClient = new StubHttpClient();
212+
httpClient.enqueueJson(200, "{\"id\":\"zip_1\",\"status\":\"pending\"}");
213+
214+
Facturapi sdk = new Facturapi(
215+
FacturapiConfig.builder("sk_test")
216+
.httpClient(httpClient.client())
217+
.build()
218+
);
219+
220+
var response = sdk.invoices().createZipRequest(
221+
Map.of(
222+
"year", 2025,
223+
"month", 3,
224+
"issuer_type", "issuing",
225+
"invoice_types", java.util.List.of("I", "E")
226+
)
227+
);
228+
229+
assertEquals("zip_1", response.get("id"));
230+
var request = httpClient.requests().get(0);
231+
assertEquals("POST", request.method());
232+
assertEquals("/v2/invoices/zip-requests", request.uri().getPath());
233+
assertTrue(request.bodyUtf8().contains("\"issuer_type\":\"issuing\""));
234+
}
235+
236+
@Test
237+
void invoiceZipRequestsCanBeListed() {
238+
StubHttpClient httpClient = new StubHttpClient();
239+
httpClient.enqueueJson(
240+
200,
241+
"{\"page\":1,\"total_pages\":1,\"total_results\":1,\"data\":[{\"id\":\"zip_1\"}]}"
242+
);
243+
244+
Facturapi sdk = new Facturapi(
245+
FacturapiConfig.builder("sk_test")
246+
.httpClient(httpClient.client())
247+
.build()
248+
);
249+
250+
var response = sdk.invoices().listZipRequests(
251+
Map.of("year", 2025, "month", 3, "status", "finished", "limit", 20, "page", 1)
252+
);
253+
254+
assertEquals("zip_1", response.getData().get(0).get("id"));
255+
var request = httpClient.requests().get(0);
256+
assertEquals("GET", request.method());
257+
assertEquals("/v2/invoices/zip-requests", request.uri().getPath());
258+
assertTrue(request.uri().getQuery().contains("year=2025"));
259+
assertTrue(request.uri().getQuery().contains("status=finished"));
260+
}
261+
262+
@Test
263+
void invoiceZipRequestCanBeRetrieved() {
264+
StubHttpClient httpClient = new StubHttpClient();
265+
httpClient.enqueueJson(200, "{\"id\":\"zip_1\",\"status\":\"finished\"}");
266+
267+
Facturapi sdk = new Facturapi(
268+
FacturapiConfig.builder("sk_test")
269+
.httpClient(httpClient.client())
270+
.build()
271+
);
272+
273+
var response = sdk.invoices().retrieveZipRequest("zip_1");
274+
275+
assertEquals("finished", response.get("status"));
276+
var request = httpClient.requests().get(0);
277+
assertEquals("GET", request.method());
278+
assertEquals("/v2/invoices/zip-requests/zip_1", request.uri().getPath());
279+
}
280+
281+
@Test
282+
void invoiceZipRequestCanBeDownloaded() throws Exception {
283+
StubHttpClient httpClient = new StubHttpClient();
284+
httpClient.enqueueBinary(200, "ZIP-CONTENT".getBytes(StandardCharsets.UTF_8), "application/zip");
285+
286+
Facturapi sdk = new Facturapi(
287+
FacturapiConfig.builder("sk_test")
288+
.httpClient(httpClient.client())
289+
.build()
290+
);
291+
292+
try (InputStream stream = sdk.invoices().downloadZipRequestStream("zip_1")) {
293+
assertEquals("ZIP-CONTENT", new String(stream.readAllBytes(), StandardCharsets.UTF_8));
294+
}
295+
296+
var request = httpClient.requests().get(0);
297+
assertEquals("GET", request.method());
298+
assertEquals("/v2/invoices/zip-requests/zip_1/zip", request.uri().getPath());
299+
}
300+
209301
@Test
210302
void organizationUploadsAcceptBytes() {
211303
StubHttpClient httpClient = new StubHttpClient();

0 commit comments

Comments
 (0)