@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/llms.txt CHANGED
@@ -1,86 +1,93 @@
1
1
  # @ramiidv/arca-padron
2
2
 
3
- > TypeScript SDK para los web services de Padron de ARCA (ex AFIP) - Constancia de Inscripcion (ex A5), A4, A10, A13 y A100, mas condicionIvaDesdePadron
3
+ > SDK en TypeScript para los web services de Padrón de ARCA (ex AFIP): Constancia de Inscripción (ex A5), A4, A10, A13 y A100, más `condicionIvaDesdePadron` para obtener la condición frente al IVA del receptor de una factura.
4
4
 
5
- ## Instalacion
5
+ ## Instalación
6
6
 
7
7
  ```bash
8
8
  npm install @ramiidv/arca-padron
9
9
  ```
10
10
 
11
- Requisitos: Node.js >= 18 (fetch nativo). Dual ESM + CommonJS.
11
+ Requisitos: Node.js >= 20.19. Solo ESM; desde CommonJS se carga con `require()` (require(esm)). Única dependencia: `@ramiidv/arca-common`.
12
12
 
13
- ## Configuracion
13
+ ## Configuración
14
14
 
15
15
  ```typescript
16
16
  import { ArcaPadron } from '@ramiidv/arca-padron';
17
17
 
18
- // ArcaPadronConfig extends ArcaBaseConfig (@ramiidv/arca-common)
18
+ // ArcaPadronConfig extiende ArcaSdkConfig (@ramiidv/arca-common)
19
19
  const padron = new ArcaPadron({
20
- cert: string, // PEM X.509 certificate
21
- key: string, // PEM private key
22
- cuit: string | number, // CUIT representada (validated: check digit). Ej: "20123456786"
23
- production?: boolean, // default: false (homologacion)
20
+ cert: string, // certificado X.509 (PEM)
21
+ key: string, // clave privada (PEM)
22
+ keyPassphrase?: string,
23
+ cuit: string | number, // CUIT representada (se valida el dígito verificador). Ej: "20123456786"
24
+ production?: boolean, // default: false (homologación)
24
25
  timeout?: number, // ms, default 30000
25
- retries?: number, // default: 1 (transient errors only; SOAP Faults are never retried)
26
- retryDelayMs?: number, // default: 1000
26
+ retries?: number, // default 1 (solo errores transitorios; un SOAP Fault nunca se reintenta)
27
+ retryDelayMs?: number, // default 1000
27
28
  tokenTTLMinutes?: number,
28
29
  onEvent?: (event: ArcaEvent) => void,
29
- ticketStorage?: TicketStorage, // persist WSAA tickets across restarts (recommended)
30
- clockOffsetMs?: number, // ARCA clock - local clock, ms. Default: 0
31
- autoClockSkew?: boolean, // default: true
30
+ ticketStorage?: TicketStorage, // persiste los tickets WSAA entre reinicios (recomendado)
31
+ clockOffsetMs?: number, // reloj ARCA - reloj local, ms. Default 0
32
+ autoClockSkew?: boolean, // default true
32
33
  loginErrorCooldownMs?: number,
33
- fetch?: typeof fetch, // custom fetch (proxy, tests)
34
+ permanentErrorCooldownMs?: number,
35
+ fetch?: typeof fetch, // fetch propio (proxy, tests)
34
36
  legacyTls?: 'auto' | 'never' | 'always',
35
- signal?: AbortSignal, // global cancellation
36
- wsaa?: WsaaClient, // shared WSAA client (e.g. arca.wsaa from arca-facturacion)
37
- endpoints?: { wsaa?, a5?, a4?, a10?, a13?, a100? }, // override URLs
37
+ wsaa?: WsaaClient, // WsaaClient compartido (ej: facturacion.wsaa de @ramiidv/arca-facturacion), mismo entorno
38
+ signal?: AbortSignal, // cancela todas las llamadas de la instancia
39
+ endpoints?: { wsaa?, a5?, a4?, a10?, a13?, a100? }, // URLs propias
38
40
  });
39
41
  ```
40
42
 
