Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,9 @@ redondeo oficial de la SET: en guaraníes, al múltiplo de 50 inferior.
| `documentos.emitir(documento, { idempotencyKey })` | `POST /api/v1/documento-electronico` |
| `documentos.consultarEstado(cdc)` | `GET /api/v1/documento-electronico/status/{cdc}` |
| `documentos.descargarKude(cdc)` | `GET /api/v1/documento-electronico/{cdc}/kude` |
| `documentos.descargarKudeTicket(cdc, { ancho, resumen })` | `GET /api/v1/documento-electronico/{cdc}/kude/ticket` |
| `documentos.descargarKudeTicketImagen(cdc, { puntos, resumen })` | `GET /api/v1/documento-electronico/{cdc}/kude/ticket/imagen` |
| `documentos.descargarXml(cdc)` | `GET /api/v1/documento-electronico/{cdc}/xml` |
| `documentos.cancelar(cdc, { motivo })` | `POST /api/v1/documento-electronico/{cdc}/cancelar` |
| `documentos.nominar(cdc, { motivo, receptor })` | `POST /api/v1/documento-electronico/{cdc}/nominar` |
| `documentos.inutilizar(rango)` | `POST /api/v1/documento-electronico/inutilizar` |
Expand All @@ -90,13 +93,22 @@ redondeo oficial de la SET: en guaraníes, al múltiplo de 50 inferior.
| `contribuyente.consultarConsumoPlan()` | `GET /api/v1/contribuyente/plan-consumo` |
| `padron.consultar(rucOCedula)` | `GET /api/v1/padron/{documento}` |
| `catalogos.enumeraciones()` | `GET /api/v1/public/enums` |
| `catalogos.departamentos()`, `distritos(id)`, `ciudades(id)` | `GET /api/v1/geografia/…` |
| `catalogos.departamentos()`, `distritos(id)`, `ciudades(id)`, `ciudadesDeDepartamento(id)` | `GET /api/v1/geografia/…` |
| `webhooks.listar()`, `crear(webhook)` | `GET`, `POST /api/v1/contribuyente/webhooks` |
| `webhooks.consultar(id)`, `actualizar(id, webhook)`, `eliminar(id)` | `GET`, `PUT`, `DELETE /api/v1/contribuyente/webhooks/{id}` |
| `webhooks.rotarSecreto(id)` | `POST /api/v1/contribuyente/webhooks/{id}/rotar` |
| `webhooks.listarEntregas(id, filtro)` | `GET /api/v1/contribuyente/webhooks/{id}/entregas` |

Los catálogos son públicos y no envían la API key.

`descargarKude` espera hasta 3 minutos a que el PDF esté listo; si no lo está, lanza `KudePendienteError`. Cambiá la
espera con `{ esperarMs }`.

`descargarKudeTicket` devuelve el KuDE en cinta de papel para impresoras térmicas (`ancho` 80 o 58 mm) y
`descargarKudeTicketImagen` el mismo ticket como PNG de 1 bit para ESC/POS (`puntos` 576, 512 o 384). Con
`resumen: true` omiten el detalle de ítems e impuestos. Sólo existen para facturas y notas de crédito o débito.
`descargarXml` devuelve el XML firmado tal como se envió a SIFEN.

Para poder retomar una operación después de un corte, generá vos la `idempotencyKey` y guardala antes de enviar. Si no
la pasás, el SDK genera un UUID que solo reusa en sus propios reintentos.

Expand Down Expand Up @@ -155,6 +167,10 @@ export async function action({ request }: { request: Request }) {

Los tipos de evento son `documento.aprobado`, `documento.rechazado`, `documento.cancelado` y `lote.procesado`.

`webhooks` registra y administra los endpoints. El secreto `whsec_…` llega sólo en la respuesta de `crear` y de
`rotarSecreto`, y ninguno de los dos admite `Idempotency-Key`: el SDK no los repite ante un corte. Si se corta un
`crear`, revisá `listar` antes de volver a intentar.

Una entrega puede repetirse: deduplicá por `evento.id`. `verificarWebhook` rechaza una entrega si su
`X-Sifende-Timestamp` difiere más de 5 minutos de tu reloj; ajustalo con `toleranciaSegundos`. Durante una rotación de secreto, pasá `secreto: [nuevo, anterior]`.

Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@sifende/sdk",
"version": "0.1.0",
"version": "0.2.0",
"description": "SDK oficial de Sifende para emitir documentos electrónicos de SIFEN desde TypeScript y JavaScript.",
"license": "Apache-2.0",
"type": "module",
Expand Down
3 changes: 3 additions & 0 deletions src/cliente.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ import { Catalogos } from './recursos/catalogos.js';
import { Contribuyente } from './recursos/contribuyente.js';
import { Documentos } from './recursos/documentos.js';
import { Padron } from './recursos/padron.js';
import { Webhooks } from './recursos/webhooks.js';

export class Sifende {
readonly documentos: Documentos;
readonly contribuyente: Contribuyente;
readonly padron: Padron;
readonly catalogos: Catalogos;
readonly webhooks: Webhooks;
/** Ambiente que fija la API key (`sk_live_` → PROD, `sk_test_` → DEV, `sk_sandbox_` → SANDBOX). */
readonly ambiente: Ambiente | undefined;

Expand All @@ -19,5 +21,6 @@ export class Sifende {
this.contribuyente = new Contribuyente(http);
this.padron = new Padron(http);
this.catalogos = new Catalogos(http);
this.webhooks = new Webhooks(http);
}
}
Loading
Loading