Migración de la app PHP/MySQL a una pila moderna. La app PHP original se conserva en /legacy como referencia hasta validar paridad. El código nuevo vive en /backend (API) y /frontend (SPA); el esquema en /database.
- Node ≥ 20, npm
- MySQL/MariaDB con el esquema existente (
database/schema.sql+maestros.sql+catalogos.sql+municipios.sql+migracion_v2..v31) - (Opcional para PDF) Google Chrome o Edge instalado — el backend genera el PDF con el navegador del sistema vía
puppeteer-core; si no hay, sirve HTML imprimible.
cp backend/.env.example backend/.env # DB_*, JWT_SECRET, RNDC_*, COLA_ENVIO_HABILITADO=falseEl backend también lee el .env de la raíz como respaldo para DB/RNDC/COLA.
npm install # workspaces: instala backend + frontend
npm run seed:admin -- --email admin@tms.local --password "CAMBIA-ESTO" --nombre "Admin"
npm run dev # API en :4000, SPA (Vite) en :5173 con proxy /api- Roles:
admin/operador. El envío real al RNDC (drenar cola, registrar maestros) está restringido aadmin. - Interruptor de seguridad:
COLA_ENVIO_HABILITADO=false(por defecto) arma y previsualiza el XML pero no lo envía.
| Comando | Qué hace |
|---|---|
npm run dev |
Levanta API + SPA en paralelo |
npm run build |
Compila backend (tsc) y frontend (vite) |
npm run typecheck |
Typecheck de ambos |
npm test |
Tests del backend (paridad RNDC byte-a-byte + QR) |
npm run worker |
Drena la cola una vez (equivale a legacy/cron/retry_worker.php); prográmalo con cron/Task Scheduler |
npm run seed:admin |
Crea/actualiza el usuario admin |
/backend— Express +mysql2(sin ORM), módulos que portan 1:1 los repos PHP:rndc/(cliente SOAP, ISO-8859-1, con tests de paridad),modules/{auth,terceros,vehiculos,municipios,catalogos,empresa,solicitudes,cola,cumplido,pdf,stats,informe},queue/worker.ts./frontend— React 18 + Vite + Tailwind + Zustand + Recharts + Lucide. Componentes reutilizables portados delegacy/public/assets/js/app.js:Autocomplete(debounce 220ms),MapPicker(Leaflet + Nominatim),MunicipioAutocomplete, retenciones, autollenado vehículo→conductor./database— esquema, maestros, catálogos, municipios DANE y migraciones./legacy— app PHP original (front controller, repos PDO, vistas, cron, PDFs Dompdf).
npm testvalida que el XML/SOAP del cliente RNDC en TS es idéntico byte a byte al PHP (incluida la codificación ISO-8859-1) y que el texto del QR del manifiesto respeta el formato exacto.- Paridad sobre datos reales: se regeneraron los
payload_xmldecola_envios(creados por la app PHP) con elColaRepode Node → idénticos. - Flujo end-to-end: crear solicitud → confirmar despacho → revisar filas encoladas y su XML en Cola (
/cola, botón XML por fila) conCOLA_ENVIO_HABILITADO=false.
Para regenerar los fixtures de paridad RNDC:
php backend/test/gen_rndc_fixtures.php(usalegacy/src/Rndc/RndcClient.phpcomo fuente de verdad).