Saltar al contenido

Piura, Perú · full stack + datos · 2022—

Construyo el software sobre el que funcionan las empresas.

Desarrollador full stack e ingeniero de datos en Piura, Perú. Siete productos en producción —ERPs, planillas, comercio electrónico, facturación electrónica—, tres míos y vendidos por suscripción, cuatro construidos para clientes que pagaron por ellos. Todo lo de abajo tiene URL viva o repositorio público.

Daniel Morán Vílchez
500.000+
registros migrados sin cerrar un solo día
7
productos en producción con URL viva
50+
usuarios diarios en sistemas que mantengo
20+
módulos de negocio construidos y en servicio
02

Notas de ingeniería

Cuatro problemas
DestacadaSistemas vivos
Lenguaje
Python, sin dependencias
Servicio
FastAPI · jobs por fecha
Integración
bidireccional, los dos sistemas vivos
Resultado
500.000+ registros, 0 días de cierre
py-foxpro-engine ↗Leer el caso completo →

Escribir en tablas FoxPro que siguen abiertas

FoxPro sigue sosteniendo operaciones reales, y la aplicación está abierta en cada escritorio desde las ocho de la mañana. Mover ese histórico a cualquier sitio suele significar cerrar el negocio un fin de semana.

En vez de eso escribí un motor DBF en Python sin dependencias que habla el mismo protocolo de bloqueo que FoxPro: toma el rango de bytes exacto de la fila que toca, nunca el fichero, y escribe cada registro de una sola pasada, así que ningún lector concurrente ve media fila. La aplicación de siempre sigue trabajando y no se entera. Encima corre un servicio FastAPI que hace dos cosas distintas: migra por rango de fechas como un trabajo que se puede seguir, y responde consultas en vivo sin migrar nada — que es como recepción resuelve un paciente mientras cada caja escribe en ese mismo fichero.

Antes

Los datos no salían de la clínica. Vivían en la red local, atados a la aplicación que los escribía, y la única salida era un reporte en Excel.

Ahora

Los mismos datos son multiplataforma: tableros que se actualizan solos, un paciente resuelto desde una tableta en el mostrador, dispositivos que se comunican entre sí, y análisis que antes no se podía ni plantear.

Un backend de restaurante sin ORM

Mozaico es el repositorio con más commits que he escrito. El SQL se escribe a mano y vive junto a la consulta que sirve, con funciones PL/pgSQL en PostgreSQL para las operaciones que no se pueden partir. El estado de cada comanda viaja a las pantallas de salón y cocina por gorilla/websocket, así que un plato marcado como listo aparece donde hace falta sin recargar y sin sondear. El cliente es React 19 y TypeScript sobre Vite.

Dos diseños de IA, opuestos a propósito

AlmaZen responde sobre stock, ventas, márgenes y deuda con 29 herramientas de solo lectura, y cada herramienta tiene su propio permiso: al usuario que no puede ver márgenes no se le entrega la herramienta, así que la pregunta no tiene dónde resolverse. Master Color tiene un chatbot de ventas público sin ninguna herramienta —ve el catálogo y nada más, porque puede hablarle cualquiera en internet—. La misma tecnología con modelos de amenaza opuestos.

Dominios reguladossunat-comprobantes ↗

La parte que solo es difícil si estás aquí

Facturación electrónica peruana de punta a punta sobre Greenter: envío a SUNAT, tratamiento del CDR que vuelve, bajas y resúmenes. Al lado, las reglas de SIAGIE y MINEDU en educación, SUSALUD en salud, consultas a RENIEC y las tablas de ubigeo. Nada de esto es intelectualmente vistoso, y todo decide si el software sirve o no sirve.

03

En producción

Siete sistemas

Producto propio · suscripción

ERP multiempresa: inventario, compras, ventas, POS, facturación SUNAT, agente de IALaravel · Livewire · PostgreSQL · Gemini
Gestión de restaurantes con salón y cocina sincronizados por WebSocketsGo · Gin · sqlx · React 19 · PostgreSQL
Personal, asistencia, horarios y cálculo de planillasTypeScript · NestJS

