Visão geral do sistema

O TrackTickets é a plataforma da Trackhouse para venda e controle de ingressos de parques, atrações e eventos. Ele cobre o ciclo inteiro: cadastrar o que se vende, precificar, vender pela internet ou no balcão, emitir o ingresso, validar a entrada no portão e prestar contas em relatórios.

Para que o sistema serve

Na prática, o TrackTickets resolve cinco necessidades de um operador de atrações:

  • Montar o catálogo — o que existe para vender (atrações), em que datas (ocorrências), em que categorias de ingresso (passaportes) e por quanto (regras de preço).
  • Vender — por uma loja online própria (checkout público, com pagamento por cartão e Pix) e por uma frente de caixa interna (PDV com maquininha e dinheiro).
  • Entregar o ingresso — cada unidade vendida vira um voucher com código e QR Code, enviado por e-mail e/ou WhatsApp.
  • Controlar a entrada — uma tela de portão valida o voucher, registra o check-in e acompanha a ocupação do dia.
  • Prestar contas — dashboard com widgets e oito relatórios com filtros, comparação de período e exportação.

A espinha dorsal: quem manda em quê

Esta é a regra mais importante do sistema. Quatro entidades dividem responsabilidades e nenhuma invade a função da outra:

Divisão de responsabilidades no catálogo
EntidadeManda emNão manda em
AtraçãoO que é a “coisa” vendável (Piscinas, Show, Churrasqueira) e quais comportamentos ela aceita.Data, preço e capacidade.
OcorrênciaA data, o status do dia e a capacidade.Preço e tipo de ingresso.
PassaporteO tipo de ingresso que pode ser vendido, se gera voucher e se consome capacidade.Data e valor final.
Regra de preçoO valor — inclusive preço antecipado e promoções.Disponibilidade e capacidade.
Regra prática

Se o item tem data, capacidade, ocorrência, acesso ou controle operacional próprio, ele é uma atração (que pode ser oferecida como complemento de outra). Se é um item comercial simples, sem data e sem capacidade própria, é um produto.

Os dois ambientes do sistema

Painel administrativoLoja pública (checkout)
Quem usaOperadores internos da empresaCliente final
Como entraE-mail e senhaSem senha: código por WhatsApp/e-mail, CPF ou conta Google
Endereço/workspace/.../loja/<slug-da-loja> ou domínio próprio
Papel sobre os dadosCadastra e editaApenas consome o que foi publicado
LayoutMenu lateral, listagens e formuláriosMobile-first, focado em conversão

Há ainda dois aplicativos internos que abrem em tela cheia, fora do menu lateral: PDV (/pdv) e Check-in (/checkin).

Tela de login do TrackTickets: painel escuro à esquerda com a marca Trackhouse Tickets e formulário de e-mail e senha à direita.
Tela de entrada do painel administrativo (/login). À direita ficam os campos Email e Senha e o link Esqueceu?. Repare no aviso “Apenas convidados — sem cadastro público”: não existe autocadastro; o acesso é sempre criado por um administrador. Clique na imagem para ampliar.

Multiempresa (multi-tenant)

Uma mesma instalação do TrackTickets atende várias empresas ao mesmo tempo. Cada empresa é um tenant: tem catálogo, contatos, vendas, usuários, loja e configurações próprios.

  • Toda consulta e toda gravação são filtradas pela empresa. Dados de uma empresa nunca aparecem em outra.
  • Um mesmo usuário pode ser membro de mais de uma empresa e alternar entre elas pelo seletor no topo.
  • A loja pública é resolvida por slug (/loja/meu-parque) ou por domínio próprio; cada uma carrega apenas o tema e os dados daquela empresa.
  • O perfil Super Admin (equipe da plataforma) pode entrar no contexto de qualquer empresa — quando isso acontece, um banner de aviso fica visível.

Ciclo de vida de uma venda

1. CatálogoAtração, ocorrência, passaporte e preço publicados
2. VendaLoja online ou PDV; preço recalculado no servidor
3. PagamentoCartão, Pix, dinheiro ou contingência manual
4. VouchersUm por unidade de passaporte, com código e QR
5. Check-inPortão valida e registra a entrada

Detalhes de cada etapa em venda na loja online, venda no PDV e check-in.

Princípios que explicam o comportamento do sistema

O servidor é a autoridade

O preço mostrado na tela é uma prévia para o usuário. No momento de gravar a venda, o servidor recalcula cada item e ignora o valor enviado pela tela. Se não houver preço calculável, a venda não é criada. Isso vale tanto para a loja online quanto para o PDV.

O preço fica congelado na venda

Depois de gravado, o valor do item não muda mais. Alterar uma regra de preço hoje não altera vendas antigas.

Nada é apagado de verdade

Cadastros usam arquivamento (soft-delete): o registro sai do dia a dia, mas continua no banco para preservar o histórico de vendas, vouchers e relatórios. Sempre é possível restaurar.

As travas ficam no banco de dados

As regras críticas (capacidade, unicidade de nome, bloqueio de arquivamento com venda futura, voucher já usado) são impostas no banco, não só na tela. Por isso algumas ações são recusadas mesmo quando o botão parece disponível — e por isso o sistema é confiável.

Permissão é obrigatória, não opcional

Cada ação sensível tem uma permissão própria no formato recurso.ação. Esconder o botão é só conforto visual; a validação real acontece no servidor. Veja perfis e permissões.

Tecnologias (contexto para a equipe técnica)

CamadaTecnologia
InterfaceReact 19 com TanStack Start e TanStack Router
Dados no clienteTanStack Query
Banco de dados e autenticaçãoSupabase (PostgreSQL com segurança por linha, Auth e Storage)
Estilo e componentesTailwind CSS 4, Radix UI e shadcn/ui
Formulários e validaçãoReact Hook Form e Zod
Automações de servidorEdge Functions e tarefas agendadas (cron) no banco
PublicaçãoBuild com Vite 7 e deploy em Cloudflare Workers
MonitoramentoSentry (erros) e Microsoft Clarity (comportamento)
Atenção ao README do projeto

O arquivo README.md do repositório descreve a versão 1.0.0 e menciona quatro papéis fixos e 18 migrações de banco. Essa parte está desatualizada: hoje o controle de acesso é feito por permissões granulares e papéis personalizáveis, e o banco tem mais de 230 migrações. Esta base de conhecimento reflete o comportamento atual do código.