@ramiidv/arca-fecred 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,173 +1,96 @@
1
1
  # @ramiidv/arca-fecred
2
2
 
3
- > TypeScript SDK para el web service WSFECRED de ARCA (ex AFIP) - Factura de Credito Electronica MiPyME (Ley 27440)
3
+ > TypeScript SDK para el web service WSFECRED (FECredService) de ARCA (ex AFIP) - Factura de Crédito Electrónica MiPyME (Ley 27.440). Cubre todas las operaciones del WSDL.
4
4
 
5
- ## Instalacion
5
+ ## Instalación
6
6
 
7
7
  ```bash
8
8
  npm install @ramiidv/arca-fecred
9
9
  ```
10
10
 
11
- Requisitos: Node.js >= 18 (fetch nativo). ESM only.
11
+ Node.js >= 18. ESM only. Depende de @ramiidv/arca-common ^0.4.0.
12
12
 
13
- ## Configuracion
13
+ ## Configuración
14
14
 
15
15
  ```typescript
16
- import { ArcaFecred } from '@ramiidv/arca-fecred';
16
+ import { ArcaFecred, FileTicketStorage } from '@ramiidv/arca-fecred';
17
17
 
18
18
  const fecred = new ArcaFecred({
19
- cert: string, // PEM X.509 certificate
20
- key: string, // PEM RSA private key
21
- cuit: string, // CUIT representada (ej: "20123456789")
22
- production?: boolean, // default: false (homologacion)
23
- timeout?: number, // default: 30000
24
- retries?: number, // default: 1
25
- retryDelayMs?: number, // default: 1000
26
- onEvent?: (event: ArcaEvent) => void,
19
+ cert: string, // PEM
20
+ key: string, // PEM
21
+ cuit: number | string, // CUIT representada (se valida dígito verificador)
22
+ production?: boolean, // default false (homologación)
23
+ timeout?: number, retries?: number, retryDelayMs?: number,
24
+ ticketStorage?: TicketStorage, // recomendado: new FileTicketStorage('./.arca-tickets')
25
+ fetch?: typeof fetch, legacyTls?: 'auto' | 'never' | 'always',
26
+ onEvent?: (e: ArcaEvent) => void,
27
+ wsaa?: WsaaClient, // compartir WSAA entre SDKs
28
+ endpoints?: { wsfecred?: string; wsaa?: string },
27
29
  });
28
30
  ```
29
31
 
30
- ## Metodos principales
32
+ Todos los métodos aceptan `opts?: { signal?: AbortSignal }` como último parámetro.
31
33
 
