@ramiidv/arca-agro 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +229 -202
  3. package/dist/arca-agro.d.ts +0 -5
  4. package/dist/arca-agro.d.ts.map +1 -1
  5. package/dist/arca-agro.js +0 -4
  6. package/dist/arca-agro.js.map +1 -1
  7. package/dist/constants.d.ts +20 -20
  8. package/dist/constants.d.ts.map +1 -1
  9. package/dist/cpe-client.d.ts +14 -2
  10. package/dist/cpe-client.d.ts.map +1 -1
  11. package/dist/cpe-client.js +60 -48
  12. package/dist/cpe-client.js.map +1 -1
  13. package/dist/cpe-schemas.d.ts +12 -0
  14. package/dist/cpe-schemas.d.ts.map +1 -1
  15. package/dist/cpe-schemas.js +16 -0
  16. package/dist/cpe-schemas.js.map +1 -1
  17. package/dist/cpe-types.d.ts +25 -6
  18. package/dist/cpe-types.d.ts.map +1 -1
  19. package/dist/errors.d.ts +30 -6
  20. package/dist/errors.d.ts.map +1 -1
  21. package/dist/errors.js +39 -11
  22. package/dist/errors.js.map +1 -1
  23. package/dist/index.d.ts +7 -6
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +3 -3
  26. package/dist/index.js.map +1 -1
  27. package/dist/internal.d.ts +49 -0
  28. package/dist/internal.d.ts.map +1 -0
  29. package/dist/internal.js +184 -0
  30. package/dist/internal.js.map +1 -0
  31. package/dist/lpg-client.d.ts +42 -6
  32. package/dist/lpg-client.d.ts.map +1 -1
  33. package/dist/lpg-client.js +130 -59
  34. package/dist/lpg-client.js.map +1 -1
  35. package/dist/lpg-schemas.d.ts +18 -0
  36. package/dist/lpg-schemas.d.ts.map +1 -1
  37. package/dist/lpg-schemas.js +227 -50
  38. package/dist/lpg-schemas.js.map +1 -1
  39. package/dist/lpg-types.d.ts +178 -11
  40. package/dist/lpg-types.d.ts.map +1 -1
  41. package/dist/schema.d.ts +7 -3
  42. package/dist/schema.d.ts.map +1 -1
  43. package/dist/schema.js +10 -5
  44. package/dist/schema.js.map +1 -1
  45. package/dist/types.d.ts +10 -2
  46. package/dist/types.d.ts.map +1 -1
  47. package/dist/validation.d.ts +17 -2
  48. package/dist/validation.d.ts.map +1 -1
  49. package/dist/validation.js +29 -2
  50. package/dist/validation.js.map +1 -1
  51. package/llms.txt +88 -62
  52. package/package.json +2 -2
package/llms.txt CHANGED
@@ -1,106 +1,132 @@
1
- # @ramiidv/arca-agro - Technical Reference (v0.3.0)
1
+ # @ramiidv/arca-agro
2
2
 
3
- ## Overview
3
+ > SDK en TypeScript para los web services agropecuarios SOAP de ARCA (ex AFIP), con autenticación WSAA automática (vía `@ramiidv/arca-common`): WSCPE (Carta de Porte Electrónica de granos, automotor y ferroviaria) y WSLPG (Liquidación Primaria de Granos, ajustes y certificación primaria `cg*`).
4
4
 