41
- Every method accepts an optional last argument `{ signal?: AbortSignal }`.
42
- CUITs are accepted with or without dashes ('20-11111111-2', '20111111112', 20111111112), validated locally (check digit; ArcaValidationError without calling ARCA) and sent normalized.
43
- All Padron operations are read-only queries.
44
- Without `ticketStorage`, a restart loses the access ticket and WSAA rejects new logins until it expires (`ArcaTicketVigenteError`).
43
+ Todos los métodos aceptan un último argumento opcional `{ signal?: AbortSignal }`.
44
+ Las CUIT se aceptan con o sin guiones ('20-11111111-2', '20111111112', 20111111112), se validan localmente (dígito verificador; `ArcaValidationError` sin llamar a ARCA) y se envían normalizadas.
45
+ Todas las operaciones de Padrón son consultas.
46
+ Sin `ticketStorage`, un reinicio pierde el ticket de acceso y WSAA rechaza nuevos logins hasta que vence (`ArcaTicketVigenteError`).
45
47
 
46
- ## Metodos principales
48
+ ## Métodos principales
47
49
 
48
50
  ### getConstanciaInscripcion(cuit): Promise<PersonaA5>
49
- Constancia de inscripcion via ws_sr_constancia_inscripcion (getPersona_v2; replaces ws_sr_padron_a5, deprecated by ARCA). PersonaA5: idPersona, tipoPersona, nombre/apellido/razonSocial, estadoClave, domicilioFiscal, dependencia, caracterizacion[], regimenGeneral { impuestos, actividades, regimenes, categoriaAutonomo }, monotributo { impuestos, actividades, actividadMonotributista, categoria, componenteDeSociedad[] }, impuestos (both regimes), errorConstancia { error[] }, errorRegimenGeneral { error[], mensaje }, errorMonotributo { error[], mensaje }. Constancia-level problems are returned in those error fields, not thrown.
51
+ Constancia de inscripción vía ws_sr_constancia_inscripcion (`getPersona_v2`; reemplaza a ws_sr_padron_a5, deprecado por ARCA). PersonaA5: idPersona, tipoPersona, nombre/apellido/razonSocial, estadoClave, domicilioFiscal, dependencia, caracterizacion[], regimenGeneral { impuestos, actividades, regimenes, categoriaAutonomo }, monotributo { impuestos, actividades, actividadMonotributista, categoria, componenteDeSociedad[] }, impuestos (ambos regímenes), errorConstancia { error[] }, errorRegimenGeneral { error[], mensaje }, errorMonotributo { error[], mensaje }, metadata { fechaHora, servidor }. Los problemas de la constancia (CUIT limitada, domicilio incompleto...) vuelven en esos campos, no se lanzan. Excepción: CUIT inexistente (Fault, o errorConstancia "No existe persona con ese Id") → `ArcaPadronServiceError` con reason 'inexistente'.
50
52
 
51
- ### getConstanciasInscripcion(cuits[]): Promise<PersonaA5[]>
52
- getPersonaList_v2: 1 to 250 CUITs per call. Non-existent CUITs come back as a PersonaA5 with errorConstancia.error = ['No existe persona con ese Id'].
53
+ ### getConstanciasInscripcion(cuits[]): Promise<ListaPadron<PersonaA5>>
54
+ `getPersonaList_v2`: 1 a 250 CUITs por llamada (fuera de ese rango, ArcaValidationError), resultado en el orden de `cuits`. Una CUIT no hace fallar el lote: inexistente → errorConstancia.error = ['No existe persona con ese Id']; CUIT inválida → no se envía a ARCA y vuelve con idPersona = valor recibido y errorConstancia.error = ['CUIT inválido: ... No se consultó a ARCA.']; persona con datos inválidos en la respuesta → errorConstancia con el detalle (si no trae CUIT, se omite).
53
55
 
54
56
  ### condicionIvaDesdePadron(persona: PersonaA5 | PersonaA4): { condicionIva: CondicionIva | null; motivo: string }