32
- ### consultarMontoObligadoRecepcion(cuit: string): Promise<MontoObligadoResult>
33
- Verifica si una CUIT esta obligada a recibir FCE. Retorna: { cuitConsultada, obligado: boolean, montoDesde?: number, raw }.
34
-
35
- ### consultarCtasCtes(params: ConsultarCtasCtesParams): Promise<CtaCte[]>
36
- Consulta cuentas corrientes de actividad FCE. Params: { rol: "Emisor"|"Receptor", cuitEmisor?, cuitReceptor?, fechaDesde, fechaHasta }. Retorna array de CtaCte.
37
-
38
- ### consultarComprobantes(params: ConsultarComprobantesParams): Promise<ComprobanteFecred[]>
39
- Busca comprobantes FCE. Params: { cuitEmisor?, cuitReceptor?, codCtaCte?, fechaDesde?, fechaHasta? }. Retorna array de ComprobanteFecred.
40
-
41
- ### aceptarFECred(codCtaCte: number): Promise<AceptarFecredResult>
42
- Acepta una FCE. Retorna: { codCtaCte, resultado, raw }.
43
-
44
- ### rechazarFECred(codCtaCte: number, codMotivoRechazo: number): Promise<RechazarFecredResult>
45
- Rechaza una FCE. Usar MotivoRechazo enum para codMotivoRechazo. Retorna: { codCtaCte, resultado, raw }.
46
-
47
- ### informarFacturaAceptadaCancelada(params: InformarCanceladaParams): Promise<InformarCanceladaResult>
48
- Informa que una FCE aceptada fue pagada. Params: { codCtaCte, codFormaCancelacion, observaciones? }. Usar FormaCancelacion enum.
49
-
50
- ### consultarTiposRetenciones(): Promise<TipoRetencionItem[]>
51
- Tipos de retenciones disponibles. Retorna: { codTipoRetencion, descTipoRetencion }[].
52
-
53
- ### consultarTiposFormasCancelacion(): Promise<TipoFormaCancelacionItem[]>
54
- Formas de cancelacion disponibles. Retorna: { codFormaCancelacion, descFormaCancelacion }[].
55
-
56
- ### consultarTiposAjustesOperacion(): Promise<TipoAjusteOperacionItem[]>
57
- Tipos de ajustes de operacion. Retorna: { codTipoAjuste, descTipoAjuste }[].
58
-
59
- ### consultarTiposMotivoRechazo(): Promise<TipoMotivoRechazoItem[]>
60
- Motivos de rechazo disponibles. Retorna: { codMotivoRechazo, descMotivoRechazo }[].
61
-
62
- ### status(): Promise<ServerStatus>
63
- Health check. No requiere autenticacion. Retorna: { appserver, dbserver, authserver }.
64
-
65
- ### clearAuthCache(): void
66
- Invalida el ticket de acceso cacheado para WSFECRED.
67
-
68
- ## Tipos principales
34
+ ## Tipos de entrada clave
69
35
 
70
36
  ```typescript
71
- interface CtaCte {
72
- codCtaCte: number;
73
- cuitEmisor: string;
74
- denominacionEmisor?: string;
75
- cuitReceptor: string;
76
- denominacionReceptor?: string;
77
- tipoComprobante?: number;
78
- puntoVenta?: number;
79
- nroComprobante?: number;
80
- codMoneda?: string;
81
- importeTotal?: number;
82
- saldo?: number;
83
- estado?: string;
84
- fechaEmision?: string;
85
- fechaVencimientoPago?: string;
86
- fechaVencimientoAceptacion?: string;
87
- cae?: string;
88
- }
89
-
90
- interface ComprobanteFecred {
91
- codCtaCte: number;
92
- tipoComprobante?: number;
93
- puntoVenta?: number;
94
- nroComprobante?: number;
95
- cuitEmisor: string;
96
- cuitReceptor: string;
97
- codMoneda?: string;
98
- importeTotal?: number;
99
- importeNeto?: number;
100
- saldo?: number;
101
- estado?: string;
102
- fechaEmision?: string;
103
- fechaVencimientoPago?: string;
104
- cae?: string;
105
- retenciones?: RetencionFecred[];
106
- }
107
-
108
- interface MontoObligadoResult {
109
- cuitConsultada: string;
110
- obligado: boolean;
111
- montoDesde?: number;
112
- raw: Record<string, unknown>;
113
- }
114
-
115
- interface ServerStatus {
116
- appserver: string;
117
- dbserver: string;
118
- authserver: string;
119
- }
37
+ type IdCtaCteInput = { codCtaCte: number | string } | { idFactura: IdComprobanteInput };
38
+ interface IdComprobanteInput { cuitEmisor: number | string; codTipoCmp: number; ptoVta: number; nroCmp: number }
39
+ interface FiltroFecha { tipo: 'Emision' | 'PuestaDispo' | 'VenPago' | 'VenAcep' | 'Acep' | 'InfoAgDptoCltv'; desde: Date | string; hasta: Date | string }
40
+ interface MotivoRechazo { codMotivo: number; descMotivo: string; justificacion: string } // textos 3..250
120
41
  ```
121
42
 
