6.2. Consulta viajes
Este documento define el nuevo servicio a utilizar para el flujo de consulta de viajes (formato moderno sin p_*) y el mapeo de campos hacia las tablas de base de datos del dominio de Recolección.
1) Servicio a utilizar
Nombre: Trip Query Service (v1)
Base URL: https://api.alpura.mx/trip-query/v1
Endpoint: POST /trips/_search
1.1 Request (nuevo formato)
{
"operadorId": 1563842,
"estatus": "En Transito",
"fecha": ""
}
fechapuede venir vacío para obtener activos o del día, según reglas de la API.
1.2 Response (ejemplo legacy equivalente)
{
"AlpRecoleccionViajesCollection": {
"AlpRecoleccionViajes": {
"rowId": 217207383,
"idViaje": 508463,
"controlInterno": 1314822,
"operadorEmployeeNumber": 1563842,
"operadorFullName": "BARRAZA SANCHEZ JOSE ARTURO",
"pipa": 148,
"dolly": "",
"proveedorTransporte": "ALPURA",
"proveedorId": 0,
"tractor": 1152,
"ruta": 471,
"volante": 2211637,
"FechaRecoleccion": "2024-06-03T00:00:00.000-05:00"
}
}
}
2) Mapeo a tablas de Base de Datos
Tablas principales: ALP_RECOLECCION_VIAJES (maestro) y ALP_DET_RECOLECCION_VIAJES (detalle).
Tabla opcional (según caso): ALP_RECOLECCION_TRANSFERENCIAS (si hay transferencia).
| Campo respuesta | Tabla.Columna | Notas |
|---|---|---|
rowId | ALP_RECOLECCION_VIAJES.ROW_ID | Identificador interno |
idViaje | ALP_DET_RECOLECCION_VIAJES.ID_VIAJE o ALP_RECOLECCION_VIAJES.ID_VIAJE | Según diseño, puede provenir del maestro o detalle; si no existe en maestro, usar del detalle |
controlInterno | ALP_RECOLECCION_VIAJES.CONTROL_INTERNO | |
operadorEmployeeNumber | ALP_RECOLECCION_VIAJES.OPERADOR_EMPLOYEE_NUMBER | |
operadorFullName | ALP_RECOLECCION_VIAJES.OPERADOR_FULL_NAME | |
pipa | ALP_RECOLECCION_VIAJES.PIPA | |
dolly | ALP_RECOLECCION_VIAJES.DOLLY | |
proveedorTransporte | ALP_RECOLECCION_VIAJES.PROVEEDOR_TRANSPORTE | |
proveedorId | ALP_RECOLECCION_VIAJES.PROVEEDOR_ID | |
tractor | ALP_RECOLECCION_VIAJES.TRACTOR | |
ruta | ALP_RECOLECCION_VIAJES.RUTA | |
volante | ALP_DET_RECOLECCION_VIAJES.VOLANTE | Requiere join al detalle |
FechaRecoleccion | ALP_RECOLECCION_VIAJES.FECHA_RECOLECCION |
Relaciones clave
ALP_RECOLECCION_VIAJES (1) — (N) ALP_DET_RECOLECCION_VIAJES(join porCONTROL_INTERNOy/oID_VIAJEsegún disponibilidad).ALP_RECOLECCION_VIAJES (1) — (0..1) ALP_RECOLECCION_TRANSFERENCIAS(siID_TRANSFERENCIA > 0).
3) SQL de referencia (Oracle)
Filtra por
operadorId(nómina),estatusy opcionalmentefecha.
La obtención deVOLANTEviene del detalle (escoge el más reciente si hay varios).
WITH det AS (
SELECT
d.CONTROL_INTERNO,
d.ID_VIAJE,
/* Elegir un VOLANTE representativo: el más reciente por FECHA_EVENTO o el máximo */
MAX(d.VOLANTE) KEEP (DENSE_RANK LAST ORDER BY NVL(d.FECHA_EVENTO, DATE '1900-01-01')) AS VOLANTE
FROM ALP_DET_RECOLECCION_VIAJES d
GROUP BY d.CONTROL_INTERNO, d.ID_VIAJE
)
SELECT
v.ROW_ID AS rowId,
NVL(v.ID_VIAJE, det.ID_VIAJE) AS idViaje,
v.CONTROL_INTERNO AS controlInterno,
v.OPERADOR_EMPLOYEE_NUMBER AS operadorEmployeeNumber,
v.OPERADOR_FULL_NAME AS operadorFullName,
v.PIPA AS pipa,
v.DOLLY AS dolly,
v.PROVEEDOR_TRANSPORTE AS proveedorTransporte,
v.PROVEEDOR_ID AS proveedorId,
v.TRACTOR AS tractor,
v.RUTA AS ruta,
det.VOLANTE AS volante,
v.FECHA_RECOLECCION AS FechaRecoleccion
FROM ALP_RECOLECCION_VIAJES v
LEFT JOIN det
ON det.CONTROL_INTERNO = v.CONTROL_INTERNO
OR (v.ID_VIAJE IS NOT NULL AND det.ID_VIAJE = v.ID_VIAJE)
WHERE
v.OPERADOR_EMPLOYEE_NUMBER = :operadorId
AND (:estatus IS NULL OR v.EVENTO = :estatus)
AND (:fecha IS NULL OR TRUNC(v.FECHA_RECOLECCION) = TO_DATE(:fecha, 'YYYY-MM-DD'));
Notas de implementación
- Si
fechallega vacío en el request, se puede ignorar el filtro o usarSYSDATEsegún regla de negocio.- Si hay múltiples filas de detalle por viaje, se sugiere consolidar
VOLANTEcon la estrategia anterior (por fecha o por máximo).