@ramiidv/arca-padron 0.6.0 → 0.7.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.
Files changed (48) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +333 -209
  3. package/dist/arca-padron.d.ts +29 -19
  4. package/dist/arca-padron.d.ts.map +1 -1
  5. package/dist/arca-padron.js +25 -15
  6. package/dist/arca-padron.js.map +1 -1
  7. package/dist/base-client.d.ts +16 -5
  8. package/dist/base-client.d.ts.map +1 -1
  9. package/dist/base-client.js +12 -1
  10. package/dist/base-client.js.map +1 -1
  11. package/dist/condicion-iva.d.ts +8 -2
  12. package/dist/condicion-iva.d.ts.map +1 -1
  13. package/dist/condicion-iva.js +38 -19
  14. package/dist/condicion-iva.js.map +1 -1
  15. package/dist/constants.d.ts +15 -0
  16. package/dist/constants.d.ts.map +1 -1
  17. package/dist/constants.js +15 -0
  18. package/dist/constants.js.map +1 -1
  19. package/dist/index.d.ts +8 -2
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +8 -2
  22. package/dist/index.js.map +1 -1
  23. package/dist/mapping.d.ts +23 -3
  24. package/dist/mapping.d.ts.map +1 -1
  25. package/dist/mapping.js +63 -7
  26. package/dist/mapping.js.map +1 -1
  27. package/dist/padron-a10.d.ts +2 -2
  28. package/dist/padron-a10.js +2 -2
  29. package/dist/padron-a100.d.ts +5 -4
  30. package/dist/padron-a100.d.ts.map +1 -1
  31. package/dist/padron-a100.js +8 -5
  32. package/dist/padron-a100.js.map +1 -1
  33. package/dist/padron-a13.d.ts +6 -5
  34. package/dist/padron-a13.d.ts.map +1 -1
  35. package/dist/padron-a13.js +8 -5
  36. package/dist/padron-a13.js.map +1 -1
  37. package/dist/padron-a4.d.ts +2 -2
  38. package/dist/padron-a4.d.ts.map +1 -1
  39. package/dist/padron-a4.js +5 -30
  40. package/dist/padron-a4.js.map +1 -1
  41. package/dist/padron-a5.d.ts +27 -11
  42. package/dist/padron-a5.d.ts.map +1 -1
  43. package/dist/padron-a5.js +105 -34
  44. package/dist/padron-a5.js.map +1 -1
  45. package/dist/types.d.ts +60 -5
  46. package/dist/types.d.ts.map +1 -1
  47. package/llms.txt +96 -66
  48. package/package.json +2 -2
package/README.md CHANGED
@@ -1,133 +1,170 @@
1
1
  # @ramiidv/arca-padron
2
2
 
