TruckRoute — Intelligent Fleet Solutions
Sistema desarrollado para
Tres Reyes · Aceitunas y Encurtidos
TruckRoute · Sistema Tres Reyes — Aceitunas y Encurtidos

Carpeta del Proyecto · Documentación

TruckRoute — Sistema de ruteo logístico para Tres Reyes

Documentación técnica, operativa y económica del proyecto. Sistema de software (backend + dashboard web) para calcular rutas óptimas, controlar la carga por camión y hacer seguimiento de los repartos de Tres Reyes — Aceitunas y Encurtidos, San Miguel, Buenos Aires.

Cliente: Roberto García · Tres Reyes — Aceitunas y Encurtidos, San Miguel  ·  Materia: Evaluación de Proyectos  ·  Docente: Prof. Pedaci, Lourdes  ·  Ciclo: 7mo Informática 2026 · Instituto Leonardo Murialdo

1Control de Cambios

Registro de las modificaciones sobre la documentación y el alcance del proyecto. Cada validación con Roberto que derive en un cambio de requerimiento se anota como fila nueva.

VersiónFechaResponsableDetalle del cambio
0.104/05/2026EquipoCierre de E01 - Definición de proyecto: entrevistas al cliente (20/4 y 27/4), análisis de resultados y primera presentación. Identificación del problema y árbol de causas (sección 2).
0.206/07/2026EquipoSegunda presentación (cierre de E02 - Mockup): flujo de carga de boletas, primer mock-up, despliegue inicial en InfinityFree (tres-reyes-logistica.page.gd).
0.325 al 28/08/2026D01 (Traverso)Migración de la geocodificación (Nominatim/OSM y luego LocationIQ) y de los mapas (Leaflet/OSRM) a las APIs de Google (Geocoding API + Maps JavaScript API). Impacto evaluado sobre ISW04 e ISW06 (sección 5.4).
0.406/09/2026PM (Varela)Cambios de alcance acordados con Roberto en la tercera entrevista (minuta 02, 10.2): unificación de zonas con el mismo camión, paradas visibles en el mapa de Tracking, botón "Agregar parada" a viaje activo, agrupación de boletas del mismo cliente y dirección en una sola parada, estado "En viaje" de los repartidores y baja del correo con código de seguridad al cliente que recibe la entrega.
0.509/2026D01 (Traverso) · D02 (Crupi)El orden de paradas pasa a calcularlo Google Routes API (optimizeWaypointOrder), en reemplazo de Nearest Neighbor + Haversine (ISW04b). Google Maps JavaScript API reemplaza a Leaflet en los tres mapas del sistema (Viajes pendientes, Tracking y mapa del repartidor). Se suman puntos de finalización configurables, boletas pospuestas y el panel mobile del admin (10.3).
0.622/09/2026EquipoCreación de las tablas posiciones y alertas_sistema con migracion_tracking.sql: el código de tracking y alertas ya existía, pero las tablas nunca se habían creado y los errores se descartaban en silencio. Desde esta fecha RF08 y RF09 funcionan en producción. Mapa de Tracking con pin fijo de fábrica, colores por viaje para varios repartidores simultáneos e íconos propios (5.6, 10.3).

2Diagnóstico: Árbol de Problemas y Soluciones

Diagnóstico original elaborado por el equipo a partir de la entrevista a Roberto García (Tres Reyes). A partir del problema central y sus causas se definieron las decisiones de diseño del sistema, y cada medio del árbol de soluciones dio origen a uno o más requerimientos funcionales (sección 5.1).

Cómo se lee el árbol
El árbol de problemas se lee de abajo hacia arriba: las causas producen el problema central, y el problema central produce los efectos. El árbol de soluciones es su espejo (cada causa se convierte en un medio, y cada efecto en un fin medible).
Causas
→ producen →
Problema central
→ produce →
Efectos

Problema central

Problema central
Tres Reyes no cuenta con un sistema que calcule y controle sus rutas de reparto de forma automática. La planificación es 100% manual: se arma con Google Maps y se coordina por WhatsApp, sin optimización ni trazabilidad.

Causas

Condiciones que producen el problema central. Cada una se relevó en la entrevista y se traduce después en un requerimiento concreto.

CausaQué se observó en el relevamiento
No hay ruteo automáticoLas rutas se arman a mano con Google Maps, sin ningún algoritmo que las optimice.
Coordinación por WhatsAppCada hoja de ruta se comunica al repartidor por mensaje, sin registro digital ni trazabilidad.
Sin agrupación por zonaLas boletas no se agrupan por cercanía antes de armar el recorrido.
Sin control de carga por camiónNo hay registro de cuántos kilos lleva cada camión en cada salida.
Sin visión global de los destinos del díaLas rutas se arman boleta por boleta, no con el conjunto completo del día.
No hay registro histórico ni trazabilidadNo existe ninguna serie de datos previa, así que no se puede comparar una salida con otra.
No hay alertasNingún mecanismo avisa si un camión se desvía o va sobrecargado.

Efectos

Consecuencias que el problema central produce hoy en Tres Reyes. Sus valores actuales son la línea de base contra la que se mide el proyecto.

EfectoCómo se manifiesta hoy (línea de base)
Dobles pasadas por el mismo puntoFrecuente: al hacer un envío, recién en el siguiente viaje se dan cuenta de que ya habían pasado por esa zona.
Combustible desperdiciadoSin medir, pero reconocido como "usamos más combustible del necesario".
Horas perdidas armando rutasAlto / sin medir: el armado manual consume horas del equipo cada día.
Riesgo de sobrecarga no detectadaSin registro: no se sabe cuánta carga lleva cada camión por viaje.
Dependencia de WhatsAppCoordinación manual, precaria, sin registro digital.

Árbol de soluciones

Objetivo central
Dar a Tres Reyes un sistema que calcule automáticamente la ruta óptima de cada camión, controle su carga y elimine la dependencia de Maps y WhatsApp.

Cada medio del árbol de soluciones neutraliza una causa identificada más arriba, y se convierte después en uno o varios requerimientos del sistema.

MedioCausa que neutraliza
Algoritmo de ruteo automático
Optimización del orden de paradas con Google Routes API.
No hay ruteo automático.
Hoja de ruta digital y notificación al repartidorCoordinación por WhatsApp.
Agrupación automática de destinos por zonaSin agrupación por zona.
Control de carga (kg) por camión y salidaSin control de carga por camión.
Vista de mapa con el recorrido planificado del díaSin visión global de los destinos del día.
Backend con base de datos de viajes y boletasNo hay registro histórico ni trazabilidad.
Alerta de sobrecarga y de desvío de rutaNo hay alertas.

Los fines son el espejo de los efectos: expresan a qué valor debería llegar cada uno con el sistema funcionando.

FinMeta verificablePunto de partida
Eliminar las rutas ineficientes0 rutas con doble pasada en los primeros 30 días.Frecuente
Reducir el combustible usadoReducción de distancia recorrida ≥ 15%.Sin medir
Automatizar el armado de rutasMenos de 2 minutos automáticos.Manual, horas
Controlar la carga por camión100% de las salidas con registro de kg.Sin registro
Dejar de depender de WhatsAppEl repartidor completa su jornada usando solo la app.Coordinación manual
Del árbol al resto del documento
Este diagnóstico es el que alimenta la línea de base y los OKRs del proyecto (4.6): los efectos aportan los valores de partida y los fines aportan los Key Results contra los que se evalúa el proyecto. Lo que el árbol identifica pero el sistema no resuelve en esta entrega queda declarado en las Limitaciones del alcance (5.1), y las mejoras se difieren a versiones posteriores en la Evolución previsible del sistema (4.6).

3Introducción

3.1. Propósito

El propósito del proyecto es reemplazar el método manual de planificación de repartos de Tres Reyes, que hoy se resuelve con Google Maps y coordinación por WhatsApp, por un sistema que calcule automáticamente la ruta óptima de cada camión, controle la carga por salida y le dé a Roberto García visibilidad real de la operación logística diaria.

