El sistema de dispensación y logística de medicamentos migrado de PostgreSQL 8.2 (2007) a PostgreSQL 18 y de PHP 5.6 a PHP 8.4 — con la versión original corriendo como referencia, la actualizada en paridad funcional, y la mejorada cumpliendo los requisitos del pliego DIGSA.
El código tal como está en el repositorio original (upstream), sin ningún arreglo, corriendo en el stack de su era (PHP 5.6). Es el punto de comparación honesto: con los datos reales de producción, hoy no logra pasar del login — los errores que se ven aquí son los que el código del repo produce tal cual.
La migración completa: base de datos PostgreSQL 8.2 → 18 (200 GB reales, restore verificado), PHP 5.6 → 8.4, dependencias actualizadas, y paridad funcional total con la operación histórica: 73/73 módulos y los 75 puntos del menú sin un solo fatal en ninguno de los dos stacks.
La versión de la oferta: sobre la base migrada, incorpora las capacidades exigidas por el Anexo 1 del pliego — API REST v1 documentada (OpenAPI), CIV con QR antifraude, y la ruta de trabajo para FHIR/RDA, RIPS 3.2, IA y el resto del checklist contractual.
Cronología de la modernización. Cada fase está documentada en el repositorio (docs/modernizacion/) con dictamen del comité de expertos (DBA, dirección de proyecto, programación senior, infraestructura) y evidencia de verificación.
Restore completo de producción (200 GB, 909 tablas con datos, rc=0). Incompatibilidades catalogadas y resueltas: OIDs, encoding LATIN1→UTF8 (la app sigue viendo Latin-1 vía client_encoding, sin mojibake), y los casts implícitos que PG 8.3 eliminó (int=varchar en funciones plpgsql, lpad(numeric)) corregidos con casts retro-compatibles.
Barrido mecánico con scripts propios basados en el tokenizer: 1.188 constructores PHP4 delegados, 2.380 offsets de llaves, 187 by-ref call-time, 903 claves bareword, 98 =& new, y los 3 bugs del framework que hoy rompen el repo original (incluido el fatal de modules.class.php:122). Lint limpio en 2.643 archivos.
adodb 4.91→5.22.12 (con legacy dual para el oráculo). nusoap rehabilitado en PHP 8 (shim php://input) con roundtrip SOAP verificado. FPDF 1.52→1.8.6 con render PDF probado en ambos stacks. jpgraph retirado (licencia QPL/comercial).
Simulación de los 73 módulos app y de los 75 items del árbol de menú con sesión autenticada en ambos contenedores: paridad total, cero diferencias, cero fatales. Diagnóstico de los módulos faltantes (deriva menú↔código de 2016) y rescate de 23 módulos desde la historia de git con compatibilización.
Sobre la versión mejorada: API REST v1 (Bearer, log de accesos, OpenAPI 3, solo consultas parametrizadas), CIV + QR antifraude (HMAC-SHA256, anti-reuso, bitácora inmutable), análisis DBA a fondo y saneo de vicios de código. El detalle y la validación de cada requisito, en el checklist ↓
Cada requisito con su estado, dónde se puede validar y la explicación detallada. Estados: CUMPLE PARCIAL EN DESARROLLO PENDIENTE NO-SW (no es software: va en la oferta/operación).
| Numeral | Requisito (Anexo 1) | Estado | Dónde validarlo |
|---|
Un manual por versión, con pantallazos reales capturados del sistema en ejecución y ayudas visuales. Se regeneran con cada hito.
Qué contiene el repo original, cómo se comporta con los datos reales (incluido el fatal del login) y por qué sirve de referencia de comparación.


La migración completa explicada para el usuario: acceso, menú, módulos verificados, qué cambió bajo el capó (BD y PHP) sin cambiar la operación.



Guía de lo nuevo: API REST v1 con ejemplos de consumo, y el flujo CIV+QR (emisión, verificación pública, dispensación anti-reuso) con evidencias.

