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.
recover() usa ARCA_INPUT_RESERVATION_NOT_FOUND cuando la clave no tiene una
reserva guardada. Ese código 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á unwsaaSessionStorepersistente para que un proceso nuevo reuse el TA que obtuvo otro. 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. 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.