@ramiidv/arca-fecred 0.1.0 → 0.3.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
@@ -4,347 +4,186 @@
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
5
5
  [![Node >= 18](https://img.shields.io/badge/node-%3E%3D18-brightgreen)](https://nodejs.org)
6
6
 
7
- SDK en TypeScript para el web service **WSFECRED** de **ARCA** (ex AFIP) -- Factura de Credito Electronica MiPyME (Ley 27440).
7
+ SDK en TypeScript para el web service **WSFECRED** (FECredService) de **ARCA** (ex AFIP): Factura de Crédito Electrónica MiPyME (Ley 27.440).
8
8
 
9
- Gestiona el ciclo de vida completo de las FCE: consulta de obligados, cuentas corrientes, comprobantes, aceptacion, rechazo e informar cancelacion.
9
+ Cubre todas las operaciones del WSDL: obligación de recepción, cuentas corrientes, comprobantes, historial de estados, remitos, aceptación, rechazo, cancelación total, rechazo de notas de débito/crédito, opción de transferencia, Agentes de Depósito Colectivo y tablas de parámetros.
10
10
 
11
- ## Instalacion
11
+ > **0.3.0 es un cambio incompatible**: la versión anterior no funcionaba contra ARCA (namespace, auth y nombres de operaciones incorrectos). Ver [CHANGELOG](./CHANGELOG.md).
12
+
13
+ ## Instalación
12
14
 
13
15
  ```bash
14
16
  npm install @ramiidv/arca-fecred
15
17
  ```
16
18
 
17
- ## Requisitos
18
-
19
- - Node.js >= 18
20
- - Certificado digital X.509 y clave privada de ARCA
21
- - **Testing**: generalo desde [WSASS Homologacion](https://wsass-homo.afip.gob.ar/wsass/portal/main.aspx)
22
- - **Produccion**: generalo desde [Administracion de Certificados Digitales](https://www.afip.gob.ar/ws/documentacion/certificados.asp) (requiere clave fiscal en [arca.gob.ar](https://arca.gob.ar))
19
+ Requisitos: Node.js >= 18 y un certificado de ARCA con el servicio `wsfecred` autorizado
20
+ ([WSASS homologación](https://wsass-homo.afip.gob.ar/wsass/portal/main.aspx) o
21
+ [Administración de Certificados Digitales](https://www.afip.gob.ar/ws/documentacion/certificados.asp) en producción).
23
22
 
24
- ## Uso rapido
23
+ ## Uso rápido
25
24
 
26
25
  ```typescript
27
26
  import { readFileSync } from 'fs';
28
- import { ArcaFecred, RolCtaCte, MotivoRechazo, FormaCancelacion } from '@ramiidv/arca-fecred';
27
+ import { ArcaFecred, FileTicketStorage } from '@ramiidv/arca-fecred';
29
28
 
30
29
  const fecred = new ArcaFecred({
31
30
  cert: readFileSync('./cert.pem', 'utf-8'),
32
31
  key: readFileSync('./key.pem', 'utf-8'),
33
- cuit: '20123456789',
34
- production: false, // true para produccion
32
+ cuit: '20-12345678-6', // CUIT representada (number o string, con o sin guiones)
33
+ production: false,
34
+ ticketStorage: new FileTicketStorage('./.arca-tickets'),
35
35
  });
36
36
 
37
- // Verificar si una CUIT esta obligada a recibir FCE
38
- const obligado = await fecred.consultarMontoObligadoRecepcion('30712345678');
39
- console.log(obligado.obligado); // true/false
40
-
41
- // Consultar cuentas corrientes como receptor
42
- const cuentas = await fecred.consultarCtasCtes({
43
- rol: RolCtaCte.RECEPTOR,
44
- fechaDesde: '2026-01-01',
45
- fechaHasta: '2026-03-31',
37
+ // ¿La CUIT receptora está obligada a recibir FCE?
38
+ const { obligado, montoDesde } = await fecred.consultarMontoObligadoRecepcion({
39
+ cuitConsultada: '30712345671',
40
+ fechaEmision: '2026-11-01',
46
41
  });
47
42
 
48
- for (const cta of cuentas) {
49
- console.log(`FCE #${cta.codCtaCte}: $${cta.importeTotal} - ${cta.estado}`);
50
- }
51
-
52
- // Aceptar una FCE
53
- const aceptar = await fecred.aceptarFECred(12345);
54
- console.log(aceptar.resultado);
55
-
56
- // Rechazar una FCE
57
- const rechazar = await fecred.rechazarFECred(12345, MotivoRechazo.CBU_INCORRECTO);
58
- console.log(rechazar.resultado);
59
-
60
- // Informar que una FCE aceptada fue pagada
61
- const cancelar = await fecred.informarFacturaAceptadaCancelada({
62
- codCtaCte: 12345,
63
- codFormaCancelacion: FormaCancelacion.TRANSFERENCIA,
64
- });
65
- console.log(cancelar.resultado);
66
- ```
67
-
68
- ## Configuracion
69
-
70
- ```typescript
71
- const fecred = new ArcaFecred({
72
- cert: '...', // Certificado X.509 (PEM)
73
- key: '...', // Clave privada (PEM)
74
- cuit: '20123456789', // CUIT representada
75
- production: false, // Default: false (testing/homologacion)
76
- timeout: 30_000, // Default: 30000 (30 segundos)
77
- retries: 1, // Default: 1 (reintentos en errores transitorios)
78
- retryDelayMs: 1_000, // Default: 1000 (backoff exponencial: 1s, 2s, ...)
79
- onEvent: (e) => { // Opcional: callback para logging/debugging
80
- console.log(e.type, e);
81
- },
82
- });
83
- ```
84
-
85
- ## Ejemplos
86
-
87
- ### Verificar obligacion de recepcion FCE
88
-
89
- ```typescript
90
- const resultado = await fecred.consultarMontoObligadoRecepcion('30712345678');
91
-
92
- if (resultado.obligado) {
93
- console.log(`CUIT obligada a recibir FCE desde $${resultado.montoDesde}`);
94
- } else {
95
- console.log('CUIT no obligada a recibir FCE');
96
- }
97
- ```
98
-
99
- ### Consultar cuentas corrientes
100
-
101
- ```typescript
102
- // Como emisor (mis facturas FCE emitidas)
103
- const misEmitidas = await fecred.consultarCtasCtes({
104
- rol: RolCtaCte.EMISOR,
105
- fechaDesde: '2026-01-01',
106
- fechaHasta: '2026-03-31',
43
+ // Cuentas corrientes recibidas en octubre (paginado)
44
+ const { ctasCtes, hayMas } = await fecred.consultarCtasCtes({
45
+ rol: 'Receptor',
46
+ fecha: { tipo: 'Emision', desde: '2026-10-01', hasta: '2026-10-31' },
107
47
  });
108
48
 
109
- // Como receptor (FCE que me enviaron)
110
- const recibidas = await fecred.consultarCtasCtes({
111
- rol: RolCtaCte.RECEPTOR,
112
- cuitEmisor: '30712345678', // opcional: filtrar por emisor
113
- fechaDesde: '2026-01-01',
114
- fechaHasta: '2026-03-31',
49
+ // Aceptar una FCE
50
+ const r = await fecred.aceptarFECred({
51
+ idCtaCte: { codCtaCte: ctasCtes[0].codCtaCte },
52
+ saldoAceptado: ctasCtes[0].saldo,
53
+ codMoneda: ctasCtes[0].codMoneda,
54
+ cotizacionMonedaUlt: 1,
115
55
  });
56
+ console.log(r.resultado); // 'A' o 'O' (un rechazo se lanza como ArcaServiceError)
116
57
  ```
117
58
 
118
- ### Consultar comprobantes FCE
59
+ ## Configuración
119
60
 
120
- ```typescript
121
- // Buscar por CUIT emisor
122
- const comprobantes = await fecred.consultarComprobantes({
123
- cuitEmisor: '30712345678',
124
- fechaDesde: '2026-01-01',
125
- fechaHasta: '2026-03-31',
126
- });
127
-
128
- // Buscar un comprobante especifico por codigo de cuenta corriente
129
- const comprobante = await fecred.consultarComprobantes({
130
- codCtaCte: 12345,
131
- });
132
- ```
61
+ `ArcaFecredConfig` extiende `ArcaBaseConfig` de `@ramiidv/arca-common`:
133
62
 
134
- ### Aceptar y luego informar cancelacion
63
+ | Opción | Tipo | Default | Descripción |
64
+ | --- | --- | --- | --- |
65
+ | `cert`, `key` | `string` | — | Certificado y clave privada (PEM) |
66
+ | `cuit` | `number \| string` | — | CUIT representada; se valida el dígito verificador y se envía como 11 dígitos |
67
+ | `production` | `boolean` | `false` | Homologación o producción |
68
+ | `timeout` | `number` | `30000` | Timeout HTTP (ms) |
69
+ | `retries` / `retryDelayMs` | `number` | `1` / `1000` | Reintentos de **consultas** (las operaciones nunca se reintentan) |
70
+ | `tokenTTLMinutes` | `number` | `720` | Vigencia pedida a WSAA |
71
+ | `ticketStorage` | `TicketStorage` | — | Persistencia del TA (recomendado en producción: `FileTicketStorage` o propio) |
72
+ | `clockOffsetMs`, `autoClockSkew`, `loginErrorCooldownMs` | | | Opciones de WSAA (ver arca-common) |
73
+ | `fetch` | `typeof fetch` | `globalThis.fetch` | `fetch` propio (proxy, tests) |
74
+ | `legacyTls` | `'auto' \| 'never' \| 'always'` | `'auto'` | Transporte TLS legacy |
75
+ | `onEvent` | `(e: ArcaEvent) => void` | — | Eventos `auth:*` y `request:*` |
76
+ | `wsaa` | `WsaaClient` | — | `WsaaClient` propio (compartir tickets entre SDKs) |
77
+ | `endpoints` | `{ wsfecred?, wsaa? }` | — | Sobrescribe las URLs |
135
78
 
136
- ```typescript
137
- import { FormaCancelacion } from '@ramiidv/arca-fecred';
79
+ Todos los métodos aceptan un último parámetro opcional `opts?: CallOptions` (`{ signal }`) para cancelar.
138
80
 
139
- // 1. Aceptar la FCE
140
- await fecred.aceptarFECred(12345);
81
+ ## Operaciones
141
82
 
142
- // 2. Luego de pagar, informar la cancelacion
143
- await fecred.informarFacturaAceptadaCancelada({
144
- codCtaCte: 12345,
145
- codFormaCancelacion: FormaCancelacion.TRANSFERENCIA,
146
- observaciones: 'Transferencia realizada el 2026-03-15',
147
- });
148
- ```
83
+ Fuente: WSDL de FECredService (`https://fwshomo.afip.gob.ar/wsfecred/FECredService?wsdl`). Los nombres de campos siguen el XSD.
149
84
 
150
- ### Rechazar una FCE
85
+ ### Consultas (se reintentan ante errores transitorios)
151
86
 
152
- ```typescript
153
- import { MotivoRechazo } from '@ramiidv/arca-fecred';
87
+ | Método | Operación | Devuelve |
88
+ | --- | --- | --- |
89
+ | `status()` | `dummy` | `{ appserver, dbserver, authserver }` |
90
+ | `consultarMontoObligadoRecepcion({ cuitConsultada, fechaEmision })` | idem | `{ obligado, montoDesde?, evento?, observaciones }` |
91
+ | `consultarObligadoRecepcion(cuit)` | idem | `{ obligado, desde?, ... }` (campo `respuesta` del WS) |
92
+ | `consultarCtasCtes({ rol, cuitContraparte?, fecha?, estadoCtaCte?, nroPagina?, opcionTransferencia? })` | idem | `{ ctasCtes: InfoCtaCte[], nroPagina?, hayMas?, ... }` |
93
+ | `consultarCtaCte(idCtaCte)` | idem | `{ ctaCte: CuentaCorriente, ... }` |
94
+ | `consultarComprobantes({ rol, cuitContraparte?, codTipoCmp?, estadoCmp?, fecha?, codCtaCte?, estadoCtaCte?, nroPagina? })` | idem | `{ comprobantes: Comprobante[], nroPagina?, hayMas?, ... }` |
95
+ | `consultarHistorialEstadosComprobante(idComprobante)` | idem | `{ idComprobante, estados }` |
96
+ | `consultarHistorialEstadosCtaCte(idCtaCte)` | idem | `{ idCtaCte, estados }` |
97
+ | `obtenerRemitos(idComprobante)` | idem | `IdComprobante[]` |
98
+ | `consultarCuentasEnAgtDptoCltv()` | idem | `{ cuentas, ... }` |
99
+ | `consultarFacturasAgtDptoCltv({ idCtaCte?, fecha? })` | idem | `{ facturas, ... }` |
100
+ | `consultarTiposRetenciones()` | idem | `{ codigoJurisdiccion, descripcionJurisdiccion, porcentajeRetencion }[]` |
101
+ | `consultarTiposFormasCancelacion()` | idem | `{ codigo, descripcion }[]` |
102
+ | `consultarTiposMotivosRechazo()` | idem | `{ codigo, descripcion }[]` |
103
+ | `consultarTiposAjustesOperacion()` | idem | `{ codigo, descripcion }[]` |
104
+
105
+ ### Operaciones que cambian estado (emisiones: nunca se reintentan)
106
+
107
+ | Método | Operación | Devuelve |
108
+ | --- | --- | --- |
109
+ | `aceptarFECred({ idCtaCte, saldoAceptado, codMoneda, cotizacionMonedaUlt, ... })` | idem | `{ resultado: 'A' \| 'O', idCtaCte, evento?, observaciones }` |
110
+ | `rechazarFECred({ idCtaCte, motivos })` | idem | idem |
111
+ | `informarCancelacionTotalFECred({ idCtaCte, formasCancelacion, importeCancelacion })` | idem | idem |
112
+ | `modificarOpcionTransferencia({ idCtaCte, opcionTransferencia })` | idem | idem |
113
+ | `informarFacturaAgtDptoCltv({ idCtaCte, ctaAgente })` | idem | idem |
114
+ | `rechazarNotaDC({ idComprobante, motivos })` | idem | `{ resultado, idComprobante, ... }` |
154
115
 
155
- await fecred.rechazarFECred(12345, MotivoRechazo.OTROS);
156
- ```
116
+ `aceptarFECred` acepta además los opcionales del XSD: `confirmarNotasDC` (`{ acepta, idNota }[]`), `formasCancelacion`, `retenciones` (`{ codTipo, importe, porcentaje, descMotivo? }[]`), `ajustesOperacion` (`{ codigo, importe }[]`), `tipoCancelacion` (`'PAR' | 'TOT'`), `importeCancelado`, `importeTotalRetPesos`, `importeEmbargoPesos`, `informaCBU` y `cbuComprador`.
157
117
 
158
- ### Consultar parametros disponibles
118
+ ### Identificadores
159
119
 
160
120
  ```typescript
161
- // Tipos de retencion
162
- const retenciones = await fecred.consultarTiposRetenciones();
163
- for (const r of retenciones) {
164
- console.log(`${r.codTipoRetencion}: ${r.descTipoRetencion}`);
165
- }
166
-
167
- // Formas de cancelacion
168
- const formas = await fecred.consultarTiposFormasCancelacion();
121
+ // IdCtaCteType es un xsd:choice: por código de cuenta corriente o por factura
122
+ const porCodigo = { codCtaCte: '1234567890' };
123
+ const porFactura = { idFactura: { cuitEmisor: '30712345671', codTipoCmp: 201, ptoVta: 3, nroCmp: 125 } };
169
124
 
170
- // Tipos de ajuste de operacion
171
- const ajustes = await fecred.consultarTiposAjustesOperacion();
172
-
173
- // Motivos de rechazo
174
- const motivos = await fecred.consultarTiposMotivoRechazo();
125
+ await fecred.consultarCtaCte(porFactura);
175
126
  ```
176
127
 
177
- ### Health check
128
+ Las respuestas devuelven `codCtaCte`, CUITs y `codAutorizacion` (CAE) como **string**; importes como `number`; fechas como el string que envía ARCA; los `S`/`N` como `boolean`.
178
129
 
179
- ```typescript
180
- const status = await fecred.status();
181
- console.log(status.appserver); // "OK"
182
- console.log(status.dbserver); // "OK"
183
- console.log(status.authserver); // "OK"
184
- ```
130
+ ### Paginado
185
131
 
186
- ## Retry automatico
132
+ `consultarCtasCtes` y `consultarComprobantes` devuelven `nroPagina` y `hayMas`. Pedí la página siguiente con `nroPagina`.
187
133
 
188
- El SDK reintenta automaticamente en errores transitorios (timeout, HTTP 5xx, errores de red). No reintenta en errores de negocio (4xx, errores de ARCA).
134
+ ### Tablas de códigos
189
135
 
190
- - **Default**: 1 reintento con backoff exponencial (1s, 2s, ...)
191
- - **Configurable**: `retries: 0` para desactivar, `retries: 3` para mas intentos
136
+ Los códigos de formas de cancelación, motivos de rechazo, ajustes de operación y retenciones **no están en el WSDL**: obtenelos con `consultarTipos*()`. El SDK solo exporta las enumeraciones definidas en el XSD:
137
+ `RolCtaCte`, `EstadoCtaCte` (`Modificable`, `Aceptada`, `Rechazada`, `CanceladaTotal`, `InformadaAgDpto`), `EstadoComprobante`, `TipoFechaFiltro`, `OpcionTransferencia` (`SCA`, `ADC`), `TipoCancelacion` (`PAR`, `TOT`), `TipoAceptacion` y `Resultado`. Se pueden usar como `RolCtaCte.RECEPTOR` o con el literal (`'Receptor'`).
192
138
 
193
- ```typescript
194
- const fecred = new ArcaFecred({
195
- ...config,
196
- retries: 2, // 2 reintentos (3 intentos totales)
197
- retryDelayMs: 2000, // empezar con 2s -> 4s -> 8s
198
- });
199
- ```
200
-
201
- ## Eventos / Logging
202
-
203
- El SDK emite eventos para debugging y monitoreo sin forzar un logger especifico.
139
+ ## Errores
204
140
 
205
- ```typescript
206
- const fecred = new ArcaFecred({
207
- ...config,
208
- onEvent: (e) => console.log(`[${e.type}]`, e),
209
- });
210
- ```
141
+ | Clase | Cuándo |
142
+ | --- | --- |
143
+ | `ArcaValidationError` | Datos inválidos (CUIT con dígito verificador incorrecto, fechas inexistentes, importes NaN/negativos, textos fuera de 3..250, CBU inválido, etc.). No se llega a pedir el ticket ni a llamar a ARCA. `field` indica el parámetro. |
144
+ | `ArcaServiceError` | ARCA devolvió `arrayErrores` o `arrayErroresFormato`, o una operación terminó con `resultado = 'R'`. `errors: { code, msg, rawCode? }[]` (`rawCode` para los códigos alfanuméricos de `arrayErroresFormato`). |
145
+ | `ArcaSoapError` | HTTP, timeout, SOAP Fault (ej: `wscommon_005`/`wscommon_007` de auth) o respuesta sin un campo obligatorio del XSD. `uncertain` indica si ARCA pudo haber procesado el request. |
146
+ | `ArcaAuthError` / `ArcaTicketVigenteError` | Falla de WSAA / ya hay un TA vigente que no está en el `ticketStorage`. |
211
147
 
212
- | Evento | Cuando | Datos |
213
- | --- | --- | --- |
214
- | `auth:login` | Nuevo token obtenido | `service`, `durationMs` |
215
- | `auth:cache-hit` | Token cacheado reutilizado | `service` |
216
- | `request:start` | Antes de una llamada SOAP | `method`, `endpoint` |
217
- | `request:end` | Llamada SOAP completada | `method`, `durationMs` |
218
- | `request:retry` | Reintentando tras error | `method`, `attempt`, `error` |
219
- | `request:error` | Llamada SOAP fallo | `method`, `error` |
148
+ Las observaciones (`arrayObservaciones`) y el `evento` no son errores: vienen en el resultado.
220
149
 
221
- ## Manejo de errores
150
+ ### Resultado incierto en operaciones
222
151
 
223
- El SDK provee clases de error especificas para catch granular:
152
+ Las emisiones (`aceptarFECred`, `rechazarFECred`, `informarCancelacionTotalFECred`, `rechazarNotaDC`, `modificarOpcionTransferencia`, `informarFacturaAgtDptoCltv`) se envían una sola vez. Si la respuesta se pierde (timeout, conexión cortada, HTTP 5xx, respuesta ilegible) se lanza `ArcaSoapError` con `uncertain = true`: la operación **pudo haberse registrado**. Antes de reintentar, consultá el estado:
224
153
 
225
154
  ```typescript
226
- import {
227
- ArcaFecred,
228
- ArcaAuthError,
229
- ArcaServiceError,
230
- ArcaSoapError,
231
- } from '@ramiidv/arca-fecred';
232
-
233
155
  try {
234
- const resultado = await fecred.aceptarFECred(12345);
156
+ await fecred.aceptarFECred(params);
235
157
  } catch (e) {
236
- if (e instanceof ArcaAuthError) {
237
- // Error de autenticacion WSAA (certificado invalido, expirado, etc.)
238
- console.error('Auth error:', e.message);
239
- fecred.clearAuthCache(); // Limpiar cache e intentar de nuevo
240
- }
241
-
242
- if (e instanceof ArcaServiceError) {
243
- // Error de negocio de WSFECRED (FCE no encontrada, estado invalido, etc.)
244
- for (const err of e.errors) {
245
- console.error(`[${err.code}] ${err.msg}`);
246
- }
247
- }
248
-
249
- if (e instanceof ArcaSoapError) {
250
- // Error HTTP/SOAP (timeout, servidor caido, etc.)
251
- console.error('HTTP status:', e.statusCode);
158
+ if (e instanceof ArcaSoapError && e.uncertain) {
159
+ const { estados } = await fecred.consultarHistorialEstadosCtaCte(params.idCtaCte);
160
+ // o consultarCtaCte(params.idCtaCte) → ctaCte.estadoCtaCte.estado
161
+ // Si ya figura Aceptada/Rechazada, no reintentar.
252
162
  }
163
+ throw e;
253
164
  }
254
165
  ```
255
166
 
256
- | Clase | Cuando se lanza |
257
- | --- | --- |
258
- | `ArcaAuthError` | Falla en login WSAA, respuesta inesperada, token/sign invalidos |
259
- | `ArcaServiceError` | Error devuelto por WSFECRED (FCE no encontrada, operacion invalida, etc.). Contiene `errors: { code, msg }[]` |
260
- | `ArcaSoapError` | Error HTTP, timeout, SOAP Fault. Contiene `statusCode?: number` |
261
- | `ArcaError` | Clase base para todos los errores del SDK |
262
-
263
- ## API
264
-
265
- ### `new ArcaFecred(config)`
266
-
267
- | Parametro | Tipo | Default | Descripcion |
268
- | --- | --- | --- | --- |
269
- | `cert` | `string` | -- | Contenido del certificado X.509 (PEM) |
270
- | `key` | `string` | -- | Contenido de la clave privada (PEM) |
271
- | `cuit` | `string` | -- | CUIT de la entidad representada |
272
- | `production` | `boolean` | `false` | Entorno de produccion |
273
- | `timeout` | `number` | `30000` | Timeout HTTP en milisegundos |
274
- | `retries` | `number` | `1` | Reintentos en errores transitorios |
275
- | `retryDelayMs` | `number` | `1000` | Delay inicial entre reintentos (exponencial) |
276
- | `onEvent` | `function` | -- | Callback para eventos del SDK |
277
-
278
- ### Consultas de operaciones
279
-
280
- | Metodo | Descripcion |
281
- | --- | --- |
282
- | `consultarMontoObligadoRecepcion(cuit)` | Verifica si una CUIT esta obligada a recibir FCE |
283
- | `consultarCtasCtes(params)` | Consulta cuentas corrientes de actividad FCE |
284
- | `consultarComprobantes(params)` | Busca comprobantes FCE por filtros |
285
-
286
- ### Acciones sobre FCE
287
-
288
- | Metodo | Descripcion |
289
- | --- | --- |
290
- | `aceptarFECred(codCtaCte)` | Acepta una FCE |
291
- | `rechazarFECred(codCtaCte, codMotivoRechazo)` | Rechaza una FCE con motivo |
292
- | `informarFacturaAceptadaCancelada(params)` | Informa que una FCE aceptada fue pagada/cancelada |
293
-
294
- ### Consultas de parametros
295
-
296
- | Metodo | Descripcion |
297
- | --- | --- |
298
- | `consultarTiposRetenciones()` | Tipos de retenciones disponibles |
299
- | `consultarTiposFormasCancelacion()` | Formas de cancelacion disponibles |
300
- | `consultarTiposAjustesOperacion()` | Tipos de ajustes de operacion disponibles |
301
- | `consultarTiposMotivoRechazo()` | Motivos de rechazo disponibles |
167
+ ## Cliente de bajo nivel
302
168
 
303
- ### Estado y utilidades
304
-
305
- | Metodo | Descripcion |
306
- | --- | --- |
307
- | `status()` | Health check del servicio WSFECRED (no requiere autenticacion) |
308
- | `clearAuthCache()` | Invalida el ticket de acceso cacheado |
309
-
310
- ### Acceso a clientes de bajo nivel
311
-
312
- Para casos avanzados, se pueden usar los clientes individuales directamente:
169
+ `fecred.fecred` es un `FecredClient`: los mismos métodos con las credenciales como primer parámetro y respuestas tipadas.
313
170
 
314
171
  ```typescript
315
- const fecred = new ArcaFecred({ /* ... */ });
316
-
317
- // Obtener ticket de acceso manualmente
318
172
  const ticket = await fecred.wsaa.getAccessTicket('wsfecred');
319
-
320
- const credenciales = {
321
- Token: ticket.token,
322
- Sign: ticket.sign,
323
- Cuit: '20123456789',
324
- };
325
-
326
- // Llamar directamente al servicio
327
- const rawResult = await fecred.fecred.consultarMontoObligadoRecepcion(
328
- credenciales,
329
- '30712345678',
330
- );
173
+ const auth = { token: ticket.token, sign: ticket.sign, cuitRepresentada: '20123456786' };
174
+ const tipos = await fecred.fecred.consultarTiposMotivosRechazo(auth);
331
175
  ```
332
176
 
333
- ## Enums disponibles
334
-
335
- - `RolCtaCte` -- Rol en la cuenta corriente (EMISOR, RECEPTOR)
336
- - `EstadoCtaCte` -- Estado de la cuenta corriente (PENDIENTE_ACEPTACION, ACEPTADA, RECHAZADA, CANCELADA, ANULADA)
337
- - `MotivoRechazo` -- Motivos de rechazo (NOTA_CREDITO_DEBITO, CUIT_INCORRECTO, FECHA_INCORRECTA, CBU_INCORRECTO, OTROS)
338
- - `FormaCancelacion` -- Formas de cancelacion (ACREDITACION_CUENTA, TRANSFERENCIA, CHEQUE, PAGO_ELECTRONICO, COMPENSACION, ENDOSO, OTRO)
339
- - `TipoAjusteOperacion` -- Tipos de ajuste (NOTA_CREDITO, NOTA_DEBITO)
340
- - `TipoRetencion` -- Tipos de retencion (GANANCIAS, IVA, SUSS, INGRESOS_BRUTOS, OTRAS)
177
+ Detalles del protocolo (verificados contra homologación): namespace `http://ar.gob.afip.wsfecred/FECredService/`, wrapper `<operacionRequest>`, header `SOAPAction` = namespace + operación (obligatorio), `dummy` con Body vacío.
341
178
 
342
179
  ## Entornos
343
180
 
344
- | Entorno | WSAA | WSFECRED |
345
- | --- | --- | --- |
346
- | Testing | `wsaahomo.afip.gov.ar` | `fwshomo.afip.gob.ar` |
347
- | Produccion | `wsaa.afip.gov.ar` | `serviciosjava.afip.gob.ar` |
181
+ | Entorno | WSFECRED |
182
+ | --- | --- |
183
+ | Homologación | `https://fwshomo.afip.gob.ar/wsfecred/FECredService` |
184
+ | Producción | `https://serviciosjava.afip.gob.ar/wsfecred/FECredService` |
185
+
186
+ Los endpoints de WSAA están en `WSAA_ENDPOINTS` de `@ramiidv/arca-common`.
348
187
 
349
188
  ## Licencia
350
189
 
@@ -1,129 +1,87 @@
1
1
  import { WsaaClient } from '@ramiidv/arca-common';
2
- import type { ServerStatus } from '@ramiidv/arca-common';
2
+ import type { CallOptions, ServerStatus } from '@ramiidv/arca-common';
3
3
  import { FecredClient } from './fecred-client.js';
4
- import type { ArcaFecredConfig, MontoObligadoResult, CtaCte, ComprobanteFecred, ConsultarCtasCtesParams, ConsultarComprobantesParams, AceptarFecredResult, RechazarFecredResult, InformarCanceladaParams, InformarCanceladaResult, TipoRetencionItem, TipoFormaCancelacionItem, TipoAjusteOperacionItem, TipoMotivoRechazoItem } from './types.js';
4
+ import type { AceptarFecredParams, ArcaFecredConfig, CodigoDescripcion, ConsultarComprobantesParams, ConsultarComprobantesResult, ConsultarCtaCteResult, ConsultarCtasCtesParams, ConsultarCtasCtesResult, ConsultarCuentasEnAgtDptoCltvResult, ConsultarFacturasAgtDptoCltvParams, ConsultarFacturasAgtDptoCltvResult, ConsultarMontoObligadoRecepcionParams, HistorialEstadosComprobanteResult, HistorialEstadosCtaCteResult, IdComprobante, IdComprobanteInput, IdCtaCteInput, InformarCancelacionTotalParams, InformarFacturaAgtDptoCltvParams, ModificarOpcionTransferenciaParams, MontoObligadoRecepcionResult, ObligadoRecepcionResult, OperacionFecredResult, RechazarFecredParams, RechazarNotaDCParams, RechazarNotaDCResult, TipoRetencion } from './types.js';
5
5
  /**
6
- * Main orchestrator class for ARCA WSFECRED (Factura de Credito Electronica MiPyME).
7
- *
8
- * Provides high-level methods that handle WSAA authentication automatically
9
- * and expose results from the WSFECRED web service for managing FCE
10
- * (Electronic Credit Invoices) under Law 27440.
6
+ * Cliente de alto nivel de WSFECRED (Factura de Crédito Electrónica MiPyME,
7
+ * Ley 27.440). Obtiene y cachea el Ticket de Acceso de WSAA automáticamente.
11
8
  *
12
9
  * @example
13
10
  * ```ts
14
- * import { ArcaFecred } from '@ramiidv/arca-fecred';
15
- * import { readFileSync } from 'fs';
16
- *
17
11
  * const fecred = new ArcaFecred({
18
12
  * cert: readFileSync('cert.pem', 'utf-8'),
19
13
  * key: readFileSync('key.pem', 'utf-8'),
20
- * cuit: '20123456789',
21
- * production: false,
14
+ * cuit: '20123456786',
22
15
  * });
23
16
  *
24
- * // Check if a CUIT is obligated to receive FCE
25
- * const obligado = await fecred.consultarMontoObligadoRecepcion('30712345678');
26
- * console.log(obligado.obligado); // true/false
17
+ * const { obligado, montoDesde } = await fecred.consultarMontoObligadoRecepcion({
18
+ * cuitConsultada: '30712345674',
19
+ * fechaEmision: '2026-11-01',
20
+ * });
27
21
  *
28
- * // Query current accounts
29
- * const cuentas = await fecred.consultarCtasCtes({
22
+ * const { ctasCtes, hayMas } = await fecred.consultarCtasCtes({
30
23
  * rol: 'Receptor',
31
- * fechaDesde: '2026-01-01',
32
- * fechaHasta: '2026-03-31',
24
+ * fecha: { tipo: 'Emision', desde: '2026-10-01', hasta: '2026-10-31' },
33
25
  * });
34
26
  * ```
35
27
  */
36
28
  export declare class ArcaFecred {
37
- /** Low-level WSAA client for direct access */
29
+ /** Cliente WSAA (se puede compartir con otros SDKs). */
38
30
  readonly wsaa: WsaaClient;
39
- /** Low-level WSFECRED client for direct access */
31
+ /** Cliente de bajo nivel de FECredService. */
40
32
  readonly fecred: FecredClient;
33
+ /** CUIT representada (11 dígitos). */
41
34
  private readonly cuit;
42
- private readonly onEvent?;
43
35
  constructor(config: ArcaFecredConfig);
36
+ /** Estado de los servidores de WSFECRED (`dummy`, sin autenticación). */
37
+ status(opts?: CallOptions): Promise<ServerStatus>;
38
+ /** Si una CUIT está obligada a recibir FCE para una fecha de emisión, y desde qué monto. */
39
+ consultarMontoObligadoRecepcion(params: ConsultarMontoObligadoRecepcionParams, opts?: CallOptions): Promise<MontoObligadoRecepcionResult>;
40
+ /** Si una CUIT está obligada a recibir FCE y desde qué fecha. */
41
+ consultarObligadoRecepcion(cuitConsultada: number | string, opts?: CallOptions): Promise<ObligadoRecepcionResult>;
42
+ /** Cuentas corrientes de FCE (paginado: ver `hayMas` / `nroPagina`). */
43
+ consultarCtasCtes(params: ConsultarCtasCtesParams, opts?: CallOptions): Promise<ConsultarCtasCtesResult>;
44
+ /** Detalle de una cuenta corriente. */
45
+ consultarCtaCte(idCtaCte: IdCtaCteInput, opts?: CallOptions): Promise<ConsultarCtaCteResult>;
46
+ /** Comprobantes FCE (paginado: ver `hayMas` / `nroPagina`). */
47
+ consultarComprobantes(params: ConsultarComprobantesParams, opts?: CallOptions): Promise<ConsultarComprobantesResult>;
48
+ /** Historial de estados de un comprobante. */
49
+ consultarHistorialEstadosComprobante(idComprobante: IdComprobanteInput, opts?: CallOptions): Promise<HistorialEstadosComprobanteResult>;
50
+ /** Historial de estados de una cuenta corriente. */
51
+ consultarHistorialEstadosCtaCte(idCtaCte: IdCtaCteInput, opts?: CallOptions): Promise<HistorialEstadosCtaCteResult>;
52
+ /** Remitos asociados a un comprobante. */
53
+ obtenerRemitos(idComprobante: IdComprobanteInput, opts?: CallOptions): Promise<IdComprobante[]>;
44
54
  /**
45
- * Health check for the WSFECRED service.
46
- * Does not require authentication.
47
- */
48
- status(): Promise<ServerStatus>;
49
- /**
50
- * Check if a CUIT is obligated to receive FCE (Factura de Credito Electronica).
51
- * Authenticates automatically via WSAA.
52
- *
53
- * @param cuitConsultada - CUIT to check
54
- * @returns Result indicating if the CUIT is obligated and the threshold amount
55
- */
56
- consultarMontoObligadoRecepcion(cuitConsultada: string): Promise<MontoObligadoResult>;
57
- /**
58
- * Query current accounts from FCE activity.
59
- * Authenticates automatically via WSAA.
60
- *
61
- * @param params - Query filters (role, CUITs, date range)
62
- * @returns Array of current account records
63
- */
64
- consultarCtasCtes(params: ConsultarCtasCtesParams): Promise<CtaCte[]>;
65
- /**
66
- * Search FCE invoices by filters.
67
- * Authenticates automatically via WSAA.
68
- *
69
- * @param params - Query filters
70
- * @returns Array of FCE invoice records
71
- */
72
- consultarComprobantes(params: ConsultarComprobantesParams): Promise<ComprobanteFecred[]>;
73
- /**
74
- * Accept an FCE (Factura de Credito Electronica).
75
- * Authenticates automatically via WSAA.
76
- *
77
- * @param codCtaCte - Current account code of the FCE to accept
78
- * @returns Result of the acceptance operation
79
- */
80
- aceptarFECred(codCtaCte: number): Promise<AceptarFecredResult>;
81
- /**
82
- * Reject an FCE (Factura de Credito Electronica).
83
- * Authenticates automatically via WSAA.
84
- *
85
- * @param codCtaCte - Current account code of the FCE to reject
86
- * @param codMotivoRechazo - Rejection reason code (use MotivoRechazo enum)
87
- * @returns Result of the rejection operation
88
- */
89
- rechazarFECred(codCtaCte: number, codMotivoRechazo: number): Promise<RechazarFecredResult>;
90
- /**
91
- * Inform that an accepted FCE was paid/cancelled.
92
- * Authenticates automatically via WSAA.
93
- *
94
- * @param params - Cancellation details (account code, payment method, optional observations)
95
- * @returns Result of the cancellation notification
96
- */
97
- informarFacturaAceptadaCancelada(params: InformarCanceladaParams): Promise<InformarCanceladaResult>;
98
- /**
99
- * Query available retention types.
100
- * Authenticates automatically via WSAA.
101
- */
102
- consultarTiposRetenciones(): Promise<TipoRetencionItem[]>;
103
- /**
104
- * Query available payment method types for cancelling accepted FCE.
105
- * Authenticates automatically via WSAA.
106
- */
107
- consultarTiposFormasCancelacion(): Promise<TipoFormaCancelacionItem[]>;
108
- /**
109
- * Query available operation adjustment types.
110
- * Authenticates automatically via WSAA.
111
- */
112
- consultarTiposAjustesOperacion(): Promise<TipoAjusteOperacionItem[]>;
113
- /**
114
- * Query available rejection reason types.
115
- * Authenticates automatically via WSAA.
116
- */
117
- consultarTiposMotivoRechazo(): Promise<TipoMotivoRechazoItem[]>;
118
- /** Invalidate the cached WSAA access ticket for WSFECRED. */
119
- clearAuthCache(): void;
120
- private getAuth;
121
- private parseCtaCte;
122
- private parseComprobante;
123
- /**
124
- * Generic parser for parameter arrays from WSFECRED responses.
125
- * Handles varying SOAP response structures (different key names, namespaces).
55
+ * Acepta una FCE. Un rechazo de ARCA (errores o `resultado = 'R'`) se lanza
56
+ * como `ArcaServiceError`. Si la respuesta se pierde (`ArcaSoapError` con
57
+ * `uncertain`), consultá el estado con `consultarCtaCte` antes de reintentar.
126
58
  */
127
- private parseParamArray;
59
+ aceptarFECred(params: AceptarFecredParams, opts?: CallOptions): Promise<OperacionFecredResult>;
60
+ /** Rechaza una FCE (motivos de `consultarTiposMotivosRechazo`). */
61
+ rechazarFECred(params: RechazarFecredParams, opts?: CallOptions): Promise<OperacionFecredResult>;
62
+ /** Informa la cancelación total de una FCE aceptada. */
63
+ informarCancelacionTotalFECred(params: InformarCancelacionTotalParams, opts?: CallOptions): Promise<OperacionFecredResult>;
64
+ /** Rechaza una nota de débito/crédito asociada a una FCE. */
65
+ rechazarNotaDC(params: RechazarNotaDCParams, opts?: CallOptions): Promise<RechazarNotaDCResult>;
66
+ /** Cambia la opción de transferencia (SCA/ADC) de una cuenta corriente. */
67
+ modificarOpcionTransferencia(params: ModificarOpcionTransferenciaParams, opts?: CallOptions): Promise<OperacionFecredResult>;
68
+ /** Informa una factura a un Agente de Depósito Colectivo. */
69
+ informarFacturaAgtDptoCltv(params: InformarFacturaAgtDptoCltvParams, opts?: CallOptions): Promise<OperacionFecredResult>;
70
+ /** Cuentas de la CUIT representada en Agentes de Depósito Colectivo. */
71
+ consultarCuentasEnAgtDptoCltv(opts?: CallOptions): Promise<ConsultarCuentasEnAgtDptoCltvResult>;
72
+ /** Facturas informadas a Agentes de Depósito Colectivo. */
73
+ consultarFacturasAgtDptoCltv(params?: ConsultarFacturasAgtDptoCltvParams, opts?: CallOptions): Promise<ConsultarFacturasAgtDptoCltvResult>;
74
+ /** Tipos de retenciones (jurisdicción y porcentaje). */
75
+ consultarTiposRetenciones(opts?: CallOptions): Promise<TipoRetencion[]>;
76
+ /** Formas de cancelación (para `aceptarFECred` / `informarCancelacionTotalFECred`). */
77
+ consultarTiposFormasCancelacion(opts?: CallOptions): Promise<CodigoDescripcion[]>;
78
+ /** Motivos de rechazo (para `rechazarFECred` / `rechazarNotaDC`). */
79
+ consultarTiposMotivosRechazo(opts?: CallOptions): Promise<CodigoDescripcion[]>;
80
+ /** Tipos de ajustes de operación (para `aceptarFECred`). */
81
+ consultarTiposAjustesOperacion(opts?: CallOptions): Promise<CodigoDescripcion[]>;
82
+ /** Descarta el Ticket de Acceso de WSFECRED (memoria y `ticketStorage`). */
83
+ clearAuthCache(): Promise<void>;
84
+ /** Credenciales diferidas: el cliente las pide después de validar los parámetros. */
85
+ private auth;
128
86
  }
129
87
  //# sourceMappingURL=arca-fecred.d.ts.map