122
- ## Errores
43
+ Fechas: `Date`, `'YYYY-MM-DD'` o `'YYYYMMDD'`. Importes: number finito, se redondean a 2 decimales.
123
44
 
124
- 3-class hierarchy from @ramiidv/arca-common:
125
- - ArcaError: base class
126
- - ArcaAuthError: WSAA authentication failures
127
- - ArcaServiceError: business errors from WSFECRED (has errors: {code: number, msg: string}[])
128
- - ArcaSoapError: HTTP/transport errors (has statusCode?: number)
45
+ ## Consultas
129
46
 
130
47
  ```typescript
131
- import { ArcaAuthError, ArcaServiceError, ArcaSoapError } from '@ramiidv/arca-fecred';
132
-
133
- try {
134
- await fecred.aceptarFECred(codCtaCte);
135
- } catch (error) {
136
- if (error instanceof ArcaAuthError) { /* auth failure */ }
137
- if (error instanceof ArcaServiceError) { /* business error, check error.errors */ }
138
- if (error instanceof ArcaSoapError) { /* HTTP/network error, check error.statusCode */ }
139
- }
48
+ await fecred.status(); // dummy → { appserver, dbserver, authserver }
49
+ await fecred.consultarMontoObligadoRecepcion({ cuitConsultada, fechaEmision }); // { obligado: boolean, montoDesde?, observaciones }
50
+ await fecred.consultarObligadoRecepcion(cuit); // { obligado: boolean, desde?, observaciones }
51
+ await fecred.consultarCtasCtes({ rol: 'Emisor' | 'Receptor', cuitContraparte?, fecha?, estadoCtaCte?, nroPagina?, opcionTransferencia? });
52
+ // → { ctasCtes: { codCtaCte, estadoCtaCte: { estado, fechaHoraEstado }, idFacturaCredito, importeTotalFC, saldo, saldoAceptado?, codMoneda, opcionTransferencia }[], nroPagina?, hayMas? }
53
+ await fecred.consultarCtaCte(idCtaCte); // { ctaCte: CuentaCorriente }
54
+ await fecred.consultarComprobantes({ rol, cuitContraparte?, codTipoCmp?, estadoCmp?, fecha?, codCtaCte?, estadoCtaCte?, nroPagina? });
55
+ // → { comprobantes: Comprobante[] (cuitEmisor, razonSocialEmi, codTipoCmp, ptoVta, nroCmp, codAutorizacion, fechaEmision, fechaVenPago?, importeTotal, estado: { estado, fechaHoraEstado }, ...), hayMas? }
56
+ await fecred.consultarHistorialEstadosComprobante(idComprobante);
57
+ await fecred.consultarHistorialEstadosCtaCte(idCtaCte);
58
+ await fecred.obtenerRemitos(idComprobante);
59
+ await fecred.consultarCuentasEnAgtDptoCltv();
60
+ await fecred.consultarFacturasAgtDptoCltv({ idCtaCte?, fecha? });
61
+ await fecred.consultarTiposRetenciones(); // { codigoJurisdiccion, descripcionJurisdiccion, porcentajeRetencion }[]
62
+ await fecred.consultarTiposFormasCancelacion(); // { codigo, descripcion }[]
63
+ await fecred.consultarTiposMotivosRechazo(); // { codigo, descripcion }[]
64
+ await fecred.consultarTiposAjustesOperacion(); // { codigo, descripcion }[]
140
65
  ```
141
66
 
