Punto de partida
El problema
GEA es el sistema con el que Manuelita S.A. administra su cumplimiento legal: normas, obligaciones, responsables, evidencias, calificaciones y planes de acción. Funciona. Lleva años funcionando. Ese es, exactamente, el problema de este tipo de proyectos.
El sistema estaba escrito sobre Laravel 5.1, una versión sin soporte desde hace años y atada a versiones de PHP que los servidores modernos ya no ofrecen. Cada mes que pasaba, la ventana para actualizar se cerraba un poco más: menos hosting compatible, menos paquetes instalables, más superficie de vulnerabilidad sin parche disponible.
Y al mismo tiempo, nadie podía apagarlo. Los reportes de cumplimiento se entregan por semestre y no admiten pausa. Cualquier intervención tenía que hacerse sobre un sistema vivo.
La intervención
Lo que hicimos
- Actualización del framework de Laravel 5.1 a Laravel 11 sobre PHP 8.2, conservando PostgreSQL como motor de datos.
- Reemplazo de la cadena de compilación de assets por Vite, sin migrar el front-end a otro framework: Bootstrap 3 y jQuery siguen ahí, porque son los que la interfaz ya usa y cambiarlos habría significado rehacer todas las pantallas.
- Sustitución de formularios de página completa por modales cargados vía AJAX en los flujos de captura —evidencias, adjuntos, planes de acción, normas—, para eliminar el scroll y las recargas.
- Reportes exportables a Excel (PhpSpreadsheet) y PDF (dompdf) en formato carta, con gráficas generadas en el servidor.
- Trabajo en entregas pequeñas, una funcionalidad por vez, con el mínimo cambio posible al código existente.
Lo que quedó
El resultado
Un sistema sobre una versión de Laravel con soporte vigente, corriendo en PHP 8.2, con todos sus módulos en operación: normas, obligaciones, empresas, áreas, cargos, responsables, requerimientos ICLA y sociales, calificaciones, evidencias y planes de acción.
Los reportes de cumplimiento —consolidado, detallado, social, comparativo por empresa y comparativo por tema— salen en pantalla, en Excel y en PDF tamaño carta, listos para llevar a comité sin retrabajo.
Y el equipo de Manuelita no tuvo que aprender un sistema nuevo. La interfaz que conocían sigue siendo la misma; lo que cambió está debajo.
Dónde está la trampa
Por qué esto es difícil
La tentación en estos proyectos es reescribir. Es más cómodo empezar de cero que entender diez años de decisiones ajenas, y casi siempre termina en un proyecto de dos años que nunca alcanza la paridad funcional con lo que vino a reemplazar.
La dificultad real de una retoma no es técnica, es de disciplina: respetar patrones legacy que uno no habría escrito, resistir el impulso de «mejorar de paso» y aceptar que un controlador con el nombre en minúscula puede quedarse en minúscula, si renombrarlo no le aporta nada al cliente. Cada cambio que no se pidió es un riesgo que se le agrega a un sistema en producción.
Lo otro es la superficie invisible. En una aplicación de este tamaño, un salto de versión mayor de PHP toca consultas SQL, formatos de fecha, serialización de sesión, encriptación de parámetros y generación de PDF, todo a la vez. Actualizar no es correr composer update: es recorrer el sistema ruta por ruta y confirmar que cada flujo sigue llegando al mismo resultado que antes.
¿Se parece a lo que tienes sobre la mesa?
Cuéntanos el escenario y te decimos con franqueza si es un caso nuestro. Trabajamos también como subcontratistas, detrás de la marca de nuestros socios.
Hablemos