Blog
Software2024-08-3014 min

Facturación electrónica con ARCA/AFIP desde Next.js: una guía sin filtros

La documentación oficial de AFIP es incompleta, los SDKs de terceros están desactualizados y los errores no tienen mensajes claros. Esto es lo que aprendimos.

La realidad de integrar AFIP en 2024

Si estás buscando una integración limpia, bien documentada y con SDKs oficiales mantenidos, AFIP no es lo que esperás. La API de servicios web de AFIP es un sistema SOAP de los años 2000 con certificados digitales, ambientes de homologación separados, y errores que a veces no tienen descripción.

La arquitectura de servicios web de AFIP

Para facturación electrónica los servicios relevantes son WSAA (Web Service de Autenticación y Autorización) y WSFEv1. WSAA da tickets de acceso temporales que duran 12 horas. WSFEv1 recibe el XML con los datos de la factura y devuelve el CAE (Código de Autorización Electrónica).

El certificado digital: el primer obstáculo

Necesitás un certificado digital vinculado al CUIT del contribuyente. El proceso: generar un par de claves RSA con openssl, crear un CSR, subirlo al portal de AFIP, y esperar que AFIP emita el certificado. Guardamos el certificado y la clave como secrets en Coolify y los montamos como variables de entorno en formato PEM.

El plugin de arquitectura que elegimos

Implementamos la integración como un plugin independiente con una interface bien definida: emitirComprobante, consultarComprobante, obtenerUltimoComprobante. Internamente el plugin maneja la autenticación, el cache del token WSAA, la construcción del XML y la comunicación SOAP.

Lo que el XML de AFIP no te dice

El campo FchVtoPago es requerido para comprobantes clase B pero no para clase A. Los importes tienen que mandarse con exactamente dos decimales. El error 10016 aparece cuando hay un problema con el certificado de autenticación, no con fechas como dice la descripción.

Cache del token de WSAA

El token de WSAA dura 12 horas pero cada llamada tiene latencia de 300-800ms. Cacheamos el token en memoria: si vence en menos de 10 minutos, lo renovamos preventivamente. En producción, el primer comprobante emitido con un nuevo punto de venta tiene que ser número 1.