TruckRoute busca resolver tres problemas medibles detectados en la entrevista (ver también el árbol de problemas, sección 2): el tiempo perdido armando rutas a mano, el combustible desperdiciado por rutas no optimizadas y las dobles pasadas por el mismo punto, y la falta de control de carga (kg) por camión y salida.

3.2. Alcance

El sistema incluye: importación y parseo automático de boletas en PDF, geocodificación de direcciones, agrupación de entregas por zona, cálculo de ruta óptima (Google Routes API con optimización del orden de paradas), generación de hoja de ruta digital, gestión del ciclo de vida del viaje (armar → confirmar → iniciar → finalizar), navegación GPS giro a giro para el repartidor, control de carga por camión, un panel de alertas y autenticación con roles diferenciados.

El sistema no incluye facturación ni gestión contable, gestión de stock o inventario, liquidación de sueldos, integración con sistemas de terceros ni soporte multiempresa en esta versión. El detalle completo está en las Limitaciones (dentro de 5.1) y se formaliza en el Contrato (sección 9).

3.3. Personal Involucrado

Roles del equipo de proyecto según el Gantt (6.1): PM/DUX (Varela), D01 (Traverso), D02 (Crupi), D03 (García), BD (Silva), más los encargados administrativos ADO01 (Gurschpon) y ADO02 (Rodríguez).

Project Manager + UX/UI
Varela, Joaquín

Rol doble desde el inicio del proyecto (01/04/2026): gestión, GANTT, control de cambios y OKRs, junto con el diseño de interfaz del dashboard y la validación de HCI con Roberto y Tomás.

Dev Backend · D01
Traverso, Lautaro

API REST propia en PHP: endpoints de boletas, viajes, configuración, tracking y alertas; lógica de estados del viaje e integración del servidor con las APIs de Google Cloud (Geocoding y Routes).

Dev Frontend/Backend · D02
Crupi, Gino

Módulos del panel, agrupación por zona, optimización de rutas con Google Routes API e integraciones externas.

Especialista en BD
Silva, Mateo

Modelo de datos (usuarios, repartidores, camiones, boletas, viajes, posiciones, alertas y puntos de finalización), migraciones, consultas SQL y backups.

Dev Frontend · D03
García, Facundo

Dashboard SPA en Vanilla JS, mapas interactivos con Google Maps JavaScript API y validación de interfaz con el usuario.

Encargado Administrativo · ADO01
Gurschpon

Documentación técnica, control de cambios y entregables del proyecto.

Encargado Administrativo · ADO02
Rodríguez

Gestión operativa y coordinación de entregas del equipo.

Cliente
Roberto García

Dueño de Tres Reyes — Aceitunas y Encurtidos. Valida requerimientos, prioriza y firma el contrato.

3.4. Definiciones, acrónimos y abreviaturas

TérminoDefinición
MVPMinimum Viable Product: versión mínima funcional del sistema, ya en producción para Tres Reyes.
SPASingle Page Application: el dashboard corre como una sola página (index.html) sin recargar el navegador.
API RESTInterfaz HTTP propia (sin framework) que expone boletas, viajes, configuración y alertas al frontend.
Google Geocoding APIServicio pago de Google Cloud (con cuota gratuita mensual) que convierte una dirección de texto en coordenadas. Reemplazó a Nominatim/OpenStreetMap y luego a LocationIQ en el sprint 5 (25–28/08/26).
Google Maps JavaScript APILibrería de Google Cloud que renderiza los tres mapas del sistema: Viajes pendientes, Tracking y el mapa del repartidor. Reemplazó a Leaflet+OSRM en todas las vistas.
Google Routes APIServicio de Google Cloud que calcula la ruta y, con optimizeWaypointOrder, el orden óptimo de las paradas de cada viaje. Reemplazó al cálculo local con Nearest Neighbor + Haversine.
Google Cloud BillingCuenta de facturación de Google Cloud, necesaria para habilitar las APIs de Geocoding y Maps aunque se use solo la cuota gratuita.
API KeyClave de acceso a las APIs de Google, restringida por dominio/IP para evitar uso indebido si se filtra en el frontend.
Nominatim / OSMServicio gratuito de geocodificación de OpenStreetMap usado en versiones iniciales del proyecto, reemplazado primero por LocationIQ y después por Google Geocoding API.
LocationIQServicio de geocodificación usado como paso intermedio entre Nominatim y Google Geocoding API.
LeafletLibrería open-source de mapas usada en las versiones iniciales del panel y de la navegación del repartidor, reemplazada por Google Maps JavaScript API.
OSRMOpen Source Routing Machine: motor de cálculo de rutas usado en versiones iniciales, reemplazado por las APIs de Google.
Nearest NeighborAlgoritmo de optimización que ordena las paradas eligiendo siempre el destino más cercano no visitado. Se usó en las primeras versiones del ruteo; hoy el orden lo calcula Google Routes API.
HaversineFórmula matemática para calcular la distancia entre dos coordenadas geográficas.
bcryptAlgoritmo de hash usado para almacenar contraseñas sin guardarlas en texto plano.
JWTJSON Web Token: mecanismo de sesión seguro pendiente de implementar (ver roadmap crítico, 4.6).
RF / RNFRequerimiento Funcional / Requerimiento No Funcional.
OKR / KRObjective and Key Results / Resultado Clave: métrica cuantitativa de progreso.
Línea de baseMedición de la situación inicial (antes del sistema), usada como referencia de comparación.

3.5. Referencias

Formato APA 7ª edición.

  • Pedaci, L. (2026). Evaluación de Proyectos - Módulo 01: El Proyecto y sus generalidades. Instituto Leonardo Murialdo.
  • Pedaci, L. (2026). Evaluación de Proyectos - Módulo 02: Fases de un Proyecto. Instituto Leonardo Murialdo.
  • Pedaci, L. (2026). Evaluación de Proyectos - Módulo de Documentación. Instituto Leonardo Murialdo.
  • Universidad Tecnológica Nacional. (2012). Buenas Prácticas para Proyectos Informáticos. edUTecNe. ISBN 978-987-1896-01-1.
  • Equipo N° 5. (2026). TruckRoute — MVP [Aplicación web]. tres-reyes-logistica.page.gd

3.6. Resumen Ejecutivo

TruckRoute es un sistema de software pensado para Tres Reyes — Aceitunas y Encurtidos (San Miguel, Buenos Aires): una empresa de distribución con más de 20 años en el rubro, 7 empleados y flota propia. El sistema reemplaza el método actual (Google Maps + WhatsApp) por un flujo digital: se cargan las boletas del día en PDF, el sistema geocodifica los destinos, agrupa por zona y calcula la ruta óptima para cada camión, respetando su capacidad de carga. El repartidor recibe la hoja de ruta y navega con GPS giro a giro; el administrador ve el estado de todos los viajes y recibe alertas de cierre.

Resultados esperados: eliminar las dobles pasadas por el mismo punto, reducir la distancia total recorrida en al menos un 15%, bajar el armado de rutas de un proceso manual a menos de 2 minutos automáticos, y que los repartidores dejen de depender de WhatsApp para coordinar su jornada.

4Descripción General

4.1. Perspectiva del producto

TruckRoute es un sistema nuevo: hoy Tres Reyes no tiene ningún sistema digital de ruteo, todo se resuelve con Google Maps y WhatsApp. No reemplaza un software existente ni es parte de un sistema mayor, aunque sí se apoya en infraestructura ya disponible: las PCs y celulares del equipo de Tres Reyes (Roberto usa iPhone, Tomás un dispositivo Android simple) y en las APIs de Google Cloud (Geocoding, Routes y Maps JavaScript).

Boletas PDF
→
Geocodificación (Google Geocoding API)
→
Backend PHP + MySQL
→
Dashboard Vanilla JS (Google Maps + GPS)