142
- ## Eventos
143
-
144
- Discriminated union types: auth:login, auth:cache-hit, request:start, request:end, request:retry, request:error.
145
-
146
- ## Enums
147
-
148
- - RolCtaCte (EMISOR="Emisor", RECEPTOR="Receptor")
149
- - EstadoCtaCte (PENDIENTE_ACEPTACION, ACEPTADA, RECHAZADA, CANCELADA, ANULADA)
150
- - MotivoRechazo (NOTA_CREDITO_DEBITO=1, CUIT_INCORRECTO=2, FECHA_INCORRECTA=3, CBU_INCORRECTO=4, OTROS=5)
151
- - FormaCancelacion (ACREDITACION_CUENTA=1, TRANSFERENCIA=2, CHEQUE=3, PAGO_ELECTRONICO=4, COMPENSACION=5, ENDOSO=6, OTRO=99)
152
- - TipoAjusteOperacion (NOTA_CREDITO=1, NOTA_DEBITO=2)
153
- - TipoRetencion (GANANCIAS=1, IVA=2, SUSS=3, INGRESOS_BRUTOS=4, OTRAS=99)
67
+ ## Operaciones (no idempotentes, nunca se reintentan)
154
68
 
155
- ## Clientes de bajo nivel
156
-
157
- Accesibles como propiedades publicas: fecred.wsaa, fecred.fecred.
69
+ ```typescript
70
+ await fecred.aceptarFECred({
71
+ idCtaCte, saldoAceptado, codMoneda, cotizacionMonedaUlt,
72
+ confirmarNotasDC?, formasCancelacion?, retenciones?, ajustesOperacion?, tipoCancelacion?: 'PAR' | 'TOT',
73
+ importeCancelado?, importeTotalRetPesos?, importeEmbargoPesos?, informaCBU?: boolean, cbuComprador?,
74
+ });
75
+ await fecred.rechazarFECred({ idCtaCte, motivos: MotivoRechazo[] });
76
+ await fecred.informarCancelacionTotalFECred({ idCtaCte, formasCancelacion: { codigo, descripcion }[], importeCancelacion });
77
+ await fecred.rechazarNotaDC({ idComprobante, motivos });
78
+ await fecred.modificarOpcionTransferencia({ idCtaCte, opcionTransferencia: 'SCA' | 'ADC' });
79
+ await fecred.informarFacturaAgtDptoCltv({ idCtaCte, ctaAgente: { cuitAgente, idCuenta, razonSocialAgente?, denominacion? } });
80
+ // → { resultado: 'A' | 'O', idCtaCte, evento?, observaciones }
81
+ ```
158
82
 
159
- ## SOAP details
83
+ ## Errores
160
84
 
161
- - WSAA service ID: "wsfecred"
162
- - Production endpoint: https://serviciosjava.afip.gob.ar/wsfecred/FECredService
163
- - Homologation endpoint: https://fwshomo.afip.gob.ar/wsfecred/FECredService
164
- - Namespace: https://serviciosjava.afip.gob.ar/wsfecred/FECredService?wsdl
165
- - Uses ser: prefix (Java-based, like padron services)
166
- - Auth passed as authRequest: { Token, Sign, Cuit }
85
+ - `ArcaValidationError`: parámetros inválidos (antes de pedir ticket o llamar a ARCA). `field`, `details`.
86
+ - `ArcaServiceError`: `arrayErrores` / `arrayErroresFormato` o `resultado = 'R'`. `errors: { code, msg, rawCode? }[]`.
87
+ - `ArcaSoapError`: HTTP / timeout / SOAP Fault / respuesta sin campo obligatorio. `uncertain = true` en una operación: pudo haberse registrado → verificar con `consultarCtaCte` o `consultarHistorialEstadosCtaCte` antes de reintentar.
88
+ - `ArcaAuthError`, `ArcaTicketVigenteError`: WSAA.
167
89
 
168
- ## Utilidades re-exportadas de arca-common
90
+ ## Notas
169
91
 
