Manejo de errores
Todos los errores extiendenArcaError y exponen un code estable como
string.
facturas o desde facturas/errors. También
se exporta isArcaAuthenticationError(error) para ruteo con predicados. Los
errores de autenticación exponen solamente el código estable
ARCA_AUTHENTICATION_ERROR, un reason tipado, el servicio, la operación y un
código de proveedor seguro cuando está disponible. No se adjuntan los cuerpos
crudos del proveedor ni los valores de las credenciales.
ArcaInvalidSoapResponseError también expone service, operation,
endpointUrl, statusCode, contentType y una vista previa redactada del
cuerpo, para saber qué respondió en lugar de ARCA.
Guardar un error
toArcaSafeErrorMetadata(error) reduce cualquier error a lo que se puede
loguear o guardar: name, message, code y los campos tipados de cada clase:
Nunca incluye la causa, el stack, la respuesta cruda, la vista previa del
cuerpo, la URL del endpoint, los
issues ni el CAE. Es el mismo error que
trae lookup.kind === "failed" en un indeterminate.
Códigos de ArcaInputError
ArcaInputError se lanza antes de llamar a ARCA. Además del code, expone
field con el campo que falló y, cuando aplica, expected con lo que el SDK
esperaba. Con ARCA_INPUT_DATE_OUTSIDE_WINDOW trae también
window: { from, to }, las fechas que ARCA acepta ese día en YYYY-MM-DD.
Desde issue(), issueCreditNote() o issueDebitNote(), un ArcaInputError
garantiza que esa llamada no envió ningún pedido de autorización: ARCA no emitió
nada por ella. Pudo haber hecho consultas antes, como leer el comprobante
original de una nota, pero no reservó la idempotencyKey, así que corregís el
input y reintentás con la misma clave. La excepción es
ARCA_INPUT_IDEMPOTENCY_MISMATCH: esta llamada tampoco envió nada, pero la
clave ya pertenece a otra que sí pudo haber emitido.
ARCA_INPUT_RESERVATION_NOT_FOUND es distinto de
lookup.kind === "not_found", que significa que la reserva existe y ARCA
confirmó que su número está vacío.
Diagnóstico
coe.alreadyAuthenticated: el SDK deduplica los logins WSAA en vuelo y reusa los tickets válidos guardados en caché. En funciones serverless, procesos de cola o cualquier despliegue con varios procesos, configurá unstorepersistente para que un proceso nuevo reuse el TA que obtuvo otro. Elstoreguarda los tickets cifrados. El caché en memoria no se comparte entre procesos.dh key too small: los pedidos de producción de WSFE ya usan, donde hace falta, el nivel de seguridad anterior de OpenSSL. Si igual lo ves, confirmá que no estés salteando el transporte del SDK ni terminando TLS en otra capa.- Certificado vencido: reemplazá el certificado PEM por uno renovado que cumpla las mismas expectativas de clave privada, y redesplegá o reiniciá el proceso.
- Servicio no autorizado: tu certificado puede ser válido pero no estar
autorizado para el servicio o el entorno de destino. Revisá de nuevo la
configuración de WSASS / homologación para
testy las relaciones de servicio para producción. - WSFE
10015: en general significa que la combinaciónDocTipo/DocNroes inconsistente para ese tipo de comprobante y ese importe. Por ejemplo, la Factura B tiene reglas especiales de documento del receptor según el total. - WSFE
10016: el número de comprobante enviado enCbteDesdeno es el siguiente válido para ese punto de venta y ese tipo de comprobante, o la fecha no es válida.preview()eissue()rechazan antes, conArcaInputError, una fecha fuera de la ventana que acepta ARCA. Llamá agetNextVoucherNumber()inmediatamente antes de autorizar cuando tu numeración se pueda haber movido. Con clave de idempotencia,issue()consulta el número reservado: si ya lo ocupa otro comprobante el resultado esconflicty queda anotado en el store, y si el número está vacío sigue siendorejected.
- Que el certificado y la clave privada correspondan entre sí.
- Que el entorno sea el correcto (
testoproduction). - Que la autorización del servicio esté hecha para ese entorno.
- Que la combinación de tipo de comprobante, tipo de documento e importe sea válida.
- Que tu proceso no esté reusando supuestos viejos sobre el próximo número.