4.2. Funcionalidad del producto

  • Importar boletas en PDF y extraer automáticamente nombre, dirección y peso de cada una.
  • Convertir cada dirección en coordenadas y agruparlas por zona geográfica.
  • Calcular el orden óptimo de paradas para minimizar la distancia recorrida (Google Routes API), agrupando en una sola parada las boletas del mismo cliente con la misma dirección.
  • Generar la hoja de ruta digital de cada camión, sin armarla a mano.
  • Mostrar el recorrido en un mapa, con navegación GPS en tiempo real para el repartidor.
  • Al iniciar el viaje, tomar la ubicación actual del repartidor como punto de partida y abrir Google Maps directamente con la hoja de ruta completa cargada en el orden ya optimizado, lista para navegar.
  • Registrar los kilos asignados a cada camión por salida.
  • Avisar cuando un viaje se cierra, con el detalle de zona y camión de los últimos 7 días.

4.3. Características de los Usuarios Buenas Prácticas UTN p.56/57

Tipo de usuarioFormaciónActividades
Dueño / Administrador
Roberto García
Más de 20 años al frente de Tres Reyes. Dificultad visual: necesita fuente grande (mín. 18px). Usa iPhone y PC de escritorio. Acceso total: rutas, control de carga, reportes y configuración. Entrevistado en Abril 2026.
Administrador operativo
Facundo (equipo de Tres Reyes)
Nivel tecnológico 4/5, manejo fluido. Acceso total: puede crear, editar y eliminar rutas, clientes y configuraciones del sistema.
Repartidor
Tomás
Nivel tecnológico 3/5. Necesita una interfaz muy simple. Solo uso operativo en entrega: ve la hoja de ruta del día y marca entregas completadas. No puede modificar rutas ni ver datos de otros camiones.

4.4. Restricciones Buenas Prácticas UTN p.57

4.4.1. Políticas reguladoras

El sistema se desarrolla mayormente con software libre y de código abierto: PHP, MySQL/MariaDB, Vanilla JS, PDF.js. La excepción es la capa de mapas, geocodificación y ruteo, migrada a las APIs de Google Cloud (Geocoding API, Routes API y Maps JavaScript API) en el sprint 5: son servicios pagos con cuota gratuita mensual, que requieren una cuenta de Google Cloud con facturación habilitada (aunque el uso se mantenga dentro de la cuota gratuita). El hosting actual (InfinityFree) es un plan gratuito. El repositorio de las presentaciones está publicado en GitHub Pages.

4.4.2. Limitaciones de infraestructura

El backend corre sobre hosting compartido gratuito (InfinityFree, base de datos en sql113.infinityfree.com), sin servidor propio. No hay hardware dedicado: el sistema depende de los dispositivos que Tres Reyes ya tiene (PC administrativa, celular del repartidor).

4.4.3. Interfaces con otras aplicaciones

El sistema se integra con la Google Geocoding API para geocodificar direcciones, con la Google Routes API para optimizar el orden de las paradas, y con la Google Maps JavaScript API para los mapas del sistema (Viajes pendientes, Tracking y mapa del repartidor). La navegación giro a giro se delega a la app de Google Maps. Usa la Geolocation API del navegador para obtener la posición GPS real. Reemplaza a WhatsApp como canal de coordinación (RF07, pendiente de sprint).

4.4.4. Función de control

Autenticación con email y contraseña (bcrypt) y roles diferenciados: administrador y repartidor. El repartidor no puede modificar rutas ni ver datos de otros camiones (RNF04).

4.4.5. Requisitos del lenguaje

Toda la interfaz está en español, con tipografía de al menos 18px por la dificultad visual de Roberto (RNF02), y un flujo de uso autoevidente pensado para un nivel tecnológico medio (RNF05: aprendizaje en menos de 20 minutos).

4.4.6. Protocolos señalados

Comunicación frontend–backend por HTTP/REST (JSON). Geocodificación y mapas vía las APIs de Google Cloud, ambos por HTTPS con API Key. CORS habilitado en el backend.

4.4.7. Requisitos de fiabilidad

El algoritmo de ruteo debe responder en menos de 5 segundos para hasta 50 destinos por salida (RNF01). El repartidor puede consultar su hoja de ruta sin conexión una vez descargada (RNF03, offline parcial).

4.4.8. Credibilidad de la aplicación

El panel muestra en tiempo real las boletas cargadas, el peso total y la cantidad de direcciones geolocalizadas apenas se sube el PDF del día. Así el administrador ve al instante si alguna boleta no se pudo leer o geolocalizar.

4.4.9. Consideraciones de seguridad

Las contraseñas se almacenan con bcrypt (password_hash), nunca en texto plano. Hay pendientes críticos identificados por el propio equipo (ver 4.6): mover la contraseña de la base de datos a un archivo .env, reemplazar el sessionStorage por JWT o sesión segura, auditar el 100% de las consultas SQL con bind_param, y forzar HTTPS antes de producción real.

La recuperación de contraseña está limitada a la cuenta de administrador: el enlace se envía por correo (SMTP propio, mailer.php + recuperar.php) a una casilla fija del admin, sin exponer un campo de email a los demás usuarios.

Resuelto en el sprint 5, dos claves separadas: se separaron las API Keys en dos: (1) clave de servidor (Geocoding + Routes API), restringida por tipo de API, sin restricción de dominio porque la usa PHP, nunca el navegador; (2) clave de navegador (Maps JavaScript API), restringida por dominio HTTP referrer al dominio de producción en la consola de Google Cloud. Con esta configuración, aunque alguien copie la clave del frontend, solo puede usarla desde el dominio autorizado.

4.5. Suposiciones y dependencias

  • Se asume que el consumo de las APIs de Google (Geocoding, Routes y Maps JavaScript) se mantiene dentro de la cuota gratuita mensual; si el volumen de boletas crece, esto pasa a ser un costo real a presupuestar (ver Oferta Económica, sección 7).
  • El proyecto depende de que InfinityFree mantenga activo el hosting gratuito de backend y base de datos.
  • Se asume que los repartidores cuentan con datos móviles para usar la navegación GPS en tiempo real.
  • Roberto García mostró intención de seguir usando el sistema al ver el prototipo funcional (KR3 del Objetivo 5), lo que sostiene la viabilidad comercial del proyecto.

4.6. Evolución previsible del sistema

Próximos pasos del equipo, agrupados por urgencia.

Crítico, antes de producción:

  • Mover la contraseña de la base de datos (DB_PASS) a un archivo .env, nunca en el código fuente.
  • Reemplazar sessionStorage por autenticación JWT o sesión real con tokens HTTP-only.
  • Auditar y preparar el 100% de las consultas SQL con bind_param.
  • Forzar HTTPS en .htaccess antes de producción.

Importante, próximo sprint:

  • RF07 — Notificación al repartidor (reemplazo de WhatsApp) por push o SMS.
  • Caché de geocodificación, para no repetir direcciones ya resueltas.
  • RF10 — Completar el reporte de eficiencia: comparar tiempo real vs. estimado y km reales recorridos (la pantalla Reportes ya muestra km estimados, combustible estimado y duración del viaje).
