Andesmar BI · Documentación interna

Planilla de combustible: del Google Sheet al tablero

Cómo la planilla que carga Mantenimiento llega a la base, cómo sabemos si está al día y por qué no hay que sumarla a ciegas con la de Industrial.

Septiembre 2026 Tabla: bi_rebuild.aux_combustible Job: andesmar-aux-combustible-sync
◆
La idea en una línea: la planilla "Consolidado Combustibles Sistemas" se copia entera a bi_rebuild.aux_combustible dos veces por día. No hay cálculo en el medio: lo que dice la planilla es lo que dice la tabla. Por eso, si algo está mal o atrasado, se corrige en la planilla, pidiéndoselo a Mantenimiento, no en el job.
1

La planilla

Tres orígenes de carga en una sola hoja

AXION

Estaciones de servicio. Carga todos los días hábiles.

ANDESMAR

Carga a granel desde el tanque propio (salida de tanque).

YPF

Estaciones de servicio. Carga por lotes: puede pasar una semana sin filas nuevas.

ⓘ
La carga es manual, en días hábiles, entre las 03:00 y las 11:45 ART. Cuatro días sin filas suelen ser un fin de semana más un día salteado, no una fuente congelada. El dato del día queda al día recién después de la corrida de las 11:45.
2

Cómo sincroniza

Reemplazo total, dos veces por día

Origen
Google Sheet
unidad compartida
03:00 y 11:45 ART
Sheets API
Base
aux_combustible
reemplazo total
cada corrida
auditoría
Respaldo
Snapshot GCS
copia de la hoja leída

Para negocio

Cada corrida lee la hoja completa y deja la tabla idéntica a ella. Si Mantenimiento corrige o borra una fila vieja, el cambio aparece en la próxima corrida. Con ~34.000 filas tarda menos de un minuto.

Para técnica

  • Por qué reemplazo total: la planilla no tiene clave natural; el remito se repite de forma legítima.
  • Carga en staging y luego DELETE + INSERT en una transacción (no TRUNCATE, que bloquea a los lectores).
  • La hoja vive en una unidad compartida restringida a sus miembros: el job impersona una cuenta de servicio miembro con alcance spreadsheets.readonly. El token genérico de la plataforma no sirve.
  • Schedulers andesmar-aux-combustible-sync-daily (03:00) y andesmar-aux-combustible-sync-midday (11:45).
3

Protecciones

Cuándo el job prefiere no cargar antes que cargar mal

SituaciónQué hace
Falta una columna conocida (la renombraron)Aborta sin tocar la tabla
La hoja trae menos del 90% de las filas de la corrida anteriorAborta; se fuerza a mano si la baja es correcta
Hoja vacíaAborta
Aparece una columna nuevaCarga y la guarda aparte para promoverla con una migración
Valor ilegible o demasiado largoCarga con NULL o truncado, y lo reporta
Falla el snapshot a GCSSigue: el snapshot es auditoría
4

Frescura por origen

Cada origen tiene su propio ritmo, y su propia alarma

OrigenRezago normalUmbral de alertaPeso en litros (desde ago)
AXION0 a 3 días (los 3 son fin de semana)5 días54,2%
ANDESMAR-1 a 4 días6 días28,0%
YPF2 a 10 días (carga por lotes)14 días17,8%
⚠
Por qué no se mide sobre el total. AXION carga todos los días hábiles, así que el total de filas nunca deja de crecer: un corte de YPF, casi un quinto de los litros, no se vería nunca. El job mide cada origen en cada corrida (evento aux_combustible_frescura) y avisa como mucho una vez por día. Que YPF no traiga nada en una semana es normal; un atraso real se resuelve pidiendo la carga.
5

Qué columna medir

Litros son cantidad, no litros_unidades

Cuántos litros se cargaron?
SUM(cantidad)
Litros equivalentes, siempre positivos.
Y litros_unidades?
No para consumo
Son unidades de venta: 15 bidones de AdBlue de 10 L = 150 litros. ANDESMAR la registra en negativo.
Impuestos (IVA, CO2, tasa vial, comb. líquidos)?
Vacíos
0 filas con dato sobre 41.971 al 21/09: la planilla no los trae.
Cómo cruzar con otra fuente?
Por patente
Nunca por unidad: el interno se reutiliza al reemplazar el vehículo.
6

Brecha con Industrial

Dos planillas que se pisan en parte

62%
del combustible de Industrial
ya está en nuestra tabla
50
patentes de Industrial que ya
cargan en esta planilla
47
de esas 50 marcadas
situacion_hoy = 'INDUSTRIAL'
⚠
No sumar las dos planillas sin deduplicar. Si un tablero unificado suma la planilla de Industrial con esta, duplica el 62% del combustible de Industrial. Las 47 unidades ya se identifican con situacion_hoy = 'INDUSTRIAL' y son de la división Industrial (verificado contra su Parque Móvil), no unidades prestadas.

Detalle: api_andesmar/docs/negocio/2026-09-21_brecha_combustible_industrial_vs_autotransporte.md. El detalle de estación, producto y hora de Industrial no está perdido: existe ticket por ticket en el sistema de Industrial, cargado a mano.

7

Checklist rápido

Antes de armar un tablero de combustible

  • Litros: cantidad, nunca litros_unidades
  • Frescura: mirar por origen; YPF atrasado una semana es normal
  • Unificar con Industrial: deduplicar por situacion_hoy = 'INDUSTRIAL'
  • Cruces: por patente, no por número de unidad
  • Impuestos: no están en la planilla
  • Un error en los datos se corrige en la planilla, no en la tabla