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:
| Entidade | Manda em | Não manda em |
|---|---|---|
| Atração | O que é a “coisa” vendável (Piscinas, Show, Churrasqueira) e quais comportamentos ela aceita. | Data, preço e capacidade. |
| Ocorrência | A data, o status do dia e a capacidade. | Preço e tipo de ingresso. |
| Passaporte | O tipo de ingresso que pode ser vendido, se gera voucher e se consome capacidade. | Data e valor final. |
| Regra de preço | O valor — inclusive preço antecipado e promoções. | Disponibilidade e capacidade. |
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 administrativo | Loja pública (checkout) | |
|---|---|---|
| Quem usa | Operadores internos da empresa | Cliente final |
| Como entra | E-mail e senha | Sem 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 dados | Cadastra e edita | Apenas consome o que foi publicado |
| Layout | Menu lateral, listagens e formulários | Mobile-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).
/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
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)
| Camada | Tecnologia |
|---|---|
| Interface | React 19 com TanStack Start e TanStack Router |
| Dados no cliente | TanStack Query |
| Banco de dados e autenticação | Supabase (PostgreSQL com segurança por linha, Auth e Storage) |
| Estilo e componentes | Tailwind CSS 4, Radix UI e shadcn/ui |
| Formulários e validação | React Hook Form e Zod |
| Automações de servidor | Edge Functions e tarefas agendadas (cron) no banco |
| Publicação | Build com Vite 7 e deploy em Cloudflare Workers |
| Monitoramento | Sentry (erros) e Microsoft Clarity (comportamento) |
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.