Migración Fortalecimiento
Todos los meses llega un padrón actualizado de beneficiarios de un programa social en planillas Excel, y hay que reflejarlo en la tabla beneficios_ciudadanos del municipio. Esta herramienta en Node.js hace esa migración.
Dicho así suena a script de una tarde. Lo que lo convierte en un proyecto es el contexto: es recurrente, los datos son personales y el resultado le cambia la vida a alguien. Si una corrida duplica registros o pisa el padrón con una planilla equivocada, la consecuencia no es un bug en un dashboard: es una persona que va a cobrar y no puede.
📊 Flujo
flowchart LR
X([Planillas .xlsx del mes]) --> D[src/data<br/>fuera del repositorio]
D --> CLI[CLI interactiva<br/>elegís el archivo]
CLI --> DM[DataMigrator<br/>transformación]
DM --> E[Entidades tipadas]
E --> DB[(beneficios_ciudadanos)]
DM --> LOG[Registro de la migración]🧩 Estructura
Separación por responsabilidad, no por comodidad: capa de conexión a base, entidades del dominio (el registro de migración y el beneficio ciudadano por separado), la lógica de transformación concentrada en DataMigrator, y un index que sólo orquesta. Las planillas se organizan en subdirectorios por tipo (formatted, fortalecimiento) y la CLI te hace elegir cuál correr, en vez de asumir.
Los datos no entran al repositorio
El Desafío: el insumo del proceso es un listado de personas reales con sus datos. En un proyecto donde las planillas viven al lado del código, tarde o temprano una entra a un commit — y una vez que entró al historial de git, sacarla es una cirugía.
La Resolución Defensiva:
src/dataestá excluido del repositorio por diseño, y no se versiona ni con un.gitkeepde ejemplo que invite a llenarlo.- Quien clona tiene que crear la estructura a mano. Es fricción deliberada: obliga a pensar dónde van los datos antes de tener dónde ponerlos.
- El repositorio queda portable —se puede compartir, revisar o publicar— sin arrastrar información de nadie.
Elegir, no adivinar
El Desafío: un proceso mensual que corre solo sobre "el archivo que esté en la carpeta" es una bomba: alcanza con que quede la planilla del mes pasado para reprocesarla en silencio.
La Resolución Defensiva: la interfaz es una CLI interactiva donde se elige explícitamente qué archivo se migra. Un paso manual, a propósito, en el único punto del proceso donde equivocarse sale caro.