Operaciones · Auditoría jun 2026

Manifiestos y Ocupación

Cómo entran los manifiestos desde Betterez, qué tablas BI usar para ocupación, el gap histórico abr–may y las redes de seguridad operativas.

Veredicto auditoría 2026-06-13: Aprobado con observaciones

Observaciones operativas (auditoría 2026-06-13): monitorear manifest_webhook_refetch_failed (alerta GCP desplegada); eventos Betterez no usados (manifest.dispatch.reporting.created) clasificados como observados.

Flujo de ingesta

1. SeñalWebhook Betterez
manifests.*, manifestStatus.updated
2. Raw-firstGCS + raw_events
3. Re-fetchGET /manifests/{id}
4. OLTPmanifest_entries
manifest_legs
5. BIdim_manifest
fact_manifest_leg

Dos vías complementarias (no duplicadas innecesariamente):

Qué dice Betterez

La documentación oficial (engineering.betterez.com/webhooks/manifests) lista eventos como manifests.created, manifests.updated, manifestStatus.updated, etc.

Regla clave: muchos payloads de webhook traen legs[].tickets vacío. Por eso re-fetch del manifiesto completo es la práctica correcta — no un workaround local.

Eventos reconocidos vs no usados

EventoAcción GCP
manifests.created / updated / editedRe-fetch + persist_manifest_detail
manifest.tickets.first.addedRe-fetch completo
manifestStatus.updatedUpdate status; re-fetch si no hay filas OLTP
manifests.tripClosed / emptiedUpdate status/tags
manifest.dispatch.reporting.createdObservado, no transformado (monitorear)

Tablas BI relacionadas

TablaGranoPara qué
fact_ticket / fact_ticket_mstr1 boletoMatch ticket↔manifiesto por ticket_number; flags has_*
dim_manifest1 manifiestopeak_load, peak_load_factor del servicio
fact_manifest_leg1 parada del manifiestopax_on, pax_off, load por estación
bridge_manifest_tagN:M ticket↔tagEtiquetas nacional/internacional/etc.

Ocupación: qué tabla usar

Pregunta de negocioTablaGrano
Ocupación por manifiesto/servicio (pico del bus)dim_manifest1 viaje
Ocupación por parada (suben/bajan en cada estación)fact_manifest_leg1 parada
Ventas / revenue de boletosfact_ticket1 boleto
Columnas clave en fact_manifest_leg: pax_on, pax_off, load, load_factor, station, to_station, manifest_date, schedule_display_name
Filtros de fecha operativa: usar manifest_date (fecha del viaje), no confundir con sale_date (fecha de venta).

Dos incidentes distintos (abr–may 2026)

Gap A — Ingesta OLTP (webhooks ausentes)

Hasta ~2026-05-21 Betterez no enviaba webhooks de manifiesto de forma confiable; el polling solo cubría outlook corto (hoy → hoy+5). Resultado: tickets vendidos sin fila en manifest_entries.

Fuente: docs/comunicaciones/2026-06-06_gap_ingesta_manifiestos_analisis.md

Gap B — ETL BI paso 7b (fact_manifest_leg)

Entre ~28-abr y el redeploy del paso 7b, fact_manifest_leg quedó congelada en max(manifest_date) = 2026-05-03 mientras public.manifest_legs seguía actualizándose.

Remediación: backfill + incremental 7b activo. Fuente: GUIA_FACT_MANIFEST_LEG_BI_REBUILD.md § Incidente 2026-06-02.

No confundir: Gap A = tickets sin manifiesto en OLTP. Gap B = paradas/ocupación desactualizadas en BI aunque OLTP estuviera bien.

Redes de seguridad (mantener activas)

Uso en MicroStrategy

Joins sugeridos

fact_manifest_leg.manifest_id → dim_manifest.manifest_id
fact_manifest_leg.schedule_id → dim_schedule.schedule_id (opcional)
fact_ticket.manifest_id → dim_manifest.manifest_id

Cobertura de manifiesto en tickets

Medición 2026-06-10 (post-oleada 1): tickets pagados con manifest_id en BI — cobertura alta; no_match bajó de 2.568 → 313 tras backfill del 09-06.

Ventana reciente (auditoría 2026-06-13): en lookback 14 días, ~11 tickets pagados sin manifiesto vs ~39.732 con match — residual operativo (lag sync/ETL o viaje aún no asignado).

La cifra “~93%” de la auditoría del 05-06 quedó superada; no usar en reuniones sin fecha de medición.

Para etiquetas (nacional, Cuyanita, etc.) ver presentación dedicada: Etiquetas de manifiesto.