🏗️ Diseño del Sistema

RutaCC - Arquitectura y Diseño Técnico
Versión 2.0 | Septiembre 2026
Proyecto: RutaCC
Tipo: Diseño Técnico
Fecha: 15 de Septiembre de 2026 (v2.0 — actualiza la v1.0 de junio 2026 con tracking GPS, asistente IA, administración multi-tenant y seguridad reforzada)
Arquitectura: MVC simplificado - Multi-tenant - Contenedores Docker

📑 Índice de Contenidos

  1. Introducción al Diseño
  2. Arquitectura del Sistema
  3. Stack Tecnológico
  4. Diseño de Módulos
  5. Diseño de Base de Datos
  6. Diseño de APIs
  7. Arquitectura de Seguridad
  8. Diseño Frontend
  9. Arquitectura de Despliegue

1. Introducción al Diseño

Este documento describe el diseño técnico completo del sistema RutaCC, incluyendo la arquitectura general, los componentes principales, el modelo de datos, las APIs y las consideraciones de seguridad y despliegue.

El sistema ha sido diseñado siguiendo los principios de:

2. Arquitectura del Sistema

2.1 Arquitectura General

🖥️ CAPA DE PRESENTACIÓN (Frontend)
HTML5
CSS3
JavaScript
Leaflet.js (Mapas)
Chart.js (Gráficos)
↕ HTTP/HTTPS ↕
⚙️ CAPA DE APLICACIÓN (Backend PHP)
security.php
auth_functions.php
Módulos PHP
APIs REST
Validadores
↕ SQL ↕
🗄️ CAPA DE DATOS
PostgreSQL 16+
config/database.php
Prepared Statements
Transacciones
🌐 SERVICIOS EXTERNOS
OpenStreetMap (Mapas)
Nominatim (Geocoding)
OSRM (Rutas)
Google Gemini API (Chatbot IA)
OwnTracks (App móvil de tracking GPS)
🐳 Despliegue en contenedores: las tres capas anteriores corren como servicios Docker independientes definidos en docker-compose.yml: web (Apache + PHP 8.2, sirve todo el código de este repositorio), db (PostgreSQL con la extensión pg_cron para tareas programadas) y proxy (YARP, reverse proxy de entrada). Ver sección 9.

2.2 Arquitectura Multi-Tenant

El sistema implementa un modelo multi-tenant de base de datos compartida, donde todos los tenants comparten la misma base de datos pero sus datos están aislados mediante el campo tenant_id.

Ventajas del modelo elegido:
• Costos de infraestructura reducidos
• Actualizaciones centralizadas
• Backups simplificados
• Escalabilidad horizontal posible

2.3 Patrón de Diseño

El sistema sigue un patrón MVC simplificado:

3. Stack Tecnológico

Capa Tecnología Versión Justificación
Backend PHP 8.2 (imagen php:8.2-apache) Lenguaje maduro, amplio soporte, bajo costo de hosting
Base de Datos PostgreSQL 16+ (con extensión pg_cron) Open source, transaccional, integridad referencial estricta y soporte nativo de PL/pgSQL
Servidor Web Apache 2.4+ (mod_headers habilitado) Estándar de la industria, compatible con .htaccess; mod_headers entrega las cabeceras de seguridad
Contenerización Docker + Docker Compose - Entorno reproducible: servicios web, db, proxy y adminer
Frontend HTML5 + CSS3 + JS - Estándares web, sin framework de build (sin bundler ni transpilación)
Mapas Leaflet.js + OSM 1.9+ Gratuito, sin API key, personalizable
Gráficos Chart.js 4.4+ Librería ligera, responsive, fácil de usar
Rutas OSRM - Open Source Routing Machine, gratuito
Tablas avanzadas js/advanced_table.js (componente propio, vanilla JS) - Filtros, orden, paginación y export CSV/Excel/PDF en 18 listados del sistema (ver docs/GUIA_TABLAS_AVANZADAS.md). Tabulator se evaluó como alternativa (ver docs/Grilla Avanzada.docx y su demo) pero no es lo que quedó en producción.
Exportación jsPDF + jspdf-autotable, SheetJS (xlsx) - Generación de PDF y Excel desde el navegador, sin backend adicional
Tiempo real Socket.IO (cliente) 4.7+ Cargado para paneles de tracking en vivo
Iconografía Font Awesome 6.4+ Íconos de interfaz vía CDN
Asistente IA Google Gemini API modelo configurable vía GEMINI_MODEL Chatbot de ayuda (chat.php) y de apoyo comercial (chatv.php), llamado por HTTP desde el backend PHP
Tracking móvil OwnTracks (Android/iOS) + GPSLogger - Apps de terceros que envían posición GPS del conductor al backend (ver docs/OWNTRACKS_*.md, docs/GPSLOGGER_*.md)

