DEV Community

PasosHoy
PasosHoy

Posted on

Cómo modelar el estado de un paso fronterizo con fuentes que chocan

Saber si un paso fronterizo entre Argentina y Chile está abierto parece una pregunta de sí o no. En la práctica es un problema de datos. Hay varias fuentes oficiales y cada una publica a su propio ritmo. A veces no coinciden, y a veces dejan de actualizarse sin avisar.

En PasosHoy no decidimos si un paso está abierto. Mostramos lo que publica la fuente oficial, con la hora de cada dato y sin esconder cuando dos fuentes dicen cosas distintas. Lo difícil es decidir qué estado mostrar cuando esas fuentes chocan. Para eso escribimos un conjunto chico de reglas. Abajo están en Python, con el paso Cristo Redentor como caso real.

Las fuentes de un mismo paso

Para cada paso cruzamos estas señales:

  • El Ministerio de Seguridad de la Nación, que publica si el paso está abierto o cerrado, su horario y el horario de Cancillería. La ficha oficial dice qué organismo cargó el estado y cuándo. En la mayoría de los pasos es Gendarmería Nacional.
  • Cancillería, con su propio horario y notas como "Cerrado por temporada invernal" o "Habilitado solo para transporte de cargas".
  • Vialidad Nacional, con el parte de la ruta del lado argentino.
  • El horario oficial del paso, que cambia según el día y la época del año.

Cada fuente tiene su propio reloj. Nosotros consultamos cada 15 minutos, pero la hora que importa es la de la actualización oficial, o sea, cuándo el organismo cargó el estado. La hora de nuestra consulta va al lado, como dato secundario. Un dato que leímos hace 4 minutos puede haber sido cargado ayer. Confundir esas dos horas es el error más fácil de cometer en un agregador.

El caso Cristo Redentor

El Cristo Redentor une Mendoza con la Región de Valparaíso. Se sube por la RN 7 y se cruza por el túnel internacional. Del lado chileno sigue la Ruta 60-CH, y en Chile lo llaman Los Libertadores, que es el nombre de su complejo.

Hasta la altura tiene dos versiones: la cifra oficial chilena es 3.220 m y otras fuentes dan 3.175 m. Para los datos fijos la regla es simple. Se muestra la cifra oficial y se menciona la otra.

Con los horarios la cosa se complica. Esto mostraba la ficha del paso Cristo Redentor en PasosHoy en la consulta del 10 de noviembre de 2026 a las 02:45:

  • Ministerio de Seguridad: todos los días, 9:00 a 21:00, con corte de flujo vehicular a las 19 h de Argentina (18 h de Chile).
  • Cancillería: todos los días, 9:00 a 19:00, con la nota "Habilitado solo para transporte de cargas".
  • Vialidad Nacional: RN 7 habilitada, con fecha 29 de octubre.
  • Estado oficial: cerrado por "inclemencias climáticas", cargado por la Vicejefatura de Gabinete del Interior el día anterior a las 18:05.

La pregunta "¿hasta qué hora se cruza?" tiene tres respuestas distintas, y el parte de ruta tiene doce días.

El historial agrega otra capa. Entre el 29 de octubre y el 9 de noviembre (12 días), el paso figuró abierto 142 de las 144 horas del horario oficial. En 11 de esos 12 días siguió figurando abierto media hora o más después del cierre oficial de las 21:00. La Vicejefatura actualizó el estado en uno solo de esos días. El estado oficial y el horario oficial se contradicen seguido, y la hora de la fuente puede quedar quieta mucho tiempo.

Ante la duda, nunca "Abierto"

Los dos errores posibles no cuestan lo mismo. Si mostramos "Abierto" y el paso está cerrado, alguien carga nafta en Uspallata y sube 86 km sin estaciones de servicio hasta el límite, a 3.220 m, para encontrar el paso cerrado. Si mostramos "Sin confirmar" y el paso está abierto, esa persona confirma una vez más antes de salir.

Por eso hay tres estados. "Abierto" y "Cerrado" son los que publica el organismo oficial. "Sin confirmar" lo ponemos nosotros cuando el dato oficial dice abierto pero otra fuente lo contradice o el dato quedó viejo. Las reglas publicadas se leen así en Python:

from datetime import timedelta

H2, H24 = timedelta(hours=2), timedelta(hours=24)

