← Volver a proyectos

ERP a medida para empresa de purificación de agua

Sistema ERP completo para Purifreze: inventario, contratos de servicio, cobranza y reportes operativos en una sola plataforma.

📅 2023 – Presente 🏢 Purifreze (Ecología y Plagas)
Angular Node.js MySQL TypeScript Express.js

Contexto / Problema

Purifreze, empresa de purificación de agua y control de plagas en Mérida, operaba con múltiples hojas de cálculo desconectadas para manejar inventario, contratos de clientes, rutas de servicio y cobranza. No había visibilidad centralizada del negocio y era imposible saber en tiempo real qué refacciones había, qué contratos vencían, o qué clientes tenían pagos pendientes.

El propietario tomaba decisiones con información de días de antigüedad, cruzando manualmente 4 archivos de Excel distintos. La facturación mensual tardaba 3 días completos porque requería consolidar datos de múltiples fuentes. El sistema de rutas de servicio existía solo en la cabeza del coordinador de operaciones — un riesgo operativo crítico para la continuidad del negocio.

Decisiones técnicas

Angular para el frontend — el proyecto inició cuando el equipo de PC Oriente tenía más experiencia en Angular que en React. Para un ERP de uso interno con formularios complejos, Angular’s reactive forms y el sistema de inyección de dependencias son una ventaja real: la validación reactiva de formularios de múltiples pasos es más ergonómica, y el DI facilita el testing de servicios de negocio de forma aislada.

MySQL por la naturaleza relacional de los datos (contratos → clientes → servicios → pagos) y la familiaridad del equipo con la tecnología. TypeScript en backend desde el inicio — la complejidad del modelo de datos hacía que el tipado estricto fuera indispensable para mantener la integridad de los datos a lo largo de múltiples módulos que comparten las mismas entidades.

La decisión más importante fue modelar los “contratos de servicio” correctamente desde el inicio: un contrato puede generar servicios recurrentes, cada servicio genera un cargo, y los cargos se consolidan en estados de cuenta mensuales. Esto requirió un schema bien normalizado con tablas separadas para contratos, servicios programados, servicios realizados, cargos y pagos.

Implementación destacada

Módulo de contratos y servicios recurrentes

El sistema genera automáticamente los servicios programados basado en la frecuencia del contrato (mensual, bimestral, trimestral). El operador ve una agenda de servicios pendientes por semana, puede confirmar la realización, agregar notas y fotos de evidencia, y marcar servicios con incidencias que requieren seguimiento.

El algoritmo de generación maneja casos edge importantes: contratos que inician a mitad de mes, servicios suspendidos temporalmente, y frecuencias personalizadas para clientes con volumen alto. Esta lógica está completamente cubierta por pruebas unitarias — fue la parte del sistema que más refactorizaciones requirió durante el desarrollo.

Módulo de cobranza

Los cargos generados por servicios se consolidan automáticamente al cierre de cada período. El módulo muestra antigüedad de saldo por cliente (0–30, 31–60, 61–90, +90 días), permite registrar pagos parciales con referencia de depósito, y genera estados de cuenta en PDF con el desglose completo de servicios y pagos del período.

Las alertas automáticas de vencimiento notifican al administrador 5 días antes del vencimiento de cada contrato, eliminando la necesidad de revisar manualmente la cartera cada semana.

Módulo de inventario

El control de refacciones (filtros, membranas, químicos de tratamiento) se integra directamente con el módulo de servicios: al confirmar un servicio, el técnico registra los materiales utilizados. El sistema detecta cuando el stock de un ítem cae por debajo del mínimo configurado y genera una alerta de reabastecimiento automática.

Resultado / impacto

El propietario pasó de no saber cuántos contratos activos tenía a tener visibilidad completa del negocio en tiempo real. La cobranza mejoró significativamente con las alertas de saldos vencidos. El tiempo de facturación mensual bajó de 3 días a 2 horas.

Un resultado inesperado: el módulo de inventario reveló que varios técnicos reportaban el uso de materiales que en realidad no estaban utilizando en campo. El sistema de registro hizo visible un problema que existía desde años antes y que representaba pérdidas económicas directas para la empresa.

Desafíos del desarrollo

El mayor desafío fue la migración de datos históricos. La empresa tenía 4 años de información en Excel que necesitaba importarse sin perder el historial de contratos y pagos. Desarrollé scripts de importación específicos para cada archivo, con validación y reporte de errores detallado, que el cliente pudo revisar y aprobar antes de ejecutar la migración final en producción.

Aprendizajes

Los ERPs a medida requieren tiempo extenso de análisis del proceso del negocio antes de escribir código. Las primeras semanas fueron reuniones para mapear exactamente cómo funciona la operación — no hay atajos en esa fase. El tiempo invertido en entender el negocio antes de diseñar el schema de base de datos redujo las migraciones de schema a menos de 5, cuando había proyectado inicialmente más de 15. Un schema bien pensado desde el inicio es la inversión más rentable en un proyecto ERP.