170
- - ensureArray<T>(value): T[] - normaliza single/array SOAP responses
171
- - parseXml(xml): Record<string, unknown> - parse XML
172
- - buildXml(obj): string - build XML from object
173
- - checkServiceErrors(result, serviceName): void - throws ArcaServiceError if errors found
92
+ - Los códigos de formas de cancelación, motivos de rechazo, ajustes y retenciones salen de `consultarTipos*()`; no hay enums.
93
+ - Enums del XSD (objeto + tipo literal): `RolCtaCte`, `EstadoCtaCte`, `EstadoComprobante`, `TipoFechaFiltro`, `OpcionTransferencia`, `TipoCancelacion`, `TipoAceptacion`, `Resultado`.
94
+ - `codCtaCte`, CUITs y `codAutorizacion` se devuelven como string; importes como number; S/N como boolean.
95
+ - Cliente de bajo nivel: `fecred.fecred` (`FecredClient`), con `{ token, sign, cuitRepresentada }` como primer parámetro.
96
+ - Endpoints: homologación `https://fwshomo.afip.gob.ar/wsfecred/FECredService`, producción `https://serviciosjava.afip.gob.ar/wsfecred/FECredService`. Namespace `http://ar.gob.afip.wsfecred/FECredService/`; SOAPAction = namespace + operación.
package/package.json CHANGED
@@ -1,30 +1,34 @@
1
1
  {
2
2
  "name": "@ramiidv/arca-fecred",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "TypeScript SDK para el web service WSFECRED de ARCA (ex AFIP) - Factura de Credito Electronica MiPyME",
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
- "import": "./dist/index.js",
12
13
  "default": "./dist/index.js"
13
- }
14
+ },
15
+ "./package.json": "./package.json"
14
16
  },
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 clean && npm run build"
31
+ "lint:pkg": "publint --strict && attw --pack . --profile esm-only"
28
32
  },
29
33
  "keywords": [
30
34
  "arca",
@@ -38,28 +42,23 @@
38
42
  "typescript",
39
43
  "soap"
40
44
  ],
41
- "author": "ramiidv",
42
- "license": "MIT",
43
45
  "repository": {
44
46
  "type": "git",
45
- "url": "git+https://github.com/ramiidv/arca-fecred.git"
47
+ "url": "git+https://github.com/ramiidv/arca-sdks.git",
48
+ "directory": "packages/fecred"
46
49
  },
47
50
  "homepage": "https://arca-sdk.dev/fecred",
48
51
  "bugs": {
49
- "url": "https://github.com/ramiidv/arca-fecred/issues"
52
+ "url": "https://github.com/ramiidv/arca-sdks/issues"
50
53
  },
51
54
  "publishConfig": {
52
- "access": "public"
55
+ "access": "public",
56
+ "provenance": true
53
57
  },
54
58
  "engines": {
55
- "node": ">=18"
59
+ "node": ">=20.19.0"
56
60
  },
57
61
  "dependencies": {
58
- "@ramiidv/arca-common": "^0.1.0"
59
- },
60
- "devDependencies": {
61
- "@types/node": "^22.0.0",
62
- "typescript": "^5.7.0",
63
- "vitest": "^3.2.4"
62
+ "@ramiidv/arca-common": "^0.5.0"
64
63
  }
65
64
  }