4. Diseño de Módulos

4.1 Estructura de Módulos

📦 MÓDULOS DEL SISTEMA
🔐 Autenticación
🏢 Tenants
👥 Usuarios
🚗 Vehículos
🧑‍✈️ Conductores
🏭 Bodegas
📋 Pedidos
🚚 Despachos
⛽ Combustible
🔧 Mantenciones
⚠️ Fallos
💰 Cobros
📊 Reportes
🔔 Alertas
⚙️ Configuración
📍 Tracking GPS
🤖 Asistente IA (Chatbot)
🏢 Administración de Empresa (Usuarios/Permisos)

4.2 Detalle de Módulos

Módulo de Autenticación

Archivo Función
login.php Procesa credenciales y genera sesión
logout.php Destruye sesión de forma segura
security.php Funciones de seguridad centralizadas
auth_functions.php Funciones auxiliares de autenticación

Módulo de Despachos

Archivo Función
despachos_list.php Lista despachos del tenant
despachos_activos.php Lista despachos en curso
despachos_iniciar.php Inicia despacho (km, hora salida)
despachos_finalizar.php Finaliza despacho (km, hora llegada)
despachos_cancelar.php Cancela despacho
despachos_entregar.php Marca pedido como entregado
despachos_asignar_pedidos.php Asigna pedidos a despacho
despachos_planificar_ruta.php Planifica orden de ruta

Módulo de Tracking GPS

Ubica vehículos en tiempo real a partir de la posición que reporta el celular del conductor (vía la app OwnTracks o GPSLogger), sin hardware GPS dedicado en el vehículo.

Archivo Función
tracking_auth.php Autentica el dispositivo móvil del conductor (email/password → token de dispositivo)
tracking_batch.php Recibe lotes de posiciones GPS enviadas por la app móvil
tracking_ultima_posicion.php Última posición conocida de cada vehículo (para el mapa en vivo)
tracking_despacho_activo.php Despacho activo de un vehículo con sus pedidos y estado
tracking_ruta_vehiculo.php Reconstruye el recorrido real de un despacho pasado a partir de las posiciones GPS
tracking_cambiar_estado_pedido.php / tracking_forzar_estado.php Actualiza el estado de un pedido desde la app móvil o manualmente desde el panel
owntracks_recibir.php Webhook que recibe los mensajes nativos de OwnTracks y los normaliza a las tablas de tracking

Módulo de Asistente Virtual (Chatbot con IA)

Dos widgets de chat flotantes, ambos sobre la API de Google Gemini, cada uno con su propia base de conocimiento y sus propios límites de uso:

Archivo Función
chat.php Chat de ayuda dentro de la app — requiere sesión iniciada, responde dudas de uso del sistema
chatv.php Chat comercial en páginas públicas — sin sesión, orientado a apoyar la venta
gemini_helper.php Llama a la API de Gemini vía cURL, sanea el historial de conversación y aplica el límite de mensajes por sesión
conocimiento_ayuda.php / conocimiento_venta.php Base de conocimiento (texto de referencia) inyectada en el system prompt de cada chatbot, para que responda con hechos reales del producto en vez de improvisar
js/chat_widget.js + css/chat_widget.css Motor de UI genérico del widget flotante, reutilizado por ambos chats

Módulo de Administración de Empresa (rol Administrador)

Funciones de autoservicio que un Administrador gestiona dentro de su propia empresa — parte del producto que usa el cliente:

Archivo Función
admin_usuarios.html + usuarios_list.php / usuarios_create.php / usuarios_update.php Gestión de usuarios y su rol dentro de un tenant
permisos.html + permisos_paginas Matriz de permisos por rol y página dentro de un tenant
Fuera del producto: el alta de nuevas empresas (admin_tenants.html, tenants_create.php/tenants_update.php) y qué módulos tiene habilitados cada tenant (admin_modulos.html, tablas modulos/tenant_modulos) son herramientas operativas internas que usa el equipo de Intelliti para administrar la plataforma SaaS — no son una funcionalidad que el cliente vea ni controle, y no forman parte del producto RutaCC.

5. Diseño de Base de Datos

5.1 Modelo Relacional

La base de datos rutacc (schema rutacc en PostgreSQL) contiene 30 tablas organizadas en el siguiente modelo relacional:

📊 tenants (Empresas)
PK id INT
nombre VARCHAR(100)
rut VARCHAR(20) UNIQUE
email_contacto VARCHAR(150)
plan ENUM('basic','pro','enterprise')
estado ENUM('activo','pago_atrasado','inhabilitado')
👥 usuarios
PK id INT
FK tenant_id INT → tenants.id
nombre, email UNIQUE, password_hash (bcrypt)
rol ENUM('Administrador','Usuario','Despachador','Conductor', + un rol interno reservado para herramientas de Intelliti)
🚗 vehiculos
PK id INT
FK tenant_id INT → tenants.id
patente VARCHAR(10) UNIQUE
marca, modelo, anno, color
rendimiento_kml DECIMAL(5,2)
capacidad_kg INT
tipo_combustible ENUM
km_motor INT
estado ENUM('disponible','asignado','en_ruta','en_fallo','mantencion','inactivo')
🧑‍✈️ conductores
PK id INT
FK tenant_id INT → tenants.id
nombre VARCHAR(100)
rut VARCHAR(20) UNIQUE
telefono, email
estado ENUM('disponible','asignado','en_ruta','suspendido','licencia_medica','con_permiso','inactivo')
🚚 despachos
PK id INT
FK tenant_id, conductor_id, vehiculo_id, bodega_id
numero_orden VARCHAR(20) UNIQUE per tenant
estado ENUM('creada','planificada','en_ruta','en_entrega','finalizada','cancelada')
distancia_estimada_km, combustible_estimado_l, costo_estimado
km_motor_salida, km_motor_llegada
hora_salida_real, hora_fin_real
📋 pedidos
PK id INT
FK tenant_id, despacho_id
cliente, direccion, lat, lng
documento VARCHAR(20)
orden SMALLINT
estado ENUM('pendiente','asignado','en entrega','entregado','fallido','planificado','en ruta')

5.2 Resto de las tablas

Las entidades anteriores son el núcleo operativo; el resto de las 30 tablas cubre seguridad, tracking GPS, administración multi-tenant e historial — no se detallan campo a campo acá, solo su propósito:

GrupoTablasPropósito
Seguridad de sesión login_attempts, remember_tokens, password_reset_tokens Control de fuerza bruta, cookie "Recordarme" y recuperación de contraseña
Documentos documentos_vehiculo, documentos_conductor SOAP, revisión técnica, seguros y licencias, con fecha de vencimiento (alimentan las alertas)
Historial historial_estados_vehiculos, historial_estados_conductores, historial_estados_pedido, historial_sueldos_conductores Traza de cambios de estado y remuneración, para auditoría y reportes
Tracking GPS dispositivos_moviles, telemetria_gps, ultima_posicion_vehiculo, owntracks_raw, owntracks_temporal Registro de dispositivos autorizados, posiciones GPS crudas y procesadas de OwnTracks/GPSLogger
Administración multi-tenant modulos, tenant_modulos, paginas, modulo_paginas, permisos_paginas Qué módulos/páginas tiene habilitados cada tenant y qué puede hacer cada rol en cada una
Reportes indicadores_ipc Serie histórica de IPC usada para ajustar/comparar costos en el tiempo

5.3 Índices y Optimización

Tabla Índice Propósito
despachos idx_tenant_estado Consultas por tenant y estado
despachos idx_numero_orden_tenant Búsqueda de órdenes únicas
pedidos idx_despacho_orden Ordenar pedidos en despacho
documentos_vehiculo idx_docvehiculo_vehiculo Documentos por vehículo
otros_cobros idx_estado_vencimiento Alertas de cobros
permisos_paginas uq_usuario_pagina Permisos únicos