3
- SDK de TypeScript para los web services de Padron de ARCA (ex AFIP): Constancia de Inscripcion
4
- (`ws_sr_constancia_inscripcion`, ex A5), A4 (datos completos), A10 y A13 (datos basicos) y A100
5
- (tablas de parametros). Incluye `condicionIvaDesdePadron` para obtener la condicion frente al IVA
6
- que pide la factura electronica (`CondicionIVAReceptorId`).
3
+ [![npm](https://img.shields.io/npm/v/@ramiidv/arca-padron)](https://www.npmjs.com/package/@ramiidv/arca-padron)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
5
+ [![Node >= 20.19](https://img.shields.io/badge/node-%3E%3D20.19-brightgreen)](https://nodejs.org)
7
6
 
8
- ## Caracteristicas
7
+ SDK en TypeScript para los web services de **Padrón** de **ARCA** (ex AFIP): Constancia de Inscripción
8
+ (`ws_sr_constancia_inscripcion`, ex A5), A4 (datos completos), A10 y A13 (datos básicos) y A100
9
+ (tablas de parámetros). Incluye `condicionIvaDesdePadron` para obtener la condición frente al IVA que
10
+ pide la factura electrónica (`CondicionIVAReceptorId`, RG 5616).
9
11
 
10
- - Unica dependencia: `@ramiidv/arca-common` (WSAA, SOAP, validadores); usa `fetch` nativo (Node 18+)
11
- - ESM y CommonJS (funciona con `import` y con `require`, incluido TypeScript con `"module": "CommonJS"`)
12
- - TypeScript estricto con tipos completos
13
- - Cache automatico de tokens WSAA, con persistencia opcional (`ticketStorage`) y ajuste de reloj
14
- - Cancelacion con `AbortSignal` (global o por llamada)
15
- - Reintentos con backoff exponencial ante errores transitorios (nunca ante un SOAP Fault)
16
- - Errores de negocio tipados: `ArcaPadronServiceError` con `reason` (`inexistente`, `inactiva`, ...)
17
- - Validacion local de CUIT (digito verificador) antes de llamar a ARCA
18
- - Sistema de eventos para monitoreo
12
+ - Única dependencia: `@ramiidv/arca-common` (WSAA, SOAP, validadores); usa `fetch` nativo.
13
+ - Caché de tickets WSAA con persistencia opcional (`ticketStorage`) y ajuste de reloj.
14
+ - Cancelación con `AbortSignal` (global o por llamada).
15
+ - Reintentos con backoff exponencial ante errores transitorios (nunca ante un SOAP Fault): todas las
16
+ operaciones son consultas.
17
+ - Errores de negocio tipados: `ArcaPadronServiceError` con `reason` (`inexistente`, `inactiva`...).
18
+ - Validación local de CUIT (dígito verificador) antes de llamar a ARCA.
19
19
 
20
- ## Instalacion
20
+ Fuentes: WSDL oficiales (`wsdl/`), manual de
21
+ [`ws_sr_constancia_inscripcion` v4.1](https://www.afip.gob.ar/ws/WSCI/manual_ws_sr_ws_constancia_inscripcion.pdf),
22
+ manuales de A4 v1.3, A13 v1.4 y A100 v2.1.
23
+
24
+ ## Instalación
21
25
 
22
26
  ```bash
23
27
  npm install @ramiidv/arca-padron
24
28
  ```
25
29
 
26
- ## Inicio rapido
30
+ ## Requisitos
31
+
32
+ - Node.js >= 20.19. Solo ESM; desde CommonJS se carga con `require()` (require(esm)).
33
+ - Certificado digital X.509 y clave privada de ARCA, con cada servicio asociado por separado:
34
+ `ws_sr_constancia_inscripcion`, `ws_sr_padron_a4`, `ws_sr_padron_a10`, `ws_sr_padron_a13`,
35
+ `ws_sr_padron_a100`.
36
+ - **Homologación**: [WSASS](https://wsass-homo.afip.gob.ar/wsass/portal/main.aspx)
37
+ - **Producción**: [Administración de Certificados Digitales](https://www.afip.gob.ar/ws/documentacion/certificados.asp)
38
+
39
+ ## Inicio rápido
27
40
 
28
41
  ```typescript
29
- import { readFileSync } from 'fs';
30
- import { ArcaPadron, FileTicketStorage } from '@ramiidv/arca-padron';
42
+ import { readFileSync } from 'node:fs';
43
+ import { ArcaPadron, CollectionName, FileTicketStorage, condicionIvaDesdePadron } from '@ramiidv/arca-padron';
31
44
 
32
45
  const padron = new ArcaPadron({
33
46
  cert: readFileSync('./cert.pem', 'utf-8'),
34
47
  key: readFileSync('./key.pem', 'utf-8'),
35
- cuit: '20123456786',
36
- production: false, // false = homologacion
48
+ cuit: '20123456786', // CUIT representada (quien consulta)
49
+ production: false, // false = homologación
37
50
  ticketStorage: new FileTicketStorage('./.arca-tickets'), // recomendado
38
51
  });
39
52
 
40
- // Constancia de inscripcion (ex A5) + condicion frente al IVA para facturar
41
- import { condicionIvaDesdePadron } from '@ramiidv/arca-padron';
53
+ // Constancia de inscripción (ex A5) + condición frente al IVA para facturar
42
54
  const constancia = await padron.getConstanciaInscripcion('30712345671');
43
55
  const { condicionIva, motivo } = condicionIvaDesdePadron(constancia);
44
56
  // condicionIva: CondicionIva.RESPONSABLE_INSCRIPTO (1), motivo: "Inscripto en IVA (impuesto 30)."
57
+ console.log(condicionIva, motivo);
45
58
 
46
59
  // Consulta completa (A4)
47
60
  const contribuyente = await padron.getPersona('20-11111111-2'); // con o sin guiones
48
61
  console.log(contribuyente.tipoPersona, contribuyente.nombre);
49
62
 
50
- // Consulta basica (A10)
51
- const contribuyenteBasico = await padron.getPersonaBasic('20111111112');
52
- console.log(contribuyenteBasico.domicilio?.[0]?.direccion);
63
+ // Consulta básica (A10)
64
+ const basico = await padron.getPersonaBasic('20111111112');
65
+ console.log(basico.domicilio?.[0]?.direccion);
53
66
 
54
- // Tablas de parametros (A100)
55
- import { CollectionName } from '@ramiidv/arca-padron';
67
+ // Tablas de parámetros (A100)
56
68
  const provincias = await padron.getParametros(CollectionName.PROVINCIA);
57
69
  console.log(provincias.length, 'provincias');
58
70
  ```
59
71
 
60
- ## Configuracion
61
-
62
- `ArcaPadronConfig` extiende `ArcaBaseConfig` de `@ramiidv/arca-common`:
63
-
64
- ```typescript
65
- interface ArcaPadronConfig extends ArcaBaseConfig {
66
- // De ArcaBaseConfig:
67
- cert: string; // Certificado X.509 en formato PEM
68
- key: string; // Clave privada en formato PEM
69
- cuit: string | number; // CUIT representada (se valida el digito verificador)
70
- production?: boolean; // default: false (homologacion)
71
- timeout?: number; // ms por request (default: 30000)
72
- retries?: number; // reintentos ante errores transitorios (default: 1)
73
- retryDelayMs?: number; // backoff exponencial (default: 1000)
74
- tokenTTLMinutes?: number; // vigencia pedida a WSAA (default: 720)
75
- onEvent?: (event: ArcaEvent) => void;
76
- ticketStorage?: TicketStorage; // persistencia de tickets WSAA (recomendado)
77
- clockOffsetMs?: number; // relojARCA - relojLocal en ms (default: 0)
78
- autoClockSkew?: boolean; // default: true
79
- loginErrorCooldownMs?: number; // default: 60000
80
- fetch?: typeof fetch; // fetch propio (proxy, mTLS, tests)
81
- legacyTls?: 'auto' | 'never' | 'always';
82
- // Propias de Padron:
83
- signal?: AbortSignal; // cancela todas las llamadas de la instancia
84
- wsaa?: WsaaClient; // WsaaClient compartido (ej: arca.wsaa de arca-facturacion)
85
- endpoints?: { wsaa?: string; a5?: string; a4?: string; a10?: string; a13?: string; a100?: string };
86
- }
87
- ```
88
-
89
- > **Persisti el Ticket de Acceso.** WSAA rechaza el login si ya hay un TA vigente para el
72
+ ## Configuración
73
+
74
+ `ArcaPadronConfig` extiende `ArcaSdkConfig` de `@ramiidv/arca-common`:
75
+
76
+ | Opción | Tipo | Default | Descripción |
77
+ | ------------------------------------------------------------------------------------ | ---------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------- |
78
+ | `cert`, `key` | `string` | — | Certificado y clave privada (PEM) |
79
+ | `keyPassphrase` | `string` | — | Contraseña de la clave, si está encriptada |
80
+ | `cuit` | `number \| string` | — | CUIT representada; se valida el dígito verificador y se envía como 11 dígitos |
81
+ | `production` | `boolean` | `false` | Homologación o producción |
82
+ | `timeout` | `number` | `30000` | Timeout HTTP (ms) |
83
+ | `retries` / `retryDelayMs` | `number` | `1` / `1000` | Reintentos ante errores transitorios (nunca ante un SOAP Fault) |
84
+ | `tokenTTLMinutes` | `number` | `720` | Vigencia del TRA pedida a WSAA |
85
+ | `ticketStorage` | `TicketStorage` | — | Persistencia del TA (recomendado: `FileTicketStorage` o propio) |
86
+ | `clockOffsetMs`, `autoClockSkew`, `loginErrorCooldownMs`, `permanentErrorCooldownMs` | | | Opciones de WSAA (ver `@ramiidv/arca-common`) |
87
+ | `fetch` | `typeof fetch` | `globalThis.fetch` | `fetch` propio (proxy, tests) |
88
+ | `legacyTls` | `'auto' \| 'never' \| 'always'` | `'auto'` | Transporte TLS legacy |
89
+ | `onEvent` | `(e: ArcaEvent) => void` | — | Eventos `auth:*` y `request:*` |
90
+ | `wsaa` | `WsaaClient` | — | `WsaaClient` compartido con otros SDKs (mismo certificado); tiene que ser del mismo entorno (`production`) |
91
+ | `signal` | `AbortSignal` | — | Cancela todas las llamadas de la instancia (ej: al apagar la app); se combina con el `signal` de cada llamada |
92
+ | `endpoints` | `{ wsaa?, a5?, a4?, a10?, a13?, a100? }` | — | Sobrescribe las URLs |
93
+
94
+ > **Persistí el Ticket de Acceso.** WSAA rechaza el login si ya hay un TA vigente para el
90
95
  > certificado y servicio. Sin `ticketStorage`, un reinicio del proceso te deja sin poder consultar
91
96
  > hasta que venza (hasta 12 horas, `ArcaTicketVigenteError`). Ver `TicketStorage` en
92
97
  > [`@ramiidv/arca-common`](https://github.com/ramiidv/arca-sdks/tree/main/packages/common).
93
98
 
94
- Si usas tambien `@ramiidv/arca-facturacion` con el mismo certificado, comparti el cliente WSAA:
99
+ Si usás también `@ramiidv/arca-facturacion` con el mismo certificado, compartí el cliente WSAA:
95
100
 
96
101
  ```typescript
97
- const arca = new Arca({ cuit, cert, key, ticketStorage });
98
- const padron = new ArcaPadron({ cuit, cert, key, wsaa: arca.wsaa });
99
- ```
100
-
101
- Todos los metodos aceptan un ultimo parametro opcional `{ signal }`. Las CUIT se aceptan con o sin
102
- guiones (`'20-11111111-2'`, `'20111111112'` o `20111111112`): se validan localmente (digito
103
- verificador) y se envian normalizadas; una CUIT invalida lanza `ArcaValidationError` sin llamar a ARCA.
102
+ import { readFileSync } from 'node:fs';
103
+ import { ArcaFacturacion } from '@ramiidv/arca-facturacion';
104
+ import { ArcaPadron, FileTicketStorage } from '@ramiidv/arca-padron';
104
105
 
105
- Todas las operaciones de Padron son consultas (no modifican nada en ARCA): se pueden reintentar sin
106
- riesgo.
106
+ const cert = readFileSync('./cert.pem', 'utf-8');
107
+ const key = readFileSync('./key.pem', 'utf-8');
108
+ const cuit = '20123456786';
107
109
 
108
- ## API
110
+ const facturacion = new ArcaFacturacion({ cuit, cert, key, ticketStorage: new FileTicketStorage('./.arca-tickets') });
111
+ const padron = new ArcaPadron({ cuit, cert, key, wsaa: facturacion.wsaa });
112
+ ```
109
113
 
110
- ### Metodos de alto nivel
114
+ Todos los métodos aceptan un último parámetro opcional `{ signal }`. Las CUIT se aceptan con o sin
115
+ guiones (`'20-11111111-2'`, `'20111111112'` o `20111111112`): se validan localmente (dígito
116
+ verificador) y se envían normalizadas; una CUIT inválida lanza `ArcaValidationError` sin llamar a
117
+ ARCA (salvo en `getConstanciasInscripcion`, ver abajo).
111
118
 
112
- #### `getConstanciaInscripcion(cuit): Promise<PersonaA5>`
119
+ ## API
113
120
 
114
- Constancia de inscripcion via `ws_sr_constancia_inscripcion` (metodo `getPersona_v2`). Reemplaza a
115
- Padron A5 (`ws_sr_padron_a5`), deprecado por ARCA. Incluye datos generales, domicilio fiscal,
116
- caracterizaciones, regimen general (impuestos, actividades, regimenes), monotributo (categoria,
121
+ | Método | Servicio / operación | Devuelve |
122
+ | ---------------------------------------- | -------------------------------------------------- | ------------------------------ |
123
+ | `getConstanciaInscripcion(cuit)` | `ws_sr_constancia_inscripcion` `getPersona_v2` | `PersonaA5` |
124
+ | `getConstanciasInscripcion(cuits)` | `ws_sr_constancia_inscripcion` `getPersonaList_v2` | `ListaPadron<PersonaA5>` |
125
+ | `getPersona(cuit)` | `ws_sr_padron_a4` `getPersona` | `PersonaA4` |
126
+ | `getPersonaBasic(cuit)` | `ws_sr_padron_a10` `getPersona` | `PersonaA10` |
127
+ | `getPersonaA13(cuit)` | `ws_sr_padron_a13` `getPersona` | `PersonaA13` |
128
+ | `getPersonaA13V2(cuit)` | `ws_sr_padron_a13` `getPersonaV2` | `PersonaA13` |
129
+ | `getIdPersonaListByDocumento(documento)` | `ws_sr_padron_a13` `getIdPersonaListByDocumento` | `ListaPadron<string>` |
130
+ | `getParametros(collection)` | `ws_sr_padron_a100` `getParameterCollectionByName` | `ListaPadron<ParameterRecord>` |
131
+ | `status()` | `dummy` de los cinco servicios (sin auth) | `PadronStatus` |
132
+ | `clearAuthCache()` | — | `Promise<void>` |
133
+
134
+ ### `getConstanciaInscripcion(cuit): Promise<PersonaA5>`
135
+
136
+ Constancia de inscripción vía `ws_sr_constancia_inscripcion` (método `getPersona_v2`). Reemplaza a
137
+ Padrón A5 (`ws_sr_padron_a5`), deprecado por ARCA. Incluye datos generales, domicilio fiscal,
138
+ caracterizaciones, régimen general (impuestos, actividades, regímenes), monotributo (categoría,
117
139
  impuestos, actividad, `componenteDeSociedad`) y, si ARCA no puede emitir la constancia (o una parte),
118
140
  `errorConstancia` / `errorRegimenGeneral` / `errorMonotributo`: esos casos se devuelven, no se lanzan.
119
141
 
142
+ La excepción es la CUIT inexistente: tanto si ARCA la informa como SOAP Fault como si la informa en
143
+ `errorConstancia` ("No existe persona con ese Id"), se lanza `ArcaPadronServiceError` con
144
+ `reason: 'inexistente'`.
145
+
120
146
  ```typescript
121
147
  const constancia = await padron.getConstanciaInscripcion('30712345671');
122
148
  constancia.domicilioFiscal; // { direccion, localidad, codPostal, idProvincia, ... }
123
- constancia.impuestos; // impuestos de ambos regimenes
149
+ constancia.impuestos; // impuestos de ambos regímenes
124
150
  constancia.monotributo?.categoria; // { idCategoria, descripcionCategoria, ... }
151
+ constancia.metadata; // { fechaHora, servidor } de la respuesta, si ARCA lo informó
125
152
  ```
126
153
 
127
- #### `getConstanciasInscripcion(cuits): Promise<PersonaA5[]>`
154
+ ### `getConstanciasInscripcion(cuits): Promise<ListaPadron<PersonaA5>>`
155
+
156
+ Hasta 250 CUITs en una llamada (`getPersonaList_v2`), en el orden de `cuits`. Los problemas de una
157
+ CUIT no hacen fallar la consulta (ARCA informa por clave, manual v4.1 §3.3.3): vuelven en el
158
+ `errorConstancia` de su persona.
128
159
 
129
- Hasta 250 CUITs en una llamada (`getPersonaList_v2`). Las CUITs inexistentes no hacen fallar la
130
- consulta: vuelven como una persona con `errorConstancia.error = ['No existe persona con ese Id']`.
160
+ - CUIT inexistente: `errorConstancia.error = ['No existe persona con ese Id']` (lo informa ARCA).
161
+ - CUIT inválida (formato o dígito verificador): **no se envía a ARCA**; vuelve con `idPersona` igual al
162
+ valor recibido y el motivo en `errorConstancia.error` (`'CUIT inválido: "…". … No se consultó a ARCA.'`).
163
+ Si todas son inválidas, no se llama a ARCA.
164
+ - Persona que ARCA devuelve con datos inválidos: vuelve con el detalle en `errorConstancia` (si trae
165
+ alguna CUIT; si no, se omite).
166
+
167
+ Una lista vacía o de más de 250 elementos lanza `ArcaValidationError`.
131
168
 
132
169
  ```typescript
133
170
  const constancias = await padron.getConstanciasInscripcion(['20224107030', '27015942210']);
@@ -136,124 +173,197 @@ for (const c of constancias) {
136
173
  }
137
174
  ```
138
175
 
139
- #### `condicionIvaDesdePadron(persona): { condicionIva: CondicionIva | null; motivo: string }`
176
+ ### `condicionIvaDesdePadron(persona): { condicionIva: CondicionIva | null; motivo: string }`
140
177
 
141
- Funcion pura (no consulta ARCA). Acepta una constancia (`PersonaA5`) o una persona de A4:
178
+ Función pura (no consulta ARCA). Acepta una constancia (`PersonaA5`) o una persona de A4:
142
179
 
143
- | Padron | `condicionIva` |
180
+ | Padrón | `condicionIva` |
144
181
  | --------------------------------------------------------------------------- | ------------------------------------------ |
145
- | Monotributo activo (impuesto 20 activo; si no figura el 20, la categoria) | `MONOTRIBUTISTA` (6) |
146
- | Monotributo social (categorias 61, 99, 100 y proyectos productivos 101-104) | `MONOTRIBUTO_SOCIAL` (13) |
147
- | Trabajador independiente promovido (por la descripcion de la categoria) | `MONOTRIBUTO_INDEPENDIENTE_PROMOVIDO` (16) |
182
+ | Monotributo activo (impuesto 20 activo; si no figura el 20, la categoría) | `MONOTRIBUTISTA` (6) |
183
+ | Monotributo social (categorías 61, 99, 100 y proyectos productivos 101-104) | `MONOTRIBUTO_SOCIAL` (13) |
184
+ | Trabajador independiente promovido (por la descripción de la categoría) | `MONOTRIBUTO_INDEPENDIENTE_PROMOVIDO` (16) |
148
185
  | IVA (impuesto 30) `ACTIVO` / `ACTIVO EN TRAMITE` / `AC` | `RESPONSABLE_INSCRIPTO` (1) |
149
186
  | IVA (impuesto 30) `EXENTO` / `EXENTO EN TRAMITE` / `EX`, o impuesto 32 | `EXENTO` (4) |
150
187
  | Impuesto 34 (IVA no alcanzado) | `IVA_NO_ALCANZADO` (15) |
151
- | Ninguno de los anteriores, constancia no emitida o con errores | `null` (con el motivo) |
152
-
153
- Los impuestos en `BAJA PROVISORIA`, `BAJA DEFINITIVA` o `NO APORTANTE` no cuentan (un impuesto 20
154
- en baja no se considera monotributo aunque haya categoria). Si el padron no alcanza, devuelve `null`
155
- en lugar de asumir consumidor final: decidilo segun la operacion. Si ARCA informo
156
- `errorRegimenGeneral` / `errorMonotributo`, el motivo los incluye.
188
+ | Impuesto 33 (IVA responsable no inscripto, categoría eliminada) | `null` (con un motivo propio) |
189
+ | Ninguno de los anteriores, o constancia no emitida | `null` (con el motivo) |
157
190
 
158
- Fuentes: manual de `ws_sr_constancia_inscripcion` v4.1 (impuestos 20 y 30, estado `AC`, categorias
159
- de monotributo del anexo 5.3) y manual de `ws_sr_padron_a4` v1.3 §5.3 (TipoEstado). Los impuestos 32
160
- y 34 no figuran en los manuales: se reconocen por id o por su descripcion. La categoria 98
161
- (`B ASOCIADO COOPERATIVA`) se trata como monotributo comun.
191
+ Si figuran a la vez monotributo e IVA activos, prioriza monotributo. Los impuestos en
192
+ `BAJA PROVISORIA`, `BAJA DEFINITIVA` o `NO APORTANTE` no cuentan (un impuesto 20 en baja no se
193
+ considera monotributo aunque haya categoría). Si el padrón no alcanza, devuelve `null` en lugar de
194
+ asumir consumidor final: decidilo según la operación.
162
195
 
163
- #### `getPersonaA13(cuit): Promise<PersonaA13>` y `getPersonaA13V2(cuit)`
196
+ Si ARCA informó errores (`errorConstancia`, por ejemplo una CUIT limitada en los términos de la RG
197
+ 3832/16; `errorRegimenGeneral`; `errorMonotributo`) o la CUIT no está activa, **el motivo lo advierte
198
+ siempre**, también cuando se pudo determinar la condición: revisalo antes de facturar.
164
199
 
165
- Datos basicos via `ws_sr_padron_a13`. `getPersona` falla con `reason: 'inactiva'` si la clave esta
166
- inactiva; `getPersonaV2` (manual A13 v1.4) devuelve los datos igual (con `estadoClave: 'INACTIVO'`).
200
+ Fuentes: manual de `ws_sr_constancia_inscripcion` v4.1 (impuestos 20 y 30, estado `AC`, categorías
201
+ de monotributo del anexo 5.3) y manual de `ws_sr_padron_a4` v1.3 §5.3 (TipoEstado). Los impuestos 32,
202
+ 33 y 34 no figuran en los manuales: se reconocen por id (y el 32 y el 34, también por su descripción).
203
+ La categoría 98 (`B ASOCIADO COOPERATIVA`) se trata como monotributo común.
167
204
 
168
- #### `getIdPersonaListByDocumento(documento): Promise<string[]>`
205
+ ### `getPersonaA13(cuit)` y `getPersonaA13V2(cuit)`: `Promise<PersonaA13>`
169
206
 
170
- CUIT/CUIL asociados a un numero de documento (A13). Acepta puntos y espacios (`'11.709.676'`).
171
- Devuelve `[]` si ARCA no informa claves.
207
+ Datos básicos vía `ws_sr_padron_a13`. `getPersona` falla con `reason: 'inactiva'` si la clave está
208
+ inactiva; `getPersonaV2` (manual A13 v1.4) devuelve los datos igual (con `estadoClave: 'INACTIVO'`).
172
209
 
173
- #### `getPersona(cuit): Promise<PersonaA4>`
210
+ ### `getIdPersonaListByDocumento(documento): Promise<ListaPadron<string>>`
174
211
 
175
- Obtiene los datos completos de un contribuyente via ws_sr_padron_a4. Autentica automaticamente con WSAA.
212
+ CUIT/CUIL asociados a un número de documento (A13). Acepta puntos, espacios y guiones
213
+ (`'11.709.676'`); más de 11 dígitos lanza `ArcaValidationError`. Devuelve `[]` si ARCA no informa claves.
176
214
 
177
- ```typescript
178
- const contribuyente = await padron.getPersona('20111111112');
179
- ```
215
+ ### `getPersona(cuit): Promise<PersonaA4>` y `getPersonaBasic(cuit): Promise<PersonaA10>`
180
216
 
181
- #### `getPersonaBasic(cuit): Promise<PersonaA10>`
217
+ Datos completos (`ws_sr_padron_a4`: domicilios, impuestos, actividades, regímenes, relaciones,
218
+ categorías, emails, teléfonos) y básicos (`ws_sr_padron_a10`: datos generales, dependencia y
219
+ domicilios) de un contribuyente.
182
220
 
183
- Obtiene los datos basicos de un contribuyente via ws_sr_padron_a10.
221
+ ### `getParametros(collection): Promise<ListaPadron<ParameterRecord>>`
184
222
 
185
- ```typescript
186
- const contribuyenteBasico = await padron.getPersonaBasic('20111111112');
187
- ```
188
-
189
- #### `getParametros(collection: string): Promise<ParameterRecord[]>`
190
-
191
- Obtiene una tabla de parametros via ws_sr_padron_a100. `id`, `descripcion` y los `value` de los
192
- atributos se devuelven tal cual los envia ARCA (`"10.50"` sigue siendo `"10.50"`). Lanza
193
- `ArcaPadronError` si la respuesta no trae `parameterCollection`; una coleccion vacia devuelve `[]`.
223
+ Tabla de parámetros vía `ws_sr_padron_a100`. `id`, `descripcion` y los `value` de los atributos se
224
+ devuelven tal cual los envía ARCA (`"10.50"` sigue siendo `"10.50"`). Lanza `ArcaPadronError` si la
225
+ respuesta no trae `parameterCollection`; una colección vacía devuelve `[]`. Un nombre vacío lanza
226
+ `ArcaValidationError` sin llamar a ARCA.
194
227
 
195
228
  ```typescript
196
- import { CollectionName } from '@ramiidv/arca-padron';
197
-
198
229
  const provincias = await padron.getParametros(CollectionName.PROVINCIA);
199
230
  const tiposDocumento = await padron.getParametros(CollectionName.TIPO_DOCUMENTO);
200
- const tiposRelacion = await padron.getParametros(CollectionName.TIPO_RELACION);
201
231
  ```
202
232
 
203
- Colecciones disponibles (enum `CollectionName`, manual A100 v2.1 anexo 5.1): `PROVINCIA`, `TIPO_DOCUMENTO`, `TIPO_DOMICILIO`, `TIPO_CLAVE`, `TIPO_EMPRESA_JURIDICA`, `TIPO_EMPRESA_JURIDICA_SUBGRUPO`, `TIPO_RELACION`, `TIPO_SUBTIPO_RELACION`, `TIPO_COMPONENTE_SOCIEDAD`, `TIPO_RELACION_COMPONENTE_SOC`, `TIPO_EMAIL`, `TIPO_TELEFONO`, `TIPO_RESIDENCIA`, `TIPO_DATO_ADICIONAL_DOMICILIO`, `ORGANISMO_INFORMANTE`, `ORGANISMO_CONTROL`, `PROVINCIA_SOCIEDAD_ORG`, `SEXO`, `CALLE`, `LOCALIDAD`, `AUTONOMO_MONOTRIBUTO`, `REGIMEN`, `TIPO_REGIMEN`, `CARACTERIZACION`, `TIPO_ARCHIVO`, `ACTIVIDAD_RUBRO`, `RUBRO_ACTIVIDAD`, `ACTIVIDAD_OCUPACIONAL`.
204
- La coleccion de categorias de monotributo no se incluye porque su nombre aparece cortado en el manual.
233
+ Colecciones disponibles (enum `CollectionName`, manual A100 v2.1 anexo 5.1): `PROVINCIA`,
234
+ `TIPO_DOCUMENTO`, `TIPO_DOMICILIO`, `TIPO_CLAVE`, `TIPO_EMPRESA_JURIDICA`,
235
+ `TIPO_EMPRESA_JURIDICA_SUBGRUPO`, `TIPO_RELACION`, `TIPO_SUBTIPO_RELACION`, `TIPO_COMPONENTE_SOCIEDAD`,
236
+ `TIPO_RELACION_COMPONENTE_SOC`, `TIPO_EMAIL`, `TIPO_TELEFONO`, `TIPO_RESIDENCIA`,
237
+ `TIPO_DATO_ADICIONAL_DOMICILIO`, `ORGANISMO_INFORMANTE`, `ORGANISMO_CONTROL`, `PROVINCIA_SOCIEDAD_ORG`,
238
+ `SEXO`, `CALLE`, `LOCALIDAD`, `AUTONOMO_MONOTRIBUTO`, `REGIMEN`, `TIPO_REGIMEN`, `CARACTERIZACION`,
239
+ `TIPO_ARCHIVO`, `ACTIVIDAD_RUBRO`, `RUBRO_ACTIVIDAD`, `ACTIVIDAD_OCUPACIONAL`. La colección de
240
+ categorías de monotributo no se incluye porque su nombre aparece cortado en el manual.
205
241
 
206
- #### `status(): Promise<PadronStatus>`
242
+ ### `status(): Promise<PadronStatus>`
207
243
 
208
- Verifica el estado de los servicios (`dummy`, no requiere autenticacion). Consulta los cinco en
209
- paralelo: cada uno es un `ServiceStatus` de arca-common (`{ ok: true, status }` o
210
- `{ ok: false, error }`), asi que un servicio caido no oculta el estado de los demas.
244
+ Estado de los cinco servicios (`dummy`, sin autenticación), en paralelo. Cada uno es un
245
+ `ServiceStatus` de arca-common: `ok` es `true` solo si el servicio respondió y sus tres servidores
246
+ (`appserver`, `dbserver`, `authserver`) están en `OK`. Si respondió con alguno en otro estado (ej:
247
+ `dbserver: 'ERROR'`), `ok` es `false` y `status` tiene lo que informó ARCA; si no respondió, `ok` es
248
+ `false` sin `status`. Un servicio caído no oculta el estado de los demás.
211
249
 
212
250
  ```typescript
213
251
  const estado = await padron.status();
214
- if (estado.a4.ok)
215
- console.log(estado.a4.status.appserver); // "OK"
216
- else console.error('A4 caido:', estado.a4.error);
252
+ if (estado.a4.ok) console.log('A4 disponible');
253
+ else console.error('A4 no disponible:', estado.a4.error.message, estado.a4.status);
217
254
  ```
218
255
 
219
- ### Acceso a clientes de bajo nivel
256
+ Los `dummy()` de los clientes de bajo nivel devuelven lo que informa ARCA sin evaluarlo: usá
257
+ `serverStatusOk(status)` de `@ramiidv/arca-common`.
258
+
259
+ ### `metadata` de las respuestas
260
+
261
+ ARCA informa en cada respuesta la fecha/hora de proceso y el servidor (`metadata`). Las personas
262
+ (`PersonaA4`, `PersonaA10`, `PersonaA13`, `PersonaA5`) lo traen en `persona.metadata`; las listas
263
+ (`ListaPadron<T>`), en `lista.metadata`, una propiedad no enumerable del array (no aparece al
264
+ iterar, serializar ni copiar el array). Si ARCA no lo informa, la propiedad no está.
220
265
 
221
- Para casos avanzados, se pueden usar los clientes individuales directamente:
266
+ ### Clientes de bajo nivel
267
+
268
+ Para casos avanzados, se pueden usar los clientes de cada servicio directamente: `padron.wsaa`,
269
+ `padron.a5` (constancia: `getPersona`, `getPersonaList`), `padron.a4`, `padron.a10`, `padron.a13`
270
+ (`getPersona`, `getPersonaV2`, `getIdPersonaListByDocumento`) y `padron.a100`
271
+ (`getParameterCollectionByName`). Reciben las credenciales (`WsAuth`) como primer argumento:
222
272
 
223
273
  ```typescript
274
+ import { readFileSync } from 'node:fs';
275
+ import { ArcaPadron, ENDPOINTS } from '@ramiidv/arca-padron';
276
+ import type { WsAuth } from '@ramiidv/arca-padron';
277
+
224
278
  const padron = new ArcaPadron({
225
- /* ... */
279
+ cert: readFileSync('./cert.pem', 'utf-8'),
280
+ key: readFileSync('./key.pem', 'utf-8'),
281
+ cuit: '20123456786',
226
282
  });
227
283
 
228
- // Obtener ticket de acceso manualmente
229
- const ticket = await padron.wsaa.getAccessTicket('ws_sr_padron_a4');
230
-
231
- const credenciales = {
232
- Token: ticket.token,
233
- Sign: ticket.sign,
234
- CuitRepresentada: '20123456786',
235
- };
284
+ const ticket = await padron.wsaa.getAccessTicket(ENDPOINTS.a4.serviceId);
285
+ const credenciales: WsAuth = { token: ticket.token, sign: ticket.sign, cuitRepresentada: '20123456786' };
236
286
 
237
- // Llamar directamente al servicio
238
287
  const contribuyente = await padron.a4.getPersona(credenciales, '20111111112');
239
- // Tambien: padron.a5.getPersona / getPersonaList, padron.a13.getPersonaV2, padron.a100.getParameterCollectionByName
288
+ console.log(contribuyente.idPersona);
240
289
  ```
241
290
 
242
- Clientes disponibles: `padron.wsaa`, `padron.a5` (constancia), `padron.a4`, `padron.a10`,
243
- `padron.a13`, `padron.a100`.
291
+ ### Tipos de respuesta
244
292
 
245
- ## Tipos de respuesta
293
+ Los campos `xs:string` de los WSDL (códigos postales, datos adicionales, números de inscripción,
294
+ documentos) y los `xs:long` (CUIT, actividades, teléfonos) se devuelven siempre como `string`, aunque
295
+ sean numéricos. Los `xs:dateTime` (`fechaContratoSocial`, `fechaNacimiento`, `ffRelacion`,
296
+ `metadata.fechaHora`...) se devuelven como el string que envía ARCA, sin convertir a `Date`. Los
297
+ elementos `xsi:nil` se tratan como ausentes. `tipoPersona` es `'FISICA' | 'JURIDICA'`, pero el SDK no
298
+ rechaza otro valor: lo devuelve tal cual (`TipoPersonaPadron`).
246
299
 
247
- Los campos `xs:string` de los WSDL (codigos postales, datos adicionales, numeros de inscripcion,
248
- documentos) y los `xs:long` (CUIT, actividades, telefonos) se devuelven siempre como `string`, aunque
249
- sean numericos. Los elementos `xsi:nil` se tratan como ausentes.
300
+ #### PersonaA5 (constancia de inscripción)
250
301
 
251
- ### PersonaA4 (datos completos)
302
+ ```typescript
303
+ interface PersonaA5 {
304
+ idPersona: string;
305
+ tipoPersona?: TipoPersonaPadron;
306
+ tipoClave?: string;
307
+ estadoClave?: string;
308
+ nombre?: string;
309
+ apellido?: string;
310
+ razonSocial?: string;
311
+ mesCierre?: number;
312
+ fechaContratoSocial?: string; // xs:dateTime
313
+ fechaFallecimiento?: string; // xs:dateTime
314
+ esSucesion?: string;
315
+ domicilioFiscal?: DomicilioA5;
316
+ dependencia?: DependenciaA5;
317
+ caracterizacion?: CaracterizacionA5[];
318
+ regimenGeneral?: { impuestos: ImpuestoA5[]; actividades: ActividadA5[]; regimenes: RegimenA5[]; categoriaAutonomo?: CategoriaA5 };
319
+ monotributo?: {
320
+ impuestos: ImpuestoA5[];
321
+ actividades: ActividadA5[];
322
+ actividadMonotributista?: ActividadA5;
323
+ categoria?: CategoriaA5;
324
+ componenteDeSociedad?: ComponenteSociedadA5[];
325
+ };
326
+ impuestos: ImpuestoA5[]; // de ambos regímenes, juntos
327
+ errorConstancia?: { error: string[]; idPersona?: string; nombre?: string; apellido?: string };
328
+ errorRegimenGeneral?: { error: string[]; mensaje?: string };
329
+ errorMonotributo?: { error: string[]; mensaje?: string };
330
+ metadata?: PadronMetadata;
331
+ }
332
+ ```
333
+
334
+ #### PersonaA13
335
+
336
+ ```typescript
337
+ interface PersonaA13 {
338
+ idPersona: string;
339
+ tipoPersona: TipoPersonaPadron;
340
+ tipoClave?: string;
341
+ estadoClave?: string;
342
+ nombre?: string;
343
+ apellido?: string;
344
+ razonSocial?: string;
345
+ numeroDocumento?: string;
346
+ tipoDocumento?: string;
347
+ formaJuridica?: string;
348
+ mesCierre?: number;
349
+ fechaNacimiento?: string; // xs:dateTime
350
+ fechaFallecimiento?: string; // xs:dateTime
351
+ fechaContratoSocial?: string; // xs:dateTime
352
+ idActividadPrincipal?: string;
353
+ descripcionActividadPrincipal?: string;
354
+ periodoActividadPrincipal?: number;
355
+ claveInactivaAsociada?: string[];
356
+ domicilio?: DomicilioA13[]; // calle, numero, piso, oficinaDptoLocal, codigoPostal, estadoDomicilio...
357
+ metadata?: PadronMetadata;
358
+ }
359
+ ```
360
+
361
+ #### PersonaA4 (datos completos)
252
362
 
253
363
  ```typescript
254
364
  interface PersonaA4 {
255
365
  idPersona: string;
256
- tipoPersona: 'FISICA' | 'JURIDICA';
366
+ tipoPersona: TipoPersonaPadron;
257
367
  tipoClave?: string;
258
368
  estadoClave?: string;
259
369
  apellido?: string;
@@ -261,7 +371,7 @@ interface PersonaA4 {
261
371
  razonSocial?: string;
262
372
  numeroDocumento?: string;
263
373
  tipoDocumento?: string;
264
- fechaNacimiento?: string;
374
+ fechaNacimiento?: string; // xs:dateTime (también las demás fecha*)
265
375
  sexo?: string;
266
376
  numeroInscripcion?: string;
267
377
  formaJuridica?: string;
@@ -290,15 +400,16 @@ interface PersonaA4 {
290
400
  categoria?: CategoriaA4[];
291
401
  email?: EmailA4[];
292
402
  telefono?: TelefonoA4[];
403
+ metadata?: PadronMetadata;
293
404
  }
294
405
  ```
295
406
 
296
- ### PersonaA10 (datos basicos)
407
+ #### PersonaA10 (datos básicos)
297
408
 
298
409
  ```typescript
299
410
  interface PersonaA10 {
300
411
  idPersona: string;
301
- tipoPersona: 'FISICA' | 'JURIDICA';
412
+ tipoPersona: TipoPersonaPadron;
302
413
  tipoClave?: string;
303
414
  estadoClave?: string;
304
415
  nombre?: string;
@@ -311,69 +422,86 @@ interface PersonaA10 {
311
422
  dependencia?: DependenciaA10;
312
423
  claveInactivaAsociada?: string[];
313
424
  domicilio?: DomicilioA10[];
425
+ metadata?: PadronMetadata;
314
426
  }
315
427
  ```
316
428
 
317
- ### ParameterRecord (tablas A100)
429
+ #### ParameterRecord (tablas A100) y metadata
318
430
 
319
431
  ```typescript
320
432
  interface ParameterRecord {
321
433
  id: string;
322
434
  descripcion: string;
323
- atributos?: ParameterAttribute[];
435
+ atributos?: { name: string; value?: string }[]; // value tal cual lo envía ARCA (xs:string)
324
436
  }
325
437
 
326
- interface ParameterAttribute {
327
- name: string;
328
- value?: string; // tal cual lo envia ARCA (xs:string)
438
+ interface PadronMetadata {
439
+ fechaHora?: string; // xs:dateTime
440
+ servidor?: string;
329
441
  }
442
+
443
+ type ListaPadron<T> = T[] & { metadata?: PadronMetadata };
330
444
  ```
331
445
 
332
446
  ## Manejo de errores
333
447
 
334
- ```
448
+ ```text
335
449
  Error
336
450
  └── ArcaError (base, de @ramiidv/arca-common)
337
451
  ├── ArcaPadronError (respuesta de ARCA sin un dato obligatorio, ej: personaReturn sin persona)
338
452
  ├── ArcaAuthError (errores de WSAA)
339
- │ └── ArcaTicketVigenteError (TA vigente que no esta en memoria ni en el storage)
340
- ├── ArcaValidationError (CUIT o documento invalido: no se llamo a ARCA)
453
+ │ └── ArcaTicketVigenteError (TA vigente que no está en memoria ni en el storage)
454
+ ├── ArcaValidationError (CUIT o documento inválido: no se llamó a ARCA)
341
455
  ├── ArcaServiceError
342
456
  │ └── ArcaPadronServiceError (errores de negocio: reason + errors + cause)
343
457
  └── ArcaSoapError (HTTP/red/timeout y SOAP Faults no reconocidos)
344
458
  ```
345
459
 
346
- Todos tienen un `code` estable y `instanceof` funciona aunque haya mas de una copia del paquete
460
+ Todos tienen un `code` estable y `instanceof` funciona aunque haya más de una copia del paquete
347
461
  cargada. ARCA informa los errores de negocio como SOAP Fault; el SDK reconoce los textos de los
348
462
  manuales y los convierte en `ArcaPadronServiceError` con un `reason` tipado (el `ArcaSoapError`
349
463
  original queda en `cause`). No se reintentan.
350
464
 
351
465
  | `reason` | Mensaje de ARCA |
352
466
  | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
353
- | `inexistente` | "La Clave (CUIT/CUIL) consultada es inexistente", "No existe persona con ese Id" |
467
+ | `inexistente` | "La Clave (CUIT/CUIL) consultada es inexistente", "No existe persona con ese Id" (Fault, o `errorConstancia` en `getConstanciaInscripcion`) |
354
468
  | `inactiva` | "La clave (CUIT/CUIL) consultada se encuentra INACTIVA" (A13: usar `getPersonaA13V2`) |
355
469
  | `id_invalido` | "El Id de la persona no es valido" |
356
470
  | `no_autorizado` | "No autorizado, par token/sign invalido.", "Falta token y/o sign.", "Debe enviar la CUIT representada", "Este token no le permite actuar en representacion de la CUIT ..." |
471
+ | `otro` | Cualquier otro error de negocio |
357
472
 
358
473
  Un SOAP Fault con otro texto queda como `ArcaSoapError` (con `faultString`). En la constancia de
359
- inscripcion, los motivos por los que ARCA no emite la constancia (CUIT limitada, domicilio
474
+ inscripción, los motivos por los que ARCA no emite la constancia (CUIT limitada, domicilio
360
475
  incompleto, etc.) no son excepciones: vienen en `errorConstancia`, `errorRegimenGeneral` y
361
476
  `errorMonotributo`.
362
477
 
363
478
  ```typescript
364
- import { ArcaAuthError, ArcaPadronServiceError, ArcaSoapError, ArcaValidationError } from '@ramiidv/arca-padron';
479
+ import { readFileSync } from 'node:fs';
480
+ import {
481
+ ArcaAuthError,
482
+ ArcaPadron,
483
+ ArcaPadronServiceError,
484
+ ArcaSoapError,
485
+ ArcaValidationError,
486
+ } from '@ramiidv/arca-padron';
487
+
488
+ const padron = new ArcaPadron({
489
+ cert: readFileSync('./cert.pem', 'utf-8'),
490
+ key: readFileSync('./key.pem', 'utf-8'),
491
+ cuit: '20123456786',
492
+ });
365
493
 
366
494
  try {
367
495
  await padron.getPersona('20111111112');
368
496
  } catch (error) {
369
497
  if (error instanceof ArcaValidationError) {
370
- console.error('CUIT invalida:', error.message);
498
+ console.error('CUIT inválida:', error.message);
371
499
  } else if (error instanceof ArcaPadronServiceError) {
372
500
  if (error.reason === 'inexistente') console.error('La CUIT no existe');
373
- else if (error.reason === 'inactiva') console.error('La CUIT esta inactiva');
501
+ else if (error.reason === 'inactiva') console.error('La CUIT está inactiva');
374
502
  else console.error(error.errors[0]?.msg);
375
503
  } else if (error instanceof ArcaAuthError) {
376
- console.error('Error de autenticacion:', error.message);
504
+ console.error('Error de autenticación:', error.message);
377
505
  } else if (error instanceof ArcaSoapError) {
378
506
  console.error('Error HTTP/red:', error.statusCode, error.message);
379
507
  }
@@ -382,60 +510,56 @@ try {
382
510
 
383
511
  ## Eventos
384
512
 
385
- El SDK emite eventos para monitoreo y debugging:
513
+ `onEvent` (o `padron.on(tipo, handler)`) recibe `auth:login`, `auth:cache-hit`, `auth:clock-skew`,
514
+ `auth:storage-error`, `request:start`, `request:end`, `request:retry` y `request:error` (ver
515
+ `ArcaEvent` en `@ramiidv/arca-common`):
386
516
 
387
517
  ```typescript
518
+ import { readFileSync } from 'node:fs';
519
+ import { ArcaPadron } from '@ramiidv/arca-padron';
520
+
388
521
  const padron = new ArcaPadron({
389
- // ...
522
+ cert: readFileSync('./cert.pem', 'utf-8'),
523
+ key: readFileSync('./key.pem', 'utf-8'),
524
+ cuit: '20123456786',
390
525
  onEvent: (evento) => {
391
- switch (evento.type) {
392
- case 'auth:login':
393
- console.log(`Login para ${evento.service}`);
394
- break;
395
- case 'auth:cache-hit':
396
- console.log(`Token reutilizado para ${evento.service} (${evento.source})`);
397
- break;
398
- case 'request:start':
399
- console.log(`Inicio ${evento.method}`);
400
- break;
401
- case 'request:end':
402
- console.log(`Fin ${evento.method} (${evento.durationMs}ms)`);
403
- break;
404
- case 'request:retry':
405
- console.log(`Reintento #${evento.attempt}`);
406
- break;
407
- case 'request:error':
408
- console.log(`Error: ${evento.error.message}`);
409
- break;
410
- }
526
+ if (evento.type === 'request:end') console.log(`${evento.method}: ${evento.durationMs}ms`);
527
+ if (evento.type === 'request:retry') console.log(`Reintento #${evento.attempt} de ${evento.method}`);
411
528
  },
412
529
  });
413
530
  ```
414
531
 
415
- ## Enums utiles
532
+ ## Entornos
416
533
 
417
- ```typescript
418
- import { Provincia, TipoDomicilio, TipoPersona, ImpuestoId, CollectionName } from '@ramiidv/arca-padron';
419
-
420
- // Verificar si el contribuyente esta inscripto en IVA (mejor: condicionIvaDesdePadron)
421
- const tieneIva = contribuyente.impuesto?.some(
422
- (imp) => imp.idImpuesto === ImpuestoId.IVA_RESPONSABLE_INSCRIPTO && imp.estado?.startsWith('ACTIVO'),
423
- );
424
-
425
- // ImpuestoId.MONOTRIBUTO = 20, IVA_RESPONSABLE_INSCRIPTO = 30, BIENES_PERSONALES = 180,
426
- // EMPLEADOR = 301, AUTONOMOS = 308 (manuales de ARCA). IVA_EXENTO (32) e IVA_NO_ALCANZADO (34)
427
- // no figuran en los manuales del padron.
428
- //
429
- // `DocTipo` son los codigos numericos de WSFEv1, no el `tipoDocumento` string del padron
430
- // ("DNI", "LC"...).
431
- ```
534
+ | Servicio | Homologación | Producción |
535
+ | ------------------------------ | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
536
+ | `ws_sr_constancia_inscripcion` | `https://awshomo.afip.gov.ar/sr-padron/webservices/personaServiceA5` | `https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA5` |
537
+ | `ws_sr_padron_a4` | `https://awshomo.afip.gov.ar/sr-padron/webservices/personaServiceA4` | `https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA4` |
538
+ | `ws_sr_padron_a10` | `https://awshomo.afip.gov.ar/sr-padron/webservices/personaServiceA10` | `https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA10` |
539
+ | `ws_sr_padron_a13` | `https://awshomo.afip.gov.ar/sr-padron/webservices/personaServiceA13` | `https://aws.afip.gov.ar/sr-padron/webservices/personaServiceA13` |
540
+ | `ws_sr_padron_a100` | `https://awshomo.afip.gov.ar/sr-parametros/webservices/parameterServiceA100` | `https://aws.afip.gov.ar/sr-parametros/webservices/parameterServiceA100` |
432
541
 
433
- ## Requisitos
542
+ El manual de la constancia de inscripción (v4.1) publica los hosts `awshomo.arca.gob.ar` /
543
+ `aws.arca.gob.ar`. El SDK usa `awshomo.afip.gov.ar` / `aws.afip.gov.ar`: son los `soap:address` de
544
+ los WSDL oficiales de los cinco servicios y los que publica el manual de A13 (v1.4), y responden
545
+ igual. Para usar otro host, pasá `endpoints`. Las URLs, namespaces e ids de servicio están en
546
+ `ENDPOINTS`; los de WSAA, en `WSAA_ENDPOINTS` de `@ramiidv/arca-common`.
547
+
548
+ ### Enums útiles
549
+
550
+ - `ImpuestoId`: `MONOTRIBUTO` (20), `IVA_RESPONSABLE_INSCRIPTO` (30), `BIENES_PERSONALES` (180),
551
+ `EMPLEADOR` (301), `AUTONOMOS` (308)... (manuales de ARCA). `IVA_EXENTO` (32),
552
+ `IVA_RESPONSABLE_NO_INSCRIPTO` (33) e `IVA_NO_ALCANZADO` (34) no figuran en los manuales del padrón.
553
+ - `TipoDomicilio`, `TipoPersona`, `EstadoClave`, `CollectionName`, `Provincia`, `CondicionIva`.
554
+ - `DocTipo` son los códigos numéricos de WSFEv1, no el `tipoDocumento` string del padrón ("DNI", "LC"...).
555
+
556
+ `ensureArray`, `parseXml` y `buildXml` siguen exportados por compatibilidad, pero están deprecados:
557
+ importalos de `@ramiidv/arca-common`.
558
+
559
+ ## Ejemplos
434
560
 
435
- - Node.js >= 18 (soporte nativo de `fetch`)
436
- - Certificado digital emitido por ARCA/AFIP
437
- - Autorizacion para los servicios web correspondientes: `ws_sr_constancia_inscripcion`,
438
- `ws_sr_padron_a4`, `ws_sr_padron_a10`, `ws_sr_padron_a13`, `ws_sr_padron_a100` (cada uno por separado)
561
+ En [examples](https://github.com/ramiidv/arca-sdks/tree/main/packages/padron/examples): constancia de
562
+ inscripción y condición frente al IVA, consultas A4 y A10, tablas de parámetros y manejo de errores.
439
563
 
440
564
  ## Licencia
441
565