Cómo estructurar los datos de disponibilidad para Reservas

Definiciones de los parámetros

Según se especifica en la definición de Availability:

  • party_size: Es el tamaño del grupo que se puede acomodar durante este horario. Un restaurante se puede asociar con varios horarios disponibles para la misma hora, cada uno con un party_size diferente si, por ejemplo, la reserva puede acomodar 2, 3 o 4 personas.
  • spots_open: Es la cantidad de lugares disponibles actualmente para esta entrada de disponibilidad.
  • spots_total: Es la cantidad total de espacios que tiene el comercio para esta configuración (incluidos los que no están disponibles).

Estos tres parámetros funcionan en conjunto para crear una representación digital del plano. party_size es la cantidad de personas que puede contener cada mesa (habrá una entrada para cada tamaño que pueda admitir una mesa). spots_open y spots_total son recuentos de cuántas tablas pueden admitir ese party_size.

Ejemplo de plano de planta vacío

Imagina un restaurante con el siguiente plano y sin reservas activas:

Figura 1: Plano de planta sin reservas activas
Figura 1: Plano de planta sin reservas activas

Los valores de party_size, spots_open y spots_total serían los siguientes:

party_size spots_open spots_total
4 3 3
5 3 3
6 4 4
7 1 1
8 1 1

El feed de disponibilidad para un horario en este comercio se vería de la siguiente manera:

JSON

{
  "availability": [
        {
          "spots_total": 3,
          "spots_open": 3,
          "duration_sec": 3600,
          "service_id": "1000",
          "start_sec": 1535806800,
          "merchant_id": "merch1",
          "resources": {
            "party_size": 4
          }
        },
        {
          "spots_total": 3,
          "spots_open": 3,
          "duration_sec": 3600,
          "service_id": "1000",
          "start_sec": 1535806800,
          "merchant_id": "merch1",
          "resources": {
            "party_size": 5
          }
        },
        {
          "spots_total": 4,
          "spots_open": 4,
          "duration_sec": 3600,
          "service_id": "1000",
          "start_sec": 1535806800,
          "merchant_id": "merch1",
          "resources": {
            "party_size": 6
          }
        },
        {
          "spots_total": 1,
          "spots_open": 1,
          "duration_sec": 3600,
          "service_id": "1000",
          "start_sec": 1535806800,
          "merchant_id": "merch1",
          "resources": {
            "party_size": 7
          }
        },
        {
          "spots_total": 1,
          "spots_open": 1,
          "duration_sec": 3600,
          "service_id": "1000",
          "start_sec": 1535806800,
          "merchant_id": "merch1",
          "resources": {
            "party_size": 8
          }
        }
      ]
}

Ejemplo de plano de planta con una reserva

Ahora imagina que se reservó una de las mesas redondas:

Figura 2: Plano de planta con una reserva activa
Figura 2: Plano de planta con una reserva activa

Los valores de party_size, spots_open y spots_total ahora serían los siguientes:

party_size spots_open spots_total
4 2 3
5 2 3
6 3 4
7 1 1
8 1 1

JSON

{
  "availability": [
        {
          "spots_total": 3,
          "spots_open": 2,
          "duration_sec": 3600,
          "service_id": "1000",
          "start_sec": 1535806800,
          "merchant_id": "merch1",
          "resources": {
            "party_size": 4
          }
        },
        {
          "spots_total": 3,
          "spots_open": 2,
          "duration_sec": 3600,
          "service_id": "1000",
          "start_sec": 1535806800,
          "merchant_id": "merch1",
          "resources": {
            "party_size": 5
          }
        },
        {
          "spots_total": 4,
          "spots_open": 3,
          "duration_sec": 3600,
          "service_id": "1000",
          "start_sec": 1535806800,
          "merchant_id": "merch1",
          "resources": {
            "party_size": 6
          }
        },
        {
          "spots_total": 1,
          "spots_open": 1,
          "duration_sec": 3600,
          "service_id": "1000",
          "start_sec": 1535806800,
          "merchant_id": "merch1",
          "resources": {
            "party_size": 7
          }
        },
        {
          "spots_total": 1,
          "spots_open": 1,
          "duration_sec": 3600,
          "service_id": "1000",
          "start_sec": 1535806800,
          "merchant_id": "merch1",
          "resources": {
            "party_size": 8
          }
        }
      ]
}

Cómo especificar la disponibilidad de mesas con compatibilidad para mesas combinadas

Hay muchas formas en que un restaurante puede combinar mesas para admitir grupos más grandes. En tus feeds, debes especificar spots_open y spots_total de manera que reflejen con precisión si puedes aceptar grupos de un tamaño determinado. A continuación, se muestra un ejemplo de cómo puedes especificar la combinación de tablas. Es posible que tus feeds difieran un poco en la forma en que se realiza este cálculo, y es aceptable que especifiques spots_open y spots_total de una manera que coincida con tu lógica de negocios.

Si un restaurante admite la combinación de mesas para formar un grupo más grande, puedes actualizar tus campos spots_open y spots_total para reflejar esto.

Supongamos que un restaurante puede combinar dos mesas pequeñas para sentar a un grupo de 7 a 10 personas.

Figura 3: Plano de planta sin reservas activas
Figura 3: Plano de planta sin reservas activas

En el caso de que no haya reservas activas, los valores de party_size, spots_open y spots_total son los siguientes:

party_size spots_open spots_total
4 3 3
5 3 3
6 4 4
7 1 1
8 1 1
9 1 1
10 1 1

Ahora, con el mismo plano, se realiza una reserva para un grupo de 10 personas que combina dos mesas pequeñas.

Figura 4: Plano de planta con una reserva activa que abarca dos mesas
Figura 4: Plano con una reserva activa que abarca dos mesas

Luego, los valores de party_size, spots_open y spots_total ahora son los siguientes:

party_size spots_open spots_total
4 1 3
5 1 3
6 2 4
7 1 1
8 1 1
9 0 1
10 0 1