55
- Pure helper. Tax states: words from A4 manual TipoEstado (ACTIVO, ACTIVO EN TRAMITE, BAJA PROVISORIA, BAJA DEFINITIVA, EXENTO, EXENTO EN TRAMITE, NO APORTANTE) or SUPA ids (AC, EX, BP, BD, NA). Active = ACTIVO / ACTIVO EN TRAMITE. Monotributo (impuesto 20 active; category only if impuesto 20 is absent; impuesto 20 in BAJA never counts) → MONOTRIBUTISTA (6); categories 61/99/100/101-104 → MONOTRIBUTO_SOCIAL (13); category description "PROMOVID" → MONOTRIBUTO_INDEPENDIENTE_PROMOVIDO (16); category 98 (asociado cooperativa) → MONOTRIBUTISTA. IVA 30 active → RESPONSABLE_INSCRIPTO (1); IVA 30 EXENTO/EXENTO EN TRAMITE or impuesto 32 → EXENTO (4); impuesto 34 → IVA_NO_ALCANZADO (15). NO APORTANTE is NOT "no alcanzado". Otherwise null with motivo (never assumes consumidor final); errorRegimenGeneral/errorMonotributo are included in motivo. Use the result as `condicionIva` in @ramiidv/arca-facturacion.
57
+ Función pura. Estados de impuestos: palabras de TipoEstado del manual A4 (ACTIVO, ACTIVO EN TRAMITE, BAJA PROVISORIA, BAJA DEFINITIVA, EXENTO, EXENTO EN TRAMITE, NO APORTANTE) o ids SUPA (AC, EX, BP, BD, NA). Activo = ACTIVO / ACTIVO EN TRAMITE. Monotributo (impuesto 20 activo; la categoría solo si no figura el 20; un 20 en BAJA nunca cuenta) → MONOTRIBUTISTA (6); categorías 61/99/100/101-104 → MONOTRIBUTO_SOCIAL (13); descripción de categoría con "PROMOVID" → MONOTRIBUTO_INDEPENDIENTE_PROMOVIDO (16); categoría 98 (asociado cooperativa) → MONOTRIBUTISTA. Monotributo tiene prioridad sobre IVA. IVA 30 activo → RESPONSABLE_INSCRIPTO (1); IVA 30 EXENTO/EXENTO EN TRAMITE o impuesto 32 → EXENTO (4); impuesto 34 → IVA_NO_ALCANZADO (15); impuesto 33 (responsable no inscripto, categoría eliminada) → null con motivo propio. NO APORTANTE no es "no alcanzado". Si no, null con motivo (nunca asume consumidor final). Los errores de ARCA (errorConstancia, p. ej. CUIT limitada RG 3832/16; errorRegimenGeneral; errorMonotributo) y una CUIT no activa se advierten siempre en el motivo, también cuando la condición se determinó. Usar el resultado como `condicionIva` en @ramiidv/arca-facturacion.
56
58
 
57
59
  ### getPersonaA13(cuit): Promise<PersonaA13>
58
- Datos basicos via ws_sr_padron_a13 getPersona (domicilio[] with calle, numero, codigoPostal, estadoDomicilio...). Throws ArcaPadronServiceError reason 'inactiva' for inactive keys.
60
+ Datos básicos vía ws_sr_padron_a13 `getPersona` (domicilio[] con calle, numero, codigoPostal, estadoDomicilio...). Con la clave inactiva lanza ArcaPadronServiceError reason 'inactiva'.
59
61
 
60
62
  ### getPersonaA13V2(cuit): Promise<PersonaA13>
61
- A13 getPersonaV2 (manual v1.4): also returns data for INACTIVE keys.
63
+ A13 `getPersonaV2` (manual v1.4): responde también con la clave INACTIVA.
62
64
 
63
- ### getIdPersonaListByDocumento(documento): Promise<string[]>
64
- CUIT/CUIL list for a document number via ws_sr_padron_a13. Accepts dots/spaces ('11.709.676'). Returns [] when ARCA reports none.
65
+ ### getIdPersonaListByDocumento(documento): Promise<ListaPadron<string>>
66
+ CUIT/CUIL asociados a un número de documento (A13). Acepta puntos, espacios y guiones ('11.709.676'); 1 a 11 dígitos. Devuelve [] si ARCA no informa claves.
65
67
 
66
68
  ### getPersona(cuit): Promise<PersonaA4>
