@ramiidv/arca-mtxca 0.2.0 → 0.4.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/llms.txt CHANGED
@@ -1,186 +1,109 @@
1
1
  # @ramiidv/arca-mtxca
2
2
 
3
- > TypeScript SDK para el web service WSMTXCA de ARCA (ex AFIP) - Facturacion electronica con detalle de articulos
3
+ > TypeScript SDK para el web service WSMTXCA de ARCA (ex AFIP): factura electrónica con detalle de ítems, con CAE y CAEA. ESM, Node >= 18.
4
4
 
5
- ## Instalacion
5
+ ## Instalación
6
6
 
7
- ```bash
8
7
  npm install @ramiidv/arca-mtxca
9
- ```
10
-
11
- Requisitos: Node.js >= 18 (fetch nativo). ESM only.
12
8
 
13
- ## Configuracion
9
+ ## Configuración
14
10
 
15
11
  ```typescript
16
12
  import { ArcaMtxca } from '@ramiidv/arca-mtxca';
17
13
 
18
14
  const mtxca = new ArcaMtxca({
19
- cert: string, // PEM X.509 certificate
20
- key: string, // PEM RSA private key
21
- cuit: number, // CUIT del contribuyente (ej: 20123456789)
22
- production?: boolean, // default: false (homologacion)
23
- timeout?: number, // default: 30000
24
- retries?: number, // default: 1
25
- retryDelayMs?: number, // default: 1000
15
+ cert: string, // PEM
16
+ key: string, // PEM
17
+ cuit: number | string, // CUIT representada; se valida el dígito verificador
18
+ production?: boolean, // default false (homologación)
19
+ endpoints?: { mtxca?: string, wsaa?: string }, // overrides (endpoint/wsaaEndpoint: deprecated)
20
+ wsaa?: WsaaClient, // WsaaClient compartido
21
+ signal?: AbortSignal, // cancela todas las llamadas
22
+ timeout?: number, retries?: number, retryDelayMs?: number,
23
+ ticketStorage?: TicketStorage, tokenTTLMinutes?: number,
24
+ clockOffsetMs?: number, autoClockSkew?: boolean, loginErrorCooldownMs?: number,
25
+ fetch?: typeof fetch, legacyTls?: 'auto' | 'never' | 'always',
26
26
  onEvent?: (event: ArcaEvent) => void,
27
27
  });
28
28
  ```
29
29
 
30
- ## WSMTXCA vs WSFEv1
31
-
32
- WSMTXCA: facturacion con detalle de articulos (arrayItems con codigo, descripcion, cantidad, precioUnitario, importeItem, codigoCondicionIVA, importeIVA por linea). Fechas en formato YYYY-MM-DD. Soporta tipos A, B, M. Protocolo SOAP Java.
33
- WSFEv1: facturacion sin detalle de items (solo subtotales globales de IVA). Fechas en formato YYYYMMDD. Soporta A, B, C, E, M, FCE. Protocolo SOAP .NET.
34
-
35
- ## Metodos principales
36
-
37
- ### autorizar(request: AutorizarRequest): Promise<MtxcaInvoiceResult>
38
- Autoriza un comprobante con detalle de articulos. Retorna CAE si aprobado. El request contiene ptoVta, cbteTipo, y un objeto invoice con concepto, docTipo, docNro, cbteFch (YYYY-MM-DD), importeTotal, items[], y campos opcionales (subtotalesIVA, otrosTributos, comprobanteAsociado, fechas de servicio).
39
-
40
- ### ultimoComprobante(ptoVta: number, cbteTipo: number): Promise<number>
41
- Ultimo numero de comprobante autorizado.
42
-
43
- ### siguienteComprobante(ptoVta: number, cbteTipo: number): Promise<number>
44
- Siguiente numero de comprobante (ultimo + 1).
45
-
46
- ### consultarComprobante(cbteTipo: number, ptoVta: number, cbteNro: number): Promise<MtxcaComprobante>
47
- Consulta un comprobante previamente autorizado, incluyendo detalle de items.
30
+ Endpoints: homologación https://fwshomo.afip.gov.ar/wsmtxca/services/MTXCAService, producción https://serviciosjava.afip.gob.ar/wsmtxca/services/MTXCAService. Namespace http://impl.service.wsmtxca.afip.gov.ar/service/, SOAPAction = namespace + operación, wrappers `{operacion}Request` / `{operacion}Response`.
48
31
 
