Skip to content

Papéis & Permissões ​

O controle de acesso do módulo Tours segue o modelo RBAC: cada usuário staff recebe um ou mais papéis (roles), e cada papel é composto de permissões. As permissões são o que a API verifica de fato — quando falta a permissão exigida, a resposta é 403 com code: FORBIDDEN.

Os dois lados do modelo têm escopos diferentes:

  • Papéis são por instância: cada estabelecimento monta os seus (recepcionista, caixa, governança…). Papéis semeados pelo sistema carregam isSystem: true — o owner (Proprietário) é criado no setup da instância com todas as permissões.
  • Permissões formam um catálogo global (29 itens semeados no setup), compartilhado por todas as instâncias. As rotas passam pela cadeia normal do módulo — X-Tour-Id e token staff são obrigatórios — mas o catálogo em si não é filtrado por instância.

A vinculação de papéis a usuários é feita em Atualizar Papéis.

Headers obrigatórios

Todas as requisições devem incluir o header X-Tour-Id (UUID) com o identificador da instância e Authorization: Bearer {token} com o token de um usuário staff (guard toursUser).


Catálogo de Permissões ​

As 29 permissões semeadas no setup, agrupadas por categoria:

CódigoCategoriaDescrição
reservation.readreservasVisualizar reservas
reservation.writereservasCriar e editar reservas
reservation.cancelreservasCancelar reservas e aplicar multa
reservation.check_inreservasRealizar check-in e check-out
resource.assignreservasAtribuir unidade física à reserva
rate.readtarifasConsultar tabelas de preço
rate.writetarifasCriar e alterar tarifas e regras
pos.orderposLançar pedidos em comanda
pos.void_itemposCancelar item já lançado
pos.discountposConceder desconto
pos.transferposTransferir itens entre comandas
kds.update_statusposAlterar status de preparo
bill.issuefinanceiroFechar e emitir conta
bill.splitfinanceiroDividir conta
payment.recordfinanceiroRegistrar recebimento
payment.refundfinanceiroEstornar recebimento
cash.open_closefinanceiroAbrir e fechar caixa
report.financialfinanceiroAcessar relatórios financeiros
stock.readestoqueConsultar estoque
stock.adjustestoqueAjustar saldo e registrar perdas
stock.purchaseestoqueRegistrar entradas de compra
customer.readcrmConsultar cadastro de clientes
customer.writecrmCriar e editar clientes
customer.document.readcrmAcessar documentos de identificação
housekeeping.updateoperacoesAtualizar status de limpeza
maintenance.manageoperacoesAbrir e encerrar ordens de manutenção
staff.manageadminGerenciar usuários e papéis
settings.manageadminConfigurar tour, impostos e taxas
audit.readadminConsultar trilha de auditoria

Endpoints — Papéis ​

Listar Papéis ​

Lista os papéis da instância, com paginação, busca e filtros.

http
GET /v1/tours/user/roles

Parâmetros de Query ​

NomeTipoObrigatórioDescrição
pagenumberNãoO número da página (mínimo: 1).
perPagenumberNãoItens por página (entre 1 e 100, padrão: 25).
searchstringNãoBusca por código ou nome (máx. 150 caracteres).
isSystembooleanNãoFiltra por papéis de sistema / criados pelo administrador.
orderByenumNãoid, code, name ou createdAt (padrão: id).
orderDirectionenumNãoasc ou desc (padrão: desc).

Exemplo de Requisição ​

bash
curl -X GET "https://api.us.basis.tavares.in/v1/tours/user/roles" \
  -H "X-Tour-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer {token}" \
  -H "Accept: application/json"

Respostas ​

200 OK

Retorna a página de papéis no formato meta/data.

json
{
  "meta": {
    "currentPage": 1,
    "perPage": 10
  },
  "data": [
    {
      "id": 2,
      "tourId": 1,
      "code": "recepcionista",
      "name": "Recepcionista",
      "isSystem": false,
      "createdAt": "2026-10-07T11:56:13.797-03:00",
      "updatedAt": "2026-10-07T11:56:13.797-03:00"
    },
    {
      "id": 1,
      "tourId": 1,
      "code": "owner",
      "name": "Proprietário",
      "isSystem": true,
      "createdAt": "2026-10-07T11:56:13.297-03:00",
      "updatedAt": "2026-10-07T11:56:13.297-03:00"
    }
  ]
}

Criar Papel ​

Cria um novo papel na instância (exige permissão staff.manage). As permissões são atribuídas em seguida, em Atualizar Permissões do Papel.

http
POST /v1/tours/user/roles

Payload (Body) ​