@@ -1,26 +0,0 @@
1
- import type { ConsultarCtasCtesParams } from './types.js';
2
- /**
3
- * Validates a CUIT value. Must be a positive number or a non-empty numeric string.
4
- * @param cuit - Value to validate
5
- * @param fieldName - Field name for error messages (default: "cuit")
6
- * @returns The CUIT as a string
7
- * @throws ArcaValidationError if the CUIT is invalid
8
- */
9
- export declare function validateCuit(cuit: unknown, fieldName?: string): string;
10
- /**
11
- * Validates a CodCtaCte (current account code).
12
- * Must be a non-empty string or a positive number.
13
- * @param cod - Value to validate
14
- * @returns The code as a number
15
- * @throws ArcaValidationError if the code is invalid
16
- */
17
- export declare function validateCodCtaCte(cod: unknown): number;
18
- /**
19
- * Validates parameters for consultarCtasCtes.
20
- * Requires rol, fechaDesde, fechaHasta, and at least one of CUITEmisor or CUITReceptor
21
- * (depending on the role).
22
- * @param params - Parameters to validate
23
- * @throws ArcaValidationError if required fields are missing or invalid
24
- */
25
- export declare function validateConsultaCtasCtes(params: ConsultarCtasCtesParams): void;
26
- //# sourceMappingURL=validation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAM1D;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,SAAS,GAAG,MAAM,CAsCtE;AAMD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAqCtD;AAMD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI,CA8E9E"}
@@ -1,161 +0,0 @@
1
- import { ArcaValidationError } from '@ramiidv/arca-common';
2
- // ---------------------------------------------------------------------------
3
- // CUIT validation
4
- // ---------------------------------------------------------------------------
5
- /**
6
- * Validates a CUIT value. Must be a positive number or a non-empty numeric string.
7
- * @param cuit - Value to validate
8
- * @param fieldName - Field name for error messages (default: "cuit")
9
- * @returns The CUIT as a string
10
- * @throws ArcaValidationError if the CUIT is invalid
11
- */
12
- export function validateCuit(cuit, fieldName = 'cuit') {
13
- if (typeof cuit === 'number') {
14
- if (!Number.isFinite(cuit) || cuit <= 0 || !Number.isInteger(cuit)) {
15
- throw new ArcaValidationError(`${fieldName} debe ser un numero entero positivo.`, [{ field: fieldName, message: 'Debe ser un numero entero positivo', value: cuit }], fieldName);
16
- }
17
- return String(cuit);
18
- }
19
- if (typeof cuit === 'string') {
20
- const trimmed = cuit.trim();
21
- if (trimmed.length === 0) {
22
- throw new ArcaValidationError(`${fieldName} no puede estar vacio.`, [{ field: fieldName, message: 'No puede estar vacio', value: cuit }], fieldName);
23
- }
24
- // Allow formats: 20123456789 or 20-12345678-9
25
- const normalized = trimmed.replace(/-/g, '');
26
- if (!/^\d+$/.test(normalized)) {
27
- throw new ArcaValidationError(`${fieldName} debe contener solo digitos (opcionalmente separados por guiones).`, [{ field: fieldName, message: 'Debe contener solo digitos', value: cuit }], fieldName);
28
- }
29
- return trimmed;
30
- }
31
- throw new ArcaValidationError(`${fieldName} debe ser un numero o string.`, [{ field: fieldName, message: 'Debe ser un numero o string', value: cuit }], fieldName);
32
- }
33
- // ---------------------------------------------------------------------------
34
- // CodCtaCte validation
35
- // ---------------------------------------------------------------------------
36
- /**
37
- * Validates a CodCtaCte (current account code).
38
- * Must be a non-empty string or a positive number.
39
- * @param cod - Value to validate
40
- * @returns The code as a number
41
- * @throws ArcaValidationError if the code is invalid
42
- */
43
- export function validateCodCtaCte(cod) {
44
- if (typeof cod === 'number') {
45
- if (!Number.isFinite(cod) || cod <= 0 || !Number.isInteger(cod)) {
46
- throw new ArcaValidationError('codCtaCte debe ser un numero entero positivo.', [{ field: 'codCtaCte', message: 'Debe ser un numero entero positivo', value: cod }], 'codCtaCte');
47
- }
48
- return cod;
49
- }
50
- if (typeof cod === 'string') {
51
- const trimmed = cod.trim();
52
- if (trimmed.length === 0) {
53
- throw new ArcaValidationError('codCtaCte no puede estar vacio.', [{ field: 'codCtaCte', message: 'No puede estar vacio', value: cod }], 'codCtaCte');
54
- }
55
- const num = Number(trimmed);
56
- if (!Number.isFinite(num) || num <= 0 || !Number.isInteger(num)) {
57
- throw new ArcaValidationError('codCtaCte debe ser un numero entero positivo.', [{ field: 'codCtaCte', message: 'Debe ser un numero entero positivo', value: cod }], 'codCtaCte');
58
- }
59
- return num;
60
- }
61
- throw new ArcaValidationError('codCtaCte es requerido.', [{ field: 'codCtaCte', message: 'Es requerido', value: cod }], 'codCtaCte');
62
- }
63
- // ---------------------------------------------------------------------------
64
- // ConsultarCtasCtes params validation
65
- // ---------------------------------------------------------------------------
66
- /**
67
- * Validates parameters for consultarCtasCtes.
68
- * Requires rol, fechaDesde, fechaHasta, and at least one of CUITEmisor or CUITReceptor
69
- * (depending on the role).
70
- * @param params - Parameters to validate
71
- * @throws ArcaValidationError if required fields are missing or invalid
72
- */
73
- export function validateConsultaCtasCtes(params) {
74
- const errors = [];
75
- // Validate rol
76
- if (!params.rol || typeof params.rol !== 'string' || params.rol.trim().length === 0) {
77
- errors.push({
78
- field: 'rol',
79
- message: 'rol es requerido (debe ser "Emisor" o "Receptor")',
80
- value: params.rol,
81
- });
82
- }
83
- else {
84
- const rolNorm = params.rol.trim();
85
- if (rolNorm !== 'Emisor' && rolNorm !== 'Receptor') {
86
- errors.push({
87
- field: 'rol',
88
- message: 'rol debe ser "Emisor" o "Receptor"',
89
- value: params.rol,
90
- });
91
- }
92
- }
93
- // Validate fechaDesde
94
- if (!params.fechaDesde || typeof params.fechaDesde !== 'string' || params.fechaDesde.trim().length === 0) {
95
- errors.push({
96
- field: 'fechaDesde',
97
- message: 'fechaDesde es requerido',
98
- value: params.fechaDesde,
99
- });
100
- }
101
- else if (!isValidDateString(params.fechaDesde)) {
102
- errors.push({
103
- field: 'fechaDesde',
104
- message: 'fechaDesde debe ser una fecha valida (YYYY-MM-DD)',
105
- value: params.fechaDesde,
106
- });
107
- }
108
- // Validate fechaHasta
109
- if (!params.fechaHasta || typeof params.fechaHasta !== 'string' || params.fechaHasta.trim().length === 0) {
110
- errors.push({
111
- field: 'fechaHasta',
112
- message: 'fechaHasta es requerido',
113
- value: params.fechaHasta,
114
- });
115
- }
116
- else if (!isValidDateString(params.fechaHasta)) {
117
- errors.push({
118
- field: 'fechaHasta',
119
- message: 'fechaHasta debe ser una fecha valida (YYYY-MM-DD)',
120
- value: params.fechaHasta,
121
- });
122
- }
123
- // Validate date range
124
- if (params.fechaDesde && params.fechaHasta && isValidDateString(params.fechaDesde) && isValidDateString(params.fechaHasta)) {
125
- if (params.fechaDesde > params.fechaHasta) {
126
- errors.push({
127
- field: 'fechaHasta',
128
- message: 'fechaHasta debe ser igual o posterior a fechaDesde',
129
- value: { fechaDesde: params.fechaDesde, fechaHasta: params.fechaHasta },
130
- });
131
- }
132
- }
133
- // Validate that at least one CUIT is present
134
- const hasCuitEmisor = params.cuitEmisor != null && String(params.cuitEmisor).trim().length > 0;
135
- const hasCuitReceptor = params.cuitReceptor != null && String(params.cuitReceptor).trim().length > 0;
136
- if (!hasCuitEmisor && !hasCuitReceptor) {
137
- // While the WS may accept queries without CUITs in some cases,
138
- // at least one is typically needed depending on the role
139
- // We allow it but do not error - the service will return its own error if needed
140
- }
141
- if (errors.length > 0) {
142
- throw new ArcaValidationError(`Parametros de consultarCtasCtes invalidos: ${errors.map((e) => e.message).join('; ')}`, errors);
143
- }
144
- }
145
- // ---------------------------------------------------------------------------
146
- // Helpers
147
- // ---------------------------------------------------------------------------
148
- /**
149
- * Checks if a string is a valid YYYY-MM-DD date.
150
- */
151
- function isValidDateString(dateStr) {
152
- if (!/^\d{4}-\d{2}-\d{2}$/.test(dateStr))
153
- return false;
154
- const date = new Date(dateStr + 'T00:00:00Z');
155
- if (isNaN(date.getTime()))
156
- return false;
157
- // Verify the parsed date matches input (catches e.g. 2026-02-30)
158
- const [y, m, d] = dateStr.split('-').map(Number);
159
- return date.getUTCFullYear() === y && date.getUTCMonth() + 1 === m && date.getUTCDate() === d;
160
- }
161
- //# sourceMappingURL=validation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAI3D,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,IAAa,EAAE,SAAS,GAAG,MAAM;IAC5D,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,mBAAmB,CAC3B,GAAG,SAAS,sCAAsC,EAClD,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,oCAAoC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAClF,SAAS,CACV,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,mBAAmB,CAC3B,GAAG,SAAS,wBAAwB,EACpC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,sBAAsB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACpE,SAAS,CACV,CAAC;QACJ,CAAC;QACD,8CAA8C;QAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,mBAAmB,CAC3B,GAAG,SAAS,oEAAoE,EAChF,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,4BAA4B,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAC1E,SAAS,CACV,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,mBAAmB,CAC3B,GAAG,SAAS,+BAA+B,EAC3C,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,6BAA6B,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAC3E,SAAS,CACV,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,mBAAmB,CAC3B,+CAA+C,EAC/C,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,oCAAoC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EACnF,WAAW,CACZ,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,mBAAmB,CAC3B,iCAAiC,EACjC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,sBAAsB,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EACrE,WAAW,CACZ,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,mBAAmB,CAC3B,+CAA+C,EAC/C,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,oCAAoC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EACnF,WAAW,CACZ,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,IAAI,mBAAmB,CAC3B,yBAAyB,EACzB,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAC7D,WAAW,CACZ,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,sCAAsC;AACtC,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAA+B;IACtE,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,eAAe;IACf,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpF,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,mDAAmD;YAC5D,KAAK,EAAE,MAAM,CAAC,GAAG;SAClB,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,oCAAoC;gBAC7C,KAAK,EAAE,MAAM,CAAC,GAAG;aAClB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzG,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE,yBAAyB;YAClC,KAAK,EAAE,MAAM,CAAC,UAAU;SACzB,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE,mDAAmD;YAC5D,KAAK,EAAE,MAAM,CAAC,UAAU;SACzB,CAAC,CAAC;IACL,CAAC;IAED,sBAAsB;IACtB,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzG,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE,yBAAyB;YAClC,KAAK,EAAE,MAAM,CAAC,UAAU;SACzB,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE,mDAAmD;YAC5D,KAAK,EAAE,MAAM,CAAC,UAAU;SACzB,CAAC,CAAC;IACL,CAAC;IAED,sBAAsB;IACtB,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,IAAI,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3H,IAAI,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,YAAY;gBACnB,OAAO,EAAE,oDAAoD;gBAC7D,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE;aACxE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/F,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAErG,IAAI,CAAC,aAAa,IAAI,CAAC,eAAe,EAAE,CAAC;QACvC,+DAA+D;QAC/D,yDAAyD;QACzD,iFAAiF;IACnF,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,mBAAmB,CAC3B,8CAA8C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACvF,MAAM,CACP,CAAC;IACJ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;GAEG;AACH,SAAS,iBAAiB,CAAC,OAAe;IACxC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACvD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC;IAC9C,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,iEAAiE;IACjE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAChG,CAAC"}