49
- ### status(): Promise<ServerStatus>
50
- Health check. No requiere autenticacion.
32
+ Todos los métodos aceptan `opts?: { signal?: AbortSignal }` como último parámetro.
51
33
 
52
- ### Parametros
53
- - getTiposComprobante(): Promise<ParamItem[]>
54
- - getTiposDocumento(): Promise<ParamItem[]>
55
- - getAlicuotasIVA(): Promise<ParamItem[]>
56
- - getCondicionesIVA(): Promise<ParamItem[]>
57
- - getMonedas(): Promise<MonedaItem[]>
58
- - getUnidadesMedida(): Promise<UnidadMedidaItem[]>
59
- - getPuntosVenta(): Promise<PtoVentaItem[]>
60
- - getPuntosVentaCAE(): Promise<PtoVentaItem[]>
61
- - getPuntosVentaCAEA(): Promise<PtoVentaItem[]>
62
- - getCotizacionMoneda(monedaId: string): Promise<CotizacionResult>
34
+ ## Autorizar (CAE)
63
35
 
64
- ## Tipos principales
36
+ Los campos se llaman como en el XSD (ComprobanteType / ItemType). Fechas: Date o 'YYYY-MM-DD' / 'YYYYMMDD'.
65
37
 
66
38
  ```typescript
67
- interface MtxcaItem {
68
- codigo?: string;
69
- descripcion: string;
70
- cantidad: number;
71
- unidadMedida: number;
72
- precioUnitario: number;
73
- importeItem: number;
74
- codigoCondicionIVA: number;
75
- importeIVA: number;
76
- importeBonificacion?: number;
77
- }
78
-
79
- interface SubtotalIVA {
80
- codigo: number;
81
- baseImponible: number;
82
- importe: number;
83
- }
84
-
85
- interface MtxcaInvoice {
86
- concepto: number;
87
- docTipo: number;
88
- docNro: number;
89
- cbteFch: string; // YYYY-MM-DD
90
- items: MtxcaItem[];
91
- importeTotal: number;
92
- codigoMoneda?: string;
93
- cotizacionMoneda?: number;
94
- importeGravado?: number;
95
- importeNoGravado?: number;
96
- importeExento?: number;
97
- subtotalesIVA?: SubtotalIVA[];
98
- importeOtrosTributos?: number;
99
- otrosTributos?: MtxcaTributo[];
100
- comprobanteAsociado?: MtxcaComprobanteAsociado[];
101
- fechaDesde?: string;
102
- fechaHasta?: string;
103
- fechaVtoPago?: string;
104
- observaciones?: string;
105
- }
106
-
107
- interface AutorizarRequest {
108
- ptoVta: number;
109
- cbteTipo: number;
110
- invoice: MtxcaInvoice;
111
- }
112
-
113
- interface MtxcaInvoiceResult {
114
- resultado: string; // "A" or "R"
115
- cae?: string;
116
- caeFchVto?: string;
117
- cbteNro: number;
118
- observaciones: MtxcaObservacion[];
119
- errores: MtxcaObservacion[];
120
- }
121
-
122
- interface MtxcaComprobante {
123
- codigoTipoComprobante: number;
124
- numeroPuntoVenta: number;
125
- numeroComprobante: number;
126
- fechaEmision: string;
127
- codigoTipoDocumento: number;
128
- numeroDocumento: number;
129
- importeTotal: number;
130
- importeNoGravado: number;
131
- importeGravado: number;
132
- importeExento: number;
133
- importeOtrosTributos: number;
134
- importeSubtotal: number;
135
- codigoMoneda: string;
136
- cotizacionMoneda: number;
137
- resultado: string;
138
- codigoAutorizacion?: string;
139
- fechaVencimiento?: string;
140
- observaciones: MtxcaObservacion[];
141
- items: MtxcaItem[];
142
- }
143
-
144
- interface MtxcaObservacion { code: number; msg: string; }
145
- interface MtxcaTributo { codigoTributo: number; descripcion?: string; baseImponible: number; alicuota?: number; importe: number; }
146
- interface MtxcaComprobanteAsociado { codigoTipoComprobante: number; numeroPuntoVenta: number; numeroComprobante: number; cuit?: number; }
147
- interface ServerStatus { appserver: string; dbserver: string; authserver: string; }
148
- interface ParamItem { Id: number; Desc: string; FchDesde?: string; FchHasta?: string; }
149
- interface MonedaItem { Id: string; Desc: string; FchDesde?: string; FchHasta?: string; }
150
- interface UnidadMedidaItem { Id: number; Desc: string; FchDesde?: string; FchHasta?: string; }
151
- interface PtoVentaItem { Nro: number; EmisionTipo: string; Bloqueado: string; FchBaja: string; }
152
- interface CotizacionResult { monedaId: string; cotizacion: number; fechaCotizacion: string; }
39
+ const res = await mtxca.autorizar({
40
+ codigoTipoComprobante: 1, // CbteTipo.FACTURA_A
41
+ numeroPuntoVenta: 4000,
42
+ numeroComprobante?: number, // omitido => último + 1
43
+ fechaEmision?: Date | string,
44
+ codigoTipoDocumento: 80, numeroDocumento: '30000000007',
45
+ condicionIVAReceptor: 1, // RG 5616, ver getCondicionesIVAReceptor(tipo)
46
+ importeGravado: 100, importeNoGravado: 0, importeExento: 0,
47
+ importeSubtotal: 100, // obligatorio
48
+ importeOtrosTributos?: number,
49
+ importeTotal: 121, // obligatorio
50
+ codigoMoneda: 'PES', // obligatorio
51
+ cotizacionMoneda: 1,
52
+ codigoConcepto: 1, // 2/3 exigen fechaServicioDesde/Hasta y fechaVencimientoPago
53
+ items: [{
54
+ unidadesMtx: 1, codigoMtx: '7790001000012', // obligatorios salvo unidad 97/99
55
+ codigo?: string, descripcion: 'Producto',
56
+ cantidad: 1, codigoUnidadMedida: 7, precioUnitario: 100, // sin cantidad/precio en unidad 97/99
57
+ importeBonificacion?: number,
58
+ codigoCondicionIVA: 5,
59
+ importeIVA: 21, // obligatorio en 1,2,3,51,52,53; prohibido en 6,7,8
60
+ importeItem: 121, // con IVA; negativo en unidad 95/99
61
+ }],
62
+ subtotalesIVA: [{ codigo: 5, importe: 21 }], // uno por condición 4/5/6 presente
63
+ otrosTributos?: [{ codigo, descripcion?, baseImponible, importe }],
64
+ comprobantesAsociados?, periodoComprobantesAsociados?, datosAdicionales?, compradores?, actividades?: number[],
65
+ }, { validarImportes?: boolean /* default true */, signal? });
66
+
67
+ if (res.resultado === 'R') res.errores; // rechazo: NO lanza
68
+ else res.comprobante.cae, res.comprobante.fechaVencimientoCAE; // 'A' u 'O' (con observaciones)
153
69
  ```
