Modules documented: - MAI-003 (OT): README, REQUERIMIENTOS, RESUMEN-EPICA, 10 US - MAI-006 (Tracking): README, REQUERIMIENTOS, RESUMEN-EPICA - MAI-008 (Incidencias): 3 US (18 SP) - MAI-011 (Flota): README, REQUERIMIENTOS, RESUMEN-EPICA - MAI-012 (Combustible): 3 US (18 SP) - MAI-013 (Mantenimiento): 3 US (18 SP) - MAI-014 (Carriers): 3 US (18 SP) - MAI-015 (Portal): 3 US (18 SP) - MAE-016 (Carta Porte): 10 US - MAE-017 (HOS): 3 US (16 SP) - MAE-018 (Reportes): 3 US (18 SP) Phase 2+3 complete: 13 modules, 50+ User Stories Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
167 lines
13 KiB
Markdown
167 lines
13 KiB
Markdown
# REQUERIMIENTOS.md - MAI-006 Tracking en Tiempo Real
|
|
|
|
**Modulo:** MAI-006 | **Version:** 1.0.0 | **Actualizado:** 2026-01-27
|
|
**Referencia:** REQ-GIRO-TRANSPORTISTA.md (Secciones 4.5, 4.13)
|
|
|
|
---
|
|
|
|
## Requerimientos Funcionales
|
|
|
|
### RF-MAI006-001: Ingestion de Posiciones GPS
|
|
**Prioridad:** P0 | **Origen:** RF-4.5.1
|
|
|
|
El sistema debe recibir y almacenar posiciones GPS provenientes de dispositivos de telematica. Cada posicion debe incluir como minimo: latitud (DECIMAL 10,7), longitud (DECIMAL 10,7), velocidad en km/h, timestamp del GPS y la unidad asociada. Opcionalmente puede incluir: altitud, rumbo (0-360 grados), odometro, estado del motor (encendido/apagado), HDOP (precision horizontal), numero de satelites, IMEI del dispositivo y proveedor GPS. Las posiciones se almacenan en la tabla `tracking.posiciones_gps` particionada mensualmente por `fecha_particion`. Si la unidad esta asociada a un viaje activo, se debe registrar el `viaje_id`.
|
|
|
|
**Tabla DDL:** `tracking.posiciones_gps`
|
|
**Indices:** `idx_posicion_unidad_fecha` (unidad_id, timestamp_gps), `idx_posicion_viaje` (viaje_id WHERE NOT NULL), `idx_posicion_geo` GIST (ST_SetSRID(ST_MakePoint(longitud, latitud), 4326))
|
|
|
|
---
|
|
|
|
### RF-MAI006-002: Consulta de Posicion Actual
|
|
**Prioridad:** P0 | **Origen:** RF-4.5.1, RF-4.13.1
|
|
|
|
El sistema debe permitir obtener la ultima posicion conocida de una unidad, incluyendo: latitud, longitud, velocidad, rumbo, timestamp GPS, estado del motor y viaje asociado. La consulta se resuelve obteniendo el registro mas reciente de `tracking.posiciones_gps` para la unidad indicada, ordenando por `timestamp_gps DESC LIMIT 1`. El endpoint debe soportar consulta individual por unidad y consulta masiva de toda la flota del tenant.
|
|
|
|
---
|
|
|
|
### RF-MAI006-003: Registro de Eventos de Tracking
|
|
**Prioridad:** P0 | **Origen:** RF-4.5.2
|
|
|
|
El sistema debe registrar eventos de tracking durante la ejecucion de un viaje. Cada evento se almacena en `tracking.eventos` con: viaje_id (obligatorio), tipo_evento, fuente (OPERADOR, SISTEMA, USUARIO), ubicacion (latitud, longitud, direccion), timestamp del evento, datos especificos en JSONB, parada asociada (si aplica), generado_por_id y tipo, evidencias en JSONB, y observaciones. Los eventos pueden ser generados automaticamente por el sistema (geocercas, alertas) o manualmente por el operador a traves de la app movil.
|
|
|
|
**Tabla DDL:** `tracking.eventos`
|
|
**Indices:** `idx_evento_viaje` (viaje_id), `idx_evento_tipo` (tenant_id, tipo_evento), `idx_evento_fecha` (timestamp_evento)
|
|
|
|
---
|
|
|
|
### RF-MAI006-004: CRUD de Geocercas
|
|
**Prioridad:** P0 | **Origen:** RF-4.5.4
|
|
|
|
El sistema debe permitir crear, consultar, actualizar y desactivar geocercas. Cada geocerca se almacena en `tracking.geocercas` con: codigo (unico por tenant), nombre, tipo (CLIENTE, PROVEEDOR, PATIO, ZONA_RIESGO, CASETA, GASOLINERA, PUNTO_CONTROL, OTRO). Las geocercas pueden ser circulares (centro_latitud, centro_longitud, radio_metros) o poligonales (poligono GEOMETRY POLYGON 4326). Cada geocerca configura: alerta_entrada (boolean), alerta_salida (boolean), tiempo_permanencia_minutos (alerta si excede), color de visualizacion, estado activa/inactiva, y opcionalmente un cliente asociado y direccion.
|
|
|
|
**Tabla DDL:** `tracking.geocercas`
|
|
**Indices:** `idx_geocerca_tenant` (tenant_id), `idx_geocerca_tipo` (tenant_id, tipo), `idx_geocerca_geo` GIST (poligono), `idx_geocerca_codigo` UNIQUE (tenant_id, codigo)
|
|
|
|
---
|
|
|
|
### RF-MAI006-005: Evaluacion Automatica de Geocercas
|
|
**Prioridad:** P0 | **Origen:** RF-4.5.4
|
|
|
|
El sistema debe evaluar automaticamente cada posicion GPS recibida contra las geocercas activas del tenant. Para geocercas circulares, se utiliza `ST_DWithin` comparando la posicion con el punto centro y el radio en metros. Para geocercas poligonales, se utiliza `ST_Contains` verificando si la posicion esta dentro del poligono. Cuando una unidad ingresa o abandona una geocerca, el sistema debe generar automaticamente un evento en `tracking.eventos` y, si la geocerca tiene configurada la alerta correspondiente (alerta_entrada o alerta_salida), generar una alerta en `tracking.alertas`.
|
|
|
|
---
|
|
|
|
### RF-MAI006-006: Generacion de Alertas
|
|
**Prioridad:** P0 | **Origen:** RF-4.5.5
|
|
|
|
El sistema debe generar alertas automaticas almacenadas en `tracking.alertas` con: tipo (tipo_alerta: 11 valores posibles), severidad (INFO, WARNING, CRITICAL), referencias (unidad_id, viaje_id, geocerca_id, operador_id), ubicacion, titulo, mensaje, datos especificos en JSONB, y timestamp. Las alertas se crean con estado leida=FALSE y atendida=FALSE. Al ser leida se registra leida_por y leida_fecha. Al ser atendida se registra atendida_por, atendida_fecha y resolucion (texto). El campo notificaciones_enviadas (JSONB) registra los canales por los que se notifico.
|
|
|
|
**Tabla DDL:** `tracking.alertas`
|
|
**Indices:** `idx_alerta_tenant`, `idx_alerta_unidad`, `idx_alerta_viaje`, `idx_alerta_no_atendida` (WHERE atendida = FALSE), `idx_alerta_fecha`
|
|
|
|
---
|
|
|
|
### RF-MAI006-007: Configuracion de Reglas de Alerta
|
|
**Prioridad:** P1 | **Origen:** RF-4.5.5
|
|
|
|
El sistema debe permitir configurar reglas de alerta en `tracking.reglas_alerta`. Cada regla define: nombre, descripcion, tipo_alerta que genera, severidad por defecto, condiciones en JSONB (ejemplo: `{"velocidad_max": 100, "tiempo_parada_max_min": 30, "temp_min": -18, "temp_max": -15}`), aplicabilidad (todas las unidades o lista especifica de unidades_ids UUID[]), canales de notificacion (email, SMS, push), lista de destinatarios en JSONB, y estado activa/inactiva. El sistema evalua las reglas activas del tenant al procesar cada posicion GPS o evento relevante.
|
|
|
|
**Tabla DDL:** `tracking.reglas_alerta`
|
|
**Indices:** `idx_regla_tenant` (tenant_id), `idx_regla_tipo` (tipo_alerta WHERE activa = TRUE)
|
|
|
|
---
|
|
|
|
### RF-MAI006-008: Calculo de ETA Dinamico
|
|
**Prioridad:** P0 | **Origen:** RF-4.5.3, RF-4.3.6
|
|
|
|
El sistema debe calcular y recalcular periodicamente el tiempo estimado de arribo (ETA) para cada viaje activo. Cada calculo se almacena en `tracking.eta_calculado` con: viaje_id, parada_id (opcional, para ETA por parada), eta_original (programado), eta_actual (recalculado), eta_anterior (para comparacion), distancia_restante_km, tiempo_restante_minutos, factor_trafico (multiplicador decimal), factor_clima (multiplicador decimal), estado (EN_TIEMPO, ADELANTADO, RETRASADO), y minutos_diferencia respecto al eta_original. El calculo considera la posicion actual de la unidad, la distancia restante y los factores de ajuste.
|
|
|
|
**Tabla DDL:** `tracking.eta_calculado`
|
|
**Indices:** `idx_eta_viaje` (viaje_id), `idx_eta_fecha` (calculado_at)
|
|
|
|
---
|
|
|
|
### RF-MAI006-009: Historial de Recorrido
|
|
**Prioridad:** P1 | **Origen:** RF-4.5.1
|
|
|
|
El sistema debe permitir consultar el historial completo de posiciones GPS de una unidad o viaje en un rango de fechas. La consulta se ejecuta sobre `tracking.posiciones_gps` filtrando por unidad_id o viaje_id y rango de timestamp_gps. El resultado debe incluir las posiciones ordenadas cronologicamente y permitir la reconstruccion visual del recorrido en mapa. El sistema debe calcular metricas derivadas: distancia total recorrida, velocidad promedio, velocidad maxima, tiempo en movimiento, tiempo detenido, y numero de paradas.
|
|
|
|
---
|
|
|
|
### RF-MAI006-010: Deteccion de Desvio de Ruta
|
|
**Prioridad:** P1 | **Origen:** RF-4.5.5
|
|
|
|
El sistema debe detectar cuando una unidad se desvia de la ruta planeada. Se compara la posicion GPS actual contra el corredor de la ruta esperada (buffer geometrico alrededor de la ruta planeada). Si la posicion cae fuera del corredor definido, se genera una alerta de tipo DESVIO_RUTA con severidad WARNING o CRITICAL segun la distancia de desvio. La deteccion utiliza funciones PostGIS como `ST_Distance` y `ST_Buffer` para calcular la distancia entre la posicion y la geometria de la ruta.
|
|
|
|
---
|
|
|
|
### RF-MAI006-011: Dashboard de Flota en Tiempo Real
|
|
**Prioridad:** P1 | **Origen:** RF-4.5.1, RF-4.13.1
|
|
|
|
El sistema debe proporcionar un dashboard de flota con mapa interactivo mostrando la posicion actual de todas las unidades del tenant. El dashboard debe incluir: visualizacion en mapa con iconos por estado (en movimiento, detenida, con alerta), filtros por estado de viaje, tipo de unidad y operador, contadores de unidades en movimiento/detenidas/con alertas/fuera de cobertura, lista de alertas activas no atendidas, y panel de detalle al seleccionar una unidad. Las actualizaciones se transmiten via WebSocket para evitar polling constante.
|
|
|
|
---
|
|
|
|
### RF-MAI006-012: Reporte de Recorrido
|
|
**Prioridad:** P2 | **Origen:** RF-4.5.1
|
|
|
|
El sistema debe generar reportes de recorrido por viaje con: ruta trazada en mapa, tabla de eventos con timestamps y ubicaciones, metricas de velocidad (promedio, maxima, distribucion), tiempos de parada por ubicacion, distancia planeada vs real, cumplimiento de geocercas (entradas/salidas con hora), alertas generadas durante el viaje, y ETA vs hora real de arribo. El reporte debe ser exportable en formato PDF.
|
|
|
|
---
|
|
|
|
### RF-MAI006-013: Integracion de Dispositivo GPS
|
|
**Prioridad:** P1 | **Origen:** RF-4.5.1
|
|
|
|
El sistema debe soportar la ingestion de posiciones desde multiples proveedores de GPS/telematica. Cada posicion incluye el campo `proveedor_gps` (VARCHAR 50) y el `imei` (VARCHAR 50) del dispositivo. El sistema debe implementar una capa de abstraccion (adapter pattern) que normalice los datos de diferentes proveedores al esquema unificado de `tracking.posiciones_gps`. La asociacion entre IMEI y unidad se gestiona externamente (modulo flota MAI-011).
|
|
|
|
---
|
|
|
|
### RF-MAI006-014: Notificaciones en Tiempo Real
|
|
**Prioridad:** P1 | **Origen:** RF-4.5.6
|
|
|
|
El sistema debe transmitir actualizaciones en tiempo real a traves de WebSocket. Se implementan dos canales: (1) canal de posiciones de flota (`/ws/tracking/flota`) que emite la ultima posicion de cada unidad cuando se actualiza, y (2) canal de alertas (`/ws/tracking/alertas`) que emite alertas nuevas al momento de generarse. Los canales estan segregados por tenant_id. Las reglas de alerta definen adicionalmente si se envia notificacion por email, SMS y/o push a los destinatarios configurados.
|
|
|
|
---
|
|
|
|
### RF-MAI006-015: Aislamiento Multi-Tenant (RLS)
|
|
**Prioridad:** P0 | **Origen:** Transversal
|
|
|
|
Todas las tablas del schema tracking deben tener Row Level Security habilitado con politica de aislamiento por tenant: `USING (tenant_id = current_setting('app.tenant_id')::uuid)`. Las tablas con RLS son: posiciones_gps, eventos, geocercas, alertas, reglas_alerta, eta_calculado. Ningun usuario debe poder acceder a datos de un tenant distinto al configurado en la sesion de base de datos.
|
|
|
|
---
|
|
|
|
## Requerimientos No Funcionales
|
|
|
|
### RNF-MAI006-001: Rendimiento de Ingestion
|
|
La ingestion de posiciones GPS debe procesar al menos 1,000 posiciones por segundo sin degradacion del rendimiento. El particionamiento mensual de `posiciones_gps` y los indices optimizados garantizan el rendimiento de escritura y lectura.
|
|
|
|
### RNF-MAI006-002: Latencia de Evaluacion
|
|
La evaluacion de geocercas debe completarse en menos de 2 segundos por posicion procesada, incluyendo la verificacion contra todas las geocercas activas del tenant. Los indices GIST de PostGIS optimizan las consultas espaciales.
|
|
|
|
### RNF-MAI006-003: Escalabilidad de Almacenamiento
|
|
El sistema debe soportar al menos 12 meses de historico de posiciones GPS sin degradacion significativa en consultas. La estrategia de particionamiento mensual permite la eliminacion selectiva de particiones antiguas y la creacion automatica de nuevas.
|
|
|
|
### RNF-MAI006-004: Disponibilidad WebSocket
|
|
Los canales WebSocket de tracking y alertas deben mantener una disponibilidad del 99.5%. Se debe implementar reconexion automatica en el cliente frontend en caso de desconexion.
|
|
|
|
### RNF-MAI006-005: Seguridad de Datos GPS
|
|
Los datos de posicion GPS son informacion sensible. Solo usuarios autorizados del tenant con los permisos adecuados (RBAC) pueden acceder a datos de tracking. Las politicas RLS proporcionan la primera capa de aislamiento a nivel de base de datos.
|
|
|
|
---
|
|
|
|
## Trazabilidad con Requerimientos del Giro
|
|
|
|
| RF del Giro | RF del Modulo | Cobertura |
|
|
|-------------|---------------|-----------|
|
|
| RF-4.5.1 Integracion GPS/Telematica | RF-MAI006-001, RF-MAI006-013 | Completa |
|
|
| RF-4.5.3 ETA dinamico | RF-MAI006-008 | Completa |
|
|
| RF-4.5.4 Geocercas (geofencing) | RF-MAI006-004, RF-MAI006-005 | Completa |
|
|
| RF-4.5.5 Alertas | RF-MAI006-006, RF-MAI006-007, RF-MAI006-010 | Completa |
|
|
| RF-4.5.6 Comunicacion omnicanal | RF-MAI006-014 | Parcial (configuracion de canales; implementacion de WhatsApp/SMS en modulo externo) |
|
|
| RF-4.13.1 Tracking portal cliente | RF-MAI006-002, RF-MAI006-011 | Parcial (datos disponibles; portal en MAI-015) |
|
|
| RF-4.3.6 Simulacion de ruta y ETA | RF-MAI006-008, RF-MAI006-010 | Parcial (ETA dinamico si; simulacion previa en MAI-004) |
|
|
|
|
---
|
|
|
|
*Requerimientos MAI-006 Tracking en Tiempo Real - ERP Transportistas v1.0.0*
|