@pimia/sdk 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -92,6 +92,56 @@ if (meta.idempotentReplay) {
92
92
  }
93
93
  ```
94
94
 
95
+ ## Subir un fichero
96
+
97
+ Diez operaciones de la API son `multipart/form-data`: el justificante de un
98
+ gasto, el documento de una factura recibida, un extracto bancario, el membrete
99
+ de una plantilla, el certificado de firma, el avatar. Para ésas pásale un
100
+ `FormData` y el cliente lo manda tal cual — **no le pongas `content-type`**: el
101
+ runtime escribe el suyo con el `boundary` que separa las partes, y una cabecera
102
+ puesta a mano se lo quita (el cliente lo rechaza antes de salir, con un aviso
103
+ que lo explica).
104
+
105
+ `toFormData` hace las tres conversiones que el servidor espera y que `FormData`
106
+ sola no hace: los booleanos como `1`/`0`, los objetos y arrays como cadena
107
+ JSON, y los `null` omitidos en vez de mandados como la cadena `"null"`.
108
+
109
+ ```ts
110
+ import { toFormData } from '@pimia/sdk'
111
+
112
+ // Un gasto con su justificante en PDF, de una sola llamada.
113
+ await client.post('/expenses', toFormData({
114
+ expense_date: '2026-08-24',
115
+ expense_category_id: 3,
116
+ amount: 12100, // céntimos, como todo importe
117
+ attachment_receipt: ficheroDelInput, // un File del navegador
118
+ customFields: [{ id: 3, value: 'REF-42' }],
119
+ }))
120
+
121
+ // El documento de una factura recibida, con un Blob al que le das nombre.
122
+ const form = new FormData()
123
+ form.append('document', blobPdf, 'factura-proveedor.pdf')
124
+ await client.post(`/received-invoices/${id}/upload/document`, form)
125
+ ```
126
+
127
+ Los campos de fichero salen tipados como `Blob` en `@pimia/sdk/api`, así que un
128
+ `File` del navegador encaja sin ceremonia.
129
+
130
+ ⚠️ Lo que **no** puedes pasar es un `ReadableStream`: el cliente reintenta ante
131
+ un 401 y ante un 429, y un cuerpo de un solo uso no se puede volver a mandar.
132
+
133
+ ## Descargar un fichero
134
+
135
+ Para las dos operaciones que devuelven un binario, `download`:
136
+
137
+ ```ts
138
+ const pdf = await client.download(`/received-invoices/${id}/show/document`)
139
+ const url = URL.createObjectURL(pdf)
140
+ ```
141
+
142
+ ⚠️ **No uses `get()` para esto.** Lee la respuesta con `response.text()`, así
143
+ que un PDF llega entero de tamaño y no se abre — sin ningún error que mirar.
144
+
95
145
  ## Recibir webhooks
96
146
 
97
147
  `verifyWebhook` comprueba la firma `PIMIA-WEBHOOK-v1` y te devuelve el evento