Appearance
Módulo de Tours (Hospitalidade & Lazer)
O módulo de Tours é uma plataforma headless completa para hospitalidade, lazer e experiências. Ele cobre a operação inteira de um estabelecimento — pousada, beach club ou operadora de passeios: recursos reserváveis (quartos, camas balinesas, lanchas, equipamentos e serviços), motor de alocação anti double-booking, precificação dinâmica com regras sazonais, CRM de hóspedes, ponto de venda com comandas e KDS, estoque com ficha técnica e o financeiro completo com folio, split de conta e pagamentos manuais.
Cada estabelecimento é uma instância isolada (um tour), com usuários, papéis, catálogo, tarifas e operação próprios. Um workspace pode ter vários estabelecimentos, cada um com regras independentes — fuso, moeda, virada do dia operacional e horários de check-in/check-out.
Por que utilizar este módulo?
- Um único motor para qualquer coisa reservável: quarto, cama de praia, passeio de barco, prancha ou massagem são o mesmo conceito — tipo (o que se vende) e recurso (a unidade física). O mesmo motor atende o quarto exclusivo e os 20 assentos da lancha.
- Tudo que ocupa recurso vive na mesma tabela: reserva, manutenção, limpeza, bloqueio do proprietário e hold de checkout competem pela mesma agenda — uma manutenção jamais colide com uma reserva.
- Preço combinado não muda: diárias, consumos e impostos são congelados no momento da venda/lançamento. A tabela pode mudar amanhã; a conta do hóspede de ontem continua auditável.
- POS offline-first: comandas, pedidos e pagamentos carregam
clientRef(UUID gerado no dispositivo) como chave de idempotência — reenviar o mesmo pedido após reconexão não duplica a venda. - RBAC granular: 29 permissões agrupadas em papéis por estabelecimento, do recepcionista ao financeiro.
As Duas Áreas do Módulo
| Área | Prefixo das rotas | Público | Guard |
|---|---|---|---|
| Gestão da instância | /user/tours | Dono da conta (módulo user) | user |
| Staff (equipe) | /v1/tours/user | Recepção, POS, governança, admin | toursUser |
- A gestão da instância cria e configura os estabelecimentos (nome, fuso, moeda, endereço, domínios autorizados) e segue a autenticação da plataforma.
- A área de staff concentra toda a operação: reservas, tarifas, clientes, POS, estoque, financeiro, governança e administração.
Autenticação e Contexto
Identificação da Instância
Todas as requisições para os endpoints /v1/tours/** (públicas ou privadas) devem incluir o identificador da instância:
| Header | Tipo | Obrigatório | Descrição |
|---|---|---|---|
X-Tour-Id | UUID | Sim | O tokenHeader da instância, gerado na criação (ver Gestão da Instância). |
Como funciona o X-Tour-Id
O middleware resolve a instância pelo tokenHeader e valida se o domínio (ou IP) de origem está na lista de domínios autorizados do workspace, conforme a configuração allowBy (domain ou ip). Requisições sem o header, com instância inexistente ou com origem não autorizada recebem 401 Unauthorized. Instância ou workspace inativos recebem 503 Service Unavailable.
bash
curl -X GET "https://api.us.basis.tavares.in/v1/tours/user/reservations" \
-H "X-Tour-Id: 123e4567-e89b-12d3-a456-426614174000" \
-H "Accept: application/json"Token de Acesso (Staff)
O login da equipe usa e-mail + PIN numérico (4 a 8 dígitos) — pensado para acesso rápido no POS e na recepção:
| Contexto | Endpoint de login | Credenciais |
|---|---|---|
| Staff | POST /v1/tours/user/users/login | email + pin |
Retorna um token Bearer com validade de 30 dias. O logout invalida o token imediatamente. O PIN nunca é armazenado em claro — apenas o hash (scrypt).
| Header | Valor | Descrição |
|---|---|---|
Authorization | Bearer <token> | Token obtido no login do staff. |
Resumo dos Headers
http
GET /v1/tours/user/reservations
X-Tour-Id: 123e4567-e89b-12d3-a456-426614174000
Authorization: Bearer {token}
Accept: application/jsonControle de Acesso (RBAC por Permissões)
O acesso é controlado por papéis (roles) compostos de permissões, ambos por instância. O papel owner é criado no setup com todas as permissões; os demais papéis são montados pelo administrador (ver Papéis & Permissões).
Mutaciones exigem a permissão correspondente — a API responde 403 com code: FORBIDDEN quando falta:
| Código | Área | Código | Área |
|---|---|---|---|
reservation.read | reservas | bill.issue | financeiro |
reservation.write | reservas | bill.split | financeiro |
reservation.cancel | reservas | payment.record | financeiro |
reservation.check_in | reservas | payment.refund | financeiro |
resource.assign | reservas | cash.open_close | financeiro |
rate.read | tarifas | report.financial | financeiro |
rate.write | tarifas | stock.read | estoque |
pos.order | pos | stock.adjust | estoque |
pos.void_item | pos | stock.purchase | estoque |
pos.discount | pos | customer.read | crm |
pos.transfer | pos | customer.write | crm |
kds.update_status | pos | customer.document.read | crm |
housekeeping.update | operações | staff.manage | admin |
maintenance.manage | operações | settings.manage | admin |
audit.read | admin |
Billing e Limites de Plano
Todas as rotas do módulo passam por limite de plano e contabilização de uso. Quando o plano não permite a operação, a API responde 402 Payment Required com um dos seguintes códigos:
| Code | Significado |
|---|---|
PENDING_INVOICES | Existem faturas pendentes no workspace. |
PLAN_REQUIRED | O workspace não possui um plano ativo para o módulo. |
USAGE_LIMIT_EXCEEDED | O limite de uso do plano foi atingido. |
Convenções da API
- Paginação: parâmetros
page/perPage(máx. 100) com resposta no formato{ "meta": { "currentPage", "perPage" }, "data": [...] }. - Listas para dropdown: endpoints
GET .../listretornam[{ "value", "label" }], comsearchopcional. - Ordenação:
orderBy(campos permitidos por recurso) +orderDirection(asc/desc). - Soft delete: registros removidos não aparecem em consultas. Livros-razão (pagamentos, lançamentos, movimentos de estoque) não usam soft delete — correções são feitas por estorno/void, nunca por remoção.
- Erros de validação:
422 Unprocessable Entitycomerrors: [{ "message", "rule", "field" }]. - Datas e horários: sempre em ISO 8601; filtros de período usam
YYYY-MM-DD; janelas de horário usamHH:mm. Timestamps são gravados em UTC — a conversão para o fuso do estabelecimento (timezoneda instância) acontece na apresentação. - Dia da semana:
dayOfWeeksegue a convenção JS/luxon —0= domingo …6= sábado. - Dinheiro: valores monetários em decimal com 2 casas, na moeda da instância (
currency). - Idempotência: operações sensíveis à reconexão (pedidos, pagamentos, comandas) aceitam
clientRef(UUID gerado no dispositivo). - Rate limit: 3000 req/min para o módulo; as rotas de gestão da instância (
/user/tours) seguem o throttle do módulouser(100 req/min).
Códigos de Erro de Negócio
| Code | Status | Significado |
|---|---|---|
FORBIDDEN | 403 | O usuário não possui a permissão exigida. |
Próximos Passos
- Gestão da Instância
- Usuários & Autenticação (Staff)
- Papéis & Permissões
- Turnos & Caixa
- Recursos Reserváveis
- Disponibilidade & Exceções
- Tarifas & Precificação
- Políticas de Cancelamento
- Impostos & Taxas
- Clientes (CRM)
- Reservas & Alocações
- Catálogo de Produtos
- Estoque
- Ponto de Venda (POS)
- Financeiro
- Governança & Manutenção
- Infraestrutura & Auditoria