67
- Datos completos del contribuyente via ws_sr_padron_a4. Incluye: domicilios, impuestos, actividades, regimenes, relaciones, categorias, emails, telefonos.
69
+ Datos completos vía ws_sr_padron_a4: domicilios, impuestos, actividades, regímenes, relaciones, categorías, emails, teléfonos.
68
70
 
69
71
  ### getPersonaBasic(cuit): Promise<PersonaA10>
70
- Datos basicos del contribuyente via ws_sr_padron_a10. Incluye: datos generales, dependencia y domicilios.
72
+ Datos básicos vía ws_sr_padron_a10: datos generales, dependencia y domicilios.
71
73
 
72
- ### getParametros(collection: string): Promise<ParameterRecord[]>
73
- Tablas de parametros via ws_sr_padron_a100 (getParameterCollectionByName). id, descripcion and attribute values are returned exactly as sent by ARCA (xs:string: "10.50" stays "10.50"). Throws ArcaPadronError if parameterCollection is missing; an empty collection returns []. CollectionName enum (manual A100 v2.1): PROVINCIA (SUPA.E_PROVINCIA), TIPO_DOCUMENTO (SUPA.TIPO_DOCUMENTO), TIPO_DOMICILIO (SUPA.TIPO_DOMICILIO), TIPO_CLAVE (SUPA.TIPO_CLAVE_IDENTIFICACION), 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 (E_SEXO), CALLE (PUC_PARAM.T_CALLE), LOCALIDAD (PUC_PARAM.T_LOCALIDAD), AUTONOMO_MONOTRIBUTO (SUPA.E_AUTONOMO_MONOTRIBUTO), REGIMEN (SUPA.E_REGIMEN), TIPO_REGIMEN (SUPA.TIPO_REGIMEN), CARACTERIZACION (SUPA.E_CARACTERIZACION), TIPO_ARCHIVO (SUPA.TIPO_ARCHIVO), ACTIVIDAD_RUBRO (SUPA.A_ACTIVIDAD_RUBRO), RUBRO_ACTIVIDAD (SUPA.E_RUBRO_ACTIVIDAD), ACTIVIDAD_OCUPACIONAL (SUPA.E_ACTIVIDAD_OCUPACIONAL).
74
+ ### getParametros(collection: string): Promise<ListaPadron<ParameterRecord>>
75
+ Tablas de parámetros vía ws_sr_padron_a100 (`getParameterCollectionByName`). id, descripcion y los value de los atributos vuelven tal cual los envía ARCA (xs:string: "10.50" sigue siendo "10.50"). Lanza ArcaPadronError si falta parameterCollection; una colección vacía devuelve []; un nombre vacío lanza ArcaValidationError. Enum CollectionName (manual A100 v2.1): PROVINCIA (SUPA.E_PROVINCIA), TIPO_DOCUMENTO, TIPO_DOMICILIO, TIPO_CLAVE (SUPA.TIPO_CLAVE_IDENTIFICACION), 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 (E_SEXO), CALLE (PUC_PARAM.T_CALLE), LOCALIDAD (PUC_PARAM.T_LOCALIDAD), AUTONOMO_MONOTRIBUTO, REGIMEN, TIPO_REGIMEN, CARACTERIZACION, TIPO_ARCHIVO, ACTIVIDAD_RUBRO, RUBRO_ACTIVIDAD, ACTIVIDAD_OCUPACIONAL.
74
76
 
75
77
  ### status(): Promise<PadronStatus>
76
- Health check (dummy) of a5, a4, a10, a13, a100 in parallel. Each value is `ServiceStatus` from arca-common (`{ ok: true, status: ServerStatus } | { ok: false, error: Error }`): `if (s.a4.ok) s.a4.status.appserver`. No authentication.
78
+ `dummy` de a5, a4, a10, a13 y a100 en paralelo, sin autenticación. Cada valor es un `ServiceStatus` de arca-common: `{ ok: true, status }` solo si los tres servidores (appserver, dbserver, authserver) están en "OK"; `{ ok: false, error, status }` si respondió con alguno en otro estado (ej: dbserver "ERROR"); `{ ok: false, error }` si no respondió. Los `dummy()` de bajo nivel devuelven el ServerStatus sin evaluar (usar `serverStatusOk` de arca-common).
79
+
80
+ ### metadata
81
+ Las personas traen `metadata?: { fechaHora?, servidor? }` de la respuesta. Las listas (`ListaPadron<T> = T[] & { metadata? }`) lo traen en `lista.metadata`, propiedad no enumerable del array.
77
82
 