5.4 Integridad Referencial

Todas las relaciones están protegidas con foreign keys y reglas de cascada:

6. Diseño de APIs

6.1 Endpoints Principales

Autenticación

POST /login.php - Iniciar sesión
POST /logout.php - Cerrar sesión

Vehículos

GET /vehiculos_list.php - Listar vehículos
POST /vehiculos_create.php - Crear vehículo
POST /vehiculos_update.php - Actualizar vehículo
POST /vehiculos_disable.php - Desactivar vehículo

Despachos

GET /despachos_list.php - Listar despachos
GET /despachos_activos.php - Despachos en curso
POST /despachos_iniciar.php - Iniciar despacho
POST /despachos_finalizar.php - Finalizar despacho
POST /despachos_asignar_pedidos.php - Asignar pedidos
POST /despachos_planificar_ruta.php - Planificar ruta

Reportes

GET /dashboard_stats.php - Estadísticas del dashboard
GET /reportes_costos.php - Reporte de costos
GET /alertas_vencimiento.php - Alertas de documentos
GET /alerta_cobro.php - Alertas de cobros

Tracking GPS

POST /tracking_auth.php - Autenticar dispositivo móvil del conductor
POST /tracking_batch.php - Recibir lote de posiciones GPS
GET /tracking_ultima_posicion.php - Última posición de la flota
GET /tracking_ruta_vehiculo.php - Recorrido real de un despacho pasado

Asistente IA (Chatbot)

POST /chat.php - Chat de ayuda (requiere sesión iniciada)
POST /chatv.php - Chat comercial (público, sin sesión)

Administración de Empresa

GET /usuarios_list.php - Listar usuarios del tenant
GET /permisos.php - Matriz de permisos por rol
Inventario completo: el sistema expone 98 endpoints PHP en total, siguiendo siempre la convención {módulo}_{acción}.php descrita en la Guía de Estándares. Esta sección solo lista los más representativos de cada módulo.

6.2 Formato de Respuesta

Todas las APIs responden en formato JSON:

{
  "success": true,
  "data": { ... },
  "message": "Operación exitosa"
}

// En caso de error:
{
  "success": false,
  "message": "Descripción del error"
}

7. Arquitectura de Seguridad

7.1 Capas de Seguridad

🛡️ CAPA 1: PROTECCIÓN PERIMETRAL
.htaccess (bloquea archivos sensibles + cabeceras)
Content-Security-Policy + HSTS (mod_headers)
X-Frame-Options, X-Content-Type-Options, Referrer-Policy
CORS configurado (ALLOWED_ORIGINS)
🔐 CAPA 2: AUTENTICACIÓN
security.php
requireAuth()
Sesiones PHP
bcrypt (cost 12)
👥 CAPA 3: AUTORIZACIÓN
requireRole()
permisos_paginas
tenant_id isolation
🔒 CAPA 4: PROTECCIÓN DE DATOS
Prepared Statements
sanitizeInput()
Validación de inputs
CSRF tokens
📝 CAPA 5: REGISTRO Y CONTROL DE ACCESO
secureLog() (activo solo si APP_ENV ≠ production)
login_attempts (bloqueo temporal por fuerza bruta)
Sin implementar todavía: autenticación de dos factores (2FA) y una auditoría de acceso a nivel de registro (quién vio/modificó qué fila). Lo que existe hoy es el registro de intentos de login (login_attempts) y el log de depuración (secureLog()), no una bitácora de auditoría formal — no afirmar lo contrario en material comercial.

7.2 Cumplimiento Normativo

RutaCC está diseñado siguiendo los principios de estos estándares — no cuenta con una certificación formal de terceros. El chatbot comercial (chatv.php) usa este mismo matiz al responder sobre cumplimiento, para no prometer más de lo que el sistema realmente tiene.

Estándar Aplicación
OWASP Top 10 Prevención de inyección, XSS, CSRF, broken auth
ISO/IEC 27001:2022 Control de acceso, cifrado, segregación de datos (diseño alineado, no certificado)
Ley 21.710 (Chile) Protección de datos personales
NIST Framework Gestión de identidad, protección de datos