Por encargo · cliente

Comercio electrónico, gestión de pedidos y app de soporte en campo con FlutterLaravel · Vue 3 · Flutter · AWS S3
Caja, comprobantes y padrón de alumnos con acceso por roles y auditoríaVue 3 · Firebase
Catálogo con carrito de cotización y panel, imágenes huérfanas limpiadas por triggersFirebase · Cloud Functions · Cloudflare Pages
Sitio institucional con despliegue continuo desde el repositorioFirebase Hosting · GitHub Actions
04

Trayectoria

Salud · 3+ años

2022 —

Desarrollador backend y analista de sistemas (full stack)

Clínica Santa Rosa · Sullana, Piura

Más de la mitad de mi semana es software clínico. Desde noviembre de 2022 construyo y mantengo los sistemas sobre los que funciona una clínica privada: la intranet que usa el personal todos los días, la gestión de seguros médicos y la capa de datos que saca el histórico de un sistema de los noventa. El código es de la clínica y no se publica — lo que sigue es la ingeniería.

2022 — 2024

Soporte TI

Soporte de hardware y software, y la mesa de cobranza de seguros y devoluciones. Aprendí el sistema desde el lado del negocio y no desde un documento de requisitos, que es de donde salieron todas las mejoras que propuse después. Primeras aplicaciones por iniciativa propia: una de tickets y una de citas médicas.

2024 —

El encargo cambia

Propuse el sistema de gestión de seguros médicos y se aprobó. Construido desacoplado del sistema heredado, con un migrador rudimentario —un visor de DBF y Python sobre Windows— que servía para cargas puntuales pero no para el día a día.

2025 —

La capa de datos

Un servidor Linux propio junto al Windows Server donde corren los sistemas de los noventa, con una carpeta compartida entre sistemas operativos en la misma red y dos salidas de red de proveedores distintos por redundancia. Encima, el motor DBF, el servicio que lo expone, y los endpoints que hoy consume otro desarrollador del equipo.

Sistemas bandera

Un motor propio que lee y escribe las tablas FoxPro de los noventa a nivel de byte, con bloqueo por rangos, y un servicio en FastAPI que dispara migraciones por rango de fechas, las sigue por su identificador y sirve los agregados. Más de 500.000 registros históricos llegaron a PostgreSQL sin cerrar la operación un solo día. No es una migración de una vez: es la capa de datos sobre la que funciona el área. Otro desarrollador del equipo consume sus endpoints desde el sistema heredado para construir sus propios tableros, la integración va en los dos sentidos —un ingreso registrado en el sistema antiguo aparece en la intranet, y al revés— y la historia clínica digital que se construye ahora se alimentará de aquí.Python · FastAPI · PostgreSQL · FoxPro · DBF · Alembicpy-foxpro-engine ↗
Una API central que orquesta admisiones, historias, recursos humanos y soporte informático en un solo sitio, con eventos en tiempo real por WebSockets para que las pantallas de admisión no se desincronicen. Estampa datos y firmas sobre plantillas PDF que ya existían, en vez de rehacerlas. El cliente es una SPA con calendario de turnos, lectura de códigos de barras desde la cámara del navegador y exportación de PDF y Excel en el propio cliente, para no cargar al servidor.Laravel 12 · Vue 3 · Reverb · JWT · MySQL
El ciclo completo del seguro: admisión, historia clínica, facturación, auditoría médica y liquidación, con acceso por roles que separa a auditores, facturadores y administración para que cada uno vea solo su etapa. Notificaciones en vivo por WebSockets, e importación y exportación masiva en Excel, que es de lo que vive de verdad este trabajo.Laravel 11 · Vue 3 · RBAC · Reverb · Docker
En construcción: un asistente conversacional que se lleve las llamadas repetidas de las líneas de la clínica. Python en el servidor, cliente en Vue, empaquetado en Docker. Es la tercera IA que meto dentro de un producto en vez de al lado — y la primera cuyos interlocutores son pacientes.Python · Vue 3 · Docker
05

Código abierto

Publicado entero

