ARCA_ENVIRONMENT.
1. Credenciales de producción
Homologación y producción tienen certificados y puntos de venta propios. Nada de lo que habilitaste en el WSASS sirve en producción.- Generá la clave y el CSR de producción con
npx facturas init --cuit 20123456786 --env production, y seguí los pasos que imprime:Administración de Certificados Digitalespara el certificado yAdministrador de Relacionespara autorizarlo en Facturación Electrónica. Están en Habilitación en ARCA. - Habilitá un punto de venta de producción con el sistema de web services de
tu condición.
Comprobantes en líneano sirve. - Corré
npx facturas checkcon el par de producción. En producción, si ARCA no informa ningún punto de venta, la capa falla: no hay excepción como en homologación. - Guardá los PEM en el gestor de secretos de tu plataforma, nunca en el repositorio.
2. Configuración
ARCA_ENVIRONMENT=production. No hay valor por defecto, así que un entorno olvidado lanzaArcaConfigurationErroren vez de emitir en el lugar equivocado.- Dejá los logs en
warn, que es el nivel por defecto, o eninfo. Endebugel SDK loguea los requests SOAP, con los datos de cada comprobante. Está en Configuración. retriesreintenta solo fallas de transporte, nunca la autorización. Un valor distinto de cero no puede duplicar un comprobante.
3. Un store persistente y una clave por venta
Sinstore, un corte de conexión después del envío deja a tu aplicación sin
saber si ARCA emitió, y el reintento puede duplicar la factura.
- Configurá un
storepersistente y compartido por todos los procesos que emiten: Postgres, Redis, o archivos en un único servidor.createMemoryStore()no sobrevive a un reinicio y no sirve en producción. - Pasá
idempotencyKeyen cadaissue(),issueCreditNote()eissueDebitNote(). Usá el ID estable de la venta, nunca un UUID nuevo por intento, y sin CUIT, DNI ni otros datos personales. - No borres, no hagas vencer y no reescribas los registros de reserva. Guardan el número fiscal que un reintento tiene que consultar. Contienen datos fiscales y de clientes: restringí el acceso y protegé los backups.
- Con
withLock, el store coordina la numeración entre los procesos que lo comparten. No alcanza a otros sistemas que emitan en el mismo punto de venta. Un punto de venta propio para la aplicación evita ese caso.
4. Los cuatro resultados
issue() devuelve el resultado fiscal en vez de lanzarlo. Tu código tiene que
tratar los cuatro, y cada uno pide algo distinto:
Dentro de
indeterminate, lookup.kind dice por qué quedó abierto. Con
blocked, conciliá primero la clave que nombra by. Con superseded, emití
bajo una clave nueva. El resto de los casos está en
Emitir facturas.
Pasá un abortSignal, por ejemplo AbortSignal.timeout(20_000), para que una
llamada no quede colgada si ARCA no responde. Si corta después del envío, el
resultado es indeterminate y la reserva queda para recover().
Los errores de input y de configuración sí se lanzan, antes de escribir en
ARCA. Están en Errores.
5. Una prueba de humo
Antes de la primera venta real, emití una factura de ARS 1 conitems: [{ amount: 100 }] seguida de una nota de crédito total, con
all: true. Usá tu condición fiscal real en issuer.
En cada venta, preview(input) te muestra los importes sin hacer ninguna
llamada. Compará amounts.sentTotal con el total de tu venta antes de emitir.
6. Mantenimiento
- Vigilá el vencimiento del certificado.
npx facturas checkavisa cuando faltan menos de 30 días. Para renovarlo, generá un CSR nuevo connpx facturas inity repetí el alta en ARCA. - Fijá la versión exacta de
facturasy leé el changelog antes de actualizar. El paquete está antes de la versión 1.0. - Conservá los registros del store al actualizar. Cada uno lleva su versión, y el SDK los sigue leyendo.