@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 +116 -277
- package/dist/arca-fecred.d.ts +62 -104
- package/dist/arca-fecred.d.ts.map +1 -1
- package/dist/arca-fecred.js +133 -307
- package/dist/arca-fecred.js.map +1 -1
- package/dist/constants.d.ts +73 -75
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +65 -95
- package/dist/constants.js.map +1 -1
- package/dist/fecred-client.d.ts +74 -84
- package/dist/fecred-client.d.ts.map +1 -1
- package/dist/fecred-client.js +288 -148
- package/dist/fecred-client.js.map +1 -1
- package/dist/index.d.ts +6 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -13
- package/dist/index.js.map +1 -1
- package/dist/parsers.d.ts +38 -0
- package/dist/parsers.d.ts.map +1 -0
- package/dist/parsers.js +327 -0
- package/dist/parsers.js.map +1 -0
- package/dist/types.d.ts +406 -198
- package/dist/types.d.ts.map +1 -1
- package/dist/validation.d.ts +55 -23
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +233 -144
- package/dist/validation.js.map +1 -1
- package/llms.txt +65 -142
- package/package.json +5 -4
package/README.md
CHANGED
|
@@ -4,347 +4,186 @@
|
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
5
|
[](https://nodejs.org)
|
|
6
6
|
|
|
7
|
-
SDK en TypeScript para el web service **WSFECRED** de **ARCA** (ex AFIP)
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
|
23
|
+
## Uso rápido
|
|
25
24
|
|
|
26
25
|
```typescript
|
|
27
26
|
import { readFileSync } from 'fs';
|
|
28
|
-
import { ArcaFecred,
|
|
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: '
|
|
34
|
-
production: false,
|
|
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
|
-
//
|
|
38
|
-
const obligado = await fecred.consultarMontoObligadoRecepcion(
|
|
39
|
-
|
|
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
|
-
|
|
49
|
-
|
|
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
|
-
//
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
-
|
|
59
|
+
## Configuración
|
|
119
60
|
|
|
120
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
140
|
-
await fecred.aceptarFECred(12345);
|
|
81
|
+
## Operaciones
|
|
141
82
|
|
|
142
|
-
|
|
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
|
-
###
|
|
85
|
+
### Consultas (se reintentan ante errores transitorios)
|
|
151
86
|
|
|
152
|
-
|
|
153
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
118
|
+
### Identificadores
|
|
159
119
|
|
|
160
120
|
```typescript
|
|
161
|
-
//
|
|
162
|
-
const
|
|
163
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
132
|
+
`consultarCtasCtes` y `consultarComprobantes` devuelven `nroPagina` y `hayMas`. Pedí la página siguiente con `nroPagina`.
|
|
187
133
|
|
|
188
|
-
|
|
134
|
+
### Tablas de códigos
|
|
189
135
|
|
|
190
|
-
|
|
191
|
-
|
|
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
|
-
|
|
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
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
-
|
|
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
|
-
|
|
150
|
+
### Resultado incierto en operaciones
|
|
222
151
|
|
|
223
|
-
|
|
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
|
-
|
|
156
|
+
await fecred.aceptarFECred(params);
|
|
235
157
|
} catch (e) {
|
|
236
|
-
if (e instanceof
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 |
|
|
345
|
-
| --- | --- |
|
|
346
|
-
|
|
|
347
|
-
|
|
|
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
|
|
package/dist/arca-fecred.d.ts
CHANGED
|
@@ -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,
|
|
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
|
-
*
|
|
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: '
|
|
21
|
-
* production: false,
|
|
14
|
+
* cuit: '20123456786',
|
|
22
15
|
* });
|
|
23
16
|
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
17
|
+
* const { obligado, montoDesde } = await fecred.consultarMontoObligadoRecepcion({
|
|
18
|
+
* cuitConsultada: '30712345674',
|
|
19
|
+
* fechaEmision: '2026-11-01',
|
|
20
|
+
* });
|
|
27
21
|
*
|
|
28
|
-
*
|
|
29
|
-
* const cuentas = await fecred.consultarCtasCtes({
|
|
22
|
+
* const { ctasCtes, hayMas } = await fecred.consultarCtasCtes({
|
|
30
23
|
* rol: 'Receptor',
|
|
31
|
-
*
|
|
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
|
-
/**
|
|
29
|
+
/** Cliente WSAA (se puede compartir con otros SDKs). */
|
|
38
30
|
readonly wsaa: WsaaClient;
|
|
39
|
-
/**
|
|
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
|
-
*
|
|
46
|
-
*
|
|
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
|
-
|
|
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
|