Los productos son privados porque se venden. Estas son las piezas que llevan la ingeniería y ninguna regla de negocio, publicadas enteras.

Lee y escribe tablas FoxPro (.dbf) de forma nativa, hablando el mismo protocolo de bloqueo por rangos que usa FoxPro: inserta y edita mientras la aplicación de los noventa sigue abierta en cada escritorio. Sin dependencias, sin ODBC y sin ejecutables de Windows. Su README dice sus límites por delante.

Packagist · MITsunat-comprobantes ↗

Utilidades de facturación electrónica para SUNAT, publicadas en Packagist como djasoft/sunat-comprobantes.

Python · MITnomenclador ↗

Renombra facturas PDF en masa. Lee el texto nativo y, si el PDF viene escaneado, recurre a OCR. Aplica las nomenclaturas que exige cada aseguradora.

La versión desacoplada de AlmaZen, publicada entera: API en Laravel y cliente en Vue 3, con licencia PolyForm Noncommercial.

06

Cómo trabajo

Seis pasos

No Scrum ni Kanban — eso lo escribe todo el mundo. Esto es a lo que se parece el trabajo de verdad cuando los sistemas que tocas no se pueden apagar.

01

Abrir lo que ya hay

Antes de proponer arquitectura abro el sistema que sostiene el negocio hoy: sus ficheros, sus binarios, las hojas de cálculo con las que se trabaja de verdad. Más de una vez lo que decidió el proyecto no estaba en la documentación, sino dentro de un .dbf que nadie había mirado. Listar ficheros no es auditarlos: hay que abrirlos.

02

Escribir las restricciones antes que las funcionalidades

Una lista de funcionalidades la entrega cualquiera. Lo que decide el diseño son las restricciones: que la operación no se puede detener, que el dato es de categoría sensible, que la pantalla de cocina es una tableta modesta sobre wifi compartido. Escritas primero, la arquitectura sale casi sola — y las restricciones que nadie mencionó aparecen en la primera semana en vez de en la última.

03

Un cambio por vez, verificado después

En sistemas que se usan todos los días, un lote grande no se depura: se revierte entero. Así que el plan concreto antes de ejecutar, y la comprobación del resultado después. Es más lento de contar y bastante más rápido cuando algo sale mal.

04

Respaldar antes de tocar lo irreversible

Antes de cualquier cosa que no se pueda deshacer, un respaldo — y el respaldo verificado contra el original, porque un respaldo sin verificar es una creencia, no un respaldo. Contener va también antes que embellecer: si algo está expuesto, se cierra primero y se documenta después. Tapar un problema no es arreglarlo.

05

No romper lo que otro depende

Parte de lo que escribo lo consume el sistema de un compañero. Un endpoint que ya está en producción es un contrato: se amplía, no se le cambia la forma — y cuando hay que cambiarlo, se avisa antes y se comprueba después. Cuesta una conversación de más el primer día y ahorra la llamada del segundo.

06

Sacar fuera la parte reutilizable

Cuando una pieza lleva valor técnico y ninguna regla de negocio, la extraigo, la despojo y la publico. Al cliente le queda su producto; a mí, código ya probado en producción. Los paquetes de aquí arriba salieron así — y extraer uno de ellos sacó a la luz dos defectos de corrección que llevaban años escondidos.

Y las decisiones se escriben, incluidas las que salieron mal: este sitio lleva su propio registro ↗

07

Stack

Con lo que trabajo
Backend
Go · Gin · sqlx · PHP · Laravel · TypeScript · NestJS · Python · FastAPI
Frontend
React 19 · Vue 3 · Livewire · Astro · Tailwind
Datos
PostgreSQL · PL/pgSQL · Firestore · FoxPro · DBF · ETL
Móvil
Flutter
Infraestructura
Firebase · Cloudflare Pages · AWS S3 · GitHub Actions · WebSockets
08

Contacto

Disponible

Abierto a puestos de ingeniería y a consultoría sobre integración con sistemas heredados, dominios regulados peruanos, o meter un LLM dentro de un producto sin entregarle las llaves.