78
83
  ## Tipos principales
79
84
 
85
+ Los xs:string y xs:long (CUIT, actividades, teléfonos, códigos postales) vuelven como string. Los xs:dateTime (fechaContratoSocial, fechaNacimiento, ffRelacion, metadata.fechaHora...) vuelven como el string que envía ARCA, sin convertir a Date. `TipoPersonaPadron = 'FISICA' | 'JURIDICA' | (string & {})`: el SDK no rechaza otro valor.
86
+
80
87
  ```typescript
81
88
  interface PersonaA4 {
82
89
  idPersona: string;
83
- tipoPersona: 'FISICA' | 'JURIDICA';
90
+ tipoPersona: TipoPersonaPadron;
84
91
  tipoClave?: string;
85
92
  estadoClave?: string;
86
93
  apellido?: string;
@@ -117,11 +124,12 @@ interface PersonaA4 {
117
124
  categoria?: CategoriaA4[];
118
125
  email?: EmailA4[];
119
126
  telefono?: TelefonoA4[];
127
+ metadata?: PadronMetadata;
120
128
  }
121
129
 
122
130
  interface PersonaA10 {
123
131
  idPersona: string;
124
- tipoPersona: 'FISICA' | 'JURIDICA';
132
+ tipoPersona: TipoPersonaPadron;
125
133
  tipoClave?: string;
126
134
  estadoClave?: string;
127
135
  nombre?: string;
@@ -134,17 +142,36 @@ interface PersonaA10 {
134
142
  dependencia?: DependenciaA10;
135
143
  claveInactivaAsociada?: string[];
136
144
  domicilio?: DomicilioA10[];
145
+ metadata?: PadronMetadata;
146
+ }
147
+
148
+ interface PersonaA13 {
149
+ idPersona: string;
150
+ tipoPersona: TipoPersonaPadron;
151
+ tipoClave?: string;
152
+ estadoClave?: string;
153
+ nombre?: string;
154
+ apellido?: string;
155
+ razonSocial?: string;
156
+ numeroDocumento?: string;
157
+ tipoDocumento?: string;
158
+ formaJuridica?: string;
159
+ mesCierre?: number;
160
+ fechaNacimiento?: string;
161
+ fechaFallecimiento?: string;
162
+ fechaContratoSocial?: string;
163
+ idActividadPrincipal?: string;
164
+ descripcionActividadPrincipal?: string;
165
+ periodoActividadPrincipal?: number;
166
+ claveInactivaAsociada?: string[];
167
+ domicilio?: DomicilioA13[];
168
+ metadata?: PadronMetadata;
137
169
  }
138
170
 
139
171
  interface ParameterRecord {
140
172
  id: string;
141
173
  descripcion: string;
142
- atributos?: ParameterAttribute[];
143
- }
144
-
145
- interface ParameterAttribute {
146
- name: string;
147
- value?: string; // exactly as sent by ARCA
174
+ atributos?: { name: string; value?: string }[]; // value tal cual lo envía ARCA
148
175
  }
149
176
 
150
177
  interface ServerStatus {
@@ -156,13 +183,13 @@ interface ServerStatus {
156
183
 
157
184
  ## Errores
158
185
 
159
- All extend ArcaError (from @ramiidv/arca-common), have a stable `code`, and instanceof works across duplicated package copies:
160
- - ArcaValidationError: invalid CUIT/document (no request sent)
161
- - ArcaAuthError: WSAA authentication failures
162
- - ArcaTicketVigenteError (extends ArcaAuthError): WSAA already issued a valid TA not available in memory/storage
163
- - ArcaPadronServiceError (extends ArcaServiceError): business errors. ARCA reports them as SOAP Faults; known texts are converted with a typed `reason`: 'inexistente' ("La Clave (CUIT/CUIL) consultada es inexistente", "No existe persona con ese Id"), 'inactiva' ("... se encuentra INACTIVA"), 'id_invalido' ("El Id de la persona no es valido"), 'no_autorizado' (token/sign/cuitRepresentada errors), 'otro'. `errors[0].msg` has ARCA's text, `cause` is the original ArcaSoapError. Never retried.
164
- - ArcaPadronError: ARCA response missing a mandatory element (e.g. personaReturn without persona).
165
- - ArcaSoapError: HTTP/transport errors, timeouts, aborts and unrecognized SOAP Faults (statusCode?, faultCode?, faultString?, uncertain, aborted).
186
+ Todos extienden ArcaError (de @ramiidv/arca-common), tienen un `code` estable e `instanceof` funciona aunque haya copias duplicadas del paquete:
187
+ - ArcaValidationError: CUIT/documento inválido (no se envió el request).
188
+ - ArcaAuthError: errores de autenticación WSAA.
189
+ - ArcaTicketVigenteError (extiende ArcaAuthError): WSAA ya emitió un TA vigente que no está en memoria ni en el storage.
190
+ - ArcaPadronServiceError (extiende ArcaServiceError): errores de negocio. ARCA los informa como SOAP Fault; los textos conocidos se convierten con un `reason` tipado: 'inexistente' ("La Clave (CUIT/CUIL) consultada es inexistente", "No existe persona con ese Id"; en la constancia también desde errorConstancia), 'inactiva' ("... se encuentra INACTIVA"), 'id_invalido' ("El Id de la persona no es valido"), '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 ..."), 'otro'. `errors[0].msg` tiene el texto de ARCA; `cause`, el ArcaSoapError original. Nunca se reintentan.
191
+ - ArcaPadronError: respuesta de ARCA sin un elemento obligatorio (ej: personaReturn sin persona).
192
+ - ArcaSoapError: errores HTTP/transporte, timeouts, cancelaciones y SOAP Faults no reconocidos (statusCode?, faultCode?, faultString?, uncertain, aborted).
166
193
 
167
194
  ```typescript
