Como estruturar dados de disponibilidade para reservas

Definições de parâmetro

Conforme especificado na definição de Availability:

  • party_size: o tamanho do grupo que pode ser acomodado durante esse período. Um restaurante pode estar associado a vários espaços ao mesmo tempo, cada um especificando um party_size diferente, se, por exemplo, duas, três ou quatro pessoas puderem fazer uma reserva.
  • spots_open: o número de vagas disponíveis atualmente para esta entrada de disponibilidade
  • spots_total: o número total de vagas que o comerciante tem para essa configuração (incluindo as que não estão disponíveis)

Esses três parâmetros trabalham juntos para criar uma representação digital do plano. party_size é o número de pessoas que cada mesa pode acomodar. Haverá uma entrada para cada tamanho que uma mesa pode acomodar. spots_open e spots_total são contagens de quantas tabelas podem acomodar esse party_size.

Exemplo de planta vazia

Imagine um restaurante com o seguinte plano de piso e sem reservas ativas:

Figura 1: planta sem reservas ativas
Figura 1: planta do andar sem reservas ativas

Os valores de party_size, spots_open e spots_total seriam:

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

O feed de disponibilidade de um horário disponível neste comerciante seria assim:

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
          }
        }
      ]
}

Exemplo de planta com uma reserva

Agora imagine que uma das mesas redondas foi reservada:

Figura 2: planta com uma reserva ativa
Figura 2:planta baixa com um agendamento ativo

Os valores de party_size, spots_open e spots_total agora serão:

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
          }
        }
      ]
}

Como especificar a disponibilidade de refeições com suporte a mesas combinadas

Há muitas maneiras de combinar mesas para atender grupos maiores. É esperado que você especifique spots_open e spots_total nos seus feeds de uma forma que reflita com precisão se é possível aceitar grupos de um determinado tamanho. Confira a seguir um exemplo de como especificar a combinação de tabelas. Seus feeds podem diferir um pouco na forma como esse cálculo é feito, e é aceitável especificar spots_open e spots_total de uma maneira que corresponda à sua lógica de negócios.

Se um restaurante permitir a combinação de mesas para formar um grupo maior, você poderá atualizar spots_open e spots_total para refletir isso.

Digamos que um restaurante possa combinar duas mesas pequenas para acomodar um grupo de 7 a 10 pessoas.

Figura 3: planta com nenhuma reserva ativa
Figura 3: planta do andar sem reservas ativas

No caso de não haver reservas ativas, os valores de party_size, spots_open e spots_total são:

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

Agora, com o mesmo plano, uma reserva é feita para um grupo de 10 pessoas que combina duas mesas pequenas.

Figura 4: planta com uma reserva ativa que abrange duas mesas
Figura 4:planta com uma reserva ativa que abrange duas mesas

Os valores de party_size, spots_open e spots_total agora são:

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