Pagos de compensación laboral. Byte4Bit. Arquitectura, construcción y despliegue del procesador ACH.

Audit1ACH

Diseñé, construí y desplegué el procesador de pagos ACH que cobra primas de compensación laboral generando y conciliando ficheros NACHA.

Rol
Arquitectura, build, deploy
Dominio
ACH, NACHA
Estilo
Hexagonal, DDD
IaC
Terraform
Perfil de GitHub Índice

El problema

Cobrar primas de seguro por ACH significa producir ficheros NACHA que un banco acepte, y después convivir con todo lo que vuelve días más tarde: devoluciones, rechazos, cambios de estado y la conciliación que nadie ve hasta que está mal. Un fichero malformado no es un error de validación: es dinero que no se movió.

Fui responsable de la arquitectura, la implementación y el despliegue del procesador. La capa de dominio no sabe nada de HTTP, de Mongo ni del bus de mensajes: la generación NACHA, el manejo de devoluciones y la conciliación son lógica pura detrás de puertos, con adaptadores para todo lo que cambia.

Node.jsTypeScriptHonoMongoDBMSSQLRedisPub/SubTerraform

El formato del fichero es lógica de dominio, no pegamento

La generación y el parseo NACHA viven en el dominio, testeables sin base de datos ni banco. Los adaptadores que mueven los ficheros se pueden cambiar sin tocar las reglas que los hacen válidos.

Las devoluciones son parte del diseño, no un añadido

Devoluciones, estado de transacción y cutover tienen cada uno su propio servicio, porque lo interesante de ACH no es el envío, son los días que vienen después.

Desplegado como código

El procesador viene con su propio Terraform y su build de contenedor, así que un entorno es un artefacto revisable y no un runbook que alguien recuerda.

Decisiones y el precio que pagué por ellas

Arquitectura hexagonal con el dominio en el centro

El núcleo procesa pagos, así que la estructura debería decirlo. Las dependencias apuntan hacia dentro, y la infraestructura depende de la lógica de negocio y no al revés.

Trade-off aceptado

Más indirección que una capa de servicios directa, y un equipo tiene que entender puertos y adaptadores antes de moverse rápido en el código.

Validar antes de que nada llegue al banco

Un fichero NACHA rechazado cuesta un ciclo de liquidación, así que la validación de esquema va delante de cada escritura y de cada fichero generado, no solo en el borde.

Trade-off aceptado

Más rechazo estricto en la frontera, y más trabajo para dejar pasar un caso legítimo pero inusual.

Asíncrono por mensajería, no por sondeo

Ingesta, procesamiento, devoluciones y conciliación son preocupaciones distintas que fallan por separado, así que hablan por un bus de mensajes con reintentos en lugar de una cadena síncrona larga.

Trade-off aceptado

Consistencia eventual que el producto tiene que expresar, e idempotencia que cada consumidor tiene que ganarse.