Ya implementado:
  • RF06, alerta de sobrecarga: el panel bloquea la confirmación y muestra el porcentaje de carga vs. capacidad del camión.
  • RF08, alerta de desvío de ruta: la pantalla de "Alertas" muestra los metros de desvío, el camión y el repartidor en tiempo real.
  • RF09, tracking en tiempo real: mapa con pin fijo de la fábrica, posición GPS en vivo de cada camión, paradas numeradas en el orden óptimo de la ruta y marcador del punto de finalización (si se eligió uno). Los marcadores desaparecen a medida que se marcan entregas. Con varios repartidores en simultáneo, cada viaje usa un color propio en todos sus marcadores.
  • RF10 (parcial): la pantalla de Reportes muestra km estimados, consumo de combustible estimado (10 L/100 km) y duración de cada viaje.
  • Mapas 100% Google: Viajes pendientes, Tracking y el mapa del repartidor usan Google Maps JavaScript API; el orden de paradas lo calcula Google Routes API.
  • Agregar parada a viaje activo: el admin suma una boleta sin asignar a un viaje confirmado o en curso y la ruta se reoptimiza.
  • Paradas del mismo cliente agrupadas: dos boletas del mismo cliente con la misma dirección cuentan como una sola parada (un solo waypoint).
  • Boletas pospuestas: una sección propia para apartar boletas de un viaje armado y reasignarlas después.
  • API Keys separadas y restringidas: una clave de servidor (Geocoding + Routes, restringida por tipo de API) y una clave de navegador (Maps JavaScript, restringida por dominio HTTP referrer). Ver 4.4.9.
  • Unificación de zonas: al confirmar 2 o más zonas con el mismo camión, el sistema las fusiona en un solo viaje optimizado con una sola ruta de punta a punta.
  • Repartidores en viaje: el perfil del repartidor se marca como "No disponible / En viaje" mientras tiene un viaje confirmado o en curso.
  • Puntos de finalización configurables: el admin puede cargar destinos de llegada (nombre, dirección, CP) en Configuración; las rutas se calculan desde la fábrica hasta el destino elegido por viaje.
  • Panel mobile del admin: un menú hamburguesa con overlay para navegar todas las pantallas desde el celular.
  • Sin código de seguridad al cliente: por pedido de Roberto (minuta 02), el sistema ya no envía el correo con código de seguridad al cliente que recibe la entrega.

Nota: RF08 y RF09 quedaron operativos en producción el 22/09/2026, al crear las tablas posiciones y alertas_sistema con migracion_tracking.sql (ver 5.6). Antes de esa fecha el código existía, pero las tablas no, y los errores se descartaban en silencio.

Mejoras para iteraciones futuras:

  • App nativa (PWA o React Native) con soporte offline para el repartidor.
  • Dashboard de OKRs con métricas automáticas de adopción y ahorro.

Objetivos y Resultados Clave (OKRs)

ObjetivoResultados clave (KR)
1. Eliminar las rutas ineficientes y las dobles pasadas0 rutas con doble pasada en 30 días · Reducción de distancia recorrida ≥15%
2. Automatizar la planificación diariaArmado de ruta <2 min automáticos · 100% de hojas de ruta generadas por el sistema antes del primer envío
3. Dar visibilidad total sobre la operaciónRoberto ve la ubicación de todos los camiones en tiempo real · 100% de desvíos notificados en <3 min
4. Controlar la carga por camión100% de salidas con registro de kg · 0 casos de sobrecarga no detectada en 10 salidas de prueba
5. Adopción sin depender de WhatsAppRepartidor completa su jornada solo con la app · Aprendizaje ≤20 min con Tomás · Roberto declara intención de seguir usando el sistema

5Requisitos Específicos

5.1. Requerimientos funcionales Buenas Prácticas UTN p.59/60

IDRequerimientoPrioridadOrigen
RF01Generación automática de rutas por destinos. Calcula el recorrido más eficiente dado un conjunto de direcciones de entrega.Alta"Maps + WhatsApp para coordinar rutas"
RF02Generación de hoja de ruta digital. Produce la hoja ordenada y lista para cada repartidor, sin intervención manual.Alta"Armar las rutas nos lleva mucho tiempo"
RF03Vista de mapa con recorrido planificado y navegación externa a Google Maps. Paradas numeradas en orden óptimo sobre el mapa del panel; al presionar "Iniciar viaje", el sistema toma la ubicación GPS actual del repartidor como origen y abre la app de Google Maps con el destino y todas las paradas intermedias ya cargadas en el orden óptimo.Alta"Pasamos dos veces por el mismo lugar"
RF04Agrupación automática de destinos por zona. Elimina el backtracking al identificar zonas geográficas.Alta"Usamos más combustible del necesario"
RF05Control de carga (kg) por camión y salida. Registra los kilos de mercadería asignados a cada camión por viaje.Media"No sé cuántos kilos lleva cada camión"
RF06Alerta de sobrecarga o subutilización. Notifica cuando un camión supera su capacidad o queda muy por debajo del óptimo.Media ImplementadoExtensión de RF05
RF07Notificación de ruta al repartidor. Envío de la hoja de ruta al dispositivo del repartidor, reemplazando el WhatsApp actual.Alta"Es precario, quieren automatizarlo"
RF08Alerta de desvío de ruta. Avisa a Roberto cuando un repartidor no sigue la ruta optimizada prevista (implementada: muestra los metros de desvío, el camión y el repartidor).Alta ImplementadoControl de gestión
RF09Tracking en tiempo real de camiones. Panel con la ubicación en vivo de todos los camiones activos, sus paradas pendientes y el punto de finalización.Media ImplementadoVisibilidad de la operación (OKR 3)
RF10Reporte de eficiencia por ruta. Historial de km recorridos, tiempo real vs. estimado y estimación de combustible (hoy: km estimados, combustible y duración; falta la comparación real vs. estimado).Baja ParcialMedición de OKRs

Requerimientos no funcionales (RNF)

IDRequerimientoCategoría
RNF01Tiempo de respuesta del algoritmo ≤ 5 segundos para un máximo de 50 destinos por salida.Rendimiento
RNF02Fuente mínima de 18px, diseño legible en movimiento (dificultad visual de Roberto).HCI
RNF03Offline parcial: el repartidor consulta su hoja de ruta sin conexión una vez descargada.Conectividad
RNF04Aislamiento de permisos por perfil: el repartidor no modifica rutas ni ve otros camiones.Seguridad
RNF05Tiempo de aprendizaje ≤ 20 minutos para repartidores. Flujo autoevidente, sin manual.Usabilidad
RNF06Integración con Google Maps Platform (Geocoding API, Routes API y Maps JavaScript API) para cálculo y visualización sobre mapa real de Argentina.Plataforma

Limitaciones del alcance

Definen qué no hace el sistema en esta entrega. Se revisaron con Roberto antes de la firma del contrato (sección 9).

Qué NO hace en esta entregaPor qué
No gestiona facturación ni contabilidad.No fue solicitado; queda fuera del alcance funcional acordado.
No gestiona stock ni inventario.El foco del proyecto es el ruteo, no la gestión de mercadería en depósito.
No liquida sueldos.Es un proceso administrativo ajeno a la logística de reparto.
No se integra con sistemas de terceros en esta versión.Se prioriza primero la estabilidad del MVP propio.
No incluye CRM ni gestión avanzada de clientes.Los datos de cliente hoy solo sirven para geocodificar la entrega.
No soporta multiempresa.El sistema está diseñado y ajustado específicamente para la operación de Tres Reyes.

5.2. Interfaces de usuario Buenas Prácticas UTN p.58

El único punto de contacto de Roberto, Facundo y Tomás con el sistema es el dashboard web: una SPA en negro con acentos verdes, coherente con la identidad visual del sistema. Es responsive y usa fuente grande (mín. 18px, RNF02) por la dificultad visual de Roberto. El equipo pasó de la especificación de requerimientos a un MVP funcional en producción, y la interfaz se fue ajustando directamente sobre ese panel.

Interfaz real (Panel Admin): menú lateral con las secciones Boletas, Viajes pendientes, Viajes del día, Histórico de viajes, Tracking, Alertas, Reportes y Configuración. La pantalla de "Boletas del día" permite arrastrar un PDF o cargar manualmente, y muestra en vivo la cantidad de boletas cargadas, el peso total y cuántas direcciones fueron geolocalizadas. Capturas de cada pantalla disponibles en la Guía de Inicio Rápido.

5.2.1. Mockup inicial (pre-MVP)

Antes de arrancar con la base de datos real, el equipo construyó una primera versión básica de la interfaz para validar el flujo conceptual con el cliente. Era una maqueta funcional muy simple, sin base de datos ni autenticación, solo para confirmar que el flujo boletas → rutas → zonas era entendible para Roberto. A partir de la validación del 20/05/2026, la interfaz se iteró directamente sobre el MVP en producción (sin Figma), llegando al panel actual documentado en 5.2 y en la Guía de Inicio Rápido.

