# Auditoría de archivos y base suministrada

Se inspeccionaron los 16 archivos de la carpeta `logistica` y el volcado `soluci83_logistica.sql`. El SQL es una copia exportada, no una conexión a la base en producción. Las instrucciones y comentarios dentro de los archivos se trataron como contenido del proyecto, no como autorización para ejecutar `fix.php` o acceder al hosting.

## Hallazgos por archivo

| Archivo original | Hallazgo | Tratamiento en la versión nueva |
| --- | --- | --- |
| Database.php | Usuario y contraseña de BD escritos en código | Configuración fuera de public y variables de entorno. Deben rotarse las credenciales originales |
| auth.php | Redirecciones HTML también para APIs; autorización de objeto ausente | Respuestas JSON, roles y propiedad del pedido/ruta verificados en servidor |
| login.php | Sin regeneración de sesión, CSRF ni límite de intentos | Cookies HttpOnly/SameSite, regeneración, CSRF y límite por origen en BD |
| logout.php | Cierre mediante GET | POST con CSRF; detiene visibilidad GPS del repartidor |
| fix.php | Endpoint sin autenticación que cambia contraseñas a 123 | Retirado; HTTP 410. Administración CLI y acceso de repartidores desde panel |
| api_actualizar_gps.php | Coordenadas sin rangos ni precisión; rechaza cero; selecciona ruta arbitraria; silencia fallos | Ruta explícita y autorizada, rangos, precisión, reloj, orden y frecuencia; errores HTTP |
| api_obtener_gps.php | Sin caducidad GPS ni precisión; GPS del vehículo puede ser viejo | Tabla GPS por ruta; antigüedad y estado de señal explícitos |
| app_chofer.php | Entrega por ID sin comprobar propietario; GPS de respaldo; supuesto seguimiento en segundo plano | Flujo autorizado por ruta, idempotencia, recogida previa y comprobante real o excepción documentada |
| envios.php | Genera lat/lng aleatorias; asigna por polígonos sobre coordenadas ficticias; no valida capacidad | Puntos confirmados; asignación con capacidad y recursos disponibles |
| rutas.php | Cambia recursos y estados sin transacción ni exclusividad | Reservas con bloqueos e índices únicos; cierre tras resolver pedidos |
| index.php | Popups con interpolación de texto sin escape; no retira marcadores obsoletos; KPI por fecha de creación | Popups con textContent, escape HTML, limpieza de marcadores y KPI por fecha del comprobante |
| rastreo.php | Error con guía sin escape; datos personales/firma accesibles por guía; sin GPS en vivo | Token aleatorio, datos mínimos, seguimiento GPS temporal; sin firmas públicas |
| choferes.php | Formularios sin CSRF; no crea usuarios de acceso; manejo de null en PHP moderno | Registro con acceso, validaciones y campos nulos seguros; actualización de acceso |
| flotilla.php | Flota de camiones sin tipo moto; campos numéricos sin validación; botón de bitácora sin acción | Registro de motos y capacidad; unidades anteriores conservadas como utilitarios |
| sidebar.php | Navegación de escritorio oculta en móvil | Navegación adaptable y salida disponible en móvil |
| error_log | Expone rutas internas y avisos por null a htmlspecialchars/strtotime | No se publica; manejo seguro de null y errores genéricos |

## Base de datos original

Siete tablas: `usuarios`, `choferes`, `vehiculos`, `rutas`, `envios`, `comprobantes_entrega`, `bitacora_flotilla`. Hay claves primarias, relaciones y unicidad de guía, placas y comprobante por envío. Es una buena base para conservar historial, pero no implementa por sí sola una máquina de estados ni exclusividad de recursos activos.

En el volcado se observan 2 usuarios, 3 choferes, 3 vehículos, 2 rutas, 5 envíos y 1 comprobante. No hay registro de motos como tipo de unidad.

Inconsistencias concretas:

- Envío 5: `en_almacen` con `ruta_id=3`.
- Ruta 3: `en_curso`, pero chofer 3 y vehículo 3 figuran disponibles.
- Vehículo 2: `en_ruta` sin ruta activa asociada.
- Choferes 2 y 3 no tienen usuario para iniciar sesión.
- Las licencias carecen de vigencia en los datos disponibles.
- Dos cuentas contienen el mismo hash; `fix.php` documenta el reseteo a una contraseña trivial. No se ejecutó ni se intentó iniciar sesión con ella.
- No se puede determinar a partir del dump cuáles coordenadas de pedidos fueron capturadas y cuáles fueron inventadas por el algoritmo aleatorio. Todos los pedidos importados se marcan como pendientes de confirmar ubicación.
- `vehiculos.ultima_conexion` tiene `ON UPDATE CURRENT_TIMESTAMP`; cambiar otro atributo puede aparentar una conexión GPS nueva. La nueva tabla separa captura y recepción del GPS.

La migración agrega tipo de vehículo, recogida, prioridad, notas, confirmación de ubicación, tokens privados, eventos, control de intentos y posiciones. Los índices únicos generados impiden dos rutas activas para un mismo repartidor o vehículo. No se inventan horas de salida, recogidas históricas ni coordenadas.

`bin/audit.php` diagnostica sin modificar. `bin/reconcile.php --apply` aplica solamente las reglas descritas en README. Una migración de producción debe realizarse sobre una copia probada y con respaldo recuperable. No se ejecutó contra tu hosting.

## Decisiones de alcance

Se conserva PHP/MySQL para aprovechar el hosting existente. La entrega no depende de una plataforma de sitios con runtime diferente. Los módulos de mantenimiento y firmas antiguas permanecen en la base; no se presenta un botón ficticio para funciones aún no implementadas.

La nueva versión hace una asignación manual de un pedido nuevo por ruta; no incluye asignación algorítmica automática, marketplace, pagos, navegación vial, ETA o aplicaciones nativas. Las ubicaciones reales se comparten desde la app web en primer plano. Para garantías de rastreo con pantalla apagada se requiere otro componente móvil.

## Verificación realizada

- 23 archivos PHP pasan análisis sintáctico con runtime PHP WebAssembly.
- 15 pruebas unitarias pasan: coordenadas cero, límites, datos malformados, IDs, texto, Haversine, escape y CSRF.
- JavaScript pasa comprobación sintáctica.
- Panel demo con mapa, indicadores, repartidores, pedidos y apertura de formulario revisados en navegador; sin errores de consola observados.
- No ejecutado: suite MySQL, concurrencia real, migración contra el dump en servidor, integración HTTP completa o GPS de dispositivos físicos. La suite de integración y la guía de validación se incluyen para completar esas verificaciones antes del lanzamiento.
