Skip to content

Reservas

O módulo de reservas (backend/src/reservations/) gerencia reservas de mesa com ciclo de vida completo, anti-spam por telefone, detecção de double-booking e NPS pós-visita automático.

Visão Geral

CaracterísticaDetalhe
Módulo backendbackend/src/reservations/
View adminfrontend-react/src/views/admin/ReservationsView.tsx
Rota/t/:slug/admin/reservations
SchemaReservation
SchedulerNoShowScheduler — marca no_show automaticamente
Permissão adminPermission.AllReservations
Módulo habilitadotenant.reservationsEnabled = true

Schema Reservation

CampoTipoDescrição
customerNamestring
customerPhonestring
customerEmailstring?
dateDateData da reserva
timestringHH:MM
partySizenumberMin 1
tableObjectId? → TableMesa atribuída
statusenumVer tabela abaixo
notesstring?Observações
tenantObjectId
npsTokenstring?Token único para link de NPS pós-visita
npsRequestedAtDate?Quando o email de NPS foi enviado
npsScorenumber?0–10 (NPS do cliente)

Status

StatusDescrição
pendingAguardando confirmação do admin
confirmedConfirmada — cliente notificado
cancelledCancelada (por admin ou cliente)
completedCliente chegou e foi atendido
no_showMarcou e não compareceu (atribuído automaticamente)

Regras de Negócio

Anti-spam por telefone

Um mesmo customerPhone não pode ter mais de 5 reservas em aberto (pending ou confirmed) simultaneamente por tenant. Retorna 400 Bad Request ao exceder o limite.

Anti-double-booking

Mesma mesa + data + horário com status diferente de cancelled/no_show409 Conflict.

Reservas no passado

Datas anteriores a hoje retornam 400 Bad Request.

Throttle público

O endpoint POST /t/:slug/reservations tem rate-limit de 3 requisições/minuto por IP (proteção contra bots).

Endpoints

MétodoRotaPermissãoDescrição
POST/t/:slug/reservationsPúblicoCliente cria reserva
GET/t/:slug/reservationsAllReservationsLista (filtro ?date=&status=)
GET/t/:slug/reservations/statsAllReservationsEstatísticas do período
PUT/t/:slug/reservations/:idAllReservationsAtualiza (confirmar, cancelar, etc.)
GET/t/:slug/reservations/nps/:tokenPúblicoCliente responde NPS

Pré-pedido com Slots de Capacidade

O PreOrderSlotsService (backend/src/orders/pre-order-slots.service.ts) calcula a capacidade disponível por janela de tempo configurável por filial:

typescript
branch.preOrderSlots = {
  bucketMinutes: 15,       // janela de tempo (padrão 15 min)
  capacityPerBucket: 10,   // pedidos por janela (padrão 10)
  prepTimeMinutes: 15,     // antecedência mínima (padrão 15 min)
}

Janelas esgotadas retornam full: true. O serviço projeta 7 dias à frente a partir de fromDate.

Integração com Notificações

  • Confirmação: WhatsApp/email ao confirmar (via NotificationsService)
  • Lembrete: 24h antes da reserva
  • NPS: Email com link /reservations/nps/:token após marcar completed

Relacionados

Lançado sob a licença MIT.