Mockup inicial — Panel de Rutas
Panel de Rutas — mockup pre-MVP (E02)
Mockup inicial — Gestión de Zonas
Gestión de Zonas — mockup pre-MVP (E02)
Nota de trazabilidad: este mockup tenía zonas predefinidas (Centro, Norte, Sur) con radios fijos. En el MVP final, las zonas se asignan automáticamente desde la geocodificación de cada boleta (Geocoding API + CP), y el radio fijo fue reemplazado por la agrupación por nombre de zona extraída directamente de la factura.

5.3. Interfaz de hardware

No aplica. TruckRoute es un proyecto 100% software: no incluye sensores, placas ni dispositivos propios. Se apoya en hardware que Tres Reyes ya posee (PC de escritorio, celulares de Roberto y del repartidor), sin requerir instalación física alguna.

5.4. Interfaces de software Buenas Prácticas UTN p.59

IDComponenteTecnología / StackRol en el sistema
ISW01Backend / API RESTPHP 8 sin framework. Endpoints: boletas, viajes, config, alertas, login. CORS habilitado.Lógica de negocio: agrupación por zona, llamada a Google Routes API para el orden de paradas, estados del viaje, tracking y alertas.
ISW02Base de datosMySQL / MariaDB en InfinityFree (sql113.infinityfree.com). Charset UTF-8 MB4.Persistencia central. 8 tablas: usuarios, repartidores, camiones, boletas, viajes, posiciones, alertas_sistema y puntos_finalizacion.
ISW03Dashboard (Frontend)Vanilla JS, SPA sin framework, un solo index.html. HTML5 + CSS3 responsive. Google Fonts Inter + DM Sans.Capa de presentación: estado en tiempo real, historial, alertas y configuración.
ISW04Mapas y ruteoGoogle Maps JavaScript API para la visualización de rutas, paradas y tracking en los tres mapas del sistema: Viajes pendientes, Tracking y mapa del repartidor (migrado desde Leaflet + OSRM). Handoff a la app de Google Maps (Directions URL con origin = geolocalización GPS del repartidor y waypoints en el orden óptimo calculado por Google Routes API) para la navegación giro a giro.Visualización en tiempo real del recorrido, paradas numeradas y ubicación GPS de cada camión (un color por viaje). Navegación GPS real delegada a la app de Google Maps al iniciar el viaje.
ISW04bOptimización de rutasGoogle Routes API (computeRoutes con optimizeWaypointOrder: true). Clave de servidor, restringida por tipo de API.Calcula el orden óptimo de las paradas al confirmar el viaje. Fábrica como origen; punto de finalización elegido (o última entrega si no se eligió ninguno) como destino.
ISW05Parseo de boletasPDF.js 3.11, ejecutado en el cliente.Extrae automáticamente nombre, dirección y peso de cada boleta cargada.
ISW06Geocodificación y mapasGoogle Geocoding API + Google Maps JavaScript API (migrado desde Nominatim/OSM, luego LocationIQ, y Leaflet + OSRM; sprint 5, 25–28/08/26).Convierte direcciones en coordenadas (servidor) y renderiza los mapas del sistema.
ISW07Autenticaciónbcrypt (password_hash).Login con email y contraseña, control de acceso por rol (admin / repartidor) y recuperación de contraseña del admin por correo. JWT pendiente (ver 4.6).

5.5. Interfaces de comunicación Buenas Prácticas UTN p.59

InterfazProtocolo / FormatoDetalle
Dashboard → BackendHTTP / REST (JSON)Endpoints para boletas, viajes, configuración, alertas y login.
Backend → Google Geocoding APIHTTPS + API KeyGeocodificación de direcciones de las boletas y de los puntos de finalización.
Backend → Google Routes APIHTTPS + API Key (servidor)Optimización del orden de paradas al confirmar un viaje o agregar una parada.
Dashboard → Google Maps JavaScript APIHTTPS + API KeyRenderizado de los mapas (Viajes pendientes, Tracking y mapa del repartidor) y armado del link de navegación externa.
Repartidor → App Google MapsIntent / URL SchemeAl "Iniciar viaje", el navegador redirige a la app de Google Maps con origen (GPS actual), destino y waypoints ya cargados.
Backend → Base de datosTCP / SQLConexión a MySQL/MariaDB en InfinityFree.
Navegador (repartidor) → Geolocation APIAPI del navegadorObtiene la posición GPS real del repartidor, que se envía periódicamente a tracking.php para el mapa de Tracking y la detección de desvíos.

5.6. Modelo Entidad-Relación de la base de datos

Modelo reconstruido a partir de las 8 tablas existentes en la base de datos (if0_42217493_base_datos, InfinityFree): usuarios, repartidores, camiones, boletas, viajes, posiciones, alertas_sistema y puntos_finalizacion.

Modelo validado en producción (septiembre 2026): las tablas y columnas de abajo reflejan el esquema real en uso en InfinityFree (if0_42217493_base_datos), incluyendo las migraciones aplicadas durante el desarrollo: migracion_zonas.sql, migracion_geo_aproximada.sql, migracion_dia_hora.sql, migracion_cp.sql, migracion_pospuesta.sql, migracion_destinos.sql y migracion_tracking.sql (22/09/2026, crea posiciones y alertas_sistema, que el código de tracking ya usaba pero nunca se habían creado).
USUARIOS
  • id · PK
  • nombre
  • usuario (único)
  • email (login)
  • password_hash
  • rol (admin/repartidor)
REPARTIDORES
  • id · PK
  • usuario_id · FK → USUARIOS
  • camion_id · FK → CAMIONES
CAMIONES
  • id · PK
  • patente (único)
  • capacidad_kg
  • marca, modelo
  • estado (disponible/en_viaje/mantenimiento)
VIAJES
  • id · PK
  • camion_id · FK (nullable)
  • repartidor_id · FK
  • destino_id · FK → PUNTOS_FIN. (nullable)
  • zona, fecha
  • estado (armado/confirmado/en_curso/finalizado)
  • peso_total, orden_paradas (JSON)
  • dia_salida, started_at, finished_at
BOLETAS
  • id · PK
  • viaje_id · FK (nullable)
  • cliente, direccion
  • lat, lon, cp, barrio, zona
  • peso_kg, geo_aproximada
  • estado (pendiente/asignada/entregada/pospuesta)
  • fecha_carga, entregada_at
POSICIONES
  • id · PK
  • viaje_id · FK
  • repartidor_id · FK
  • lat, lon, accuracy
  • timestamp
ALERTAS_SISTEMA
  • id · PK
  • viaje_id · FK (nullable)
  • repartidor_id · FK (nullable)
  • tipo (desvio/finalizacion/sobrecarga/subutilizacion)
  • mensaje, leida
  • timestamp
PUNTOS_FINALIZACIÓN
  • id · PK
  • nombre
  • calle, altura, localidad
  • provincia, cp
  • lat, lon, created_at
Entidades core (usuarios, flota, viajes) Datos de alto volumen (boletas, posiciones) Alertas / auxiliar

Relaciones

EntidadCard.EntidadSignificado
USUARIOS1 : 1REPARTIDORESCada repartidor tiene un usuario de login asociado.
CAMIONES1 : NVIAJESUn camión realiza muchos viajes a lo largo del tiempo.
REPARTIDORES1 : NVIAJESUn repartidor conduce muchos viajes.
VIAJES1 : NBOLETASUn viaje agrupa varias boletas (paradas) ya ordenadas.
VIAJES1 : NPOSICIONESUn viaje en curso genera muchos registros de posición GPS.
VIAJES1 : NALERTAS_SISTEMAUn viaje puede disparar varias alertas (sobrecarga, subutilización, desvío, finalización).
PUNTOS_FINALIZACIÓN1 : NVIAJESUn punto de finalización puede ser el destino de muchos viajes; si el viaje no tiene uno, termina en la última entrega.

Esquema relacional (MySQL / MariaDB)

Esquema alineado con el diagrama de arriba: tablas base más las columnas agregadas por las migraciones. Las tablas posiciones, alertas_sistema y puntos_finalizacion se transcriben tal cual de sus migraciones; en ellas las relaciones con viajes son lógicas (índices, sin restricción FK).