AtributoTipoObrigatórioDescrição
codestringSimCódigo único na instância (máx. 50 caracteres).
namestringSimNome de exibição (máx. 150 caracteres).
isSystembooleanNãoMarca o papel como de sistema (padrão: false).

Exemplo de Requisição ​

bash
curl -X POST "https://api.us.basis.tavares.in/v1/tours/user/roles" \
  -H "X-Tour-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "code": "doc-atendente",
    "name": "Atendente Doc",
    "isSystem": false
  }'

Respostas ​

201 Created

Retorna o ID do papel criado.

json
{
  "id": 5
}

422 Unprocessable Entity

Ocorre quando o código já existe na instância ou o payload é inválido.

json
{
  "errors": [
    {
      "message": "Código já cadastrado",
      "rule": "database.unique",
      "field": "code"
    }
  ]
}

403 Forbidden

Ocorre quando o usuário autenticado não possui a permissão staff.manage (code: FORBIDDEN).

Listar para Dropdown ​

Retorna os papéis em formato simplificado (value/label), ideal para selects.

http
GET /v1/tours/user/roles/list

Aceita search e isSystem como filtros opcionais de query.

Exemplo de Requisição ​

bash
curl -X GET "https://api.us.basis.tavares.in/v1/tours/user/roles/list" \
  -H "X-Tour-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer {token}" \
  -H "Accept: application/json"

Respostas ​

200 OK

Retorna um array com os papéis.

json
[
  {
    "value": 5,
    "label": "Atendente Doc"
  },
  {
    "value": 1,
    "label": "Proprietário"
  }
]

Obter Papel por ID ​

Recupera os detalhes de um papel da instância, incluindo suas permissões.

http
GET /v1/tours/user/roles/:id

Parâmetros de Rota ​

NomeTipoObrigatórioDescrição
idnumberSimO ID do papel.

Respostas ​

200 OK

Retorna o papel com toursPermissions.

json
{
  "id": 5,
  "tourId": 1,
  "code": "doc-atendente",
  "name": "Atendente Doc",
  "isSystem": false,
  "createdAt": "2026-10-07T15:11:06.548-03:00",
  "updatedAt": "2026-10-07T15:11:06.548-03:00",
  "toursPermissions": []
}

404 Not Found

Ocorre quando o papel não existe na instância.

Atualizar Papel ​

Atualiza código, nome ou flag de sistema de um papel (exige permissão staff.manage).

http
PUT /v1/tours/user/roles/:id

Payload (Body) ​

AtributoTipoObrigatórioDescrição
codestringNãoCódigo único na instância (máx. 50 caracteres).
namestringNãoNome de exibição (máx. 150 caracteres).
isSystembooleanNãoMarca o papel como de sistema.

Respostas ​

204 No Content

Atualização concluída com sucesso.

422 Unprocessable Entity

Ocorre quando o código informado já pertence a outro papel da instância.

403 Forbidden

Ocorre quando o usuário autenticado não possui a permissão staff.manage (code: FORBIDDEN).

Atualizar Permissões do Papel ​

Substitui as permissões de um papel (exige permissão staff.manage). Envie o array completo — os vínculos anteriores são substituídos.

http
PUT /v1/tours/user/roles/:id/permissions

Payload (Body) ​

AtributoTipoObrigatórioDescrição
permissionIdsnumber[]SimIDs das permissões a vincular ao papel.

Exemplo de Requisição ​

bash
curl -X PUT "https://api.us.basis.tavares.in/v1/tours/user/roles/5/permissions" \
  -H "X-Tour-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "permissionIds": [1]
  }'

Respostas ​

204 No Content

Permissões atualizadas com sucesso.

422 Unprocessable Entity

Ocorre quando alguma permissão não existe no catálogo.

403 Forbidden

Ocorre quando o usuário autenticado não possui a permissão staff.manage (code: FORBIDDEN).

Remover Papel ​

Remove um papel via soft delete (exige permissão staff.manage).

http
DELETE /v1/tours/user/roles/:id

Respostas ​

204 No Content

Remoção concluída com sucesso.

403 Forbidden

Ocorre quando o usuário autenticado não possui a permissão staff.manage (code: FORBIDDEN).


Endpoints — Catálogo de Permissões ​

O catálogo é global e já vem semeado com as 29 permissões do módulo. As consultas (index, show, list) servem para montar telas de composição de papéis; as mutações exigem a permissão settings.manage e permitem estender o catálogo.

Listar Permissões ​

Lista as permissões do catálogo, com paginação, busca e filtros.

http
GET /v1/tours/user/permissions

Parâmetros de Query ​