8. Diseño Frontend

8.1 Estructura de Páginas

Página Archivo Funcionalidad
Login login.html Formulario de acceso
Dashboard dashboard.html Panel principal con estadísticas
Vehículos vehiculos.html Gestión de flota
Conductores conductores.html Gestión de conductores
Bodegas bodegas.html Gestión de bodegas
Pedidos pedidos.html Gestión de pedidos
Despachos despachos.html Lista de despachos
Despacho Inicio despachos_inicio.html Iniciar despachos
Despacho Cierre despachos_cierre.html Finalizar despachos
Combustible combustible.html Registro de combustible
Mantención mantenimiento.html Gestión de mantenciones
Fallos fallos.html Registro de fallos
Cobros cobros.html Gestión de cobros
Reportes reportes_costos.html Reportes financieros
Configuración configuracion.html Configuración del sistema

8.2 Arquitectura Frontend

📁 ESTRUCTURA DE ARCHIVOS
/css - Estilos
/js - JavaScript
/components - Componentes reutilizables
/img - Imágenes

8.3 Módulos JavaScript

Archivo Responsabilidad
api.js Cliente HTTP centralizado (fetch + CSRF automático), autenticación/sesión, carga del menú lateral, reloj, e inyección del widget de chat de ayuda
theme.js Alterna entre tema oscuro/claro/azul, persistido en localStorage
chat_widget.js Motor genérico del widget de chat flotante (ayuda y venta)
advanced_table.js Componente propio de tabla avanzada: filtros estilo Excel, orden, paginación y export CSV/Excel/PDF (SheetJS + jsPDF)
tracking_monitor.js / tracking_ruta.js Mapa de posición en vivo y reconstrucción de rutas GPS (Leaflet)
reportes.js / reportes_costos.js Generación de reportes y gráficos (Chart.js)
{módulo}.js / {módulo}_ficha.js Un archivo por página, siguiendo el mismo patrón que su HTML (ver convención de nombres) — 64 archivos en total

9. Arquitectura de Despliegue

9.1 Entornos

Hoy el proyecto define un único entorno reproducible vía docker-compose.yml, parametrizado con variables de entorno (APP_ENV, credenciales de BD, API key de Gemini) para distinguir desarrollo de un eventual despliegue productivo — todavía no existen ambientes de staging/producción separados.

Servicio Contenedor Propósito
web php:8.2-apache + mod_headers Sirve todo el código de este repositorio (HTML, PHP, assets)
db PostgreSQL (build propio) + pg_cron Base de datos rutacc, con tareas programadas (limpieza de telemetría GPS)
proxy YARP (.NET) Reverse proxy de entrada
adminer Adminer Administración visual de la base de datos (solo desarrollo)
Nota: APP_ENV determina si DEBUG_MODE queda activo (todo menos production) y si la cookie de sesión exige HTTPS. Al desplegar en un entorno real, hay que fijar APP_ENV=production explícitamente — el valor por defecto es local.

9.2 Requisitos de Servidor

Recurso Mínimo (dev/demo) Recomendado
CPU 2 cores 4 cores
RAM 2 GB 4 GB
Disco 20 GB SSD 50 GB SSD
PHP 8.2 (fijo por la imagen del Dockerfile) 8.2
PostgreSQL 16 (fijo por el build del servicio db) 16

9.3 Backups

⚠️ Pendiente de implementar: hoy no existe una tarea de backup automático de la base de datos en este repositorio — pg_cron solo tiene programada la limpieza de telemetría GPS antigua (ver BBDD/postgres_procedures.sql). No afirmar "backups automáticos diarios" en material comercial hasta que esto se implemente (por ejemplo, un pg_dump programado con retención y copia fuera del host). El chatbot comercial ya está instruido para no afirmarlo tampoco.
✅ Resumen del Diseño:
El sistema RutaCC está diseñado con una arquitectura moderna, segura y escalable. Utiliza tecnologías maduras y probadas, sigue mejores prácticas de la industria y cumple con estándares internacionales de seguridad y normativas chilenas.