5
- TypeScript SDK for ARCA (Argentina's tax authority, formerly AFIP) agricultural SOAP web services, with automatic WSAA authentication (via @ramiidv/arca-common ^0.4.0).
5
+ WSCTG (Código de Trazabilidad de Granos) no está incluido: se derogó el 1/11/2021 (RG 5017/2021) y sus endpoints responden 404. El número de CTG lo devuelve WSCPE (`cabecera.nroCTG`).
6
6
 
7
- - WSCPE - Carta de Porte Electrónica (grain bill of lading; road "automotor" and rail "ferroviaria")
8
- - WSLPG - Liquidación Primaria de Granos (primary grain settlement) and certificación primaria (cg*)
7
+ ## Instalación
9
8
 
10
- WSCTG (Código de Trazabilidad de Granos) is NOT included: it was repealed on 2021-11-01 (RG 5017/2021) and its endpoints return 404. The CTG number is now returned by WSCPE (`cabecera.nroCTG`).
9
+ ```bash
10
+ npm install @ramiidv/arca-agro
11
+ ```
12
+
13
+ Requisitos: Node >= 20.19. Solo ESM; desde CommonJS se carga con `require()` (require(esm)). Depende de `@ramiidv/arca-common`. El certificado tiene que tener asociados los servicios `wscpe` y/o `wslpg` en WSAA.
11
14
 
12
- ## Architecture
15
+ ## Arquitectura
13
16
 
14
17
  ```
15
- ArcaAgro
16
- ├── .cpe → CpeClient (WSCPE) → WSAA service "wscpe"
17
- └── .lpg → LpgClient (WSLPG) → WSAA service "wslpg"
18
+ ArcaAgro (extiende ArcaSdkBase)
19
+ ├── .cpe → CpeClient (WSCPE) → servicio WSAA "wscpe"
20
+ └── .lpg → LpgClient (WSLPG) → servicio WSAA "wslpg"
18
21
  ```
19
22
 
20
- Sub-clients are only obtained from `ArcaAgro` (their classes are exported as types). Every public method takes an optional last argument `opts?: { signal?: AbortSignal }`.
23
+ Los sub-clientes solo se obtienen desde `ArcaAgro` (sus clases se exportan como tipos). Todo método público acepta un último argumento opcional `opts?: CallOptions` (`{ signal?: AbortSignal }`).
21
24
 
22
- ## Endpoints and namespaces
25
+ ## Configuración
23
26
 
24
- | Service | Testing | Production | Namespace |
25
- |---|---|---|---|
26
- | WSCPE | https://cpea-ws-qaext.afip.gob.ar/wscpe/services/soap | https://cpea-ws.afip.gob.ar/wscpe/services/soap | https://serviciosjava.afip.gob.ar/wscpe/ |
27
- | WSLPG | https://fwshomo.afip.gov.ar/wslpg/LpgService | https://serviciosjava.afip.gob.ar/wslpg/LpgService | http://serviciosjava.afip.gob.ar/wslpg/ (http!) |
27
+ `ArcaAgroConfig` extiende `ArcaSdkConfig` de `@ramiidv/arca-common`: `cuit` (number | string, se valida el dígito verificador), `cert`, `key`, `keyPassphrase?`, `production` (default false), `timeout` (30000), `retries` (1, solo consultas), `retryDelayMs` (1000), `tokenTTLMinutes` (720), `ticketStorage`, `clockOffsetMs`, `autoClockSkew`, `loginErrorCooldownMs`, `permanentErrorCooldownMs`, `fetch`, `legacyTls`, `onEvent`, `wsaa` (WsaaClient compartido, mismo entorno), `signal` (cancela todas las llamadas de la instancia), `endpoints?: { cpe?, lpg?, wsaa? }`.
28
28
 
29
- SOAP details (from the official WSDLs):
30
- - WSCPE: request element `<Op>Req` (capitalized operation, e.g. `AutorizarCPEAutomotorReq`), response `<Op>Resp` with a `respuesta` child; SOAPAction = namespace + operation; auth `{token, sign, cuitRepresentada}`; business errors in `respuesta.errores.error[]{codigo,descripcion}`.
31
- - WSLPG: request/response elements per WSDL (e.g. `liquidacionReq`/`liquidacionResp` → `liqReturn`); SOAPAction = namespace + operation; auth `{token, sign, cuit}`; errors in `errores.error[]` and `erroresFormato.error[]`; info in `eventos.evento[]`.
32
- - `dummy` (both): empty SOAP Body, no auth.
29
+ ```typescript
30
+ import fs from 'node:fs';
31
+ import { ArcaAgro, FileTicketStorage, TIPO_CPE } from '@ramiidv/arca-agro';
33
32
 
34
- ## Configuration (ArcaAgroConfig extends ArcaBaseConfig)
35
-
36
- cuit (number|string, validated with check digit), cert, key, production=false, timeout=30000, retries=1 (queries only), retryDelayMs=1000, tokenTTLMinutes=720, ticketStorage, clockOffsetMs, autoClockSkew, loginErrorCooldownMs, fetch, legacyTls, onEvent, endpoints?: { cpe?, lpg?, wsaa? }.
33
+ const agro = new ArcaAgro({
34
+ cuit: '20-12345678-6',
35
+ cert: fs.readFileSync('cert.pem', 'utf-8'),
36
+ key: fs.readFileSync('key.pem', 'utf-8'),
37
+ production: false,
38
+ ticketStorage: new FileTicketStorage('.arca-tickets'),
39
+ });
40
+ ```
37
41
 
38
42
  ## ArcaAgro
39
43
 
40
44
  - `cpe: CpeClient`, `lpg: LpgClient`
41
- - `status(opts?)` → `{ cpe: AgroServiceStatus, lpg: AgroServiceStatus }` where `AgroServiceStatus = { ok: true, status: ServerStatus } | { ok: false, error: Error }` (Promise.allSettled). `serverStatus()` is a @deprecated alias.
45
+ - `status(opts?)` → `{ cpe: AgroServiceStatus, lpg: AgroServiceStatus }`, donde `AgroServiceStatus = { ok: true, status } | { ok: false, error, status? }` (`statusOf` de common: la caída de un servicio no oculta el otro).
42
46
  - `clearAuthCache(): Promise<void>`
43
- - `on(type, handler)`, `off(type, handler)`
47
+ - `on(tipo, handler)`, `off(tipo, handler)`: eventos `auth:*` y `request:*`.
44
48
 
45
- ## CpeClient (agro.cpe)
49
+ ## Endpoints y namespaces
46
50
 
47
- Constants: `TIPO_CPE = { AUTOMOTOR: 74, FERROVIARIA: 75, AUTOMOTOR_FLETE_CORTO: 274 }`, `ESTADOS_CPE` (AC, AN, BR, CF, CN, CO, DE, RE, PA, AP, DD, PE, IN, PO).
51
+ | Servicio | Homologación | Producción | Namespace |
52
+ |---|---|---|---|
53
+ | WSCPE | https://cpea-ws-qaext.afip.gob.ar/wscpe/services/soap | https://cpea-ws.afip.gob.ar/wscpe/services/soap | https://serviciosjava.afip.gob.ar/wscpe/ |
54
+ | WSLPG | https://fwshomo.afip.gov.ar/wslpg/LpgService | https://serviciosjava.afip.gob.ar/wslpg/LpgService | http://serviciosjava.afip.gob.ar/wslpg/ (http) |
48
55
 
49
- Requests mirror the XSD (`solicitud` content). `CartaPorteId = { tipoCPE, sucursal, nroOrden }`.
56
+ Constantes: `CPE_ENDPOINTS`, `LPG_ENDPOINTS`, `CPE_NAMESPACE`, `LPG_NAMESPACE`, `WSAA_SERVICES`.
50
57
 
51
- Emissions (kind 'emision', never retried):
52
- - `autorizarCPEAutomotor(AutorizarCPEAutomotorParams)` → `CPEAutomotorDetalle` (requires `cabecera.nroCTG`)
53
- - params: `{ cabecera: {tipoCP, cuitSolicitante, sucursal, nroOrden}, origen: {operador?|productor?}, correspondeRetiroProductor, esSolicitanteCampo, retiroProductor?, intervinientes?, datosCarga: {codGrano, cosecha, semilla?, pesoBruto, pesoTara}, destino: {cuit, esDestinoCampo, codProvincia, codLocalidad, planta?}, destinatario: {cuit}, transporte: {cuitTransportista, dominio[], fechaHoraPartida, kmRecorrer, codigoTurno?, cuitChofer, tarifa?, cuitPagadorFlete, cuitIntermediarioFlete?, mercaderiaFumigada}, observaciones? }`
58
+ Detalles SOAP (de los WSDL oficiales):
59
+ - WSCPE: elemento de request `<Op>Req` (operación con mayúscula, ej: `AutorizarCPEAutomotorReq`) y de respuesta `<Op>Resp` con un hijo `respuesta` (excepción: `consultarRenspa` responde `ConsultarRenspaRes`). SOAPAction = namespace + operación. Auth `{ token, sign, cuitRepresentada }`. Errores en `respuesta.errores.error[]{codigo, descripcion}`.
60
+ - WSLPG: elementos según el WSDL (ej: `liquidacionReq`/`liquidacionResp` → `liqReturn`; `CgConsultarXNroOrdenReq` con mayúscula; `ajusteXCoeConsReq` → `ajusteXcoeConsResp`). SOAPAction = namespace + operación. Auth `{ token, sign, cuit }`. Errores en `errores.error[]` y `erroresFormato.error[]`; información en `eventos.evento[]`.
61
+ - `dummy` (ambos): Body vacío, sin auth.
62
+
63
+ ## CpeClient (agro.cpe)
64
+
65
+ Constantes: `TIPO_CPE = { AUTOMOTOR: 74, FERROVIARIA: 75, AUTOMOTOR_FLETE_CORTO: 274 }`, `ESTADOS_CPE`. Los requests replican el contenido de `solicitud` del XSD. `CartaPorteId = { tipoCPE, sucursal, nroOrden }`.
66
+
67
+ Emisiones (nunca se reintentan):
68
+ - `autorizarCPEAutomotor(AutorizarCPEAutomotorParams)` → `CPEAutomotorDetalle` (exige `cabecera.nroCTG`)
69
+ - params: `{ cabecera: { tipoCP, cuitSolicitante, sucursal, nroOrden }, origen: { operador? | productor? }, correspondeRetiroProductor, esSolicitanteCampo, retiroProductor?, intervinientes?, datosCarga: { codGrano, cosecha, semilla?, pesoBruto, pesoTara }, destino: { cuit, esDestinoCampo, codProvincia, codLocalidad, planta? }, destinatario: { cuit }, transporte: { cuitTransportista, dominio[], fechaHoraPartida, kmRecorrer, codigoTurno?, cuitChofer, tarifa?, cuitPagadorFlete, cuitIntermediarioFlete?, mercaderiaFumigada }, observaciones? }`
54
70
  - `autorizarCPEFerroviaria(AutorizarCPEFerroviariaParams)` → `CPEFerroviariaDetalle`
55
- - returning `CPEResultado { cabecera?, pdf?, metadata? }`: `editarCPEAutomotor`, `editarCPEConfirmadaAutomotor`, `confirmarArriboCPE`, `confirmacionDefinitivaCPEAutomotor`, `descargadoDestinoCPE`, `rechazoCPE`, `anularCPE`, `nuevoDestinoDestinatarioCPEAutomotor`, `regresoOrigenCPEAutomotor`, `desvioCPEAutomotor`, `informarContingencia`, `cerrarContingenciaCPE`, `editarCPEFerroviaria`, `editarCPEConfirmadaFerroviaria`, `confirmacionDefinitivaCPEFerroviaria`, `nuevoDestinoDestinatarioCPEFerroviaria`, `regresoOrigenCPEFerroviaria`, `desvioCPEFerroviaria`
71
+ - Devuelven `CPEResultado { cabecera?, pdf?, metadata?, advertencias? }`: `editarCPEAutomotor`, `editarCPEConfirmadaAutomotor`, `confirmarArriboCPE`, `confirmacionDefinitivaCPEAutomotor`, `descargadoDestinoCPE`, `rechazoCPE`, `anularCPE`, `nuevoDestinoDestinatarioCPEAutomotor`, `regresoOrigenCPEAutomotor`, `desvioCPEAutomotor`, `informarContingencia`, `cerrarContingenciaCPE`, `editarCPEFerroviaria`, `editarCPEConfirmadaFerroviaria`, `confirmacionDefinitivaCPEFerroviaria`, `nuevoDestinoDestinatarioCPEFerroviaria`, `regresoOrigenCPEFerroviaria`, `desvioCPEFerroviaria`
56
72
 
57
- Queries:
58
- - `consultarCPEAutomotor({cuitSolicitante?, cartaPorte? | nroCTG?})` → `CPEAutomotorDetalle`
73
+ Consultas (se reintentan; listas vacías → `[]`):
74
+ - `consultarCPEAutomotor({ cuitSolicitante?, cartaPorte? | nroCTG? })` → `CPEAutomotorDetalle`
59
75
  - `consultarCPEFerroviaria(...)` → `CPEFerroviariaDetalle`
60
76
  - `consultaCPEFerroviariaPorNroOperativo(nroOperativo)` → `OperativoFerroviarioCPE`
61
- - `consultarCPEPorDestino({planta, fechaPartidaDesde, fechaPartidaHasta, tipoCartaPorte?})` → `CPEResumen[]`
62
- - `consultarCPEPPendientesDeResolucion({perfil: 'S'|'D', planta?})` → `CPEResumen[]`
63
- - `consultarUltNroOrden(sucursal, tipoCPE)` → number (throws if missing)
64
- - `siguienteNroOrden(sucursal, tipoCPE)` → number (NOT atomic: concurrent callers get the same number)
65
- - `consultarProvincias()`, `consultarLocalidadesPorProvincia(codProvincia)`, `consultarTiposGrano()`, `consultarCategoriasSemillas()` → `CodigoDescripcion[]` (`codigo` is string)
77
+ - `consultarCPEPorDestino({ planta, fechaPartidaDesde, fechaPartidaHasta, tipoCartaPorte? })` → `CPEResumen[]`
78
+ - `consultarCPEPPendientesDeResolucion({ perfil: 'S' | 'D', planta? })` → `CPEResumen[]`
79
+ - `consultarUltNroOrden(sucursal, tipoCPE)` → number (lanza si falta)
80
+ - `siguienteNroOrden(sucursal, tipoCPE)` → number (NO es atómico: dos llamadas concurrentes obtienen el mismo número)
81
+ - `consultarProvincias()`, `consultarLocalidadesPorProvincia(codProvincia)`, `consultarTiposGrano()`, `consultarCategoriasSemillas()`, `consultarUnidadesMedida()` → `CodigoDescripcion[]` (`codigo` es string)
82
+ - `consultarTiposEmbalaje()` → `TipoEmbalajeCPE[]` (`{ codigo, descripcion, unidadMedida: CodigoDescripcion[] }`)
66
83
  - `consultarPlantas(cuit)` → `PlantaCPE[]`; `consultarLocalidadesProductor(cuit)` → `LocalidadProductorCPE[]`; `consultarVariedadesSemillas(codGrano?)` → `VariedadSemillaCPE[]`
84
+ - `consultarRenspa(cuit, codProvincia)` → `RenspaCPE[]` (`{ nroRenspa, descripcion }`)
85
+ - `consultarDomiciliosPorCUIT(cuit)` → `DomicilioCPE[]` (`{ tipo, orden, descripcion }`)
67
86
  - `dummy()` → ServerStatus
68
87
 
69
- Not supported: derivados granarios (DG, types 284-287), ductos, consultarRenspa, consultarDomiciliosPorCUIT, DG parametrics.
88
+ No implementado: el circuito de derivados granarios (CPE DG: `autorizarCPE*DG`, `aceptarEmision*DG`, `rechazarEmision*DG`, las variantes `*DG`/`*Ductos`/`*EmisionDestinoDG` de editar, confirmar, desviar, regresar, nuevo destino, anular, contingencia y descarga), `consultarCPE*DG`, `consultarCPEDuctos`, `consultarCPEDGPendienteActivacion`, `consultarCPEEmitidasDestinoDGPendientesActivacion`, `consultarDerivadosGranarios`, `consultarPlantasDG`.
70
89
 
71
90
  ## LpgClient (agro.lpg)
72
91
 
73
- Emissions:
74
- - `liquidacionAutorizar({ liquidacion: LiquidacionLpg, deducciones?, retenciones?, percepciones? })` → `{ autorizacion: LiquidacionAutorizadaLpg (coe: string), eventos }`
75
- - `liquidacionAnular(coe)` → `{ coe?, resultado, pdf?, eventos }`
92
+ Emisiones (nunca se reintentan):
93
+ - `liquidacionAutorizar({ liquidacion: LiquidacionLpg, deducciones?, retenciones?, percepciones? })` → `{ autorizacion: LiquidacionAutorizadaLpg (coe: string), eventos, advertencias? }`
94
+ - `liquidacionAnular(coe)` → `{ coe?, resultado?, pdf?, eventos }`; `resultado: 'R'` (rechazada) lanza `ArcaAgroServiceError`
76
95
  - `liquidacionAjustarUnificado({ ajusteBase, ajusteCredito?, ajusteDebito? })` → `{ ajusteUnificado (coe: string), eventos }`
77
- - `cgAutorizar(CgAutorizarParams)` → `{ autorizacion (coe: string), eventos }`
78
- - `cgSolicitarAnulacion(coe, {pdf?})`, `cgConfirmarAnulacion(coe, {pdf?})` → `{ estadoCertificado, pdf?, eventos }`
96
+ - `cgAutorizar(CgAutorizarParams)` → `{ autorizacion (coe: string), eventos }`. `cabecera.cuitCorredor` acepta `0` (sin corredor, `LpgCuit0Type`) o una CUIT válida.
97
+ - `cgSolicitarAnulacion(coe, { pdf? })`, `cgConfirmarAnulacion(coe, { pdf? })` → `{ estadoCertificado?, pdf?, eventos }`
79
98
 
80
- Queries:
81
- - `liquidacionXCoeConsultar(coe, {pdf?})`, `liquidacionXNroOrdenConsultar(ptoEmision, nroOrden)` → `{ liquidacion?, autorizacion, pdf?, eventos }`
99
+ Consultas:
100
+ - `liquidacionXCoeConsultar(coe, { pdf? })`, `liquidacionXNroOrdenConsultar(ptoEmision, nroOrden)` → `{ liquidacion?, autorizacion, pdf?, eventos }`
82
101
  - `liquidacionUltimoNroOrdenConsultar(ptoEmision)`, `cgConsultarUltimoNroOrden(ptoEmision)` → number
83
- - parametrics → `CodigoDescripcion[]`: `provinciasConsultar`, `localidadXProvinciaConsultar(codProvincia)`, `tipoOperacionXActividadConsultar(nroActLiquida)`, `puertoConsultar`, `tipoActividadConsultar`, `tipoActividadRepresentadoConsultar`, `tipoCertificadoDepositoConsultar`, `tipoRetencionConsultar`, `tipoDeduccionConsultar`, `tipoGranoConsultar`, `codigoGradoReferenciaConsultar`, `campaniasConsultar`; `codigoGradoEntregadoXTipoGranoConsultar(codGrano)` → `GradoEntregadoLpg[]`
102
+ - `liquidacionPorContratoConsultar({ nroContrato, cuitComprador, cuitVendedor, cuitCorredor?, codGrano })` → `string[]` (COEs)
103
+ - `ajusteXCoeConsultar(coe, { pdf? })`, `ajusteXNroOrdenConsultar(ptoEmision, nroOrden)`, `ajustePorContratoConsultar(nroContrato)` → `AjusteConsultaResultado { ajusteUnificado (coe), pdf?, eventos }`
104
+ - `cgConsultarXCoe(coe, { pdf? })`, `cgConsultarXNroOrden(ptoEmision, nroOrden)` → `CertificacionConsultaResultado { autorizacion (coe), cabecera?, primaria?, retiroTransferencia?, preexistente?, ..., pdf?, eventos }`
105
+ - `cgBuscarCtg(CgBuscarCtgParams)` → `CtgCertificableLpg[]`; `cgBuscarCertConSaldoDisponible(params)` → `CertificadoConSaldoLpg[]`
106
+ - Paramétricas → `CodigoDescripcion[]`: `provinciasConsultar`, `localidadXProvinciaConsultar(codProvincia)`, `tipoOperacionXActividadConsultar(nroActLiquida)`, `puertoConsultar`, `tipoActividadConsultar`, `tipoActividadRepresentadoConsultar`, `tipoCertificadoDepositoConsultar`, `tipoRetencionConsultar`, `tipoDeduccionConsultar`, `tipoGranoConsultar`, `codigoGradoReferenciaConsultar`, `campaniasConsultar`; `codigoGradoEntregadoXTipoGranoConsultar(codGrano)` → `GradoEntregadoLpg[]`
84
107
  - `dummy()`
85
108
 
86
- `LiquidacionLpg` (LpgLiquidacionBaseType, XSD order): ptoEmision, nroOrden, numeroContrato?, cuitComprador, nroActComprador, nroIngBrutoComprador, codTipoOperacion, esLiquidacionPropia?, esCanje?, codPuerto, desPuertoLocalidad?, codGrano, pesoNetoSinCertificado?, codLocalidadProcedenciaSinCertificado?, codProvProcedenciaSinCertificado?, cuitVendedor, nroIngBrutoVendedor, actuaCorredor?, liquidaCorredor, cuitCorredor?, comisionCorredor?, nroIngBrutoCorredor?, fechaPrecioOperacion, precioRefTn, codGradoRef?, codGradoEnt?, valGradoEnt?, factorEnt?, precioFleteTn, contProteico?, alicIvaOperacion?, campaniaPPal, codLocalidadProcedencia, codProvProcedencia, datosAdicionales?, certificados?[], opcionales?[].
109
+ No implementado: `lsg*` (liquidación secundaria), `lpgAutorizarAnticipo`, `lpgCancelarAnticipo`, `lpgAnularContraDocumento`, `liquidacionAjustarContrato`, `asociarLiquidacionAContrato`, `cgInformarCalidad`.
110
+
111
+ ## Validación
87
112
 
88
- Not supported: lsg*, anticipos, anulación contra documento, ajuste por contrato, cgBuscarCtg, cgBuscarCertConSaldoDisponible, cgConsultarXCoe/XNroOrden, cgInformarCalidad.
113
+ Todos los requests se validan localmente contra el XSD antes de enviarse (`ArcaValidationError` con todos los `details[]`): obligatorios, campos desconocidos, rangos/largos/enumeraciones, dígito verificador de CUIT, números finitos, decimales redondeados a `fractionDigits`, `xsd:date` (Date | AAAAMMDD | AAAA-MM-DD), `xsd:dateTime` (Date → hora de Argentina `-03:00`, o string ISO que se envía tal cual; el manual WSCPE muestra el formato sin zona horaria: para eso pasar el string sin zona). Exportados: `validateAutorizarCPEAutomotor`, `validateAutorizarCPEFerroviaria`, `validateEditarCPEAutomotor`, `validateEditarCPEFerroviaria`, `validateEditarCPEConfirmada`, `validateConfirmacionDefinitivaCPEAutomotor`, `validateConfirmacionDefinitivaCPEFerroviaria`, `validateLiquidacion`, `validateAjusteUnificado`, `validateCgAutorizar`.
89
114
 
90
- ## Validation
115
+ ## Errores
91
116
 
92
- All requests are validated locally against the XSD before sending (ArcaValidationError with all `details[]`): required fields, unknown fields, ranges/lengths/enums, CUIT check digit (validateCuit), finite numbers, decimals rounded to `fractionDigits`, `xsd:date` (Date | AAAAMMDD | AAAA-MM-DD → AAAA-MM-DD), `xsd:dateTime` (Date → Argentina time -03:00, or ISO string). Exported: `validateAutorizarCPEAutomotor`, `validateAutorizarCPEFerroviaria`, `validateLiquidacion`, `validateAjusteUnificado`.
117
+ - `ArcaValidationError`: datos inválidos (no se envía el request).
118
+ - `ArcaAgroServiceError extends ArcaServiceError`: errores de negocio de ARCA; `errors[]`, `service`, `method`, `response`, `uncertain`. Un `<error>` sin código cuenta como error; solo se ignora el código explícito `0`.
119
+ - `ArcaSoapError`: transporte/HTTP/SOAP Fault; `uncertain` en emisiones (no en Faults `Client`); `faultDetail` con el `<detail>`. `cpeFaultException(error)` devuelve el `Exception` de WSCPE (`uuid`, `timestamp`, `businessErrorId`, `exceptionDetails`, `serverName`).
120
+ - `ArcaAgroResponseError`: falta un dato imprescindible (nroCTG, coe, nroOrden) o una consulta no tiene la forma del XSD; `uncertain` en emisiones.
121
+ - `ArcaAuthError`, `ArcaTicketVigenteError`: WSAA.
93
122
 
94
- ## Errors
123
+ Errores admitidos: WSCPE 550 y WSLPG 1021 ("Error al generar el archivo pdf", operación Aceptada) no lanzan; el resultado viene sin `pdf` y con `advertencias: ServiceErrorDetail[]`. Si vienen junto con otro error, se lanza con todos.
95
124
 
96
- - `ArcaValidationError` - invalid input (no request sent)
97
- - `ArcaAgroServiceError extends ArcaServiceError` - ARCA business errors; `errors[]`, `service`, `method`, `response`
98
- - `ArcaSoapError` - transport/HTTP/SOAP Fault; `uncertain` for emissions
99
- - `ArcaAgroResponseError` - response missing a required datum (nroCTG, coe, nroOrden); `uncertain` for emissions
100
- - `ArcaAuthError`, `ArcaTicketVigenteError` - WSAA
125
+ `uncertain: true` en emisiones: `ArcaSoapError` (timeout, 5xx, Fault Server), `ArcaAgroResponseError` (sin identificador) o `ArcaAgroServiceError` cuando la respuesta trae errores y también el resultado (`cabecera.nroCTG`/`cabecera.estado` en WSCPE; `autorizacion.coe`, `ajusteUnificado.coe` o `resultado: 'A'` en WSLPG). En una emisión aceptada, un campo secundario con forma inválida se omite en lugar de lanzar.
101
126
 
102
- ## Recovering an uncertain emission
127
+ ## Recuperar una emisión incierta
103
128
 
104
- - CPE: `consultarUltNroOrden(sucursal, tipoCPE) >= nroOrden` → it was authorized; fetch it with `consultarCPEAutomotor({cartaPorte})`. Otherwise retry with the same nroOrden.
105
- - LPG: `liquidacionUltimoNroOrdenConsultar(ptoEmision)` + `liquidacionXNroOrdenConsultar`; for anular/ajuste use `liquidacionXCoeConsultar(coe)`.
106
- - CG: `cgConsultarUltimoNroOrden(ptoEmision)`.
129
+ - CPE: si `consultarUltNroOrden(sucursal, tipoCPE) < nroOrden`, no se emitió: reintentar con el mismo nroOrden. Si no, `consultarCPEAutomotor({ cartaPorte })` y comparar datos clave (destino, dominio, fechaHoraPartida) con lo enviado: otro proceso pudo haber usado el número.
130
+ - Liquidación: `liquidacionUltimoNroOrdenConsultar(ptoEmision)` + `liquidacionXNroOrdenConsultar`; anulación: `liquidacionXCoeConsultar(coe)` y mirar `autorizacion.estado`.
131
+ - Ajuste: el número de orden es el mismo contador que el de las liquidaciones: `liquidacionUltimoNroOrdenConsultar(ptoEmision)` + `ajusteXNroOrdenConsultar`.
132
+ - Certificación: `cgConsultarUltimoNroOrden(ptoEmision)` + `cgConsultarXNroOrden`; anulación: `cgConsultarXCoe(coe)`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ramiidv/arca-agro",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "SDK para servicios agropecuarios de ARCA (ex AFIP) - WSCPE (Carta de Porte Electrónica) y WSLPG (Liquidación Primaria de Granos)",
5
5
  "author": "ramiidv",
6
6
  "license": "MIT",
@@ -62,6 +62,6 @@
62
62
  "node": ">=20.19.0"
63
63
  },
64
64
  "dependencies": {
65
- "@ramiidv/arca-common": "^0.5.0"
65
+ "@ramiidv/arca-common": "^0.7.0"
66
66
  }
67
67
  }