154
70
 
155
- ## Errores
156
-
157
- 4-class hierarchy from @ramiidv/arca-common:
158
- - ArcaError: base class
159
- - ArcaAuthError: WSAA authentication failures
160
- - ArcaServiceError: business errors from ARCA (has errors: {code: number, msg: string}[])
161
- - ArcaSoapError: HTTP/transport errors (has statusCode?: number)
71
+ Reglas validadas localmente (manual WSMTXCA): importeItem = (precio*cantidad - bonif)*(1+alícuota) en clase A (precio sin IVA) y precio*cantidad - bonif en clase B (precio con IVA); importeGravado = Σ(importeItem - IVA) de condiciones 3-6; importeNoGravado = Σ condición 1; importeExento = Σ condición 2; importeSubtotal = gravado + no gravado + exento; importeTotal = subtotal + otros tributos + Σ subtotalesIVA = otros tributos + Σ importeItem. Margen: relativo <= 0.01% o absoluto <= 0.01 por elemento. Redondeo: importes 2 decimales, cantidad/precio/bonificación/cotización 6 (`roundImporte`, `roundDecimal`).
162
72
 
163
- Note: autorizar() may return resultado="R" with errores/observaciones without throwing. Always check result.resultado.
164
-
165
- ## Eventos
73
+ ## Errores
166
74
 