168
195
  import { ArcaPadronServiceError, ArcaSoapError, ArcaValidationError } from '@ramiidv/arca-padron';
@@ -170,33 +197,36 @@ import { ArcaPadronServiceError, ArcaSoapError, ArcaValidationError } from '@ram
170
197
  try {
171
198
  await padron.getPersona(cuit);
172
199
  } catch (error) {
173
- if (error instanceof ArcaValidationError) { /* bad CUIT */ }
174
- else if (error instanceof ArcaPadronServiceError && error.reason === 'inexistente') { /* CUIT does not exist */ }
175
- else if (error instanceof ArcaPadronServiceError) { /* other business error: error.reason, error.errors */ }
176
- else if (error instanceof ArcaSoapError) { /* HTTP/network error, error.statusCode */ }
200
+ if (error instanceof ArcaValidationError) { /* CUIT inválida */ }
201
+ else if (error instanceof ArcaPadronServiceError && error.reason === 'inexistente') { /* la CUIT no existe */ }
202
+ else if (error instanceof ArcaPadronServiceError) { /* otro error de negocio: error.reason, error.errors */ }
203
+ else if (error instanceof ArcaSoapError) { /* error HTTP/red: error.statusCode */ }
177
204
  }
178
205
  ```
179
206
 
180
207
  ## Eventos
181
208
 
182
- Discriminated union types: auth:login, auth:cache-hit (source: memory|storage), auth:clock-skew, auth:storage-error, request:start, request:end, request:retry, request:error.
209
+ Unión discriminada: auth:login, auth:cache-hit (source: memory|storage), auth:clock-skew, auth:storage-error, request:start, request:end, request:retry, request:error. Por `onEvent` o `padron.on(tipo, handler)`.
210
+
211
+ ## Entornos
212
+
213
+ Hosts: homologación `https://awshomo.afip.gov.ar`, producción `https://aws.afip.gov.ar` (rutas `/sr-padron/webservices/personaServiceA5|A4|A10|A13` y `/sr-parametros/webservices/parameterServiceA100`). El manual de la constancia v4.1 publica `awshomo.arca.gob.ar` / `aws.arca.gob.ar`; el SDK usa los `soap:address` de los WSDL oficiales (afip.gov.ar), que responden igual. Constante `ENDPOINTS`; se pueden sobrescribir con `endpoints`.
183
214
 
