@ramiidv/arca-sdk 0.1.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/LICENSE +21 -0
- package/README.md +273 -0
- package/dist/arca.d.ts +101 -0
- package/dist/arca.d.ts.map +1 -0
- package/dist/arca.js +199 -0
- package/dist/arca.js.map +1 -0
- package/dist/constants.d.ts +111 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +157 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/soap-client.d.ts +19 -0
- package/dist/soap-client.d.ts.map +1 -0
- package/dist/soap-client.js +99 -0
- package/dist/soap-client.js.map +1 -0
- package/dist/types.d.ts +228 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/wsaa.d.ts +37 -0
- package/dist/wsaa.d.ts.map +1 -0
- package/dist/wsaa.js +128 -0
- package/dist/wsaa.js.map +1 -0
- package/dist/wsfe.d.ts +59 -0
- package/dist/wsfe.d.ts.map +1 -0
- package/dist/wsfe.js +238 -0
- package/dist/wsfe.js.map +1 -0
- package/package.json +60 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 ramiidv
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
# arca-sdk
|
|
2
|
+
|
|
3
|
+
SDK en TypeScript para interactuar con los Web Services de **ARCA** (ex AFIP) — Facturación Electrónica Argentina.
|
|
4
|
+
|
|
5
|
+
Soporta **todos los tipos de comprobante** de WSFEv1: Facturas, Notas de Débito/Crédito, Recibos (A, B, C, E, M) y Facturas de Crédito Electrónica MiPyME (FCE).
|
|
6
|
+
|
|
7
|
+
## Instalación
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install arca-sdk
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Requisitos
|
|
14
|
+
|
|
15
|
+
- Node.js >= 18
|
|
16
|
+
- Certificado digital X.509 y clave privada de ARCA
|
|
17
|
+
- **Testing**: generalo desde [WSASS Homologación](https://wsass-homo.afip.gob.ar/wsass/portal/main.aspx)
|
|
18
|
+
- **Producción**: generalo desde [Administrador de Certificados](https://auth.afip.gob.ar/contribuyente_/certificados/)
|
|
19
|
+
|
|
20
|
+
## Uso rápido
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import fs from "fs";
|
|
24
|
+
import { Arca, CbteTipo, Concepto, DocTipo, IvaTipo, Moneda } from "arca-sdk";
|
|
25
|
+
|
|
26
|
+
const arca = new Arca({
|
|
27
|
+
cuit: 20123456789,
|
|
28
|
+
cert: fs.readFileSync("./cert.crt", "utf-8"),
|
|
29
|
+
key: fs.readFileSync("./key.key", "utf-8"),
|
|
30
|
+
production: false, // true para producción
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// Crear factura B para consumidor final (obtiene el número automáticamente)
|
|
34
|
+
const result = await arca.crearFacturaAuto(1, CbteTipo.FACTURA_B, {
|
|
35
|
+
Concepto: Concepto.PRODUCTOS,
|
|
36
|
+
DocTipo: DocTipo.CONSUMIDOR_FINAL,
|
|
37
|
+
DocNro: 0,
|
|
38
|
+
CbteFch: Arca.formatDate(new Date()),
|
|
39
|
+
ImpTotal: 121,
|
|
40
|
+
ImpTotConc: 0,
|
|
41
|
+
ImpNeto: 100,
|
|
42
|
+
ImpOpEx: 0,
|
|
43
|
+
ImpTrib: 0,
|
|
44
|
+
ImpIVA: 21,
|
|
45
|
+
MonId: Moneda.PESOS,
|
|
46
|
+
MonCotiz: 1,
|
|
47
|
+
Iva: [{ Id: IvaTipo.IVA_21, BaseImp: 100, Importe: 21 }],
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
const { approved, cae, caeFchVto } = Arca.extractCAE(result);
|
|
51
|
+
console.log(approved ? `CAE: ${cae}` : "Rechazada");
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Tipos de comprobante soportados
|
|
55
|
+
|
|
56
|
+
| Enum | Código | Descripción |
|
|
57
|
+
| --- | --- | --- |
|
|
58
|
+
| `FACTURA_A` | 1 | Factura A |
|
|
59
|
+
| `NOTA_DEBITO_A` | 2 | Nota de Débito A |
|
|
60
|
+
| `NOTA_CREDITO_A` | 3 | Nota de Crédito A |
|
|
61
|
+
| `RECIBO_A` | 4 | Recibo A |
|
|
62
|
+
| `FACTURA_B` | 6 | Factura B |
|
|
63
|
+
| `NOTA_DEBITO_B` | 7 | Nota de Débito B |
|
|
64
|
+
| `NOTA_CREDITO_B` | 8 | Nota de Crédito B |
|
|
65
|
+
| `RECIBO_B` | 9 | Recibo B |
|
|
66
|
+
| `FACTURA_C` | 11 | Factura C |
|
|
67
|
+
| `NOTA_DEBITO_C` | 12 | Nota de Débito C |
|
|
68
|
+
| `NOTA_CREDITO_C` | 13 | Nota de Crédito C |
|
|
69
|
+
| `RECIBO_C` | 15 | Recibo C |
|
|
70
|
+
| `FACTURA_E` | 19 | Factura de Exportación |
|
|
71
|
+
| `NOTA_DEBITO_E` | 20 | Nota de Débito E |
|
|
72
|
+
| `NOTA_CREDITO_E` | 21 | Nota de Crédito E |
|
|
73
|
+
| `FACTURA_M` | 51 | Factura M |
|
|
74
|
+
| `NOTA_DEBITO_M` | 52 | Nota de Débito M |
|
|
75
|
+
| `NOTA_CREDITO_M` | 53 | Nota de Crédito M |
|
|
76
|
+
| `RECIBO_M` | 54 | Recibo M |
|
|
77
|
+
| `FCE_FACTURA_A` | 201 | Factura de Crédito Electrónica MiPyME A |
|
|
78
|
+
| `FCE_NOTA_DEBITO_A` | 202 | Nota de Débito FCE MiPyME A |
|
|
79
|
+
| `FCE_NOTA_CREDITO_A` | 203 | Nota de Crédito FCE MiPyME A |
|
|
80
|
+
| `FCE_FACTURA_B` | 206 | Factura de Crédito Electrónica MiPyME B |
|
|
81
|
+
| `FCE_NOTA_DEBITO_B` | 207 | Nota de Débito FCE MiPyME B |
|
|
82
|
+
| `FCE_NOTA_CREDITO_B` | 208 | Nota de Crédito FCE MiPyME B |
|
|
83
|
+
| `FCE_FACTURA_C` | 211 | Factura de Crédito Electrónica MiPyME C |
|
|
84
|
+
| `FCE_NOTA_DEBITO_C` | 212 | Nota de Débito FCE MiPyME C |
|
|
85
|
+
| `FCE_NOTA_CREDITO_C` | 213 | Nota de Crédito FCE MiPyME C |
|
|
86
|
+
|
|
87
|
+
Tambien se incluyen tipos especiales: `COMPRA_BIENES_USADOS` (49), `CTA_VTA_LIQ_PROD_A/B` (60/61), `LIQUIDACION_A/B` (63/64), y comprobantes RG 1415 (34, 35, 39, 40).
|
|
88
|
+
|
|
89
|
+
## Ejemplos
|
|
90
|
+
|
|
91
|
+
### Factura A por servicios
|
|
92
|
+
|
|
93
|
+
Para servicios (`Concepto.SERVICIOS` o `Concepto.PRODUCTOS_Y_SERVICIOS`), es obligatorio incluir las fechas de servicio y vencimiento de pago.
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
const result = await arca.crearFacturaAuto(1, CbteTipo.FACTURA_A, {
|
|
97
|
+
Concepto: Concepto.SERVICIOS,
|
|
98
|
+
DocTipo: DocTipo.CUIT,
|
|
99
|
+
DocNro: 30712345678,
|
|
100
|
+
CbteFch: Arca.formatDate(new Date()),
|
|
101
|
+
ImpTotal: 60500,
|
|
102
|
+
ImpTotConc: 0,
|
|
103
|
+
ImpNeto: 50000,
|
|
104
|
+
ImpOpEx: 0,
|
|
105
|
+
ImpTrib: 0,
|
|
106
|
+
ImpIVA: 10500,
|
|
107
|
+
MonId: Moneda.PESOS,
|
|
108
|
+
MonCotiz: 1,
|
|
109
|
+
FchServDesde: "20260301",
|
|
110
|
+
FchServHasta: "20260331",
|
|
111
|
+
FchVtoPago: "20260415",
|
|
112
|
+
Iva: [{ Id: IvaTipo.IVA_21, BaseImp: 50000, Importe: 10500 }],
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Nota de crédito
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
const result = await arca.crearFacturaAuto(1, CbteTipo.NOTA_CREDITO_B, {
|
|
120
|
+
Concepto: Concepto.PRODUCTOS,
|
|
121
|
+
DocTipo: DocTipo.CONSUMIDOR_FINAL,
|
|
122
|
+
DocNro: 0,
|
|
123
|
+
CbteFch: Arca.formatDate(new Date()),
|
|
124
|
+
ImpTotal: 121,
|
|
125
|
+
ImpTotConc: 0,
|
|
126
|
+
ImpNeto: 100,
|
|
127
|
+
ImpOpEx: 0,
|
|
128
|
+
ImpTrib: 0,
|
|
129
|
+
ImpIVA: 21,
|
|
130
|
+
MonId: Moneda.PESOS,
|
|
131
|
+
MonCotiz: 1,
|
|
132
|
+
Iva: [{ Id: IvaTipo.IVA_21, BaseImp: 100, Importe: 21 }],
|
|
133
|
+
// Asociar con la factura original
|
|
134
|
+
CbtesAsoc: [{ Tipo: CbteTipo.FACTURA_B, PtoVta: 1, Nro: 150 }],
|
|
135
|
+
});
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Factura con múltiples alícuotas de IVA
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
const result = await arca.crearFacturaAuto(1, CbteTipo.FACTURA_A, {
|
|
142
|
+
Concepto: Concepto.PRODUCTOS,
|
|
143
|
+
DocTipo: DocTipo.CUIT,
|
|
144
|
+
DocNro: 30712345678,
|
|
145
|
+
CbteFch: Arca.formatDate(new Date()),
|
|
146
|
+
ImpTotal: 1352.5,
|
|
147
|
+
ImpTotConc: 0,
|
|
148
|
+
ImpNeto: 1100, // 1000 + 100
|
|
149
|
+
ImpOpEx: 0,
|
|
150
|
+
ImpTrib: 0,
|
|
151
|
+
ImpIVA: 252.5, // 210 + 42.5 (nota: no incluye el IVA 0%)
|
|
152
|
+
MonId: Moneda.PESOS,
|
|
153
|
+
MonCotiz: 1,
|
|
154
|
+
Iva: [
|
|
155
|
+
{ Id: IvaTipo.IVA_21, BaseImp: 1000, Importe: 210 },
|
|
156
|
+
{ Id: IvaTipo.IVA_10_5, BaseImp: 100, Importe: 10.5 },
|
|
157
|
+
// Para incluir items al 0%, se debe declarar también:
|
|
158
|
+
// { Id: IvaTipo.IVA_0, BaseImp: 500, Importe: 0 },
|
|
159
|
+
],
|
|
160
|
+
});
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Factura MiPyME (FCE)
|
|
164
|
+
|
|
165
|
+
```typescript
|
|
166
|
+
const result = await arca.crearFacturaAuto(1, CbteTipo.FCE_FACTURA_A, {
|
|
167
|
+
Concepto: Concepto.PRODUCTOS,
|
|
168
|
+
DocTipo: DocTipo.CUIT,
|
|
169
|
+
DocNro: 30712345678,
|
|
170
|
+
CbteFch: Arca.formatDate(new Date()),
|
|
171
|
+
ImpTotal: 121000,
|
|
172
|
+
ImpTotConc: 0,
|
|
173
|
+
ImpNeto: 100000,
|
|
174
|
+
ImpOpEx: 0,
|
|
175
|
+
ImpTrib: 0,
|
|
176
|
+
ImpIVA: 21000,
|
|
177
|
+
MonId: Moneda.PESOS,
|
|
178
|
+
MonCotiz: 1,
|
|
179
|
+
Iva: [{ Id: IvaTipo.IVA_21, BaseImp: 100000, Importe: 21000 }],
|
|
180
|
+
// Dato obligatorio para FCE: CBU del emisor
|
|
181
|
+
Opcionales: [{ Id: "2101", Valor: "0110012345678901234567" }],
|
|
182
|
+
});
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Consultas
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
// Estado del servidor
|
|
189
|
+
const status = await arca.serverStatus();
|
|
190
|
+
|
|
191
|
+
// Último comprobante autorizado
|
|
192
|
+
const ultimo = await arca.ultimoComprobante(1, CbteTipo.FACTURA_B);
|
|
193
|
+
|
|
194
|
+
// Consultar un comprobante
|
|
195
|
+
const cbte = await arca.consultarComprobante(CbteTipo.FACTURA_B, 1, 150);
|
|
196
|
+
|
|
197
|
+
// Puntos de venta habilitados
|
|
198
|
+
const ptosVenta = await arca.getPuntosVenta();
|
|
199
|
+
|
|
200
|
+
// Cotización del dólar
|
|
201
|
+
const cotiz = await arca.getCotizacion(Moneda.DOLARES);
|
|
202
|
+
|
|
203
|
+
// Tipos de comprobante, documento, IVA, monedas, tributos
|
|
204
|
+
const tiposCbte = await arca.getTiposComprobante();
|
|
205
|
+
const tiposDoc = await arca.getTiposDocumento();
|
|
206
|
+
const tiposIva = await arca.getTiposIva();
|
|
207
|
+
const monedas = await arca.getMonedas();
|
|
208
|
+
const tiposTrib = await arca.getTiposTributo();
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## API
|
|
212
|
+
|
|
213
|
+
### `new Arca(config)`
|
|
214
|
+
|
|
215
|
+
| Parámetro | Tipo | Descripción |
|
|
216
|
+
| --- | --- | --- |
|
|
217
|
+
| `cuit` | `number` | CUIT del contribuyente (sin guiones) |
|
|
218
|
+
| `cert` | `string` | Contenido del certificado X.509 (PEM) |
|
|
219
|
+
| `key` | `string` | Contenido de la clave privada (PEM) |
|
|
220
|
+
| `production` | `boolean` | `false` = testing (default), `true` = producción |
|
|
221
|
+
| `tokenTTLMinutes` | `number` | TTL del token en minutos (default: 720 = 12h) |
|
|
222
|
+
|
|
223
|
+
### Facturación
|
|
224
|
+
|
|
225
|
+
| Método | Descripción |
|
|
226
|
+
| --- | --- |
|
|
227
|
+
| `crearFactura(request)` | Solicita CAE para uno o más comprobantes |
|
|
228
|
+
| `crearFacturaAuto(ptoVta, cbteTipo, invoice)` | Obtiene el número automáticamente y crea la factura |
|
|
229
|
+
| `ultimoComprobante(ptoVta, cbteTipo)` | Último número autorizado |
|
|
230
|
+
| `siguienteComprobante(ptoVta, cbteTipo)` | Siguiente número (último + 1) |
|
|
231
|
+
| `consultarComprobante(cbteTipo, ptoVta, cbteNro)` | Consulta un comprobante existente |
|
|
232
|
+
|
|
233
|
+
### Parámetros
|
|
234
|
+
|
|
235
|
+
| Método | Descripción |
|
|
236
|
+
| --- | --- |
|
|
237
|
+
| `serverStatus()` | Estado de los servidores |
|
|
238
|
+
| `getTiposComprobante()` | Lista de tipos de comprobante |
|
|
239
|
+
| `getTiposDocumento()` | Lista de tipos de documento |
|
|
240
|
+
| `getTiposIva()` | Lista de alícuotas de IVA |
|
|
241
|
+
| `getMonedas()` | Lista de monedas |
|
|
242
|
+
| `getTiposTributo()` | Lista de tipos de tributo |
|
|
243
|
+
| `getTiposOpcional()` | Lista de datos opcionales |
|
|
244
|
+
| `getPuntosVenta()` | Puntos de venta habilitados |
|
|
245
|
+
| `getCotizacion(monedaId)` | Cotización de una moneda |
|
|
246
|
+
| `getCantMaxRegistros()` | Máx registros por request |
|
|
247
|
+
|
|
248
|
+
### Utilidades estáticas
|
|
249
|
+
|
|
250
|
+
| Método | Descripción |
|
|
251
|
+
| --- | --- |
|
|
252
|
+
| `Arca.extractCAE(result)` | Extrae CAE y estado del resultado |
|
|
253
|
+
| `Arca.formatDate(date)` | Formatea `Date` a `YYYYMMDD` |
|
|
254
|
+
|
|
255
|
+
## Enums disponibles
|
|
256
|
+
|
|
257
|
+
- `CbteTipo` — Tipos de comprobante
|
|
258
|
+
- `Concepto` — Tipos de concepto (Productos, Servicios, Ambos)
|
|
259
|
+
- `DocTipo` — Tipos de documento (CUIT, DNI, etc.)
|
|
260
|
+
- `IvaTipo` — Alícuotas de IVA (0%, 2.5%, 5%, 10.5%, 21%, 27%)
|
|
261
|
+
- `Moneda` — Códigos de moneda (PES, DOL, EUR, etc.)
|
|
262
|
+
- `TributoTipo` — Tipos de tributo
|
|
263
|
+
|
|
264
|
+
## Entornos
|
|
265
|
+
|
|
266
|
+
| Entorno | WSAA | WSFE |
|
|
267
|
+
| --- | --- | --- |
|
|
268
|
+
| Testing | `wsaahomo.afip.gov.ar` | `wswhomo.afip.gov.ar` |
|
|
269
|
+
| Producción | `wsaa.afip.gov.ar` | `servicios1.afip.gov.ar` |
|
|
270
|
+
|
|
271
|
+
## Licencia
|
|
272
|
+
|
|
273
|
+
MIT
|
package/dist/arca.d.ts
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { ArcaConfig, InvoiceRequest, InvoiceDetail, FECAESolicitarResult, FECAEDetResponse, FECompConsultarResult, ServerStatus, ParamItem, MonedaItem, PtoVentaItem, CotizacionResult } from "./types.js";
|
|
2
|
+
export declare class Arca {
|
|
3
|
+
private wsaa;
|
|
4
|
+
private wsfe;
|
|
5
|
+
private cuit;
|
|
6
|
+
private production;
|
|
7
|
+
constructor(config: ArcaConfig);
|
|
8
|
+
/**
|
|
9
|
+
* Obtiene las credenciales de autenticación para WSFE.
|
|
10
|
+
*/
|
|
11
|
+
private getAuth;
|
|
12
|
+
/**
|
|
13
|
+
* Crea una factura y obtiene el CAE.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* const result = await arca.crearFactura({
|
|
18
|
+
* PtoVta: 1,
|
|
19
|
+
* CbteTipo: CbteTipo.FACTURA_B,
|
|
20
|
+
* invoices: [{
|
|
21
|
+
* Concepto: Concepto.PRODUCTOS,
|
|
22
|
+
* DocTipo: DocTipo.CONSUMIDOR_FINAL,
|
|
23
|
+
* DocNro: 0,
|
|
24
|
+
* CbteDesde: nextNum,
|
|
25
|
+
* CbteHasta: nextNum,
|
|
26
|
+
* CbteFch: "20260328",
|
|
27
|
+
* ImpTotal: 121,
|
|
28
|
+
* ImpTotConc: 0,
|
|
29
|
+
* ImpNeto: 100,
|
|
30
|
+
* ImpOpEx: 0,
|
|
31
|
+
* ImpTrib: 0,
|
|
32
|
+
* ImpIVA: 21,
|
|
33
|
+
* MonId: Moneda.PESOS,
|
|
34
|
+
* MonCotiz: 1,
|
|
35
|
+
* Iva: [{ Id: IvaTipo.IVA_21, BaseImp: 100, Importe: 21 }],
|
|
36
|
+
* }],
|
|
37
|
+
* });
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
crearFactura(request: InvoiceRequest): Promise<FECAESolicitarResult>;
|
|
41
|
+
/**
|
|
42
|
+
* Obtiene el último número de comprobante autorizado.
|
|
43
|
+
* Útil para calcular el siguiente número antes de crear una factura.
|
|
44
|
+
*/
|
|
45
|
+
ultimoComprobante(ptoVta: number, cbteTipo: number): Promise<number>;
|
|
46
|
+
/**
|
|
47
|
+
* Obtiene el siguiente número de comprobante (último + 1).
|
|
48
|
+
*/
|
|
49
|
+
siguienteComprobante(ptoVta: number, cbteTipo: number): Promise<number>;
|
|
50
|
+
/**
|
|
51
|
+
* Crea una factura automáticamente calculando el siguiente número de comprobante.
|
|
52
|
+
* Simplifica el flujo más común: obtener número → crear factura.
|
|
53
|
+
*/
|
|
54
|
+
crearFacturaAuto(ptoVta: number, cbteTipo: number, invoice: Omit<InvoiceDetail, "CbteDesde" | "CbteHasta">): Promise<FECAESolicitarResult>;
|
|
55
|
+
/**
|
|
56
|
+
* Consulta un comprobante previamente autorizado.
|
|
57
|
+
*/
|
|
58
|
+
consultarComprobante(cbteTipo: number, ptoVta: number, cbteNro: number): Promise<FECompConsultarResult>;
|
|
59
|
+
/**
|
|
60
|
+
* Verifica el estado de los servidores de ARCA.
|
|
61
|
+
* No requiere autenticación.
|
|
62
|
+
*/
|
|
63
|
+
serverStatus(): Promise<ServerStatus>;
|
|
64
|
+
/** Obtiene los tipos de comprobante disponibles. */
|
|
65
|
+
getTiposComprobante(): Promise<ParamItem[]>;
|
|
66
|
+
/** Obtiene los tipos de documento disponibles. */
|
|
67
|
+
getTiposDocumento(): Promise<ParamItem[]>;
|
|
68
|
+
/** Obtiene los tipos de IVA disponibles. */
|
|
69
|
+
getTiposIva(): Promise<ParamItem[]>;
|
|
70
|
+
/** Obtiene las monedas disponibles. */
|
|
71
|
+
getMonedas(): Promise<MonedaItem[]>;
|
|
72
|
+
/** Obtiene los tipos de tributo disponibles. */
|
|
73
|
+
getTiposTributo(): Promise<ParamItem[]>;
|
|
74
|
+
/** Obtiene los tipos de datos opcionales disponibles. */
|
|
75
|
+
getTiposOpcional(): Promise<ParamItem[]>;
|
|
76
|
+
/** Obtiene los puntos de venta habilitados. */
|
|
77
|
+
getPuntosVenta(): Promise<PtoVentaItem[]>;
|
|
78
|
+
/** Obtiene la cotización de una moneda. */
|
|
79
|
+
getCotizacion(monedaId: string): Promise<CotizacionResult>;
|
|
80
|
+
/** Obtiene la cantidad máxima de registros por request. */
|
|
81
|
+
getCantMaxRegistros(): Promise<number>;
|
|
82
|
+
/**
|
|
83
|
+
* Extrae el CAE y detalles de respuesta de FECAESolicitar.
|
|
84
|
+
* Helper para simplificar el procesamiento del resultado.
|
|
85
|
+
*/
|
|
86
|
+
static extractCAE(result: FECAESolicitarResult): {
|
|
87
|
+
approved: boolean;
|
|
88
|
+
details: FECAEDetResponse[];
|
|
89
|
+
cae?: string;
|
|
90
|
+
caeFchVto?: string;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Formatea una fecha Date a formato YYYYMMDD requerido por ARCA.
|
|
94
|
+
*/
|
|
95
|
+
static formatDate(date: Date): string;
|
|
96
|
+
/**
|
|
97
|
+
* Invalida los tickets de acceso cacheados.
|
|
98
|
+
*/
|
|
99
|
+
clearAuthCache(): void;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=arca.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arca.d.ts","sourceRoot":"","sources":["../src/arca.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,UAAU,EAEV,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,EACZ,SAAS,EACT,UAAU,EACV,YAAY,EACZ,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAGpB,qBAAa,IAAI;IACf,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,UAAU,CAAU;gBAEhB,MAAM,EAAE,UAAU;IAkB9B;;OAEG;YACW,OAAO;IAarB;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACG,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAK1E;;;OAGG;IACG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK1E;;OAEG;IACG,oBAAoB,CACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC;IAKlB;;;OAGG;IACG,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,WAAW,CAAC,GACtD,OAAO,CAAC,oBAAoB,CAAC;IAgBhC;;OAEG;IACG,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,qBAAqB,CAAC;IASjC;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC;IAI3C,oDAAoD;IAC9C,mBAAmB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAKjD,kDAAkD;IAC5C,iBAAiB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAK/C,4CAA4C;IACtC,WAAW,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAKzC,uCAAuC;IACjC,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAKzC,gDAAgD;IAC1C,eAAe,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAK7C,yDAAyD;IACnD,gBAAgB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAK9C,+CAA+C;IACzC,cAAc,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAK/C,2CAA2C;IACrC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAKhE,2DAA2D;IACrD,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC;IAS5C;;;OAGG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,oBAAoB,GAAG;QAC/C,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,gBAAgB,EAAE,CAAC;QAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;IAgBD;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAOrC;;OAEG;IACH,cAAc,IAAI,IAAI;CAGvB"}
|
package/dist/arca.js
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { WsaaClient } from "./wsaa.js";
|
|
2
|
+
import { WsfeClient } from "./wsfe.js";
|
|
3
|
+
export class Arca {
|
|
4
|
+
wsaa;
|
|
5
|
+
wsfe;
|
|
6
|
+
cuit;
|
|
7
|
+
production;
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.cuit = config.cuit;
|
|
10
|
+
this.production = config.production ?? false;
|
|
11
|
+
this.wsaa = new WsaaClient({
|
|
12
|
+
cert: config.cert,
|
|
13
|
+
key: config.key,
|
|
14
|
+
production: this.production,
|
|
15
|
+
tokenTTLMinutes: config.tokenTTLMinutes ?? 720,
|
|
16
|
+
});
|
|
17
|
+
this.wsfe = new WsfeClient(this.production);
|
|
18
|
+
}
|
|
19
|
+
// ============================================================
|
|
20
|
+
// Auth helpers
|
|
21
|
+
// ============================================================
|
|
22
|
+
/**
|
|
23
|
+
* Obtiene las credenciales de autenticación para WSFE.
|
|
24
|
+
*/
|
|
25
|
+
async getAuth() {
|
|
26
|
+
const ticket = await this.wsaa.getAccessTicket("wsfe");
|
|
27
|
+
return {
|
|
28
|
+
Token: ticket.token,
|
|
29
|
+
Sign: ticket.sign,
|
|
30
|
+
Cuit: this.cuit,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
// ============================================================
|
|
34
|
+
// Facturación - Métodos principales
|
|
35
|
+
// ============================================================
|
|
36
|
+
/**
|
|
37
|
+
* Crea una factura y obtiene el CAE.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* const result = await arca.crearFactura({
|
|
42
|
+
* PtoVta: 1,
|
|
43
|
+
* CbteTipo: CbteTipo.FACTURA_B,
|
|
44
|
+
* invoices: [{
|
|
45
|
+
* Concepto: Concepto.PRODUCTOS,
|
|
46
|
+
* DocTipo: DocTipo.CONSUMIDOR_FINAL,
|
|
47
|
+
* DocNro: 0,
|
|
48
|
+
* CbteDesde: nextNum,
|
|
49
|
+
* CbteHasta: nextNum,
|
|
50
|
+
* CbteFch: "20260328",
|
|
51
|
+
* ImpTotal: 121,
|
|
52
|
+
* ImpTotConc: 0,
|
|
53
|
+
* ImpNeto: 100,
|
|
54
|
+
* ImpOpEx: 0,
|
|
55
|
+
* ImpTrib: 0,
|
|
56
|
+
* ImpIVA: 21,
|
|
57
|
+
* MonId: Moneda.PESOS,
|
|
58
|
+
* MonCotiz: 1,
|
|
59
|
+
* Iva: [{ Id: IvaTipo.IVA_21, BaseImp: 100, Importe: 21 }],
|
|
60
|
+
* }],
|
|
61
|
+
* });
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
async crearFactura(request) {
|
|
65
|
+
const auth = await this.getAuth();
|
|
66
|
+
return this.wsfe.solicitarCAE(auth, request);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Obtiene el último número de comprobante autorizado.
|
|
70
|
+
* Útil para calcular el siguiente número antes de crear una factura.
|
|
71
|
+
*/
|
|
72
|
+
async ultimoComprobante(ptoVta, cbteTipo) {
|
|
73
|
+
const auth = await this.getAuth();
|
|
74
|
+
return this.wsfe.ultimoComprobante(auth, ptoVta, cbteTipo);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Obtiene el siguiente número de comprobante (último + 1).
|
|
78
|
+
*/
|
|
79
|
+
async siguienteComprobante(ptoVta, cbteTipo) {
|
|
80
|
+
const ultimo = await this.ultimoComprobante(ptoVta, cbteTipo);
|
|
81
|
+
return ultimo + 1;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Crea una factura automáticamente calculando el siguiente número de comprobante.
|
|
85
|
+
* Simplifica el flujo más común: obtener número → crear factura.
|
|
86
|
+
*/
|
|
87
|
+
async crearFacturaAuto(ptoVta, cbteTipo, invoice) {
|
|
88
|
+
const nextNum = await this.siguienteComprobante(ptoVta, cbteTipo);
|
|
89
|
+
return this.crearFactura({
|
|
90
|
+
PtoVta: ptoVta,
|
|
91
|
+
CbteTipo: cbteTipo,
|
|
92
|
+
invoices: [
|
|
93
|
+
{
|
|
94
|
+
...invoice,
|
|
95
|
+
CbteDesde: nextNum,
|
|
96
|
+
CbteHasta: nextNum,
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Consulta un comprobante previamente autorizado.
|
|
103
|
+
*/
|
|
104
|
+
async consultarComprobante(cbteTipo, ptoVta, cbteNro) {
|
|
105
|
+
const auth = await this.getAuth();
|
|
106
|
+
return this.wsfe.consultarComprobante(auth, cbteTipo, ptoVta, cbteNro);
|
|
107
|
+
}
|
|
108
|
+
// ============================================================
|
|
109
|
+
// Estado y parámetros
|
|
110
|
+
// ============================================================
|
|
111
|
+
/**
|
|
112
|
+
* Verifica el estado de los servidores de ARCA.
|
|
113
|
+
* No requiere autenticación.
|
|
114
|
+
*/
|
|
115
|
+
async serverStatus() {
|
|
116
|
+
return this.wsfe.serverStatus();
|
|
117
|
+
}
|
|
118
|
+
/** Obtiene los tipos de comprobante disponibles. */
|
|
119
|
+
async getTiposComprobante() {
|
|
120
|
+
const auth = await this.getAuth();
|
|
121
|
+
return this.wsfe.getTiposComprobante(auth);
|
|
122
|
+
}
|
|
123
|
+
/** Obtiene los tipos de documento disponibles. */
|
|
124
|
+
async getTiposDocumento() {
|
|
125
|
+
const auth = await this.getAuth();
|
|
126
|
+
return this.wsfe.getTiposDocumento(auth);
|
|
127
|
+
}
|
|
128
|
+
/** Obtiene los tipos de IVA disponibles. */
|
|
129
|
+
async getTiposIva() {
|
|
130
|
+
const auth = await this.getAuth();
|
|
131
|
+
return this.wsfe.getTiposIva(auth);
|
|
132
|
+
}
|
|
133
|
+
/** Obtiene las monedas disponibles. */
|
|
134
|
+
async getMonedas() {
|
|
135
|
+
const auth = await this.getAuth();
|
|
136
|
+
return this.wsfe.getMonedas(auth);
|
|
137
|
+
}
|
|
138
|
+
/** Obtiene los tipos de tributo disponibles. */
|
|
139
|
+
async getTiposTributo() {
|
|
140
|
+
const auth = await this.getAuth();
|
|
141
|
+
return this.wsfe.getTiposTributo(auth);
|
|
142
|
+
}
|
|
143
|
+
/** Obtiene los tipos de datos opcionales disponibles. */
|
|
144
|
+
async getTiposOpcional() {
|
|
145
|
+
const auth = await this.getAuth();
|
|
146
|
+
return this.wsfe.getTiposOpcional(auth);
|
|
147
|
+
}
|
|
148
|
+
/** Obtiene los puntos de venta habilitados. */
|
|
149
|
+
async getPuntosVenta() {
|
|
150
|
+
const auth = await this.getAuth();
|
|
151
|
+
return this.wsfe.getPuntosVenta(auth);
|
|
152
|
+
}
|
|
153
|
+
/** Obtiene la cotización de una moneda. */
|
|
154
|
+
async getCotizacion(monedaId) {
|
|
155
|
+
const auth = await this.getAuth();
|
|
156
|
+
return this.wsfe.getCotizacion(auth, monedaId);
|
|
157
|
+
}
|
|
158
|
+
/** Obtiene la cantidad máxima de registros por request. */
|
|
159
|
+
async getCantMaxRegistros() {
|
|
160
|
+
const auth = await this.getAuth();
|
|
161
|
+
return this.wsfe.getCantMaxRegistros(auth);
|
|
162
|
+
}
|
|
163
|
+
// ============================================================
|
|
164
|
+
// Utilidades
|
|
165
|
+
// ============================================================
|
|
166
|
+
/**
|
|
167
|
+
* Extrae el CAE y detalles de respuesta de FECAESolicitar.
|
|
168
|
+
* Helper para simplificar el procesamiento del resultado.
|
|
169
|
+
*/
|
|
170
|
+
static extractCAE(result) {
|
|
171
|
+
const detArr = Array.isArray(result.FeDetResp.FECAEDetResponse)
|
|
172
|
+
? result.FeDetResp.FECAEDetResponse
|
|
173
|
+
: [result.FeDetResp.FECAEDetResponse];
|
|
174
|
+
const approved = result.FeCabResp.Resultado === "A";
|
|
175
|
+
const firstApproved = detArr.find((d) => d.Resultado === "A");
|
|
176
|
+
return {
|
|
177
|
+
approved,
|
|
178
|
+
details: detArr,
|
|
179
|
+
cae: firstApproved?.CAE,
|
|
180
|
+
caeFchVto: firstApproved?.CAEFchVto,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Formatea una fecha Date a formato YYYYMMDD requerido por ARCA.
|
|
185
|
+
*/
|
|
186
|
+
static formatDate(date) {
|
|
187
|
+
const y = date.getFullYear();
|
|
188
|
+
const m = String(date.getMonth() + 1).padStart(2, "0");
|
|
189
|
+
const d = String(date.getDate()).padStart(2, "0");
|
|
190
|
+
return `${y}${m}${d}`;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Invalida los tickets de acceso cacheados.
|
|
194
|
+
*/
|
|
195
|
+
clearAuthCache() {
|
|
196
|
+
this.wsaa.clearTicket("wsfe");
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=arca.js.map
|
package/dist/arca.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arca.js","sourceRoot":"","sources":["../src/arca.ts"],"names":[],"mappings":"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"}
|