@ramiidv/arca-mtxca 0.5.0 → 0.6.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/CHANGELOG.md +28 -0
- package/README.md +143 -87
- package/dist/arca-mtxca.d.ts +17 -2
- package/dist/arca-mtxca.d.ts.map +1 -1
- package/dist/arca-mtxca.js +19 -1
- package/dist/arca-mtxca.js.map +1 -1
- package/dist/format.d.ts +2 -7
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js +7 -17
- package/dist/format.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/mtxca-client.d.ts +8 -0
- package/dist/mtxca-client.d.ts.map +1 -1
- package/dist/mtxca-client.js +28 -6
- package/dist/mtxca-client.js.map +1 -1
- package/dist/qr.d.ts +24 -0
- package/dist/qr.d.ts.map +1 -0
- package/dist/qr.js +79 -0
- package/dist/qr.js.map +1 -0
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +15 -17
- package/dist/schemas.js.map +1 -1
- package/dist/serialize.d.ts +2 -1
- package/dist/serialize.d.ts.map +1 -1
- package/dist/serialize.js +9 -7
- package/dist/serialize.js.map +1 -1
- package/dist/types.d.ts +32 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/validation.d.ts +11 -4
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +117 -8
- package/dist/validation.js.map +1 -1
- package/llms.txt +25 -7
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.6.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 739b0d8: Auditoría contra el Manual del desarrollador WSMTXCA v0.25.8.
|
|
8
|
+
|
|
9
|
+
**Cambios de comportamiento:**
|
|
10
|
+
|
|
11
|
+
- **FCE MiPyME:** `fechaVencimientoPago` ahora es obligatoria en 201 y 206 y no corresponde en 202, 203, 207 y 208, cualquiera sea el concepto (148/149 en `autorizar`, 764/765 en `informarComprobanteCAEA`). Antes se exigía solo con concepto 2 o 3 y se rechazaba con concepto 1, lo que impedía emitir una FCE de productos.
|
|
12
|
+
- **`condicionIVAReceptor` (RG 5616) obligatoria localmente:** `autorizar()` e `informarComprobanteCAEA()` lanzan `ArcaValidationError` si falta (ARCA hoy la observa con 190/390 y pasará a rechazar). En `autorizar()` se puede omitir la validación local con `{ validarImportes: false }`.
|
|
13
|
+
- **Redondeo Round Half Even:** los importes, cantidades, precios, bonificaciones y cotizaciones se redondean mitad al par, como indica el manual (`8.565` → `8.56`, `1.005` → `1.00`; antes, mitad hacia afuera: `8.57`, `1.01`). Aplica a lo que se envía, a la validación de importes y a `roundImporte()` / `roundDecimal()`.
|
|
14
|
+
|
|
15
|
+
Nuevas validaciones locales (citan el código de ARCA): `cancelaEnMismaMonedaExtranjera: 'S'` solo en 1, 6, 51, 201 y 206 (118); descripción de cada tributo en FCE (302); compradores solo con concepto 1 (432) y uno solo en FCE (433); en CAEA no se admiten compradores (753); el IVA de las bonificaciones no puede superar el de su alícuota (516); notas de débito/crédito 2, 3, 7, 8, 52 y 53 con comprobantes asociados o período, no ambos (160/161 en CAE, 778/779 en CAEA).
|
|
16
|
+
|
|
17
|
+
Nuevo:
|
|
18
|
+
|
|
19
|
+
- `urlQR()` (método de `ArcaMtxca` y función exportada): URL del código QR (RG 4892) desde el request y el resultado de `autorizar` / `informarComprobanteCAEA`, o desde el comprobante de `consultarComprobante`. Se exportan también `QR_URL` y el tipo `QROptions`.
|
|
20
|
+
- `evento` de ARCA: `onEvento(evento, method)` en la configuración (`ArcaMtxcaConfig` y `MtxcaClientConfig`) lo recibe de cualquier respuesta, incluidas las que devuelven un número o una lista; `solicitarCAEA`, `consultarCAEA` y `getCotizacionMoneda` lo incluyen como `evento?` en el resultado.
|
|
21
|
+
|
|
22
|
+
Documentación: Node >= 20.19 (solo ESM; desde CommonJS con `require()`), reglas de FCE y tabla de reglas validadas, redondeo, SOAP Fault `Client` (no incierto) vs `Server` (incierto) en emisiones, QR y eventos.
|
|
23
|
+
- `informarComprobanteCAEA` exige `fechaHoraGen` (regla 754: obligatoria para todo comprobante CAEA desde el 01/08/2026).
|
|
24
|
+
|
|
25
|
+
### Patch Changes
|
|
26
|
+
|
|
27
|
+
- 1db70be: Descripción y keywords del paquete en npm corregidas (tildes).
|
|
28
|
+
- Updated dependencies [b152f08]
|
|
29
|
+
- @ramiidv/arca-common@0.7.0
|
|
30
|
+
|
|
3
31
|
## 0.5.0
|
|
4
32
|
|
|
5
33
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
# @ramiidv/arca-mtxca
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@ramiidv/arca-mtxca)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://nodejs.org)
|
|
6
|
+
|
|
3
7
|
SDK de TypeScript para el web service **WSMTXCA** de ARCA (ex AFIP): factura electrónica con detalle de ítems (código MTX/GTIN, cantidad, precio unitario e IVA por línea), con CAE y con CAEA.
|
|
4
8
|
|
|
5
9
|
- Tipos fieles al WSDL/XSD de WSMTXCA y elementos en el orden de la secuencia (Axis2 valida el orden).
|
|
6
|
-
- Redondeo según el
|
|
7
|
-
- Validación local de las reglas excluyentes del manual (presencia de campos por unidad de medida, fórmulas por ítem, subtotales de IVA por alícuota, totales).
|
|
10
|
+
- Redondeo según el manual (Round Half Even): 2 decimales en importes, 6 en cantidad, precio unitario, bonificación y cotización.
|
|
11
|
+
- Validación local de las reglas excluyentes del manual (presencia de campos por unidad de medida, fórmulas por ítem, subtotales de IVA por alícuota, totales, FCE, condición de IVA del receptor).
|
|
12
|
+
- URL del código QR (RG 4892) con `urlQR()`.
|
|
8
13
|
- Las emisiones nunca se reintentan y los errores con resultado desconocido se marcan como `uncertain`.
|
|
9
14
|
- Los errores de negocio de ARCA (`arrayErrores`) se lanzan como `ArcaServiceError` en las consultas.
|
|
10
15
|
- Autenticación WSAA automática (via `@ramiidv/arca-common`), con `ticketStorage` persistente opcional.
|
|
11
|
-
- ESM,
|
|
16
|
+
- Solo ESM, `fetch` nativo.
|
|
17
|
+
|
|
18
|
+
Fuente: [Manual del desarrollador WSMTXCA v0.25.8](https://www.afip.gob.ar/fe/ayuda/documentos/wsmtxca-RG-2904.pdf) y el WSDL de producción.
|
|
12
19
|
|
|
13
20
|
## Instalación
|
|
14
21
|
|
|
@@ -16,11 +23,17 @@ SDK de TypeScript para el web service **WSMTXCA** de ARCA (ex AFIP): factura ele
|
|
|
16
23
|
npm install @ramiidv/arca-mtxca
|
|
17
24
|
```
|
|
18
25
|
|
|
26
|
+
## Requisitos
|
|
27
|
+
|
|
28
|
+
- Node.js >= 20.19. Solo ESM; desde CommonJS se carga con `require()` (require(esm)).
|
|
29
|
+
- Certificado digital de ARCA asociado al servicio `wsmtxca` y empadronamiento en "Codificación de Productos – Factura con Detalle".
|
|
30
|
+
|
|
19
31
|
## Inicio rápido
|
|
20
32
|
|
|
21
33
|
```typescript
|
|
22
34
|
import { readFileSync } from 'node:fs';
|
|
23
35
|
import { ArcaMtxca, CbteTipo, Concepto, CodigoCondicionIVA, Moneda } from '@ramiidv/arca-mtxca';
|
|
36
|
+
import type { AutorizarRequest } from '@ramiidv/arca-mtxca';
|
|
24
37
|
|
|
25
38
|
const mtxca = new ArcaMtxca({
|
|
26
39
|
cert: readFileSync('./cert.pem', 'utf-8'),
|
|
@@ -30,14 +43,14 @@ const mtxca = new ArcaMtxca({
|
|
|
30
43
|
});
|
|
31
44
|
|
|
32
45
|
// Factura A: 1 producto a $100 + IVA 21%
|
|
33
|
-
const
|
|
46
|
+
const comprobante: AutorizarRequest = {
|
|
34
47
|
codigoTipoComprobante: CbteTipo.FACTURA_A,
|
|
35
48
|
numeroPuntoVenta: 4000,
|
|
36
49
|
// numeroComprobante: omitido => último autorizado + 1
|
|
37
50
|
fechaEmision: new Date(),
|
|
38
51
|
codigoTipoDocumento: 80,
|
|
39
52
|
numeroDocumento: '30-00000000-7',
|
|
40
|
-
condicionIVAReceptor: 1, // RG 5616: ver getCondicionesIVAReceptor()
|
|
53
|
+
condicionIVAReceptor: 1, // RG 5616 (obligatoria): ver getCondicionesIVAReceptor()
|
|
41
54
|
importeGravado: 100,
|
|
42
55
|
importeNoGravado: 0,
|
|
43
56
|
importeExento: 0,
|
|
@@ -61,7 +74,8 @@ const res = await mtxca.autorizar({
|
|
|
61
74
|
},
|
|
62
75
|
],
|
|
63
76
|
subtotalesIVA: [{ codigo: CodigoCondicionIVA.IVA_21, importe: 21 }],
|
|
64
|
-
}
|
|
77
|
+
};
|
|
78
|
+
const res = await mtxca.autorizar(comprobante);
|
|
65
79
|
|
|
66
80
|
if (res.resultado === 'R') {
|
|
67
81
|
console.error('Rechazado', res.errores);
|
|
@@ -69,6 +83,7 @@ if (res.resultado === 'R') {
|
|
|
69
83
|
// 'A' aprobado, 'O' aprobado con observaciones
|
|
70
84
|
console.log(res.comprobante.numeroComprobante, res.comprobante.cae, res.comprobante.fechaVencimientoCAE);
|
|
71
85
|
if (res.observaciones.length) console.warn(res.observaciones);
|
|
86
|
+
console.log(mtxca.urlQR(comprobante, res)); // URL del QR (RG 4892)
|
|
72
87
|
}
|
|
73
88
|
```
|
|
74
89
|
|
|
@@ -89,85 +104,10 @@ if (res.resultado === 'R') {
|
|
|
89
104
|
| `tokenTTLMinutes`, `clockOffsetMs`, `autoClockSkew`, `loginErrorCooldownMs` | Opciones de WSAA. |
|
|
90
105
|
| `fetch`, `legacyTls` | `fetch` propio (proxy, tests) y transporte TLS legacy. |
|
|
91
106
|
| `onEvent` | Callback de eventos (`auth:*`, `request:*`). |
|
|
92
|
-
|
|
93
|
-
Endpoints (manual WSMTXCA):
|
|
94
|
-
|
|
95
|
-
| Entorno | URL |
|
|
96
|
-
| ------------ | ----------------------------------------------------------------- |
|
|
97
|
-
| Homologación | `https://fwshomo.afip.gov.ar/wsmtxca/services/MTXCAService` |
|
|
98
|
-
| Producción | `https://serviciosjava.afip.gob.ar/wsmtxca/services/MTXCAService` |
|
|
107
|
+
| `onEvento` | Recibe el `evento` (aviso de ARCA) de cualquier respuesta: `(evento, method) => void`. |
|
|
99
108
|
|
|
100
109
|
Todos los métodos aceptan un último parámetro `opts?: CallOptions` con `signal` para cancelar.
|
|
101
110
|
|
|
102
|
-
## Reglas de importes
|
|
103
|
-
|
|
104
|
-
Los campos del request se llaman igual que en el XSD (`ComprobanteType`, `ItemType`). Lo más importante del manual:
|
|
105
|
-
|
|
106
|
-
- `importeItem` incluye el IVA. En clase A (1, 2, 3, 51, 52, 53) `precioUnitario` va **sin** IVA y el ítem lleva `importeIVA`; en clase B (6, 7, 8) `precioUnitario` va **con** IVA y el ítem no lleva `importeIVA`.
|
|
107
|
-
- `importeItem` = (`precioUnitario` × `cantidad` − `importeBonificacion`) × (1 + alícuota) en clase A; = `precioUnitario` × `cantidad` − `importeBonificacion` en clase B.
|
|
108
|
-
- Unidad 99 (bonificación) y 97 (seña): sin `cantidad`, `precioUnitario` ni `importeBonificacion`; la bonificación tiene `importeItem` negativo y requiere otro ítem con la misma condición de IVA. En clase A, `importeIVA` = `importeItem` − `importeItem` / (1 + alícuota).
|
|
109
|
-
- Fuera de 97/99, `unidadesMtx` y `codigoMtx` son obligatorios.
|
|
110
|
-
- `importeGravado` = Σ (`importeItem` − IVA) de los ítems con condición 3–6; `importeNoGravado` = Σ ítems condición 1; `importeExento` = Σ ítems condición 2; `importeSubtotal` = gravado + no gravado + exento.
|
|
111
|
-
- `subtotalesIVA`: uno por cada condición 4, 5 o 6 presente, con la suma del IVA de esos ítems.
|
|
112
|
-
- `importeTotal` = `importeSubtotal` + `importeOtrosTributos` + Σ subtotales de IVA = `importeOtrosTributos` + Σ `importeItem`.
|
|
113
|
-
- Margen de error del manual: error relativo ≤ 0,01% o absoluto ≤ 0,01 × cantidad de elementos.
|
|
114
|
-
|
|
115
|
-
`autorizar()` valida todo esto antes de enviar y lanza `ArcaValidationError` con el detalle (incluye el código de error de ARCA que se evita y el valor esperado). Si ARCA acepta un caso que la validación local rechaza, pasá `{ validarImportes: false }`. Para redondear como el SDK: `roundImporte()` y `roundDecimal()`.
|
|
116
|
-
|
|
117
|
-
Ejemplo de bonificación en clase A:
|
|
118
|
-
|
|
119
|
-
```typescript
|
|
120
|
-
items: [
|
|
121
|
-
{ unidadesMtx: 1, codigoMtx: '7790001000012', descripcion: 'Producto', cantidad: 1, codigoUnidadMedida: 7,
|
|
122
|
-
precioUnitario: 100, codigoCondicionIVA: 5, importeIVA: 21, importeItem: 121 },
|
|
123
|
-
{ descripcion: 'Bonificación 10%', codigoUnidadMedida: 99, codigoCondicionIVA: 5, importeIVA: -2.1, importeItem: -12.1 },
|
|
124
|
-
],
|
|
125
|
-
importeGravado: 90, importeSubtotal: 90, importeTotal: 108.9,
|
|
126
|
-
subtotalesIVA: [{ codigo: 5, importe: 18.9 }],
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
## Resultado de una autorización y manejo de errores
|
|
130
|
-
|
|
131
|
-
| Situación | Qué pasa |
|
|
132
|
-
| ------------------------------ | -------------------------------------------------------------------- |
|
|
133
|
-
| Datos inválidos localmente | `ArcaValidationError` (no se hace ningún request). |
|
|
134
|
-
| ARCA aprueba | `{ resultado: 'A', comprobante: { cae, fechaVencimientoCAE, ... } }` |
|
|
135
|
-
| ARCA aprueba con observaciones | `{ resultado: 'O', comprobante, observaciones }` |
|
|
136
|
-
| ARCA rechaza | `{ resultado: 'R', errores }` — **no lanza**; revisá `resultado`. |
|
|
137
|
-
| Consulta con `arrayErrores` | `ArcaServiceError` con `errors[]` (`code`, `msg`). |
|
|
138
|
-
| Fault SOAP, HTTP, red, timeout | `ArcaSoapError` (`uncertain`, `faultString`, `statusCode`). |
|
|
139
|
-
| Login WSAA | `ArcaAuthError` / `ArcaTicketVigenteError`. |
|
|
140
|
-
|
|
141
|
-
`ultimoComprobante()` devuelve 0 solo ante el error 1502 de ARCA ("no hay comprobantes para ese punto de venta y tipo"); cualquier otro error lanza.
|
|
142
|
-
|
|
143
|
-
### Emisiones con resultado incierto
|
|
144
|
-
|
|
145
|
-
`autorizar`, `autorizarAjusteIVA`, `solicitarCAEA`, `informarComprobanteCAEA`, `informarAjusteIVACAEA`, `informarCAEANoUtilizado` e `informarCAEANoUtilizadoPtoVta` se envían una sola vez (nunca se reintentan). Si fallan con `ArcaSoapError` y `uncertain === true` (timeout, conexión cortada, HTTP 5xx, respuesta ilegible), ARCA pudo haber procesado el request. **No reintentes a ciegas**: si el comprobante ya fue autorizado, un reenvío con el mismo número es rechazado por correlatividad (102) y uno con el número siguiente duplica la factura.
|
|
146
|
-
|
|
147
|
-
```typescript
|
|
148
|
-
import { ArcaSoapError } from '@ramiidv/arca-mtxca';
|
|
149
|
-
|
|
150
|
-
const numero = (await mtxca.ultimoComprobante(4000, CbteTipo.FACTURA_A)) + 1;
|
|
151
|
-
try {
|
|
152
|
-
return await mtxca.autorizar({ ...comprobante, numeroComprobante: numero });
|
|
153
|
-
} catch (e) {
|
|
154
|
-
if (e instanceof ArcaSoapError && e.uncertain) {
|
|
155
|
-
// ¿Llegó a autorizarse?
|
|
156
|
-
const ultimo = await mtxca.ultimoComprobante(4000, CbteTipo.FACTURA_A);
|
|
157
|
-
if (ultimo >= numero) {
|
|
158
|
-
const { comprobante } = await mtxca.consultarComprobante(CbteTipo.FACTURA_A, 4000, numero);
|
|
159
|
-
return comprobante; // codigoAutorizacion = CAE
|
|
160
|
-
}
|
|
161
|
-
// No se autorizó: se puede reenviar con el mismo número.
|
|
162
|
-
}
|
|
163
|
-
throw e;
|
|
164
|
-
}
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
Para CAEA: `solicitarCAEA` incierto → `consultarCAEAEntreFechas()`; `informarComprobanteCAEA` incierto → `consultarComprobante()`.
|
|
168
|
-
|
|
169
|
-
Las solicitudes de un mismo punto de venta y tipo deben ser secuenciales (ARCA rechaza con 135 una solicitud concurrente), y la numeración automática supone un único emisor por punto de venta.
|
|
170
|
-
|
|
171
111
|
## API
|
|
172
112
|
|
|
173
113
|
### Comprobantes con CAE
|
|
@@ -179,6 +119,18 @@ Las solicitudes de un mismo punto de venta y tipo deben ser secuenciales (ARCA r
|
|
|
179
119
|
| `ultimoComprobante(ptoVta, cbteTipo, opts?)` | `consultarUltimoComprobanteAutorizado` |
|
|
180
120
|
| `siguienteComprobante(ptoVta, cbteTipo, opts?)` | último + 1 |
|
|
181
121
|
| `consultarComprobante(cbteTipo, ptoVta, cbteNro, opts?)` | `consultarComprobante` → `{ comprobante, observaciones, evento? }` |
|
|
122
|
+
| `urlQR(comprobante, resultado?, options?)` | URL del código QR (RG 4892), sin request |
|
|
123
|
+
|
|
124
|
+
### Código QR (RG 4892)
|
|
125
|
+
|
|
126
|
+
`urlQR` arma la URL con `generarUrlQR` de `@ramiidv/arca-common` y la CUIT de la instancia. Toma tipo, punto de venta, número y CAE/CAEA de `resultado` (con CAE, también la fecha que asignó ARCA) y del comprobante `importeTotal`, `codigoMoneda`, `cotizacionMoneda` (1 si es `PES`), `codigoTipoDocumento` y `numeroDocumento`. Sin `resultado`, recibe el comprobante de `consultarComprobante()` (`codigoTipoAutorizacion` "E" = CAE, "A" = CAEA). También está como función: `urlQR(cuit, comprobante, resultado?, options?)`.
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
const { comprobante } = await mtxca.consultarComprobante(CbteTipo.FACTURA_A, 4000, 25);
|
|
130
|
+
const url = mtxca.urlQR(comprobante); // https://www.arca.gob.ar/fe/qr/?p=...
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Lanza `ArcaValidationError` si el comprobante fue rechazado o falta un dato (ej. la cotización de una moneda extranjera omitida por `cancelaEnMismaMonedaExtranjera`: en ese caso, usá el comprobante de `consultarComprobante()`).
|
|
182
134
|
|
|
183
135
|
### CAEA
|
|
184
136
|
|
|
@@ -211,7 +163,7 @@ Las solicitudes de un mismo punto de venta y tipo deben ser secuenciales (ARCA r
|
|
|
211
163
|
| `getActividadesVigentes()` | `consultarActividadesVigentes` | `{ codigo, orden, descripcion }[]` |
|
|
212
164
|
| `getPuntosVenta()` / `getPuntosVentaCAE()` / `getPuntosVentaCAEA()` | `consultarPuntosVenta*` | `{ numeroPuntoVenta, bloqueado, fechaBaja? }[]` |
|
|
213
165
|
|
|
214
|
-
`getCotizacionMoneda` usa la fecha de hoy si no se indica; `cotizacion` es `null` cuando ARCA no tiene cotización (responde sin valor y sin error).
|
|
166
|
+
`getCotizacionMoneda` usa la fecha de hoy si no se indica; `cotizacion` es `null` cuando ARCA no tiene cotización (responde sin valor y sin error). `getCotizacionMoneda`, `solicitarCAEA` y `consultarCAEA` incluyen `evento?` en el resultado; para el resto, usá `onEvento` (ver [Eventos](#eventos)).
|
|
215
167
|
|
|
216
168
|
`clearAuthCache()` (async) descarta el ticket WSAA de `wsmtxca`.
|
|
217
169
|
|
|
@@ -225,7 +177,52 @@ const client = new MtxcaClient({ endpoint: MTXCA_ENDPOINTS.testing });
|
|
|
225
177
|
await client.dummy();
|
|
226
178
|
```
|
|
227
179
|
|
|
228
|
-
|
|
180
|
+
### Reglas de importes
|
|
181
|
+
|
|
182
|
+
Los campos del request se llaman igual que en el XSD (`ComprobanteType`, `ItemType`). Lo más importante del manual:
|
|
183
|
+
|
|
184
|
+
- `importeItem` incluye el IVA. En clase A (1, 2, 3, 51, 52, 53) `precioUnitario` va **sin** IVA y el ítem lleva `importeIVA`; en clase B (6, 7, 8) `precioUnitario` va **con** IVA y el ítem no lleva `importeIVA`.
|
|
185
|
+
- `importeItem` = (`precioUnitario` × `cantidad` − `importeBonificacion`) × (1 + alícuota) en clase A; = `precioUnitario` × `cantidad` − `importeBonificacion` en clase B.
|
|
186
|
+
- Unidad 99 (bonificación) y 97 (seña): sin `cantidad`, `precioUnitario` ni `importeBonificacion`; la bonificación tiene `importeItem` negativo y requiere otro ítem con la misma condición de IVA. En clase A, `importeIVA` = `importeItem` − `importeItem` / (1 + alícuota).
|
|
187
|
+
- Fuera de 97/99, `unidadesMtx` y `codigoMtx` son obligatorios.
|
|
188
|
+
- `importeGravado` = Σ (`importeItem` − IVA) de los ítems con condición 3–6; `importeNoGravado` = Σ ítems condición 1; `importeExento` = Σ ítems condición 2; `importeSubtotal` = gravado + no gravado + exento.
|
|
189
|
+
- `subtotalesIVA`: uno por cada condición 4, 5 o 6 presente, con la suma del IVA de esos ítems.
|
|
190
|
+
- `importeTotal` = `importeSubtotal` + `importeOtrosTributos` + Σ subtotales de IVA = `importeOtrosTributos` + Σ `importeItem`.
|
|
191
|
+
- En una bonificación (99) de clase A, el IVA (en valor absoluto) no puede superar el IVA de los demás ítems de la misma condición (516).
|
|
192
|
+
- Margen de error del manual: error relativo ≤ 0,01% o absoluto ≤ 0,01 × cantidad de elementos.
|
|
193
|
+
- Redondeo: **Round Half Even** (mitad al par, nota 4 de "Aclaraciones y Definiciones" del manual) en todos los valores decimales: `8.565` → `8.56`, `8.575` → `8.58`, `1.005` → `1.00`. El SDK redondea así lo que envía y lo que valida; para calcular igual, usá `roundImporte()` (2 decimales) y `roundDecimal()` (6).
|
|
194
|
+
|
|
195
|
+
`autorizar()` valida todo esto antes de enviar y lanza `ArcaValidationError` con el detalle (incluye el código de error de ARCA que se evita y el valor esperado). Si ARCA acepta un caso que la validación local rechaza, pasá `{ validarImportes: false }`.
|
|
196
|
+
|
|
197
|
+
### Otras reglas del manual que se validan localmente
|
|
198
|
+
|
|
199
|
+
| Regla | CAE (`autorizar`) | CAEA (`informarComprobanteCAEA`) |
|
|
200
|
+
| -------------------------------------------------------------------------------------------------------------- | ----------------- | -------------------------------- |
|
|
201
|
+
| `condicionIVAReceptor` (RG 5616) obligatoria. ARCA hoy la **observa**; el SDK la exige para no emitir sin ella | 190 | 390 |
|
|
202
|
+
| `fechaServicioDesde`/`Hasta` y `fechaVencimientoPago` solo con concepto 2 o 3 (fuera de FCE) | 122-124 | — (ARCA solo observa) |
|
|
203
|
+
| FCE 201 y 206: `fechaVencimientoPago` obligatoria, cualquiera sea el concepto | 148 | 764 |
|
|
204
|
+
| FCE 202, 203, 207 y 208: `fechaVencimientoPago` no corresponde, cualquiera sea el concepto | 149 | 765 |
|
|
205
|
+
| FCE: cada `otrosTributos[].descripcion` es obligatoria (en el resto, solo con `codigo` 99, regla 301) | 302 | — |
|
|
206
|
+
| ND/NC 2, 3, 7, 8, 52, 53: `comprobantesAsociados` o `periodoComprobantesAsociados`, no ambos | 160, 161 | 778, 779 |
|
|
207
|
+
| `cancelaEnMismaMonedaExtranjera: 'S'` solo en 1, 6, 51, 201 y 206 | 118 | — (ARCA solo observa) |
|
|
208
|
+
| `compradores` solo con concepto 1; en FCE, uno solo | 432, 433 | no se admiten (753) |
|
|
209
|
+
| `fechaHoraGen` obligatoria en todo comprobante CAEA (desde el 01/08/2026) | — | 754 |
|
|
210
|
+
|
|
211
|
+
En FCE (201-208) el ítem no exige `importeIVA` ni se valida su fórmula (514/515 aplican a 1, 2, 3, 51, 52, 53); el precio va sin IVA en FCE A y con IVA en FCE B, y los totales (110-116) se validan igual que en A y B.
|
|
212
|
+
|
|
213
|
+
Ejemplo de bonificación en clase A:
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
items: [
|
|
217
|
+
{ unidadesMtx: 1, codigoMtx: '7790001000012', descripcion: 'Producto', cantidad: 1, codigoUnidadMedida: 7,
|
|
218
|
+
precioUnitario: 100, codigoCondicionIVA: 5, importeIVA: 21, importeItem: 121 },
|
|
219
|
+
{ descripcion: 'Bonificación 10%', codigoUnidadMedida: 99, codigoCondicionIVA: 5, importeIVA: -2.1, importeItem: -12.1 },
|
|
220
|
+
],
|
|
221
|
+
importeGravado: 90, importeSubtotal: 90, importeTotal: 108.9,
|
|
222
|
+
subtotalesIVA: [{ codigo: 5, importe: 18.9 }],
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Enums y constantes
|
|
229
226
|
|
|
230
227
|
- `CbteTipo`: 1, 2, 3, 6, 7, 8, 51, 52, 53 (A con leyenda "OPERACIÓN SUJETA A RETENCIÓN") y FCE 201–203, 206–208.
|
|
231
228
|
- `Concepto`: 1 productos, 2 servicios, 3 ambos.
|
|
@@ -233,10 +230,69 @@ await client.dummy();
|
|
|
233
230
|
- `UnidadMedidaEspecial`: 95, 97 (seña), 99 (bonificación).
|
|
234
231
|
- `Moneda`: `PES`, `DOL`, `060` (euro). Lista completa: `getMonedas()`.
|
|
235
232
|
|
|
236
|
-
##
|
|
233
|
+
## Manejo de errores
|
|
237
234
|
|
|
238
|
-
|
|
239
|
-
|
|
235
|
+
| Situación | Qué pasa |
|
|
236
|
+
| ------------------------------ | -------------------------------------------------------------------- |
|
|
237
|
+
| Datos inválidos localmente | `ArcaValidationError` (no se hace ningún request). |
|
|
238
|
+
| ARCA aprueba | `{ resultado: 'A', comprobante: { cae, fechaVencimientoCAE, ... } }` |
|
|
239
|
+
| ARCA aprueba con observaciones | `{ resultado: 'O', comprobante, observaciones }` |
|
|
240
|
+
| ARCA rechaza | `{ resultado: 'R', errores }` — **no lanza**; revisá `resultado`. |
|
|
241
|
+
| Consulta con `arrayErrores` | `ArcaServiceError` con `errors[]` (`code`, `msg`). |
|
|
242
|
+
| Fault SOAP, HTTP, red, timeout | `ArcaSoapError` (`uncertain`, `faultString`, `statusCode`). |
|
|
243
|
+
| Respuesta con forma inesperada | `ArcaSoapError` (`uncertain: true` en emisiones). |
|
|
244
|
+
| Login WSAA | `ArcaAuthError` / `ArcaTicketVigenteError`. |
|
|
245
|
+
|
|
246
|
+
`ultimoComprobante()` devuelve 0 solo ante el error 1502 de ARCA ("no hay comprobantes para ese punto de venta y tipo"); cualquier otro error lanza.
|
|
247
|
+
|
|
248
|
+
### Emisiones con resultado incierto
|
|
249
|
+
|
|
250
|
+
`autorizar`, `autorizarAjusteIVA`, `solicitarCAEA`, `informarComprobanteCAEA`, `informarAjusteIVACAEA`, `informarCAEANoUtilizado` e `informarCAEANoUtilizadoPtoVta` se envían una sola vez (nunca se reintentan). Si fallan con `ArcaSoapError` y `uncertain === true` (timeout, conexión cortada, HTTP 5xx, SOAP Fault `Server`, respuesta ilegible), ARCA pudo haber procesado el request. Los Fault `Client` (ej. "Token vencido", errores de estructura) no son inciertos: el request se rechazó antes de procesarse. **No reintentes a ciegas**: si el comprobante ya fue autorizado, un reenvío con el mismo número es rechazado por correlatividad (102) y uno con el número siguiente duplica la factura.
|
|
251
|
+
|
|
252
|
+
```typescript
|
|
253
|
+
import { type ArcaMtxca, type AutorizarRequest, ArcaSoapError, CbteTipo } from '@ramiidv/arca-mtxca';
|
|
254
|
+
|
|
255
|
+
async function autorizarSeguro(mtxca: ArcaMtxca, comprobante: AutorizarRequest) {
|
|
256
|
+
const numero = (await mtxca.ultimoComprobante(4000, CbteTipo.FACTURA_A)) + 1;
|
|
257
|
+
try {
|
|
258
|
+
return await mtxca.autorizar({ ...comprobante, numeroComprobante: numero });
|
|
259
|
+
} catch (e) {
|
|
260
|
+
if (e instanceof ArcaSoapError && e.uncertain) {
|
|
261
|
+
// ¿Llegó a autorizarse?
|
|
262
|
+
const ultimo = await mtxca.ultimoComprobante(4000, CbteTipo.FACTURA_A);
|
|
263
|
+
if (ultimo >= numero) {
|
|
264
|
+
const { comprobante } = await mtxca.consultarComprobante(CbteTipo.FACTURA_A, 4000, numero);
|
|
265
|
+
return comprobante; // codigoAutorizacion = CAE
|
|
266
|
+
}
|
|
267
|
+
// No se autorizó: se puede reenviar con el mismo número.
|
|
268
|
+
}
|
|
269
|
+
throw e;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Para CAEA: `solicitarCAEA` incierto → `consultarCAEAEntreFechas()`; `informarComprobanteCAEA` incierto → `consultarComprobante()`.
|
|
275
|
+
|
|
276
|
+
Las solicitudes de un mismo punto de venta y tipo deben ser secuenciales (ARCA rechaza con 135 una solicitud concurrente), y la numeración automática supone un único emisor por punto de venta.
|
|
277
|
+
|
|
278
|
+
## Eventos
|
|
279
|
+
|
|
280
|
+
`onEvent` (o `mtxca.on(tipo, handler)`) recibe `auth:login`, `auth:cache-hit`, `auth:clock-skew`, `auth:storage-error`, `request:start`, `request:end`, `request:retry` y `request:error` (ver `ArcaEvent` en `@ramiidv/arca-common`).
|
|
281
|
+
|
|
282
|
+
El `evento` de WSMTXCA (aviso informativo de ARCA, `{ codigo, descripcion }`, ej. mantenimiento programado) llega como `evento?` en los resultados de autorizaciones, informes de CAEA, `consultarComprobante`, `solicitarCAEA`, `consultarCAEA` y `getCotizacionMoneda`, y de **cualquier** respuesta (incluidas las que devuelven un número o una lista) a `onEvento(evento, method)` de la configuración.
|
|
283
|
+
|
|
284
|
+
## Entornos
|
|
285
|
+
|
|
286
|
+
| Entorno | URL |
|
|
287
|
+
| ------------ | ----------------------------------------------------------------- |
|
|
288
|
+
| Homologación | `https://fwshomo.afip.gov.ar/wsmtxca/services/MTXCAService` |
|
|
289
|
+
| Producción | `https://serviciosjava.afip.gob.ar/wsmtxca/services/MTXCAService` |
|
|
290
|
+
|
|
291
|
+
`production: false` (default) usa homologación. Las URLs están en `MTXCA_ENDPOINTS`; las de WSAA, en `WSAA_ENDPOINTS` de `@ramiidv/arca-common`.
|
|
292
|
+
|
|
293
|
+
## Ejemplos
|
|
294
|
+
|
|
295
|
+
En [examples](https://github.com/ramiidv/arca-sdks/tree/main/packages/mtxca/examples): factura B con ítems y QR, consultas de parámetros y CAEA, y manejo de errores.
|
|
240
296
|
|
|
241
297
|
## Licencia
|
|
242
298
|
|
package/dist/arca-mtxca.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ArcaSdkBase } from '@ramiidv/arca-common';
|
|
2
|
-
import type { CallOptions, ServerStatus } from '@ramiidv/arca-common';
|
|
2
|
+
import type { CallOptions, QROptions, ServerStatus } from '@ramiidv/arca-common';
|
|
3
3
|
import { MtxcaClient } from './mtxca-client.js';
|
|
4
|
+
import type { ComprobanteQR } from './qr.js';
|
|
4
5
|
import type { ActividadVigente, ArcaMtxcaConfig, AutorizarOptions, AutorizarRequest, CodigoDescripcion, CodigoDescripcionString, CotizacionResult, FechaInput, MtxcaAutorizarResult, MtxcaCAEA, MtxcaCAEANoUtilizadoResult, MtxcaComprobanteCAEA, MtxcaConsultaComprobanteResult, MtxcaInformarCAEAResult, PuntoVenta } from './types.js';
|
|
5
6
|
/**
|
|
6
7
|
* Cliente de alto nivel de WSMTXCA (factura electrónica con detalle de
|
|
@@ -52,6 +53,19 @@ export declare class ArcaMtxca extends ArcaSdkBase<'mtxca'> {
|
|
|
52
53
|
siguienteComprobante(ptoVta: number, cbteTipo: number, opts?: CallOptions): Promise<number>;
|
|
53
54
|
/** Consulta un comprobante autorizado (CAE) o informado (CAEA). Lanza `ArcaServiceError` si no existe. */
|
|
54
55
|
consultarComprobante(cbteTipo: number, ptoVta: number, cbteNro: number, opts?: CallOptions): Promise<MtxcaConsultaComprobanteResult>;
|
|
56
|
+
/**
|
|
57
|
+
* URL del código QR (RG 4892) de un comprobante autorizado con CAE o
|
|
58
|
+
* informado con CAEA, con la CUIT de la instancia como emisor.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```ts
|
|
62
|
+
* const res = await mtxca.autorizar(req);
|
|
63
|
+
* if (res.resultado !== 'R') console.log(mtxca.urlQR(req, res));
|
|
64
|
+
* // Más tarde: mtxca.urlQR((await mtxca.consultarComprobante(1, 4000, 25)).comprobante)
|
|
65
|
+
* ```
|
|
66
|
+
* @throws ArcaValidationError si el comprobante fue rechazado o falta algún dato (ver `urlQR`).
|
|
67
|
+
*/
|
|
68
|
+
urlQR(comprobante: ComprobanteQR, resultado?: MtxcaAutorizarResult | MtxcaInformarCAEAResult, options?: QROptions): string;
|
|
55
69
|
/**
|
|
56
70
|
* Solicita un CAEA para `periodo` (AAAAMM) y `orden` (1: días 1-15, 2: 16
|
|
57
71
|
* a fin de mes). Lanza `ArcaServiceError` si ARCA lo rechaza. Si lanza
|
|
@@ -64,7 +78,8 @@ export declare class ArcaMtxca extends ArcaSdkBase<'mtxca'> {
|
|
|
64
78
|
consultarCAEAEntreFechas(fechaDesde: FechaInput, fechaHasta: FechaInput, opts?: CallOptions): Promise<MtxcaCAEA[]>;
|
|
65
79
|
/**
|
|
66
80
|
* Informa un comprobante emitido con CAEA (`informarComprobanteCAEA`). Valida
|
|
67
|
-
* el XSD y las reglas excluyentes
|
|
81
|
+
* el XSD y las reglas excluyentes del manual (ítems, condición de IVA del
|
|
82
|
+
* receptor, FCE, comprobantes asociados, compradores). Un rechazo devuelve
|
|
68
83
|
* `resultado: 'R'`. Ante `uncertain`, verificá con `consultarComprobante()`.
|
|
69
84
|
*/
|
|
70
85
|
informarComprobanteCAEA(comprobante: MtxcaComprobanteCAEA, opts?: CallOptions): Promise<MtxcaInformarCAEAResult>;
|
package/dist/arca-mtxca.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arca-mtxca.d.ts","sourceRoot":"","sources":["../src/arca-mtxca.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAgC,MAAM,sBAAsB,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"arca-mtxca.d.ts","sourceRoot":"","sources":["../src/arca-mtxca.ts"],"names":[],"mappings":"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"}
|
package/dist/arca-mtxca.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ArcaSdkBase, ArcaServiceError, formatDate } from '@ramiidv/arca-common';
|
|
2
2
|
import { MTXCA_ENDPOINTS, MTXCA_SERVICE_ID } from './constants.js';
|
|
3
3
|
import { MtxcaClient } from './mtxca-client.js';
|
|
4
|
+
import { urlQR } from './qr.js';
|
|
4
5
|
import { buildComprobante } from './serialize.js';
|
|
5
6
|
import { reglasComprobanteCAE, reglasComprobanteCAEA } from './validation.js';
|
|
6
7
|
/** Error 1502 de consultarUltimoComprobanteAutorizado: no hay comprobantes para ese punto de venta y tipo. */
|
|
@@ -26,6 +27,7 @@ export class ArcaMtxca extends ArcaSdkBase {
|
|
|
26
27
|
this.client = new MtxcaClient({
|
|
27
28
|
endpoint: this.endpoint(MTXCA_ENDPOINTS, config.endpoints?.mtxca),
|
|
28
29
|
...this.transport,
|
|
30
|
+
onEvento: config.onEvento,
|
|
29
31
|
});
|
|
30
32
|
}
|
|
31
33
|
async auth(opts) {
|
|
@@ -97,6 +99,21 @@ export class ArcaMtxca extends ArcaSdkBase {
|
|
|
97
99
|
const auth = await this.auth(opts);
|
|
98
100
|
return this.client.consultarComprobante(auth, cbteTipo, ptoVta, cbteNro, this.callOptions(opts));
|
|
99
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* URL del código QR (RG 4892) de un comprobante autorizado con CAE o
|
|
104
|
+
* informado con CAEA, con la CUIT de la instancia como emisor.
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* ```ts
|
|
108
|
+
* const res = await mtxca.autorizar(req);
|
|
109
|
+
* if (res.resultado !== 'R') console.log(mtxca.urlQR(req, res));
|
|
110
|
+
* // Más tarde: mtxca.urlQR((await mtxca.consultarComprobante(1, 4000, 25)).comprobante)
|
|
111
|
+
* ```
|
|
112
|
+
* @throws ArcaValidationError si el comprobante fue rechazado o falta algún dato (ver `urlQR`).
|
|
113
|
+
*/
|
|
114
|
+
urlQR(comprobante, resultado, options) {
|
|
115
|
+
return urlQR(this.cuit, comprobante, resultado, options);
|
|
116
|
+
}
|
|
100
117
|
// =========================================================================
|
|
101
118
|
// CAEA
|
|
102
119
|
// =========================================================================
|
|
@@ -121,7 +138,8 @@ export class ArcaMtxca extends ArcaSdkBase {
|
|
|
121
138
|
}
|
|
122
139
|
/**
|
|
123
140
|
* Informa un comprobante emitido con CAEA (`informarComprobanteCAEA`). Valida
|
|
124
|
-
* el XSD y las reglas excluyentes
|
|
141
|
+
* el XSD y las reglas excluyentes del manual (ítems, condición de IVA del
|
|
142
|
+
* receptor, FCE, comprobantes asociados, compradores). Un rechazo devuelve
|
|
125
143
|
* `resultado: 'R'`. Ante `uncertain`, verificá con `consultarComprobante()`.
|
|
126
144
|
*/
|
|
127
145
|
async informarComprobanteCAEA(comprobante, opts) {
|
package/dist/arca-mtxca.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arca-mtxca.js","sourceRoot":"","sources":["../src/arca-mtxca.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEjF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAoB9E,8GAA8G;AAC9G,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,SAAU,SAAQ,WAAoB;IACjD,mDAAmD;IACnC,MAAM,CAAc;IAEpC,0DAA0D;IAC1D,YAAY,MAAuB;QACjC,KAAK,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,WAAW,CAAC;YAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC;YACjE,GAAG,IAAI,CAAC,SAAS;
|
|
1
|
+
{"version":3,"file":"arca-mtxca.js","sourceRoot":"","sources":["../src/arca-mtxca.ts"],"names":[],"mappings":"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"}
|
package/dist/format.d.ts
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Redondea a `decimals` decimales (mitad hacia afuera del cero), sin los
|
|
3
|
-
* errores de `toFixed` con binarios (ej. `1.005` → `1.01`).
|
|
4
|
-
*/
|
|
5
|
-
export declare function roundTo(value: number, decimals: number): number;
|
|
6
|
-
/** Redondea un importe a 2 decimales (`ImporteSubtotalSimpleType` / `ImporteTotalSimpleType`). */
|
|
1
|
+
/** Redondea un importe a 2 decimales, mitad al par (`8.565` → `8.56`, `8.575` → `8.58`). */
|
|
7
2
|
export declare function roundImporte(value: number): number;
|
|
8
|
-
/** Redondea cantidad, precio unitario o
|
|
3
|
+
/** Redondea cantidad, precio unitario, bonificación o cotización a 6 decimales, mitad al par. */
|
|
9
4
|
export declare function roundDecimal(value: number): number;
|
|
10
5
|
//# sourceMappingURL=format.d.ts.map
|
package/dist/format.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAKA,4FAA4F;AAC5F,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,iGAAiG;AACjG,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD"}
|
package/dist/format.js
CHANGED
|
@@ -1,22 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*/
|
|
5
|
-
export function roundTo(value, decimals) {
|
|
6
|
-
const abs = Math.abs(value);
|
|
7
|
-
const text = String(abs);
|
|
8
|
-
const rounded = text.includes('e')
|
|
9
|
-
? Math.round(abs * 10 ** decimals) / 10 ** decimals
|
|
10
|
-
: Number(`${Math.round(Number(`${text}e${decimals}`))}e-${decimals}`);
|
|
11
|
-
const result = value < 0 ? -rounded : rounded;
|
|
12
|
-
return result === 0 ? 0 : result; // sin -0
|
|
13
|
-
}
|
|
14
|
-
/** Redondea un importe a 2 decimales (`ImporteSubtotalSimpleType` / `ImporteTotalSimpleType`). */
|
|
1
|
+
import { roundHalfEven } from '@ramiidv/arca-common';
|
|
2
|
+
// El manual de WSMTXCA ("Aclaraciones y Definiciones", nota 4) indica Round
|
|
3
|
+
// Half Even para todos los valores decimales.
|
|
4
|
+
/** Redondea un importe a 2 decimales, mitad al par (`8.565` → `8.56`, `8.575` → `8.58`). */
|
|
15
5
|
export function roundImporte(value) {
|
|
16
|
-
return
|
|
6
|
+
return roundHalfEven(value, 2);
|
|
17
7
|
}
|
|
18
|
-
/** Redondea cantidad, precio unitario o
|
|
8
|
+
/** Redondea cantidad, precio unitario, bonificación o cotización a 6 decimales, mitad al par. */
|
|
19
9
|
export function roundDecimal(value) {
|
|
20
|
-
return
|
|
10
|
+
return roundHalfEven(value, 6);
|
|
21
11
|
}
|
|
22
12
|
//# sourceMappingURL=format.js.map
|
package/dist/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,4EAA4E;AAC5E,8CAA8C;AAE9C,4FAA4F;AAC5F,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACjC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,10 @@ export { WsaaClient, MemoryTicketStorage, FileTicketStorage } from '@ramiidv/arc
|
|
|
7
7
|
export type { WsaaClientConfig } from '@ramiidv/arca-common';
|
|
8
8
|
export type { ArcaMtxcaConfig, MtxcaAuth, FechaInput, MtxcaItem, MtxcaSubtotalIVA, MtxcaOtroTributo, MtxcaComprobanteAsociado, MtxcaPeriodo, MtxcaDatoAdicional, MtxcaComprador, MtxcaComprobanteBase, MtxcaComprobanteCAE, MtxcaComprobanteCAEA, AutorizarRequest, AutorizarOptions, CodigoDescripcion, CodigoDescripcionString, MtxcaResultado, MtxcaComprobanteCAEResponse, MtxcaAutorizarResult, MtxcaComprobanteCAEAResponse, MtxcaInformarCAEAResult, MtxcaCAEA, MtxcaCAEANoUtilizadoResult, MtxcaItemConsultado, MtxcaComprobanteConsultado, MtxcaConsultaComprobanteResult, PuntoVenta, ActividadVigente, CotizacionResult, AccessTicket, ArcaEvent, CallOptions, LegacyTlsMode, ServerStatus, TicketStorage, } from './types.js';
|
|
9
9
|
export { MTXCA_ENDPOINTS, MTXCA_NAMESPACE, MTXCA_SERVICE_ID, ALICUOTAS_IVA, CbteTipo, Concepto, CodigoCondicionIVA, UnidadMedidaEspecial, Moneda, } from './constants.js';
|
|
10
|
+
export { urlQR } from './qr.js';
|
|
11
|
+
export type { ComprobanteQR } from './qr.js';
|
|
12
|
+
export { QR_URL } from '@ramiidv/arca-common';
|
|
13
|
+
export type { QROptions } from '@ramiidv/arca-common';
|
|
10
14
|
export { validateComprobanteCAE, validateComprobanteCAEA } from './validation.js';
|
|
11
15
|
export { roundImporte, roundDecimal } from './format.js';
|
|
12
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,OAAO,EACL,SAAS,EACT,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGtF,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC1F,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,YAAY,EACV,eAAe,EACf,SAAS,EACT,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,cAAc,EACd,2BAA2B,EAC3B,oBAAoB,EACpB,4BAA4B,EAC5B,uBAAuB,EACvB,SAAS,EACT,0BAA0B,EAC1B,mBAAmB,EACnB,0BAA0B,EAC1B,8BAA8B,EAC9B,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,WAAW,EACX,aAAa,EACb,YAAY,EACZ,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,kBAAkB,EAClB,oBAAoB,EACpB,MAAM,GACP,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,OAAO,EACL,SAAS,EACT,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGtF,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC1F,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,YAAY,EACV,eAAe,EACf,SAAS,EACT,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,cAAc,EACd,2BAA2B,EAC3B,oBAAoB,EACpB,4BAA4B,EAC5B,uBAAuB,EACvB,SAAS,EACT,0BAA0B,EAC1B,mBAAmB,EACnB,0BAA0B,EAC1B,8BAA8B,EAC9B,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,WAAW,EACX,aAAa,EACb,YAAY,EACZ,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,kBAAkB,EAClB,oBAAoB,EACpB,MAAM,GACP,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -8,6 +8,9 @@ export { ArcaError, ArcaAuthError, ArcaSoapError, ArcaServiceError, ArcaValidati
|
|
|
8
8
|
export { WsaaClient, MemoryTicketStorage, FileTicketStorage } from '@ramiidv/arca-common';
|
|
9
9
|
// Constantes
|
|
10
10
|
export { MTXCA_ENDPOINTS, MTXCA_NAMESPACE, MTXCA_SERVICE_ID, ALICUOTAS_IVA, CbteTipo, Concepto, CodigoCondicionIVA, UnidadMedidaEspecial, Moneda, } from './constants.js';
|
|
11
|
+
// QR (RG 4892)
|
|
12
|
+
export { urlQR } from './qr.js';
|
|
13
|
+
export { QR_URL } from '@ramiidv/arca-common';
|
|
11
14
|
// Validación y redondeo
|
|
12
15
|
export { validateComprobanteCAE, validateComprobanteCAEA } from './validation.js';
|
|
13
16
|
export { roundImporte, roundDecimal } from './format.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,wBAAwB;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,sBAAsB;AACtB,OAAO,EACL,SAAS,EACT,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAG9B,wCAAwC;AACxC,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AA2C1F,aAAa;AACb,OAAO,EACL,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,kBAAkB,EAClB,oBAAoB,EACpB,MAAM,GACP,MAAM,gBAAgB,CAAC;AAExB,wBAAwB;AACxB,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,wBAAwB;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,sBAAsB;AACtB,OAAO,EACL,SAAS,EACT,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAG9B,wCAAwC;AACxC,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AA2C1F,aAAa;AACb,OAAO,EACL,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,kBAAkB,EAClB,oBAAoB,EACpB,MAAM,GACP,MAAM,gBAAgB,CAAC;AAExB,eAAe;AACf,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG9C,wBAAwB;AACxB,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/mtxca-client.d.ts
CHANGED
|
@@ -13,6 +13,11 @@ export interface MtxcaClientConfig {
|
|
|
13
13
|
onEvent?: (event: ArcaEvent) => void;
|
|
14
14
|
fetch?: typeof fetch;
|
|
15
15
|
legacyTls?: LegacyTlsMode;
|
|
16
|
+
/**
|
|
17
|
+
* Recibe el `evento` (aviso informativo de ARCA) de cualquier respuesta que
|
|
18
|
+
* lo traiga. Los errores del callback se ignoran.
|
|
19
|
+
*/
|
|
20
|
+
onEvento?: (evento: CodigoDescripcion, method: string) => void;
|
|
16
21
|
}
|
|
17
22
|
/**
|
|
18
23
|
* Cliente de bajo nivel de WSMTXCA: una función por operación del WSDL. No
|
|
@@ -25,8 +30,11 @@ export interface MtxcaClientConfig {
|
|
|
25
30
|
* `ArcaSoapError` tiene `uncertain: true`.
|
|
26
31
|
*/
|
|
27
32
|
export declare class MtxcaClient extends SoapServiceClient {
|
|
33
|
+
#private;
|
|
28
34
|
constructor(config: MtxcaClientConfig);
|
|
29
35
|
private call;
|
|
36
|
+
/** Pasa el `evento` de la respuesta a `onEvento` (un `evento` ilegible se ignora acá). */
|
|
37
|
+
private notificarEvento;
|
|
30
38
|
private static authRequest;
|
|
31
39
|
/** Llamada autenticada: `authRequest` primero, como en todos los request del XSD. */
|
|
32
40
|
private callAuth;
|