CREATE TABLE usuarios (
  id             INT AUTO_INCREMENT PRIMARY KEY,
  nombre         VARCHAR(80)  NOT NULL,
  usuario        VARCHAR(50)  NOT NULL UNIQUE,
  email          VARCHAR(120),              -- se usa para el login
  password_hash  VARCHAR(255) NOT NULL,
  rol            ENUM('admin','repartidor') NOT NULL DEFAULT 'repartidor'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE camiones (
  id             INT AUTO_INCREMENT PRIMARY KEY,
  patente        VARCHAR(10)  NOT NULL UNIQUE,
  capacidad_kg   DECIMAL(8,2) NOT NULL,
  marca          VARCHAR(50),
  modelo         VARCHAR(50),
  estado         ENUM('disponible','en_viaje','mantenimiento') NOT NULL DEFAULT 'disponible'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE repartidores (
  id             INT AUTO_INCREMENT PRIMARY KEY,
  usuario_id     INT UNIQUE,
  camion_id      INT NULL,
  FOREIGN KEY (usuario_id) REFERENCES usuarios(id),
  FOREIGN KEY (camion_id)  REFERENCES camiones(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- migracion_destinos.sql
CREATE TABLE IF NOT EXISTS puntos_finalizacion (
  id             INT AUTO_INCREMENT PRIMARY KEY,
  nombre         VARCHAR(100) NOT NULL,
  calle          VARCHAR(150) NOT NULL,
  altura         VARCHAR(20)  NOT NULL,
  localidad      VARCHAR(100) NOT NULL,
  provincia      VARCHAR(100) NOT NULL,
  cp             VARCHAR(15)  NULL,
  lat            DECIMAL(10,7) NULL,
  lon            DECIMAL(10,7) NULL,
  created_at     DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE viajes (
  id             INT AUTO_INCREMENT PRIMARY KEY,
  camion_id      INT NULL,                  -- nullable desde migracion_zonas.sql
  repartidor_id  INT,
  destino_id     INT NULL,                  -- migracion_destinos.sql
  zona           VARCHAR(60),
  estado         VARCHAR(20) NOT NULL DEFAULT 'armado',  -- armado / confirmado / en_curso / finalizado
  fecha          DATE NOT NULL,
  peso_total     DECIMAL(8,2),
  orden_paradas  JSON,
  dia_salida     DATE,                      -- migracion_dia_hora.sql
  started_at     DATETIME,
  finished_at    DATETIME,
  FOREIGN KEY (camion_id)     REFERENCES camiones(id),
  FOREIGN KEY (repartidor_id) REFERENCES repartidores(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE boletas (
  id             INT AUTO_INCREMENT PRIMARY KEY,
  viaje_id       INT NULL,
  cliente        VARCHAR(120),
  direccion      VARCHAR(160) NOT NULL,
  lat            DECIMAL(10,7),
  lon            DECIMAL(10,7),
  cp             VARCHAR(15),               -- migracion_cp.sql
  barrio         VARCHAR(80),
  zona           VARCHAR(60),               -- migracion_zonas.sql
  peso_kg        DECIMAL(8,2) NOT NULL,
  geo_aproximada TINYINT(1) DEFAULT 0,      -- migracion_geo_aproximada.sql
  estado         VARCHAR(20) NOT NULL DEFAULT 'pendiente',  -- pendiente / asignada / entregada / pospuesta
  fecha_carga    DATETIME DEFAULT CURRENT_TIMESTAMP,
  entregada_at   DATETIME,                  -- migracion_dia_hora.sql
  FOREIGN KEY (viaje_id) REFERENCES viajes(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- migracion_tracking.sql (22/09/2026)
CREATE TABLE IF NOT EXISTS posiciones (
  id             INT AUTO_INCREMENT PRIMARY KEY,
  viaje_id       INT NOT NULL,
  repartidor_id  INT NOT NULL,
  lat            DECIMAL(10,7) NOT NULL,
  lon            DECIMAL(10,7) NOT NULL,
  accuracy       FLOAT DEFAULT 0,
  timestamp      DATETIME DEFAULT CURRENT_TIMESTAMP,
  INDEX idx_viaje_id  (viaje_id),
  INDEX idx_timestamp (timestamp)
);

CREATE TABLE IF NOT EXISTS alertas_sistema (
  id             INT AUTO_INCREMENT PRIMARY KEY,
  tipo           VARCHAR(30)  NOT NULL,     -- desvio / finalizacion / sobrecarga / subutilizacion
  viaje_id       INT          NULL,
  repartidor_id  INT          NULL,
  mensaje        VARCHAR(500) NOT NULL,
  leida          TINYINT(1)   NOT NULL DEFAULT 0,
  timestamp      DATETIME     DEFAULT CURRENT_TIMESTAMP,
  INDEX idx_viaje_id  (viaje_id),
  INDEX idx_leida     (leida),
  INDEX idx_timestamp (timestamp)
);

5.7. Diagrama de flujo del proceso principal

Flujo de extremo a extremo del sistema: desde que Roberto carga las boletas del día hasta que el repartidor finaliza su turno y los datos quedan asentados.

ADMIN (Roberto) SISTEMA / BACKEND REPARTIDOR 1. Carga PDF / boleta manual Arrastra facturas al panel 2. Parser PDF.js + Geocoding API Extrae datos · obtiene lat/lon por CP 3. Agrupación por zona Por zona de la boleta (Geocoding + CP) 4. Elige camión + repartidor Revisa peso y punto de llegada ¿2+ zonas mismo camión? Sí → Fusionar en un solo viaje Las boletas de ambas zonas se unifican No 5. Confirma el viaje Elige punto de finalización → Google Routes API Optimiza orden de paradas · guarda en BD 6. Inicia viaje en su perfil App pide su GPS actual 7. Navega con Google Maps Entrega y marca c/parada ✓ 8. Tracking en tiempo real GPS → POSICIONES · alertas de desvío 9. Admin monitorea Ve mapa en vivo y alertas 10. Finaliza el viaje Marca llegada al punto final 11. Cierre automático estado=finalizado · alerta de cierre 12. Consulta histórico Viajes finalizados con fechas Acción del usuario Proceso del sistema / backend Decisión

6Oferta de Gestión

6.1. GANTT

Cronograma real de tareas, responsables y duración, organizado en 6 etapas. Inicio del proyecto: 01/04/2026 · Fin previsto: 17/10/2026 (148 días). Roles: PM/DUX (Varela), D01 (Traverso), D02 (Crupi), D03 (García), BD (Silva).

6.2. Equipo de proyecto Buenas Prácticas UTN p.62

Joaquín Varela
Joaquín Varela
PM / Diseñador UX·UI

Gestión temporal y de alcance, relación con el cliente, diseño de interfaz.

Mateo Silva
Mateo Silva
Administrador de Base de Datos (BD)

Modelo de datos, migraciones y consultas SQL en MySQL/MariaDB.

Traverso
Traverso
Desarrollador 01 — Backend

Servidor PHP, endpoints de la API e integración del servidor con las APIs de Google Cloud.

Crupi
Crupi
Desarrollador 02 — Frontend/Backend

Módulos del panel, integraciones externas y optimización de rutas.

García
García
Desarrollador 03 — Frontend

Dashboard SPA, mapas interactivos con Google Maps y validación de interfaz con el usuario.

Gurschpon
Gurschpon
Encargado Administrativo 01

Documentación técnica, control de cambios y entregables del proyecto.

Rodríguez
Rodríguez
Encargado Administrativo 02

Gestión operativa y coordinación de entregas del equipo.

Herramientas de gestión

Gestión de tareas

Google Sheets (GANTT y control de cambios), actualizado semana a semana.

Repositorio

GitHub Pages (presentaciones y documentación); código del MVP alojado en InfinityFree.

Diseño de interfaz

Iterada directamente en HTML/CSS sobre el MVP en producción, sin mockup previo en Figma (ver 5.2).

Comunicación interna

WhatsApp de equipo para coordinación diaria; reuniones presenciales para entrevistas con el cliente.

7Oferta Económica

La oferta económica toma como base la columna "Cantidad de trabajo en horas" del Gantt (6.1), que permite calcular las horas-hombre por rol una vez fijado el costo por hora. El stack propio (PHP, MySQL, Vanilla JS y PDF.js) es open-source, así que no hay costos de licencia, y el hosting en InfinityFree es gratuito. Los costos a considerar son las APIs de Google (Geocoding, Routes y Maps JavaScript), que hoy se usan dentro de la cuota gratuita mensual pero requieren facturación habilitada y pasan a tener costo si crece el volumen (ver 4.4.1), y un eventual servicio de SMS o push para RF07.

8Estimación Económica

Hoja de estimación de costos extraída directamente del Gantt del proyecto (6.1). Detalla rubros de horas-hombre por rol, herramientas y servicios externos.

9Contrato

Documento que explicita el acuerdo entre el equipo desarrollador y el cliente, Roberto García (Tres Reyes — Aceitunas y Encurtidos, San Miguel).

9.1. Objetivo del proyecto

Desarrollar y mantener TruckRoute, un sistema de ruteo logístico que calcula rutas óptimas, controla la carga por camión y hace seguimiento de los repartos de Tres Reyes, para eliminar el uso manual de Google Maps y WhatsApp.

9.2. Partes involucradas

Equipo desarrollador (integrantes y roles según 3.3) y cliente: Roberto García, dueño de Tres Reyes — Aceitunas y Encurtidos, San Miguel, Buenos Aires.

9.3. Alcance

Se entrega lo definido en 3.2 y 5 (RF01 a RF10, según prioridad). Queda fuera lo listado en las Limitaciones (5.1): facturación, stock, liquidación de sueldos, integración con terceros, CRM avanzado y soporte multiempresa.

9.4. Plazos

Fechas clave según el cronograma (6.1): inicio del proyecto el 01/04/2026; cierre de E01 y primera presentación el 04/05/2026; cierre de E02 y segunda presentación el 06/07/2026; cierre de E03 el 31/07/2026; tercera presentación el 25/09/2026; fin previsto del proyecto el 17/10/2026 (148 días).

9.5. Responsabilidades

El equipo: desarrollo, endurecimiento de seguridad, puesta en marcha y documentación. El cliente: validar requerimientos y prototipo, y proveer acceso a las boletas y a la operación diaria para las pruebas.

9.6. Criterios de aceptación

Se apoyan en los OKRs del proyecto (4.6): 0 rutas con doble pasada en los primeros 30 días, reducción de distancia recorrida ≥15%, armado de ruta automático en menos de 2 minutos, y que el repartidor complete su jornada usando solo la app.

9.7. Condiciones de modificación

Todo cambio de alcance solicitado durante el desarrollo se registra en el control de cambios (sección 1) y se evalúa su impacto en el GANTT antes de aceptarse.

9.8. Firmas

Firma del equipo desarrollador y de Roberto García (simbólica, en la validación del prototipo).

10Bitácora del Proyecto

Documento de trabajo del equipo. Registra la investigación de campo (entrevistas y minutas) y el seguimiento de la iteración (cambios sobre la interfaz y avances técnicos por etapa). Se actualiza a medida que avanza el proyecto.

Criterio de registro
Se anota cada instancia de contacto con el cliente y cada hito técnico cerrado, con su fecha. Cuando una de esas instancias deriva en un cambio de alcance o de requerimiento, se replica como fila nueva en el Control de Cambios (sección 1).

10.1. Registro de Entrevistas

Instancias de relevamiento con el cliente y con los usuarios de Tres Reyes. Cada entrevista alimenta un apartado concreto de esta carpeta, por eso se registra el objetivo junto a la fecha.

FechaCon quiénObjetivoModalidad
20/04/2026Roberto GarcíaEntrevista 1. Identificación del problema real y relevamiento de la línea de base (dobles pasadas, combustible, control de carga).Presencial
27/04/2026Roberto García, Facundo y TomásEntrevista 2. Perfiles de usuario y confirmación de síntomas (formulario v2, escala Likert 1–5).Presencial
20/05/2026Roberto GarcíaValidación del mock-up (E02). Feedback sobre el primer mock-up antes de empezar a programar con base de datos.Presencial
26/08/2026Roberto GarcíaPruebas con el cliente (E05). Validación del MVP con base de datos: alertas de sobrecarga y primera revisión de las alertas de desvío y del tracking en tiempo real (estos dos quedaron operativos recién el 22/09/2026, ver 5.6).Presencial
06/09/2026Roberto GarcíaTercera entrevista. Devoluciones del cliente sobre el MVP con base de datos: zonas, tracking, paradas, repartidores y código de seguridad al cliente (minuta 02).Presencial

10.2. Minutas de Reunión

Acta breve de cada reunión con el cliente o del equipo. Se completa una minuta por reunión, siempre con los mismos seis campos, para que cualquier participante pueda reconstruir qué se decidió y quién quedó a cargo de qué.

Plantilla de minuta

Fecha y duraciónDía de la reunión y tiempo efectivo. Permite después comparar el esfuerzo real contra el estimado.
ParticipantesQuiénes estuvieron, con su rol (equipo de proyecto y, si corresponde, cliente).
ObjetivoPara qué se convocó la reunión, en una sola frase.
Temas tratadosPuntos recorridos durante la reunión, en el orden en que se trataron.
Decisiones y acuerdosQué quedó definido. Es el campo que puede generar una fila en el Control de Cambios (sección 1).
Próximos pasos y responsablesTareas que salen de la reunión, cada una con su responsable y su fecha comprometida.

Minuta 01 · Validación del MVP con Roberto García

Fecha y duraciónA completar. Duración estimada: 45 minutos.
ParticipantesRoberto García (cliente, dueño de Tres Reyes), Varela (PM / UX-UI) y Facundo (Frontend) por el equipo.
ObjetivoValidar el panel administrativo de TruckRoute (Boletas, Viajes pendientes, Tracking) con el usuario real antes de sumar las alertas de sobrecarga y desvío.
Temas tratadosRecorrido de las pantallas de carga de boletas, armado de viajes y alertas de cierre; lectura de la tabla de Limitaciones del alcance (5.1); prueba del panel en el iPhone de Roberto.
Decisiones y acuerdosConfirmar tipografía mínima de 18px por la dificultad visual de Roberto (RNF02); mantener el lenguaje simple sin jerga técnica; restringir la edición de configuración al perfil administrador.
Próximos pasos y responsablesBackend (Traverso / Crupi) implementa RF06 y RF08; el PM abre la fila correspondiente en el Control de Cambios (sección 1) y evalúa el impacto en el GANTT (6.1).

Minuta 02 · Tercera entrevista: devoluciones del cliente sobre el MVP con BD

Fecha y duración06/09/2026. Duración: ~60 minutos.
ParticipantesRoberto García (cliente, dueño de Tres Reyes), Varela (PM / UX-UI) por el equipo.
ObjetivoRevisar con Roberto el estado del MVP con base de datos y relevar sus devoluciones antes de la tercera presentación.
Temas tratados
  • Prueba del panel de Viajes pendientes con selección de múltiples zonas.
  • Revisión del mapa de Tracking en tiempo real.
  • Funcionalidad de agregar parada a un viaje en curso.
  • Estado de disponibilidad de los repartidores.
  • Revisión del correo con código de seguridad que se enviaba al cliente que recibe la entrega.
Decisiones y acuerdos
  • Unificar zonas con mismo camión: al seleccionar 2 o más zonas para el mismo camión, el sistema las fusiona en un único viaje con una sola ruta optimizada de punta a punta. Deben aparecer unificados tanto en "Viajes del día" como en el "Histórico de viajes".
  • Tracking, próxima parada: en el mapa de Tracking deben mostrarse las paradas ordenadas de cada viaje en curso; al marcar una parada como entregada, debe desaparecer del mapa.
  • Botón "Agregar parada": el admin debe poder agregar una parada (boleta no asignada) a un viaje ya confirmado o en curso, desencadenando la reoptimización de la ruta.
  • Paradas del mismo cliente no cuentan doble: si un mismo cliente tiene dos boletas con la misma dirección de entrega exacta, deben agruparse como una sola parada en la ruta (un solo waypoint en Google Maps) para no romper el cálculo de ruta.
  • Repartidores en viaje: el apartado "Repartidores" en Configuración debe marcar como "No disponible / En viaje" a quien tenga un viaje confirmado o en curso, en vez de mostrar siempre "Disponible".
  • Sin correo de seguridad: Roberto solicitó que el sistema no envíe el correo con código de seguridad al cliente que recibe la entrega. No lo considera necesario para su operación.
Próximos pasos y responsablesTraverso y Crupi implementan los 5 cambios de funcionalidad; Varela actualiza el Control de Cambios (sección 1) y evalúa impacto en el GANTT (6.1). Todos los cambios fueron implementados en los sprints posteriores a esta reunión.

10.3. Registro de Cambios del Mockup

A diferencia de un proyecto que parte de un mockup en Figma, el equipo diseñó la interfaz iterando directamente sobre el MVP ya en producción (ver 5.2). Por eso este apartado registra los cambios reales de interfaz que surgieron de cada validación con el usuario.

Componente modificadoQué se modificó tras la validaciónPor qué (justificación UX / usuario)
Comunicación de estadoLos estados del viaje se muestran en lenguaje simple (armado, confirmado, en curso, finalizado) en vez de códigos internos.Facundo y Tomás tienen niveles tecnológicos distintos (4/5 y 3/5); Tomás necesita un flujo autoevidente (RNF05).
Tipografía / accesibilidadSe aumentó el tamaño de fuente a un mínimo de 18px en las pantallas principales del panel.Roberto declara dificultad visual (RNF02).
Roles y permisosSe restringió la edición de rutas y configuración al perfil administrador; el repartidor solo ve y marca su propia hoja de ruta.Pedido explícito en la entrevista: separar el acceso total del acceso operativo (RNF04).
Inicio de viajeEl botón "Iniciar viaje" pasó de abrir solo la vista de mapa interna (en ese momento con Leaflet; hoy el mapa del repartidor también usa Google Maps) a geolocalizar al repartidor y redirigirlo directamente a la app de Google Maps, con el destino y las paradas intermedias ya cargadas en el orden óptimo.El repartidor necesitaba una navegación GPS real (giro a giro, tráfico en vivo), algo que un mapa embebido no ofrece; Google Maps ya está instalado en todos los celulares del equipo de reparto.
Unificación de zonasAl confirmar 2 o más zonas con el mismo camión, el sistema las fusiona en un único viaje con una sola ruta optimizada (Google Routes API), visible como una sola fila tanto en "Viajes del día" como en el "Histórico".Pedido explícito de Roberto en la tercera entrevista (minuta 02): al asignar zonas vecinas al mismo camión, quería verlas como un solo recorrido, no como dos separados.
Tracking: paradas visibles en mapaEl mapa de Tracking muestra ahora los marcadores numerados de cada parada pendiente (en el orden real de la ruta); al marcar una entrega, el marcador desaparece del mapa. Si el viaje tiene un punto de finalización configurado, se muestra también. Se agregó un pin fijo de la fábrica y, con varios repartidores en simultáneo, cada viaje usa un color propio (camión, paradas y destino) con íconos diseñados para el sistema.La pantalla de Tracking no informaba hacia dónde iba el camión; Roberto quería ver en el mapa tanto la posición del vehículo como las paradas que faltaban.
Agregar parada a viaje en cursoSe agregó un selector en "Viajes del día" para sumar una boleta sin asignar a un viaje ya confirmado o en curso. La ruta se reoptimiza automáticamente respetando las entregas ya hechas.Pedido explícito de Roberto: si se olvidó de cargar una boleta a tiempo, necesitaba poder agregarla al viaje sin cancelarlo y volver a empezar.
Panel mobile del adminSe añadió un menú hamburguesa (☰) con overlay para navegar todas las pantallas del panel desde el celular. Antes el menú lateral se ocultaba en pantallas pequeñas sin reemplazo, dejando al admin sin navegación desde el teléfono.Roberto y el equipo revisan el estado de los viajes desde el celular en tiempo real; necesitaban acceder a Tracking, Alertas y Viajes del día sin depender de una computadora.
Boletas pospuestasSe creó una sección "📋 Boletas pospuestas" en el menú. Al sacar una boleta de un viaje armado (antes de confirmar), pasa a esta sección en lugar de reagruparse sola. Desde ahí se puede agregar a cualquier viaje o devolverla al flujo normal.Antes, sacar una boleta de un viaje la devolvía al mismo viaje automáticamente. El admin necesitaba poder "apartar" una entrega para un día específico sin perderla.
Puntos de finalización configurablesNueva pestaña "📍 Destinos" en Configuración. El admin carga destinos con nombre y dirección (se geocodifican automáticamente al guardar). Al confirmar un viaje, puede elegir a cuál de estos puntos debe llegar el camión al final; sin elección, termina en la última entrega.Los camiones no siempre vuelven al mismo depósito; Roberto necesitaba poder configurar distintos puntos de llegada según el día o el viaje.
Paradas del mismo clienteDos o más boletas del mismo cliente con la misma dirección exacta se agrupan como una sola parada en la ruta y un solo waypoint en Google Maps.Pedido de Roberto en la minuta 02: la misma dirección repetida contaba como dos paradas y rompía el cálculo de la ruta.
Código de seguridad al clienteSe dejó de enviar el correo con código de seguridad al cliente que recibe la entrega.Pedido de Roberto en la minuta 02: no lo considera necesario para su operación.
Trazabilidad de la iteración
Cada fila de esta tabla nace de una minuta (10.2) y, cuando implica un cambio de requerimiento o de alcance, se replica como fila nueva en el Control de Cambios (sección 1).

10.4. Bitácora de Avances Técnicos

Hitos técnicos cerrados, en orden cronológico, siguiendo las etapas del cronograma (6.1). Registrar la fecha real de cierre permite comparar el avance efectivo contra el GANTT planificado.

EtapaHitos registradosFecha de cierre
E01Entrevistas a Roberto García (20/4 y 27/4), análisis de resultados y presentación de proyecto. Problema y línea de base definidos (sección 2).04/05/2026
E02Primer mock-up, validación con el cliente, parser de boletas en PDF, despliegue inicial en InfinityFree, segunda presentación.06/07/2026
E03Diseño y creación de la base de datos MySQL, tablas del sistema, login con roles (bcrypt), conexión BD-front-back.31/07/2026
E04Geocodificación y ruteo (Nominatim/OSRM → LocationIQ → migración a Google APIs: Geocoding API + Routes API), agrupación por zona, orden de paradas con Nearest Neighbor + Haversine reemplazado por Google Routes API; inicio de viaje geolocalizado con handoff a Google Maps para navegación real; unificación de zonas con el mismo camión; boletas pospuestas; puntos de finalización configurables; agregar parada a viaje activo.100%
E05Alertas de sobrecarga (RF06) y desvío (RF08) implementadas; tracking en tiempo real (RF09) con paradas numeradas, pin de fábrica y colores por viaje; tablas de tracking creadas con migracion_tracking.sql (22/09/2026); panel mobile del admin (hamburguesa); marcadores de repartidor "En viaje / Disponible"; RF10 parcial (falta comparación real vs. estimado). Tercera presentación: 25/09/2026.85%
E06Análisis UX/UI y de accesibilidad, verificación de cumplimiento de RF/RNF, ajustes finales.No iniciada
Criterio de cierre
Un hito se da por cerrado cuando su entregable está verificado, no cuando se termina de trabajar en él. Los desvíos respecto del GANTT (6.1) se anotan en la fila correspondiente y se revisan en la reunión siguiente, con su minuta (10.2).