@ramiidv/arca-sdk 0.3.0 → 1.1.3
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 +205 -9
- package/dist/arca.d.ts +110 -119
- package/dist/arca.d.ts.map +1 -1
- package/dist/arca.js +307 -146
- package/dist/arca.js.map +1 -1
- package/dist/constants.d.ts +15 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +15 -0
- package/dist/constants.js.map +1 -1
- package/dist/facturacion.js +3 -3
- package/dist/facturacion.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/padron.d.ts +22 -0
- package/dist/padron.d.ts.map +1 -0
- package/dist/padron.js +87 -0
- package/dist/padron.js.map +1 -0
- package/dist/soap-client.d.ts +13 -6
- package/dist/soap-client.d.ts.map +1 -1
- package/dist/soap-client.js +84 -32
- package/dist/soap-client.js.map +1 -1
- package/dist/types.d.ts +343 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/wsaa.d.ts +6 -2
- package/dist/wsaa.d.ts.map +1 -1
- package/dist/wsaa.js +25 -6
- package/dist/wsaa.js.map +1 -1
- package/dist/wsfe.d.ts +13 -27
- package/dist/wsfe.d.ts.map +1 -1
- package/dist/wsfe.js +82 -51
- package/dist/wsfe.js.map +1 -1
- package/dist/wsfex.d.ts +50 -0
- package/dist/wsfex.d.ts.map +1 -0
- package/dist/wsfex.js +141 -0
- package/dist/wsfex.js.map +1 -0
- package/llm.txt +169 -1
- package/package.json +1 -1
package/dist/wsfe.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ENDPOINTS } from "./constants.js";
|
|
2
|
-
import {
|
|
1
|
+
import { ENDPOINTS, WSFE_NAMESPACE } from "./constants.js";
|
|
2
|
+
import { afipSoapCall } from "./soap-client.js";
|
|
3
3
|
import { ArcaWSFEError } from "./errors.js";
|
|
4
4
|
function toArray(val) {
|
|
5
5
|
if (val === undefined || val === null)
|
|
@@ -14,22 +14,27 @@ function checkErrors(result) {
|
|
|
14
14
|
}
|
|
15
15
|
export class WsfeClient {
|
|
16
16
|
endpoint;
|
|
17
|
-
|
|
18
|
-
constructor(production,
|
|
17
|
+
soapOpts;
|
|
18
|
+
constructor(production, opts = {}) {
|
|
19
19
|
this.endpoint = production
|
|
20
20
|
? ENDPOINTS.wsfe.production
|
|
21
21
|
: ENDPOINTS.wsfe.testing;
|
|
22
|
-
this.
|
|
22
|
+
this.soapOpts = {
|
|
23
|
+
timeoutMs: opts.timeoutMs,
|
|
24
|
+
retries: opts.retries,
|
|
25
|
+
retryDelayMs: opts.retryDelayMs,
|
|
26
|
+
onEvent: opts.onEvent,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
call(method, params) {
|
|
30
|
+
return afipSoapCall(this.endpoint, WSFE_NAMESPACE, method, params, this.soapOpts);
|
|
23
31
|
}
|
|
24
32
|
// ============================================================
|
|
25
33
|
// Facturación
|
|
26
34
|
// ============================================================
|
|
27
|
-
/**
|
|
28
|
-
* Solicita CAE (Código de Autorización Electrónica) para uno o más comprobantes.
|
|
29
|
-
*/
|
|
30
35
|
async solicitarCAE(auth, request) {
|
|
31
36
|
const detRequests = request.invoices.map((inv) => this.buildDetRequest(inv));
|
|
32
|
-
const
|
|
37
|
+
const result = (await this.call("FECAESolicitar", {
|
|
33
38
|
Auth: auth,
|
|
34
39
|
FeCAEReq: {
|
|
35
40
|
FeCabReq: {
|
|
@@ -37,102 +42,128 @@ export class WsfeClient {
|
|
|
37
42
|
PtoVta: request.PtoVta,
|
|
38
43
|
CbteTipo: request.CbteTipo,
|
|
39
44
|
},
|
|
40
|
-
FeDetReq: {
|
|
41
|
-
FECAEDetRequest: detRequests,
|
|
42
|
-
},
|
|
45
|
+
FeDetReq: { FECAEDetRequest: detRequests },
|
|
43
46
|
},
|
|
44
|
-
};
|
|
45
|
-
const result = (await wsfeSoapCall(this.endpoint, "FECAESolicitar", params, this.timeoutMs));
|
|
47
|
+
}));
|
|
46
48
|
checkErrors(result);
|
|
47
49
|
return result;
|
|
48
50
|
}
|
|
49
|
-
/**
|
|
50
|
-
* Obtiene el último número de comprobante autorizado para un punto de venta y tipo.
|
|
51
|
-
*/
|
|
52
51
|
async ultimoComprobante(auth, ptoVta, cbteTipo) {
|
|
53
|
-
const result = (await
|
|
52
|
+
const result = (await this.call("FECompUltimoAutorizado", {
|
|
54
53
|
Auth: auth,
|
|
55
54
|
PtoVta: ptoVta,
|
|
56
55
|
CbteTipo: cbteTipo,
|
|
57
|
-
}
|
|
56
|
+
}));
|
|
58
57
|
checkErrors(result);
|
|
59
|
-
return result.CbteNro;
|
|
58
|
+
return Number(result.CbteNro);
|
|
60
59
|
}
|
|
61
|
-
/**
|
|
62
|
-
* Consulta un comprobante previamente autorizado.
|
|
63
|
-
*/
|
|
64
60
|
async consultarComprobante(auth, cbteTipo, ptoVta, cbteNro) {
|
|
65
|
-
const result = (await
|
|
61
|
+
const result = (await this.call("FECompConsultar", {
|
|
66
62
|
Auth: auth,
|
|
67
|
-
FeCompConsReq: {
|
|
68
|
-
|
|
69
|
-
CbteNro: cbteNro,
|
|
70
|
-
PtoVta: ptoVta,
|
|
71
|
-
},
|
|
72
|
-
}, this.timeoutMs));
|
|
63
|
+
FeCompConsReq: { CbteTipo: cbteTipo, CbteNro: cbteNro, PtoVta: ptoVta },
|
|
64
|
+
}));
|
|
73
65
|
checkErrors(result);
|
|
74
66
|
return result;
|
|
75
67
|
}
|
|
76
68
|
// ============================================================
|
|
77
69
|
// Parámetros
|
|
78
70
|
// ============================================================
|
|
79
|
-
/**
|
|
80
|
-
* Verifica el estado de los servidores de ARCA.
|
|
81
|
-
*/
|
|
82
71
|
async serverStatus() {
|
|
83
|
-
|
|
84
|
-
return result;
|
|
72
|
+
return (await this.call("FEDummy", {}));
|
|
85
73
|
}
|
|
86
|
-
/**
|
|
87
|
-
* Obtiene los tipos de comprobante disponibles.
|
|
88
|
-
*/
|
|
89
74
|
async getParam(auth, method, itemKey) {
|
|
90
|
-
const result = (await
|
|
75
|
+
const result = (await this.call(method, { Auth: auth }));
|
|
91
76
|
checkErrors(result);
|
|
92
77
|
return toArray(result.ResultGet?.[itemKey]);
|
|
93
78
|
}
|
|
94
79
|
async getTiposComprobante(auth) {
|
|
95
80
|
return this.getParam(auth, "FEParamGetTiposCbte", "CbteTipo");
|
|
96
81
|
}
|
|
97
|
-
/** Obtiene los tipos de concepto disponibles. */
|
|
98
82
|
async getTiposConcepto(auth) {
|
|
99
83
|
return this.getParam(auth, "FEParamGetTiposConcepto", "ConceptoTipo");
|
|
100
84
|
}
|
|
101
|
-
/** Obtiene los tipos de documento disponibles. */
|
|
102
85
|
async getTiposDocumento(auth) {
|
|
103
86
|
return this.getParam(auth, "FEParamGetTiposDoc", "DocTipo");
|
|
104
87
|
}
|
|
105
|
-
/** Obtiene los tipos de IVA disponibles. */
|
|
106
88
|
async getTiposIva(auth) {
|
|
107
89
|
return this.getParam(auth, "FEParamGetTiposIva", "IvaTipo");
|
|
108
90
|
}
|
|
109
|
-
/** Obtiene las monedas disponibles. */
|
|
110
91
|
async getMonedas(auth) {
|
|
111
92
|
return this.getParam(auth, "FEParamGetTiposMonedas", "Moneda");
|
|
112
93
|
}
|
|
113
|
-
/** Obtiene los tipos de tributo disponibles. */
|
|
114
94
|
async getTiposTributo(auth) {
|
|
115
95
|
return this.getParam(auth, "FEParamGetTiposTributos", "TributoTipo");
|
|
116
96
|
}
|
|
117
|
-
/** Obtiene los tipos de opcionales disponibles. */
|
|
118
97
|
async getTiposOpcional(auth) {
|
|
119
98
|
return this.getParam(auth, "FEParamGetTiposOpcional", "OpcionalTipo");
|
|
120
99
|
}
|
|
121
|
-
/** Obtiene los puntos de venta habilitados. */
|
|
122
100
|
async getPuntosVenta(auth) {
|
|
123
101
|
return this.getParam(auth, "FEParamGetPtosVenta", "PtoVenta");
|
|
124
102
|
}
|
|
125
|
-
/** Obtiene la cotización de una moneda. */
|
|
126
103
|
async getCotizacion(auth, monedaId) {
|
|
127
|
-
const result = (await
|
|
104
|
+
const result = (await this.call("FEParamGetCotizacion", {
|
|
105
|
+
Auth: auth,
|
|
106
|
+
MonId: monedaId,
|
|
107
|
+
}));
|
|
128
108
|
checkErrors(result);
|
|
129
109
|
return result;
|
|
130
110
|
}
|
|
131
|
-
/** Obtiene la cantidad máxima de registros por request de FECAESolicitar. */
|
|
132
111
|
async getCantMaxRegistros(auth) {
|
|
133
|
-
const result = (await
|
|
112
|
+
const result = (await this.call("FECompTotXRequest", {
|
|
113
|
+
Auth: auth,
|
|
114
|
+
}));
|
|
115
|
+
checkErrors(result);
|
|
116
|
+
return Number(result.RegXReq ?? 0);
|
|
117
|
+
}
|
|
118
|
+
// ============================================================
|
|
119
|
+
// CAEA - Autorización Anticipada
|
|
120
|
+
// ============================================================
|
|
121
|
+
async solicitarCAEA(auth, periodo, orden) {
|
|
122
|
+
const result = (await this.call("FECAEASolicitar", {
|
|
123
|
+
Auth: auth,
|
|
124
|
+
Periodo: periodo,
|
|
125
|
+
Orden: orden,
|
|
126
|
+
}));
|
|
127
|
+
checkErrors(result);
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
async consultarCAEA(auth, periodo, orden) {
|
|
131
|
+
const result = (await this.call("FECAEAConsultar", {
|
|
132
|
+
Auth: auth,
|
|
133
|
+
Periodo: periodo,
|
|
134
|
+
Orden: orden,
|
|
135
|
+
}));
|
|
134
136
|
checkErrors(result);
|
|
135
|
-
return result
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
async registrarCAEA(auth, request) {
|
|
140
|
+
const detRequests = request.invoices.map((inv) => {
|
|
141
|
+
const det = this.buildDetRequest(inv);
|
|
142
|
+
det.CAEA = inv.CAEA;
|
|
143
|
+
return det;
|
|
144
|
+
});
|
|
145
|
+
const result = (await this.call("FECAEARegInformativo", {
|
|
146
|
+
Auth: auth,
|
|
147
|
+
FeCAEARegInfReq: {
|
|
148
|
+
FeCabReq: {
|
|
149
|
+
CantReg: request.invoices.length,
|
|
150
|
+
PtoVta: request.PtoVta,
|
|
151
|
+
CbteTipo: request.CbteTipo,
|
|
152
|
+
},
|
|
153
|
+
FeDetReq: { FECAEADetRequest: detRequests },
|
|
154
|
+
},
|
|
155
|
+
}));
|
|
156
|
+
checkErrors(result);
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
async sinMovimientoCAEA(auth, caea, ptoVta) {
|
|
160
|
+
const result = (await this.call("FECAEASinMovimientoInformar", {
|
|
161
|
+
Auth: auth,
|
|
162
|
+
CAEA: caea,
|
|
163
|
+
PtoVta: ptoVta,
|
|
164
|
+
}));
|
|
165
|
+
checkErrors(result);
|
|
166
|
+
return result;
|
|
136
167
|
}
|
|
137
168
|
// ============================================================
|
|
138
169
|
// Helpers
|
package/dist/wsfe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wsfe.js","sourceRoot":"","sources":["../src/wsfe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"wsfe.js","sourceRoot":"","sources":["../src/wsfe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAoB5C,SAAS,OAAO,CAAI,GAAwB;IAC1C,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IACjD,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC;AAOD,SAAS,WAAW,CAAC,MAAkB;IACrC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,MAAM,OAAO,UAAU;IACb,QAAQ,CAAS;IACjB,QAAQ,CAAkC;IAElD,YACE,UAAmB,EACnB,OAKI,EAAE;QAEN,IAAI,CAAC,QAAQ,GAAG,UAAU;YACxB,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU;YAC3B,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG;YACd,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;IACJ,CAAC;IAEO,IAAI,CAAC,MAAc,EAAE,MAA2B;QACtD,OAAO,YAAY,CACjB,IAAI,CAAC,QAAQ,EACb,cAAc,EACd,MAAM,EACN,MAAM,EACN,IAAI,CAAC,QAAQ,CACd,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,cAAc;IACd,+DAA+D;IAE/D,KAAK,CAAC,YAAY,CAChB,IAAc,EACd,OAAuB;QAEvB,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC/C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAC1B,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAChD,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE;gBACR,QAAQ,EAAE;oBACR,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM;oBAChC,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;iBAC3B;gBACD,QAAQ,EAAE,EAAE,eAAe,EAAE,WAAW,EAAE;aAC3C;SACF,CAAC,CAAyB,CAAC;QAE5B,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,IAAc,EACd,MAAc,EACd,QAAgB;QAEhB,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;YACxD,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAiC,CAAC;QACpC,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,IAAc,EACd,QAAgB,EAChB,MAAc,EACd,OAAe;QAEf,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACjD,IAAI,EAAE,IAAI;YACV,aAAa,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;SACxE,CAAC,CAA0B,CAAC;QAC7B,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,+DAA+D;IAC/D,aAAa;IACb,+DAA+D;IAE/D,KAAK,CAAC,YAAY;QAChB,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAiB,CAAC;IAC1D,CAAC;IAEO,KAAK,CAAC,QAAQ,CACpB,IAAc,EACd,MAAc,EACd,OAAe;QAEf,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAe,CAAC;QACvE,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAwB,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,IAAc;QACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,qBAAqB,EAAE,UAAU,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,IAAc;QACnC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,yBAAyB,EAAE,cAAc,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,IAAc;QACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,EAAE,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAc;QAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,EAAE,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAc;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,wBAAwB,EAAE,QAAQ,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAAc;QAClC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,yBAAyB,EAAE,aAAa,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,IAAc;QACnC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,yBAAyB,EAAE,cAAc,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAAc;QACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,qBAAqB,EAAE,UAAU,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,IAAc,EACd,QAAgB;QAEhB,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;YACtD,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAkC,CAAC;QACrC,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,IAAc;QACtC,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;YACnD,IAAI,EAAE,IAAI;SACX,CAAC,CAAsC,CAAC;QACzC,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,+DAA+D;IAC/D,iCAAiC;IACjC,+DAA+D;IAE/D,KAAK,CAAC,aAAa,CACjB,IAAc,EACd,OAAe,EACf,KAAa;QAEb,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACjD,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,KAAK;SACb,CAAC,CAAwB,CAAC;QAC3B,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,IAAc,EACd,OAAe,EACf,KAAa;QAEb,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACjD,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,KAAK;SACb,CAAC,CAAwB,CAAC;QAC3B,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,IAAc,EACd,OAA0B;QAE1B,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YACtC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YACpB,OAAO,GAAG,CAAC;QACb,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;YACtD,IAAI,EAAE,IAAI;YACV,eAAe,EAAE;gBACf,QAAQ,EAAE;oBACR,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM;oBAChC,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;iBAC3B;gBACD,QAAQ,EAAE,EAAE,gBAAgB,EAAE,WAAW,EAAE;aAC5C;SACF,CAAC,CAAyB,CAAC;QAC5B,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,IAAc,EACd,IAAY,EACZ,MAAc;QAEd,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,6BAA6B,EAAE;YAC7D,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,MAAM;SACf,CAAC,CAAqB,CAAC;QACxB,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,+DAA+D;IAC/D,UAAU;IACV,+DAA+D;IAEvD,eAAe,CAAC,GAAkB;QACxC,MAAM,GAAG,GAAwB;YAC/B,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ;SACvB,CAAC;QAEF,IAAI,GAAG,CAAC,YAAY;YAAE,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;QAC1D,IAAI,GAAG,CAAC,YAAY;YAAE,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;QAC1D,IAAI,GAAG,CAAC,UAAU;YAAE,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;QAEpD,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,GAAG,CAAC,GAAG,GAAG;gBACR,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC3B,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,OAAO,EAAE,CAAC,CAAC,OAAO;iBACnB,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,GAAG,CAAC,QAAQ,GAAG;gBACb,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAChC,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;iBACnB,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;QAED,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,GAAG,CAAC,SAAS,GAAG;gBACd,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBAChC,MAAM,IAAI,GAAwB;wBAChC,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,MAAM,EAAE,CAAC,CAAC,MAAM;wBAChB,GAAG,EAAE,CAAC,CAAC,GAAG;qBACX,CAAC;oBACF,IAAI,CAAC,CAAC,IAAI;wBAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC/B,IAAI,CAAC,CAAC,OAAO;wBAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;oBACxC,OAAO,IAAI,CAAC;gBACd,CAAC,CAAC;aACH,CAAC;QACJ,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,GAAG,CAAC,UAAU,GAAG;gBACf,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACnC,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,KAAK,EAAE,CAAC,CAAC,KAAK;iBACf,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
|
package/dist/wsfex.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { WsfeAuth, WsfexInvoice, WsfexAuthResult, WsfexGetCmpResult, WsfexParamItem, ServerStatus, ArcaEvent } from "./types.js";
|
|
2
|
+
export declare class WsfexClient {
|
|
3
|
+
private endpoint;
|
|
4
|
+
private soapOpts;
|
|
5
|
+
constructor(production: boolean, opts?: {
|
|
6
|
+
timeoutMs?: number;
|
|
7
|
+
retries?: number;
|
|
8
|
+
retryDelayMs?: number;
|
|
9
|
+
onEvent?: (event: ArcaEvent) => void;
|
|
10
|
+
});
|
|
11
|
+
private call;
|
|
12
|
+
/**
|
|
13
|
+
* Autoriza un comprobante de exportación.
|
|
14
|
+
*/
|
|
15
|
+
authorize(auth: WsfeAuth, invoice: WsfexInvoice): Promise<WsfexAuthResult>;
|
|
16
|
+
/**
|
|
17
|
+
* Obtiene el último comprobante autorizado.
|
|
18
|
+
*/
|
|
19
|
+
getLastCmp(auth: WsfeAuth, ptoVta: number, cbteTipo: number): Promise<number>;
|
|
20
|
+
/**
|
|
21
|
+
* Obtiene el último ID de request.
|
|
22
|
+
*/
|
|
23
|
+
getLastId(auth: WsfeAuth): Promise<number>;
|
|
24
|
+
/**
|
|
25
|
+
* Consulta un comprobante de exportación.
|
|
26
|
+
*/
|
|
27
|
+
getCmp(auth: WsfeAuth, cbteTipo: number, ptoVta: number, cbteNro: number): Promise<WsfexGetCmpResult>;
|
|
28
|
+
/**
|
|
29
|
+
* Verifica el estado de los servidores de WSFEX.
|
|
30
|
+
*/
|
|
31
|
+
serverStatus(): Promise<ServerStatus>;
|
|
32
|
+
private getParamList;
|
|
33
|
+
/** Tipos de comprobante de exportación. */
|
|
34
|
+
getTiposCbte(auth: WsfeAuth): Promise<WsfexParamItem[]>;
|
|
35
|
+
/** Monedas disponibles. */
|
|
36
|
+
getMonedas(auth: WsfeAuth): Promise<WsfexParamItem[]>;
|
|
37
|
+
/** Países destino. */
|
|
38
|
+
getPaises(auth: WsfeAuth): Promise<WsfexParamItem[]>;
|
|
39
|
+
/** Idiomas disponibles. */
|
|
40
|
+
getIdiomas(auth: WsfeAuth): Promise<WsfexParamItem[]>;
|
|
41
|
+
/** Incoterms disponibles. */
|
|
42
|
+
getIncoterms(auth: WsfeAuth): Promise<WsfexParamItem[]>;
|
|
43
|
+
/** Unidades de medida. */
|
|
44
|
+
getUMed(auth: WsfeAuth): Promise<WsfexParamItem[]>;
|
|
45
|
+
/** Tipos de exportación. */
|
|
46
|
+
getTiposExpo(auth: WsfeAuth): Promise<WsfexParamItem[]>;
|
|
47
|
+
/** CUITs de países. */
|
|
48
|
+
getCuitsPais(auth: WsfeAuth): Promise<WsfexParamItem[]>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=wsfex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wsfex.d.ts","sourceRoot":"","sources":["../src/wsfex.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,QAAQ,EACR,YAAY,EACZ,eAAe,EAGf,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,SAAS,EACV,MAAM,YAAY,CAAC;AAiBpB,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAkC;gBAGhD,UAAU,EAAE,OAAO,EACnB,IAAI,GAAE;QACJ,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;KACjC;IAaR,OAAO,CAAC,IAAI;IAcZ;;OAEG;IACG,SAAS,CACb,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,eAAe,CAAC;IA2B3B;;OAEG;IACG,UAAU,CACd,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC;IAUlB;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAQhD;;OAEG;IACG,MAAM,CACV,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,CAAC;IAS7B;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC;YAQ7B,YAAY;IAe1B,2CAA2C;IACrC,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAS7D,2BAA2B;IACrB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAS3D,sBAAsB;IAChB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAS1D,2BAA2B;IACrB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAS3D,6BAA6B;IACvB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAS7D,0BAA0B;IACpB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IASxD,4BAA4B;IACtB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAS7D,uBAAuB;IACjB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAQ9D"}
|
package/dist/wsfex.js
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { ENDPOINTS, WSFEX_NAMESPACE } from "./constants.js";
|
|
2
|
+
import { afipSoapCall } from "./soap-client.js";
|
|
3
|
+
import { ArcaWSFEError } from "./errors.js";
|
|
4
|
+
function toArray(val) {
|
|
5
|
+
if (val === undefined || val === null)
|
|
6
|
+
return [];
|
|
7
|
+
return Array.isArray(val) ? val : [val];
|
|
8
|
+
}
|
|
9
|
+
function checkFexErr(result) {
|
|
10
|
+
if (result.FEXErr && result.FEXErr.ErrCode !== 0) {
|
|
11
|
+
throw new ArcaWSFEError([
|
|
12
|
+
{ code: result.FEXErr.ErrCode, msg: result.FEXErr.ErrMsg },
|
|
13
|
+
]);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class WsfexClient {
|
|
17
|
+
endpoint;
|
|
18
|
+
soapOpts;
|
|
19
|
+
constructor(production, opts = {}) {
|
|
20
|
+
this.endpoint = production
|
|
21
|
+
? ENDPOINTS.wsfex.production
|
|
22
|
+
: ENDPOINTS.wsfex.testing;
|
|
23
|
+
this.soapOpts = {
|
|
24
|
+
timeoutMs: opts.timeoutMs,
|
|
25
|
+
retries: opts.retries,
|
|
26
|
+
retryDelayMs: opts.retryDelayMs,
|
|
27
|
+
onEvent: opts.onEvent,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
call(method, params) {
|
|
31
|
+
return afipSoapCall(this.endpoint, WSFEX_NAMESPACE, method, params, this.soapOpts);
|
|
32
|
+
}
|
|
33
|
+
// ============================================================
|
|
34
|
+
// Facturación de exportación
|
|
35
|
+
// ============================================================
|
|
36
|
+
/**
|
|
37
|
+
* Autoriza un comprobante de exportación.
|
|
38
|
+
*/
|
|
39
|
+
async authorize(auth, invoice) {
|
|
40
|
+
const cmp = { ...invoice };
|
|
41
|
+
// Wrappear Items
|
|
42
|
+
if (invoice.Items && invoice.Items.length > 0) {
|
|
43
|
+
cmp.Items = { Item: invoice.Items };
|
|
44
|
+
}
|
|
45
|
+
// Wrappear Permisos
|
|
46
|
+
if (invoice.Permisos && invoice.Permisos.length > 0) {
|
|
47
|
+
cmp.Permisos = { Permiso: invoice.Permisos };
|
|
48
|
+
}
|
|
49
|
+
// Wrappear Cmps_asoc
|
|
50
|
+
if (invoice.Cmps_asoc && invoice.Cmps_asoc.length > 0) {
|
|
51
|
+
cmp.Cmps_asoc = { Cmp_asoc: invoice.Cmps_asoc };
|
|
52
|
+
}
|
|
53
|
+
const result = (await this.call("FEXAuthorize", {
|
|
54
|
+
Auth: auth,
|
|
55
|
+
Cmp: cmp,
|
|
56
|
+
}));
|
|
57
|
+
checkFexErr(result);
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Obtiene el último comprobante autorizado.
|
|
62
|
+
*/
|
|
63
|
+
async getLastCmp(auth, ptoVta, cbteTipo) {
|
|
64
|
+
const result = (await this.call("FEXGetLast_CMP", {
|
|
65
|
+
Auth: auth,
|
|
66
|
+
Cbte_Tipo: cbteTipo,
|
|
67
|
+
Punto_vta: ptoVta,
|
|
68
|
+
}));
|
|
69
|
+
checkFexErr(result);
|
|
70
|
+
return Number(result.FEXResult_LastCMP?.Cbte_nro ?? 0);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Obtiene el último ID de request.
|
|
74
|
+
*/
|
|
75
|
+
async getLastId(auth) {
|
|
76
|
+
const result = (await this.call("FEXGetLast_ID", {
|
|
77
|
+
Auth: auth,
|
|
78
|
+
}));
|
|
79
|
+
checkFexErr(result);
|
|
80
|
+
return Number(result.FEXResultGet?.Id ?? 0);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Consulta un comprobante de exportación.
|
|
84
|
+
*/
|
|
85
|
+
async getCmp(auth, cbteTipo, ptoVta, cbteNro) {
|
|
86
|
+
const result = (await this.call("FEXGetCMP", {
|
|
87
|
+
Auth: auth,
|
|
88
|
+
Cmp: { Cbte_tipo: cbteTipo, Punto_vta: ptoVta, Cbte_nro: cbteNro },
|
|
89
|
+
}));
|
|
90
|
+
checkFexErr(result);
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Verifica el estado de los servidores de WSFEX.
|
|
95
|
+
*/
|
|
96
|
+
async serverStatus() {
|
|
97
|
+
return (await this.call("FEXDummy", {}));
|
|
98
|
+
}
|
|
99
|
+
// ============================================================
|
|
100
|
+
// Parámetros
|
|
101
|
+
// ============================================================
|
|
102
|
+
async getParamList(auth, method, resultKey, itemKey) {
|
|
103
|
+
const result = (await this.call(method, { Auth: auth }));
|
|
104
|
+
checkFexErr(result);
|
|
105
|
+
const items = result[resultKey]?.[itemKey];
|
|
106
|
+
return toArray(items);
|
|
107
|
+
}
|
|
108
|
+
/** Tipos de comprobante de exportación. */
|
|
109
|
+
async getTiposCbte(auth) {
|
|
110
|
+
return this.getParamList(auth, "FEXGetPARAM_Cbte_Tipo", "FEXResultGet", "ClsFEXResponse_Cbte_Tipo");
|
|
111
|
+
}
|
|
112
|
+
/** Monedas disponibles. */
|
|
113
|
+
async getMonedas(auth) {
|
|
114
|
+
return this.getParamList(auth, "FEXGetPARAM_MON", "FEXResultGet", "ClsFEXResponse_Mon");
|
|
115
|
+
}
|
|
116
|
+
/** Países destino. */
|
|
117
|
+
async getPaises(auth) {
|
|
118
|
+
return this.getParamList(auth, "FEXGetPARAM_DST_Pais", "FEXResultGet", "ClsFEXResponse_DST_pais");
|
|
119
|
+
}
|
|
120
|
+
/** Idiomas disponibles. */
|
|
121
|
+
async getIdiomas(auth) {
|
|
122
|
+
return this.getParamList(auth, "FEXGetPARAM_Idiomas", "FEXResultGet", "ClsFEXResponse_Idi");
|
|
123
|
+
}
|
|
124
|
+
/** Incoterms disponibles. */
|
|
125
|
+
async getIncoterms(auth) {
|
|
126
|
+
return this.getParamList(auth, "FEXGetPARAM_Incoterms", "FEXResultGet", "ClsFEXResponse_Inc");
|
|
127
|
+
}
|
|
128
|
+
/** Unidades de medida. */
|
|
129
|
+
async getUMed(auth) {
|
|
130
|
+
return this.getParamList(auth, "FEXGetPARAM_UMed", "FEXResultGet", "ClsFEXResponse_UMed");
|
|
131
|
+
}
|
|
132
|
+
/** Tipos de exportación. */
|
|
133
|
+
async getTiposExpo(auth) {
|
|
134
|
+
return this.getParamList(auth, "FEXGetPARAM_Tipo_Expo", "FEXResultGet", "ClsFEXResponse_Tex");
|
|
135
|
+
}
|
|
136
|
+
/** CUITs de países. */
|
|
137
|
+
async getCuitsPais(auth) {
|
|
138
|
+
return this.getParamList(auth, "FEXGetPARAM_DST_CUIT", "FEXResultGet", "ClsFEXResponse_DST_cuit");
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=wsfex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wsfex.js","sourceRoot":"","sources":["../src/wsfex.ts"],"names":[],"mappings":"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"}
|
package/llm.txt
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# @ramiidv/arca-sdk
|
|
2
2
|
|
|
3
3
|
> TypeScript SDK for ARCA (formerly AFIP) electronic invoicing in Argentina.
|
|
4
|
-
> Wraps WSFEv1 and WSAA SOAP web services.
|
|
4
|
+
> Wraps WSFEv1, WSFEX, and WSAA SOAP web services.
|
|
5
5
|
|
|
6
6
|
## What this SDK does
|
|
7
7
|
|
|
@@ -10,6 +10,10 @@
|
|
|
10
10
|
- Handles all comprobante types: A, B, C, E, M, and MiPyME FCE
|
|
11
11
|
- Auto-calculates IVA, totals, and comprobante numbers
|
|
12
12
|
- Queries ARCA parameters (document types, IVA rates, currencies, exchange rates, etc.)
|
|
13
|
+
- Export invoices via WSFEX (Factura de Exportación)
|
|
14
|
+
- Retry with exponential backoff on transient errors
|
|
15
|
+
- Event system for logging/debugging (auth, requests, retries)
|
|
16
|
+
- QR code URL generation for printed invoices
|
|
13
17
|
|
|
14
18
|
## Install
|
|
15
19
|
|
|
@@ -65,6 +69,9 @@ new Arca({
|
|
|
65
69
|
production?: boolean, // Default: false (uses homologación/testing endpoints)
|
|
66
70
|
tokenTTLMinutes?: number, // Default: 720 (12 hours)
|
|
67
71
|
requestTimeoutMs?: number, // Default: 30000 (30 seconds). Uses AbortController.
|
|
72
|
+
retries?: number, // Default: 1. Retries on transient errors (timeout, 5xx).
|
|
73
|
+
retryDelayMs?: number, // Default: 1000. Exponential backoff: delay * 2^attempt.
|
|
74
|
+
onEvent?: (event: ArcaEvent) => void, // Callback for all SDK events
|
|
68
75
|
})
|
|
69
76
|
```
|
|
70
77
|
|
|
@@ -339,6 +346,164 @@ await arca.facturar({
|
|
|
339
346
|
});
|
|
340
347
|
```
|
|
341
348
|
|
|
349
|
+
## Events / Logging
|
|
350
|
+
|
|
351
|
+
Two ways to subscribe:
|
|
352
|
+
|
|
353
|
+
```typescript
|
|
354
|
+
// 1. Config callback (receives all events)
|
|
355
|
+
const arca = new Arca({
|
|
356
|
+
...,
|
|
357
|
+
onEvent: (e) => console.log(e.type, e),
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
// 2. Typed .on()/.off() (filter by event type)
|
|
361
|
+
arca.on("request:end", (e) => console.log(`${e.method} took ${e.durationMs}ms`));
|
|
362
|
+
arca.on("auth:login", (e) => console.log(`Login ${e.service} in ${e.durationMs}ms`));
|
|
363
|
+
arca.on("request:retry", (e) => console.warn(`Retry #${e.attempt}: ${e.error}`));
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
Event types (discriminated union `ArcaEvent`):
|
|
367
|
+
- `auth:login` — new token obtained. Fields: `service`, `durationMs`
|
|
368
|
+
- `auth:cache-hit` — cached token reused. Fields: `service`
|
|
369
|
+
- `request:start` — SOAP call starting. Fields: `method`, `endpoint`
|
|
370
|
+
- `request:end` — SOAP call completed. Fields: `method`, `durationMs`
|
|
371
|
+
- `request:retry` — retrying after error. Fields: `method`, `attempt`, `delayMs`, `error`
|
|
372
|
+
- `request:error` — request failed. Fields: `method`, `error`
|
|
373
|
+
|
|
374
|
+
## Retry
|
|
375
|
+
|
|
376
|
+
Enabled by default (`retries: 1`). Only retries on transient errors (timeout, 5xx, network). Does NOT retry on 4xx or business errors. Exponential backoff: `retryDelayMs * 2^attempt`.
|
|
377
|
+
|
|
378
|
+
## QR Code URL
|
|
379
|
+
|
|
380
|
+
ARCA requires a QR code on printed invoices. `generateQRUrl` produces the official URL:
|
|
381
|
+
|
|
382
|
+
```typescript
|
|
383
|
+
const url = Arca.generateQRUrl({
|
|
384
|
+
fecha: "2026-03-28", // YYYY-MM-DD
|
|
385
|
+
cuit: 20123456789,
|
|
386
|
+
ptoVta: 1,
|
|
387
|
+
tipoCmp: CbteTipo.FACTURA_B,
|
|
388
|
+
nroCmp: 150,
|
|
389
|
+
importe: 121,
|
|
390
|
+
moneda: "PES",
|
|
391
|
+
ctz: 1,
|
|
392
|
+
tipoDocRec: DocTipo.CONSUMIDOR_FINAL,
|
|
393
|
+
nroDocRec: 0,
|
|
394
|
+
codAut: 73429843294823, // CAE number
|
|
395
|
+
});
|
|
396
|
+
// → "https://www.afip.gob.ar/fe/qr/?p=<base64>"
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
## WSFEX (Export invoices)
|
|
400
|
+
|
|
401
|
+
Simplified API (`facturarExpo`) auto-handles ID, numbering, and item total calculation:
|
|
402
|
+
|
|
403
|
+
```typescript
|
|
404
|
+
const result = await arca.facturarExpo({
|
|
405
|
+
ptoVta: 1,
|
|
406
|
+
cbteTipo: CbteTipo.FACTURA_E,
|
|
407
|
+
tipoExpo: 1, // 1=Bienes, 2=Servicios, 4=Otros
|
|
408
|
+
pais: 203, // Country code (203 = USA)
|
|
409
|
+
cliente: {
|
|
410
|
+
nombre: "ACME Corp",
|
|
411
|
+
cuitPais: 50000000016,
|
|
412
|
+
domicilio: "123 Main St, NY",
|
|
413
|
+
idImpositivo: "12-3456789",
|
|
414
|
+
},
|
|
415
|
+
moneda: "DOL",
|
|
416
|
+
cotizacion: 1200,
|
|
417
|
+
formaPago: "Wire Transfer",
|
|
418
|
+
incoterms: "FOB",
|
|
419
|
+
idioma: 2, // 1=ES, 2=EN, 3=PT
|
|
420
|
+
items: [{
|
|
421
|
+
codigo: "SKU001",
|
|
422
|
+
descripcion: "Widget",
|
|
423
|
+
cantidad: 100,
|
|
424
|
+
unidad: 7,
|
|
425
|
+
precioUnitario: 10,
|
|
426
|
+
// Pro_total_item auto-calculated: 100 * 10 = 1000
|
|
427
|
+
}],
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
if (result.aprobada) {
|
|
431
|
+
console.log("CAE:", result.cae);
|
|
432
|
+
console.log("Cbte:", result.cbteNro);
|
|
433
|
+
}
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
Returns `FacturaExpoResult`: `aprobada`, `cae`, `caeVencimiento`, `cbteNro`, `ptoVta`, `cbteTipo`, `obs`, `raw`.
|
|
437
|
+
|
|
438
|
+
Raw API also available via `crearFacturaExportacion(invoice)` for full control.
|
|
439
|
+
|
|
440
|
+
Query methods:
|
|
441
|
+
```typescript
|
|
442
|
+
await arca.consultarComprobanteExpo(CbteTipo.FACTURA_E, 1, cbteNro);
|
|
443
|
+
await arca.serverStatusExpo();
|
|
444
|
+
await arca.getPaisesExpo(); // Country codes
|
|
445
|
+
await arca.getIncotermsExpo(); // Incoterms
|
|
446
|
+
await arca.getUMedExpo(); // Units of measure
|
|
447
|
+
await arca.getTiposExpo(); // Export types
|
|
448
|
+
await arca.getMonedasExpo();
|
|
449
|
+
await arca.getIdiomasExpo();
|
|
450
|
+
await arca.getCuitsPaisExpo();
|
|
451
|
+
await arca.getTiposCbteExpo();
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
## CAEA (offline/contingency invoicing)
|
|
455
|
+
|
|
456
|
+
CAEA (Código de Autorización Electrónico Anticipado) allows issuing invoices offline and reporting them later.
|
|
457
|
+
|
|
458
|
+
Flow:
|
|
459
|
+
1. Request CAEA for a period (before it starts)
|
|
460
|
+
2. Issue invoices offline using the CAEA
|
|
461
|
+
3. Report invoices to ARCA
|
|
462
|
+
4. If no invoices were issued, report "sin movimiento"
|
|
463
|
+
|
|
464
|
+
```typescript
|
|
465
|
+
// 1. Request CAEA (must be done 5+ days before the period starts)
|
|
466
|
+
const caea = await arca.solicitarCAEA("202604", 1); // April, 1st half
|
|
467
|
+
// caea: { CAEA, Periodo, Orden, FchVigDesde, FchVigHasta, FchTopeInf }
|
|
468
|
+
|
|
469
|
+
// 2. Register invoices with CAEA (same interface as facturar()!)
|
|
470
|
+
const result = await arca.registrarFacturaCAEA(caea.CAEA, {
|
|
471
|
+
ptoVta: 5,
|
|
472
|
+
cbteTipo: CbteTipo.FACTURA_B,
|
|
473
|
+
items: [{ neto: 100, iva: IvaTipo.IVA_21 }],
|
|
474
|
+
});
|
|
475
|
+
// Returns FacturaResult — same as facturar()
|
|
476
|
+
|
|
477
|
+
// 3. If no invoices in the period, report no movement
|
|
478
|
+
await arca.sinMovimientoCAEA(caea.CAEA, 5);
|
|
479
|
+
|
|
480
|
+
// Query existing CAEA
|
|
481
|
+
const existing = await arca.consultarCAEA("202604", 1);
|
|
482
|
+
|
|
483
|
+
// Raw API also available: registrarCAEA(request) for full control
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
## Padrón (taxpayer registry)
|
|
487
|
+
|
|
488
|
+
Look up taxpayer data by CUIT. Two service levels:
|
|
489
|
+
|
|
490
|
+
```typescript
|
|
491
|
+
// Basic lookup (A13) — works with standard cert
|
|
492
|
+
const persona = await arca.consultarCuit(30712345678);
|
|
493
|
+
persona.cuit; // 30712345678
|
|
494
|
+
persona.nombre; // "EMPRESA SA"
|
|
495
|
+
persona.tipoPersona; // "JURIDICA"
|
|
496
|
+
persona.estadoClave; // "ACTIVO"
|
|
497
|
+
persona.impuestos; // [{ id: 30, descripcion: "IVA", estado: "AC" }]
|
|
498
|
+
persona.raw; // full parsed AFIP response
|
|
499
|
+
|
|
500
|
+
// Detailed lookup (A5) — requires additional cert authorization
|
|
501
|
+
const detalle = await arca.consultarCuitDetalle(20123456789);
|
|
502
|
+
detalle.domicilioFiscal; // { direccion, localidad, codPostal }
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
Returns `Contribuyente`: `cuit`, `nombre`, `tipoPersona`, `estadoClave`, `domicilioFiscal?`, `impuestos?`, `raw`.
|
|
506
|
+
|
|
342
507
|
## Key domain concepts
|
|
343
508
|
|
|
344
509
|
- **CUIT**: Argentine tax ID (11 digits, no hyphens). Used for business identification.
|
|
@@ -350,3 +515,6 @@ await arca.facturar({
|
|
|
350
515
|
- **Homologación**: ARCA's testing/sandbox environment. Use `production: false`.
|
|
351
516
|
- **FCE MiPyME**: Factura de Crédito Electrónica for small/medium businesses. Requires CBU in opcionales.
|
|
352
517
|
- **Tipo C**: Invoices issued by monotributistas (simplified tax regime). No IVA discrimination.
|
|
518
|
+
- **WSFEX**: ARCA's web service for export invoices. Separate from WSFEv1, different schema.
|
|
519
|
+
- **CAEA**: Código de Autorización Electrónico Anticipado. Pre-authorized code for offline invoicing. Must be requested before the period starts.
|
|
520
|
+
- **Padrón A13/A5**: ARCA's taxpayer registry web services. A13 = basic info (name, status, taxes). A5 = detailed (includes address, activities). Requires separate WSAA authorization.
|
package/package.json
CHANGED