@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 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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arca.js","sourceRoot":"","sources":["../src/arca.ts"],"names":[],"mappings":"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"}