167
- Discriminated union types: auth:login, auth:cache-hit, request:start, request:end, request:retry, request:error.
75
+ - ArcaValidationError: datos inválidos (sin request). `details[]` con field/message.
76
+ - autorizar / autorizarAjusteIVA / informar*: un rechazo devuelve resultado 'R' con errores.
77
+ - Consultas: arrayErrores => ArcaServiceError (`errors[]` con code/msg).
78
+ - ArcaSoapError: Fault/HTTP/red/timeout. En emisiones nunca se reintenta; `uncertain: true` => pudo procesarse.
79
+ Recuperación: `ultimoComprobante(ptoVta, tipo)` y `consultarComprobante(tipo, ptoVta, nro)`; para solicitarCAEA, `consultarCAEAEntreFechas`.
80
+ - `ultimoComprobante` devuelve 0 solo ante el error 1502 (sin comprobantes).
81
+
82
+ ## Métodos
83
+
84
+ - autorizar(req, opts?) -> MtxcaAutorizarResult
85
+ - autorizarAjusteIVA(req, opts?) -> MtxcaAutorizarResult (solo validación XSD)
86
+ - ultimoComprobante(ptoVta, cbteTipo, opts?) -> number
87
+ - siguienteComprobante(ptoVta, cbteTipo, opts?) -> number
88
+ - consultarComprobante(cbteTipo, ptoVta, cbteNro, opts?) -> { comprobante, observaciones, evento? }
89
+ - solicitarCAEA(periodo AAAAMM, orden 1|2, opts?) -> MtxcaCAEA { caea, fechaDesde, fechaHasta, fechaTopeInforme, ... }
90
+ - consultarCAEA(caea, opts?) -> MtxcaCAEA
91
+ - consultarCAEAEntreFechas(desde, hasta, opts?) -> MtxcaCAEA[]
92
+ - informarComprobanteCAEA({ ...comprobante, numeroComprobante, caea, fechaHoraGen? }, opts?) -> MtxcaInformarCAEAResult
93
+ - informarAjusteIVACAEA(comp, opts?) -> MtxcaInformarCAEAResult
94
+ - informarCAEANoUtilizado(caea, opts?) / informarCAEANoUtilizadoPtoVta(caea, ptoVta, opts?) -> { resultado, fechaProceso?, caea?, errores }
95
+ - consultarPtosVtaCAEANoInformados(caea, opts?) -> PuntoVenta[]
96
+ - status() -> { appserver, dbserver, authserver } (dummy, sin auth)
97
+ - getTiposComprobante, getTiposDocumento, getAlicuotasIVA, getCondicionesIVA, getUnidadesMedida, getTiposTributo, getTiposDatosAdicionales -> { codigo: number, descripcion }[]
98
+ - getCondicionesIVAReceptor(cbteTipo) -> { codigo, descripcion }[]
99
+ - getMonedas() -> { codigo: string, descripcion }[]
100
+ - getCotizacionMoneda(codigo, fecha = hoy) -> { codigoMoneda, fechaCotizacion, cotizacion: number | null }
101
+ - getActividadesVigentes() -> { codigo, orden, descripcion }[]
102
+ - getPuntosVenta / getPuntosVentaCAE / getPuntosVentaCAEA -> { numeroPuntoVenta, bloqueado: 'S'|'N', fechaBaja? }[]
103
+ - clearAuthCache(): Promise<void>
104
+
105
+ Bajo nivel: `mtxca.client` / `new MtxcaClient({ endpoint })`, una función por operación del WSDL; recibe `MtxcaAuth { token, sign, cuitRepresentada }`.
168
106
 
169
107
  ## Enums
170
108
 