184
215
  ## Enums
185
216
 
186
- - Provincia (0-24, Argentine provinces)
217
+ - Provincia (0-24)
187
218
  - TipoDomicilio (FISCAL, LEGAL, REAL)
188
219
  - TipoPersona (FISICA, JURIDICA)
189
- - ImpuestoId (GANANCIAS_PH=11, MONOTRIBUTO=20, MONOTRIBUTO_AUTONOMO=21, IVA_RESPONSABLE_INSCRIPTO=30, BIENES_PERSONALES=180, EMPLEADOR=301, AUTONOMOS=308 — from ARCA manuals; GANANCIAS_PJ=10, IVA_EXENTO=32, IVA_NO_ALCANZADO=34 are not in the padron manuals). Social monotributo is identified by category, not by tax id.
190
- - DocTipo (numeric WSFEv1 document codes, from common): it is NOT the padron `tipoDocumento` string ("DNI", "LC"...).
191
- - CondicionIva (re-exported from @ramiidv/arca-common)
192
- - CollectionName (see getParametros)
220
+ - EstadoClave (ACTIVO, INACTIVO, LIMITADO)
221
+ - ImpuestoId (GANANCIAS_PH=11, MONOTRIBUTO=20, MONOTRIBUTO_AUTONOMO=21, IVA_RESPONSABLE_INSCRIPTO=30, BIENES_PERSONALES=180, EMPLEADOR=301, AUTONOMOS=308: de los manuales de ARCA; GANANCIAS_PJ=10, IVA_EXENTO=32, IVA_RESPONSABLE_NO_INSCRIPTO=33, IVA_NO_ALCANZADO=34 no figuran en los manuales del padrón). El monotributo social se identifica por categoría, no por id de impuesto.
222
+ - DocTipo (códigos numéricos de WSFEv1, de common): NO es el `tipoDocumento` string del padrón ("DNI", "LC"...).
223
+ - CondicionIva (reexportado de @ramiidv/arca-common)
224
+ - CollectionName (ver getParametros)
193
225
 
194
226
  ## Clientes de bajo nivel
195
227
 
196
- Accesibles como propiedades publicas: padron.wsaa, padron.a5 (constancia: getPersona, getPersonaList), padron.a4, padron.a10, padron.a13 (getPersona, getPersonaV2, getIdPersonaListByDocumento), padron.a100. They take `auth: { Token, Sign, CuitRepresentada }` as first argument.
228
+ Propiedades públicas: padron.wsaa, padron.a5 (constancia: getPersona, getPersonaList), padron.a4, padron.a10, padron.a13 (getPersona, getPersonaV2, getIdPersonaListByDocumento), padron.a100 (getParameterCollectionByName). Reciben `auth: WsAuth = { token, sign, cuitRepresentada }` como primer argumento.
197
229
 
198
- ## Utilidades exportadas
230
+ ## Deprecados
199
231
 
200
- - ensureArray<T>(value): T[] - normaliza single/array SOAP responses
201
- - parseXml(xml): Record<string, unknown> - parse XML with CUIT-safe options
202
- - buildXml(obj): string - build XML from object
232
+ `ensureArray`, `parseXml` y `buildXml` se siguen exportando por compatibilidad: importarlos de @ramiidv/arca-common. `BasePadronClient.soapOptions` y `.onEvent` (protected) no se usan.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ramiidv/arca-padron",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "TypeScript SDK para los web services de Padrón de ARCA (ex AFIP) - Constancia de Inscripción, A4, A10, A13 y A100",
5
5
  "author": "ramiidv",
6
6
  "license": "MIT",
@@ -56,6 +56,6 @@
56
56
  "node": ">=20.19.0"
57
57
  },
58
58
  "dependencies": {
59
- "@ramiidv/arca-common": "^0.6.0"
59
+ "@ramiidv/arca-common": "^0.7.0"
60
60
  }
61
61
  }