Cómo estructurar la disponibilidad en los feeds

Elige un formato de disponibilidad

Existen dos maneras de especificar los datos de disponibilidad: (1) Spots Open o (2) Recurrence. Elige un solo método para usar en todos tus comercios y servicios. Cuando selecciones un método, deberás seguir con él para realizar la integración completa (feeds, servidor de reservas y actualizaciones en tiempo real).

Usa la siguiente guía para determinar qué formato de disponibilidad es más adecuado:

  • En tu sistema, ¿almacenas la disponibilidad como ranuras explícitas, por ejemplo, de 8:00 a.m. a 8:30 a.m.?
  • En tu sistema, ¿almacenas la disponibilidad en un formato recurrente, lo que significa que los comercios tienen servicios que ocurren con frecuencia constante y con pocas desviaciones? Por ejemplo, los horarios disponibles se repiten cada 15 minutos de 9:00 a.m. a 5:00 p.m., y solo hay un asiento disponible en cada incremento de 15 minutos.
  • Para los servicios de sus comercios, ¿puede haber más de un espacio abierto a la vez? Por ejemplo, 30 lugares abiertos para una clase
  • ¿Ninguna de las opciones anteriores se aplica?
    • Usa Spots Open
    • Nota: Si bien la recurrencia es más eficiente y puede reducir el tamaño del feed, si tu modelo de datos no admite la recurrencia de forma nativa, no se recomienda usarla, ya que tendrás que volver a calcular todo el día de ranuras recurrentes para cada actualización en tiempo real.

    Spots Open

    Definiciones de parámetros:

    • spot_open: Es la cantidad de lugares disponibles para esta entrada de disponibilidad.
    • spot_total: Es la cantidad total de cupos que tiene el comercio para esta configuración, incluidas las que no están disponibles.

    El método Spots Open indica de manera explícita cada disponibilidad de ranuras y admite el modelo de tener varios espacios para el mismo servicio. Estos dos parámetros funcionan en conjunto para compilar una representación digital de la capacidad del servicio.

    Cuando se realiza una reserva, la cantidad de spot_open debe disminuir en 1 a través de una actualización en tiempo real (la cantidad de spot_total debe ser la misma). Una vez que spot_open = 0, el espacio ya no debería aparecer.

    Ejemplos de servicios

    Una clase de yoga o un salón de belleza tienen los siguientes planos del edificio y no tienen reservas activas

    Figura 1: Plano del edificio sin reservas activas

    El feed de disponibilidad de 2 ranuras en estos comercios se vería de la siguiente manera:

    JSON

        {
          "availability": [
                {
                  "spots_total": 6,
                  "spots_open": 6,
                  "duration_sec": 3600,
                  "service_id": "1001",
                  "start_sec": 1535817600, # Sept 1, 2018 4:00:00 PM GMT
                  "merchant_id": "1001"
                },
                {
                  "spots_total": 6,
                  "spots_open": 6,
                  "duration_sec": 3600,
                  "service_id": "1001",
                  "start_sec": 1535832000, # Sept 1, 2018 8:00:00 PM GMT
                  "merchant_id": "1001",
                }
              ]
        }
        

    Servicios de ejemplo con una reserva

    Figura 2: Plano del edificio con una reserva activa

    Ahora, un usuario reserva uno de los lugares. Cuando se realiza una reserva, se emite una actualización en tiempo real para actualizar la disponibilidad. En el siguiente feed de disponibilidad diaria, se debería reflejar esta reserva. El feed de disponibilidad de estos comercios tendría el valor spot_open disminuido en 1 para el horario del 1 de septiembre de 2018 a las 4:00:00 p.m. GMT. El horario del 1 de septiembre de 2018 a las 8:00:00 p.m. (GMT) no sufrirá cambios.

    Fragmento de feed con una reserva

    JSON

        {
          "availability": [
                {
                  "spots_total": 6,
                  "spots_open": 5,
                  "duration_sec": 3600,
                  "service_id": "1001",
                  "start_sec": 1535817600, # Sept 1, 2018 4:00:00 PM GMT
                  "merchant_id": "1001"
                },
                {
                  "spots_total": 6,
                  "spots_open": 6,
                  "duration_sec": 3600,
                  "service_id": "1001",
                  "start_sec": 1535832000, # Sept 1, 2018 8:00:00 PM GMT
                  "merchant_id": "1001",
                }
              ]
    }
        

    Recurrencia

    Definiciones de parámetros

    • recurrencia: La representación de los horarios disponibles que se repiten de forma constante.
    • repite_hasta_segundo: La marca de tiempo UTC de la hora de finalización del último espacio en el que se repite la disponibilidad.
    • repite_cada_segundo: La cantidad de segundos entre las ranuras de disponibilidad sucesivas. Por ejemplo, sirepeat_every_sec = 1,800 (30 minutos), y start_sec comienza a las 9:00 a.m., los horarios se repiten cada 30 minutos a las 9:00 a.m., 9:30 a.m., 10:00 a.m., etcétera.
      • Nota: No es necesario especificar los valores spot_open y spot_total, ya que se supone que ambos son 1, a menos que exista un schedule_exception.

    El método de recurrencia indica la disponibilidad diaria para los servicios que se producen a intervalos regulares, por ejemplo, un servicio que ocurre cada 30 minutos de 9:00 a.m. a 5:00 p.m. todos los días. Con la recurrencia, se especifica la duración del horario disponible, la primera vez del día en que se repite, la frecuencia con la que debe repetirse y el momento en que debe dejar de repetirse. Nota: Se debe especificar un nuevo conjunto de ranuras recurrentes para cada día por separado. Si un horario disponible ya está reservado en el intervalo de tiempo, debes especificar una excepción de programación. Por ejemplo, repite cada media hora desde las 9 a.m. hasta las 9 p.m., excepto desde las 11:00 a.m. hasta las 11:30 a.m. Cada servicio individual tendrá sus propias excepciones de programación y excepción.

    Ejemplos de servicios

    Un salón de belleza tiene el siguiente plano del edificio y no tiene reservas activas

    Figura 3: Planos de edificios sin reservas activas. Se supone que solo hay 1 lugar abierto por servicio (p.ej., Sally brinda servicios de corte de cabello cada 30 minutos, pero solo puede atender a 1 cliente a la vez).

    El feed de disponibilidad de 1 ranura en estos comercios se vería de la siguiente manera:

    Fragmento del feed:

    JSON

        {
        "availability": [
              {
                "merchant_id": "1001",
                "service_id": "1001",  # haircut
                "start_sec": 1493888400, # May 4, 2017 9:00:00 AM GMT
                "duration_sec": 1800,
                "recurrence": {
                  "repeat_every_sec": 1800,
                  "repeat_until_sec": 1493915400 # May 4, 2017 4:30:00 PM GMT
                }
              }
            ]
        }
        

    Servicios de ejemplo con una reserva

    Figura 4: Planos del edificio con una reserva activa. Se supone que solo hay 1 lugar abierto por servicio (p.ej., Sally brinda servicios de corte de cabello cada 30 minutos, pero solo puede atender a 1 cliente a la vez).

    Ahora, imagine que un usuario hace un corte de cabello con Sally a las 12:30 p.m. Cuando se realiza una reserva, se emite una actualización en tiempo real para actualizar la disponibilidad. En el siguiente feed de disponibilidad diaria, se debería reflejar esta reserva. El feed de disponibilidad para estos comercios tendría una excepción de programación entre las 12:30 p.m. y la 1:00 p.m. para un servicio con una duración de 30 minutos.

    Fragmento de feed con una reserva:

    JSON

        {
          "availability": [
                {
                  "merchant_id": "1001",
                  "service_id": "1001",
                  "start_sec": 1493888400, # May 4, 2017 9:00:00 AM GMT
                  "duration_sec": 1800,
                  "recurrence": {
                    "repeat_every_sec": 1800,
                    "repeat_until_sec": 1493915400 # May 4, 2017 4:30:00 PM GMT
                  },
                  "schedule_exception": [
                    {
                      "time_range": {
                        "begin_sec": 1493901000, # May 4, 2017 12:30:00 PM GMT
                        "end_sec": 1493902800 # May 4, 2017 1:00:00 PM GMT
                      }
                    }
                  ],
                }
              ]
        }