def estado_a_mostrar(p, ahora):
    """Devuelve 'Abierto', 'Cerrado' o 'Sin confirmar'."""
    # Sin un dato oficial claro en las últimas 2 horas, no hay estado.
    if p.ultimo_dato_claro is None or ahora - p.ultimo_dato_claro > H2:
        return "Sin confirmar"

    # Un cierre viejo sigue siendo cierre: muchos pasos cierran por temporada.
    if p.estado_oficial == "Cerrado":
        return "Cerrado"

    # Desde acá, el organismo dice "Abierto".
    vialidad_ok = (p.vialidad_ruta_habilitada_en is not None
                   and ahora - p.vialidad_ruta_habilitada_en <= H24)

    # Más de 24 h sin actualizar (o sin hora confiable) y sin Vialidad que lo respalde.
    sin_hora = p.actualizado_en is None
    if (sin_hora or ahora - p.actualizado_en > H24) and not vialidad_ok:
        return "Sin confirmar"

    # Cancillería lo da cerrado. Única excepción: cierre por temporada,
    # Vialidad confirmó la ruta y el horario de Seguridad lo da abierto hoy.
    if p.cancilleria_cerrado and not (
        vialidad_ok and p.cancilleria_por_temporada
        and p.horario_seguridad_abierto_hoy
    ):
        return "Sin confirmar"

    # Vialidad informa corte total en la ruta que llega al límite.
    if p.vialidad_corte_total:
        return "Sin confirmar"

    # El horario oficial lo da cerrado en esta época del año.
    if p.cerrado_por_temporada_segun_horario(ahora):
        return "Sin confirmar"

    # Ya terminó o todavía no empezó el horario oficial del día.
    # Si Gendarmería lo mantiene abierto, se muestra un aviso aparte.
    if not p.dentro_del_horario_del_dia(ahora):
        return "Sin confirmar"

    return "Abierto"
Enter fullscreen mode Exit fullscreen mode

Lo que más pesa en ese orden:

  • El control de 2 horas va primero y vale para todo. Sin un dato claro y reciente no hay estado para mostrar.
  • "Cerrado" no se degrada por viejo. Un paso cerrado sigue "Cerrado" aunque el dato no cambie hace más de 24 horas, con un aviso de desde cuándo no hay cambios.
  • Vialidad Nacional sirve como confirmación independiente. Si informó la ruta habilitada en las últimas 24 horas, un "Abierto" que el organismo no actualizó se mantiene, con la fecha de esa última actualización a la vista. Vialidad nunca abre un paso por su cuenta. Solo respalda lo que el organismo ya publicó.
  • Fuera del horario del día, el paso queda "Sin confirmar" aunque el organismo diga abierto. Si Gendarmería lo mantiene abierto fuera de horario, lo avisamos y sugerimos llamar al paso antes de salir. En el Cristo Redentor pasó en 11 de los 12 días del seguimiento.

La función devuelve el estado, pero la interfaz nunca muestra solo eso. En todos los casos va al lado el último dato oficial, con sus palabras y su fecha, para que cualquiera pueda confirmarlo en la fuente. "Sin confirmar" no esconde información. Avisa que hay que mirar dos veces y da los datos para hacerlo.

El historial también tiene reglas

Desde el 23 de octubre de 2026 guardamos cada cambio del estado oficial. Hay dos decisiones de modelado:

  • La hora de un cambio es la de la consulta en que apareció, no la hora oficial del cierre o de la apertura. Entre dos consultas pasan unos 15 minutos, y ese es el margen. El 9 de noviembre, por ejemplo, el Cristo Redentor figuró abierto hasta las 18:46, cerrado hasta las 19:16, abierto hasta las 19:31 y cerrado hasta las 21:00. Esas son horas de consulta.
  • Si pasó más de una hora sin dato oficial, ese tramo figura como "sin dato". No lo completamos con el último estado conocido. Repetir el último valor (un forward fill) inventaría horas abiertas o cerradas que ningún organismo informó.

El pronóstico sigue la misma lógica de frescura. Es el de MET Norway para el punto y la altura del paso, no el de la ciudad más cercana. Si tiene más de 3 horas, no se muestra.

Lecciones para cualquier dashboard que agregue fuentes públicas

  1. Guardá dos horas por dato: cuándo lo publicó la fuente y cuándo lo leíste. Mostrá la primera.
  2. Definí cuál de los dos errores es más caro y llevá el estado hacia el lado barato. Un tercer estado explícito es mejor que un booleano optimista.
  3. Un dato viejo es un estado, no un null. Poné umbrales concretos (2 horas, 24 horas) y publicalos donde el usuario los pueda leer.
  4. Usá las fuentes independientes para confirmar, no para promediar. Cada una tiene un rol definido en la regla.
  5. Cuando dos fuentes oficiales difieren, mostrá las dos con sus palabras. No elijas por nadie.
  6. No rellenes huecos en el historial. "Sin dato" también es información.
  7. Escribí las reglas en lenguaje humano antes que en código. Las nuestras están completas en la página de fuentes y criterios, y la función de arriba sale de ahí, regla por regla.

Equipo de PasosHoy

Top comments (0)

⌂ 换网址