171
- - CbteTipo: FACTURA_A=1, NOTA_DEBITO_A=2, NOTA_CREDITO_A=3, FACTURA_B=6, NOTA_DEBITO_B=7, NOTA_CREDITO_B=8, FACTURA_M=51, NOTA_DEBITO_M=52, NOTA_CREDITO_M=53
172
- - Concepto: PRODUCTOS=1, SERVICIOS=2, PRODUCTOS_Y_SERVICIOS=3
173
- - CodigoCondicionIVA: NO_GRAVADO=1, EXENTO=2, IVA_0=3, IVA_10_5=4, IVA_21=5, IVA_27=6, GRAVADO=7, IVA_5=8, IVA_2_5=9
174
- - Moneda: PESOS="PES", DOLARES="DOL", EUROS="060", etc.
175
-
176
- ## Clientes de bajo nivel
177
-
178
- Accesibles como propiedades publicas: mtxca.wsaa (WsaaClient), mtxca.client (MtxcaClient).
179
-
180
- ## SOAP details
181
-
182
- WSAA service name: wsmtxca
183
- Production: https://serviciosjava.afip.gob.ar/wsmtxca/services/MTXCAService
184
- Homologation: https://fwshomo.afip.gov.ar/wsmtxca/services/MTXCAService
185
- Namespace: http://impl.service.wsmtxca.afip.gov.ar/
186
- Auth params use lowercase keys: token, sign, cuitRepresentada (wrapped in authRequest object).
109
+ CbteTipo (1,2,3,6,7,8,51,52,53,201,202,203,206,207,208), Concepto (1,2,3), CodigoCondicionIVA (1 no gravado, 2 exento, 3 0%, 4 10.5%, 5 21%, 6 27%), UnidadMedidaEspecial (95, 97 seña, 99 bonificación), Moneda (PES, DOL, 060).
package/package.json CHANGED
@@ -1,30 +1,34 @@
1
1
  {
2
2
  "name": "@ramiidv/arca-mtxca",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "TypeScript SDK para el web service WSMTXCA de ARCA (ex AFIP) - Facturacion electronica con detalle de articulos",
5
+ "author": "ramiidv",
6
+ "license": "MIT",
5
7
  "type": "module",
6
- "main": "dist/index.js",
7
- "types": "dist/index.d.ts",
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
8
10
  "exports": {
9
11
  ".": {
10
12
  "types": "./dist/index.d.ts",
11
13
  "default": "./dist/index.js"
12
- }
14
+ },
15
+ "./package.json": "./package.json"
13
16
  },
14
17
  "sideEffects": false,
15
18
  "files": [
16
19
  "dist",
17
- "llms.txt",
20
+ "README.md",
18
21
  "LICENSE",
19
- "README.md"
22
+ "CHANGELOG.md",
23
+ "llms.txt"
20
24
  ],
21
25
  "scripts": {
22
- "build": "tsc",
26
+ "build": "tsc -p tsconfig.build.json",
23
27
  "clean": "rm -rf dist",
24
28
  "typecheck": "tsc --noEmit",
25
29
  "test": "vitest run",
26
30
  "test:watch": "vitest",
27
- "prepublishOnly": "npm run build"
31
+ "lint:pkg": "publint --strict && attw --pack . --profile esm-only"
28
32
  },
29
33
  "keywords": [
30
34
  "arca",
@@ -42,28 +46,23 @@
42
46
  "soap",
43
47
  "invoice"
44
48
  ],
45
- "author": "ramiidv",
46
- "license": "MIT",
47
49
  "repository": {
48
50
  "type": "git",
49
- "url": "git+https://github.com/ramiidv/arca-mtxca.git"
51
+ "url": "git+https://github.com/ramiidv/arca-sdks.git",
52
+ "directory": "packages/mtxca"
50
53
  },
51
54
  "homepage": "https://arca-sdk.dev/mtxca",
52
55
  "bugs": {
53
- "url": "https://github.com/ramiidv/arca-mtxca/issues"
56
+ "url": "https://github.com/ramiidv/arca-sdks/issues"
54
57
  },
55
58
  "publishConfig": {
56
- "access": "public"
59
+ "access": "public",
60
+ "provenance": true
57
61
  },
58
62
  "engines": {
59
- "node": ">=18"
63
+ "node": ">=20.19.0"
60
64
  },
61
65
  "dependencies": {
62
- "@ramiidv/arca-common": "^0.1.0"
63
- },
64
- "devDependencies": {
65
- "@types/node": "^22.0.0",
66
- "typescript": "^5.7.0",
67
- "vitest": "^3.2.4"
66
+ "@ramiidv/arca-common": "^0.5.0"
68
67
  }
69
68
  }