Como estruturar dados de disponibilidade para reservas

Definições de parâmetro

Conforme especificado na definição de Availability:

  • party_size: o número de pessoas que pode ser acomodado durante esse horário. Um restaurante pode ser associado a vários slots 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 no momento para esta entrada de disponibilidade.
  • spots_total: o número total de espaços que o comerciante tem para esta configuração (incluindo aqueles que não estão disponíveis)

Esses três parâmetros trabalham juntos para criar uma representação digital da planta baixa. party_size é o número de pessoas que cada tabela pode conter (haverá uma entrada para cada tamanho que uma tabela pode acomodar). spots_open e spots_total são contagens de quantas tabelas podem acomodar esse party_size.

Exemplo de planta baixa em branco

Imagine um restaurante com a seguinte planta baixa e sem reservas ativas:

Figura 1: planta baixa sem reservas ativas
Figura 1:planta baixa 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 para um horário específico desse comerciante teria esta aparência:

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 baixa com uma reserva

Agora imagine que uma das mesas redondas foi reservada:

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

Os valores de party_size, spots_open e spots_total agora seriam:

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

Especificar a disponibilidade de refeições com suporte a tabelas combinadas

Há muitas maneiras de um restaurante combinar mesas para atender a grupos maiores. Nos feeds, é necessário especificar spots_open e spots_total de uma forma que reflita com precisão se é possível aceitar partes de um determinado tamanho. Veja a seguir um exemplo de como especificar tabelas de combinação. Seus feeds podem variar um pouco na forma como esse cálculo é feito, e é aceitável especificar spots_open e spots_total de uma forma que corresponda à sua lógica de negócios.

Se um restaurante permite combinar tabelas para formar um grupo maior, atualize spots_open e spots_total para refletir isso.

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

Figura 3: planta baixa sem reservas ativas
Figura 3:planta baixa sem reservas ativas.

Caso não haja 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 a mesma planta baixa, é feita uma reserva para um grupo de 10 pessoas que combina duas mesas pequenas.

Figura 4: planta baixa com uma reserva ativa abrangendo duas mesas
Figura 4:planta baixa com uma reserva ativa abrangendo duas mesas

Então, 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