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 solo un método para usar con todos tus comercios y servicios. Después de seleccionar un método, debes conservarlo durante toda la integración (feeds, servidor de reservas y actualizaciones en tiempo real).

Usa la siguiente guía para determinar qué formato de disponibilidad es el 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 coherente con pocas desviaciones? Por ejemplo, las ranuras 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 tus comercios, ¿puede haber más de un lugar abierto a la vez? Por ejemplo, 30 lugares disponibles para una clase
  • ¿Ninguna de las opciones anteriores corresponde?
    • Usa Spots Open
    • Nota: Si bien usar la recurrencia es más eficiente y puede producir tamaños de feed más pequeños, si tu modelo de datos no admite la recurrencia de forma nativa, no se recomienda usarla, ya que deberás volver a calcular el valor de las ranuras recurrentes de un día completo para cada actualización en tiempo real.

    Spots Open

    Definiciones de parámetros:

    • Places_open: Es la cantidad de cupos disponibles actualmente para esta entrada de disponibilidad.
    • spot_total: La cantidad total de cupos que el comercio tiene para esta configuración, incluidos los que no están disponibles.

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

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

    Servicios de ejemplo

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

    Figura 1: Plano del edificio sin reservas activas

    El feed de disponibilidad de 2 horarios en estos comercios tendría el siguiente aspecto:

    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 próximo feed de disponibilidad diario, esta reserva debería verse reflejada. El feed de disponibilidad de estos comercios se reduciría en un 1 lugar el horario disponible de 4:00:00 p.m. (GMT) del 1 de septiembre de 2018. El horario disponible del 1 de septiembre de 2018 a las 8:00:00 p.m. (GMT) no se modifica.

    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: Es la representación de los horarios disponibles que se repiten de forma coherente.
    • repetido_until_sec: La marca de tiempo UTC de la hora de finalización del último horario disponible hasta el que se repite la disponibilidad.
    • repeat_every_sec: Es la cantidad de segundos entre los sucesivos horarios disponibles. Por ejemplo, si repeat_every_sec = 1,800 (30 minutos) y start_sec comienza a las 9:00 a.m., los horarios disponibles se repetirán cada 30 minutos a las 9:00 a.m., 9:30 a.m., 10:00 a.m., etcétera.
      • Nota: No es necesario especificar spot_open y spot_total; se supone que ambos son 1, a menos que haya un schedule_exception

    El método de recurrencia indica la disponibilidad diaria de los servicios que se realizan en 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 produce, la frecuencia con la que se debe repetir ese espacio y cuándo debe dejar de repetirse el mismo día. Nota: Se debe especificar un nuevo conjunto de ranuras recurrentes para cada día por separado. Si ya se reservó un horario disponible dentro del período, deberás especificar una excepción de horario. Por ejemplo, repite el proceso cada media hora de 9 a.m. a 9 p.m., excepto de 11:00 a.m. a 11:30 a.m. Cada servicio individual tendrá sus propias excepciones de recurrencia y programación.

    Servicios de ejemplo

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

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

    El feed de disponibilidad de 1 horario disponible en estos comercios tendría el siguiente aspecto:

    Fragmento de 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. Supone que solo hay 1 lugar abierto por servicio (p.ej., Sally ofrece servicios de corte de cabello cada 30 minutos, pero solo puede atender a 1 cliente a la vez).

    Ahora imagina que un usuario reserva un corte de cabello con Sara a las 12:30 p.m. Cuando se realiza una reserva, se emite una actualización en tiempo real para modificar la disponibilidad. En el próximo feed de disponibilidad diaria, esta reserva debería verse reflejada. El feed de disponibilidad de 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
                      }
                    }
                  ],
                }
              ]
        }