NomeTipoObrigatórioDescrição
pagenumberNãoO número da página (mínimo: 1).
perPagenumberNãoItens por página (entre 1 e 100, padrão: 25).
searchstringNãoBusca por código ou descrição (máx. 150 caracteres).
categorystringNãoFiltra por categoria (máx. 50 caracteres).
orderByenumNãoid, code ou category (padrão: id).
orderDirectionenumNãoasc ou desc (padrão: desc).

Exemplo de Requisição ​

bash
curl -X GET "https://api.us.basis.tavares.in/v1/tours/user/permissions?category=financeiro" \
  -H "X-Tour-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer {token}" \
  -H "Accept: application/json"

Respostas ​

200 OK

Retorna a página de permissões no formato meta/data.

json
{
  "meta": {
    "currentPage": 1,
    "perPage": 10
  },
  "data": [
    {
      "id": 29,
      "code": "audit.read",
      "category": "admin",
      "description": "Consultar trilha de auditoria"
    },
    {
      "id": 28,
      "code": "settings.manage",
      "category": "admin",
      "description": "Configurar tour, impostos e taxas"
    },
    {
      "id": 27,
      "code": "staff.manage",
      "category": "admin",
      "description": "Gerenciar usuários e papéis"
    }
  ]
}

Criar Permissão ​

Adiciona uma permissão ao catálogo global (exige permissão settings.manage).

http
POST /v1/tours/user/permissions

Payload (Body) ​

AtributoTipoObrigatórioDescrição
codestringSimCódigo único no catálogo (máx. 100 caracteres).
categorystringSimCategoria (máx. 50 caracteres).
descriptionstringSimDescrição (máx. 255 caracteres).

Exemplo de Requisição ​

bash
curl -X POST "https://api.us.basis.tavares.in/v1/tours/user/permissions" \
  -H "X-Tour-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "code": "demo.docs",
    "category": "docs",
    "description": "Permissão de demonstração da documentação"
  }'

Respostas ​

201 Created

Retorna o ID da permissão criada.

json
{
  "id": 33
}

422 Unprocessable Entity

Ocorre quando o código já existe no catálogo ou o payload é inválido.

403 Forbidden

Ocorre quando o usuário autenticado não possui a permissão settings.manage (code: FORBIDDEN).

Listar para Dropdown ​

Retorna as permissões em formato simplificado (value/label com o código), ideal para selects na composição de papéis.

http
GET /v1/tours/user/permissions/list

Aceita search e category como filtros opcionais de query.

Exemplo de Requisição ​

bash
curl -X GET "https://api.us.basis.tavares.in/v1/tours/user/permissions/list" \
  -H "X-Tour-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer {token}" \
  -H "Accept: application/json"

Respostas ​

200 OK

Retorna um array com as permissões.

json
[
  {
    "value": 29,
    "label": "audit.read"
  },
  {
    "value": 13,
    "label": "bill.issue"
  },
  {
    "value": 14,
    "label": "bill.split"
  },
  {
    "value": 17,
    "label": "cash.open_close"
  }
]

Obter Permissão por ID ​

Recupera os detalhes de uma permissão do catálogo.

http
GET /v1/tours/user/permissions/:id

Parâmetros de Rota ​

NomeTipoObrigatórioDescrição
idnumberSimO ID da permissão.

Respostas ​

200 OK

Retorna a permissão.

json
{
  "id": 33,
  "code": "demo.docs",
  "category": "docs",
  "description": "Permissão de demonstração da documentação"
}

404 Not Found

Ocorre quando a permissão não existe no catálogo.

Atualizar Permissão ​

Atualiza código, categoria ou descrição de uma permissão (exige permissão settings.manage).

http
PUT /v1/tours/user/permissions/:id

Payload (Body) ​

AtributoTipoObrigatórioDescrição
codestringNãoCódigo único no catálogo (máx. 100 caracteres).
categorystringNãoCategoria (máx. 50 caracteres).
descriptionstringNãoDescrição (máx. 255 caracteres).

Respostas ​

204 No Content

Atualização concluída com sucesso.

422 Unprocessable Entity

Ocorre quando o código informado já pertence a outra permissão do catálogo.

403 Forbidden

Ocorre quando o usuário autenticado não possui a permissão settings.manage (code: FORBIDDEN).

Remover Permissão ​

Remove uma permissão do catálogo (exige permissão settings.manage).

http
DELETE /v1/tours/user/permissions/:id

Respostas ​

204 No Content

Remoção concluída com sucesso.

403 Forbidden

Ocorre quando o usuário autenticado não possui a permissão settings.manage (code: FORBIDDEN).