Trip Sampa
DOC → Handoff
Trip Sampa — DOC
🚌

Trip Sampa

Sistema de gestão operacional. Controla vendas, vendedores, comissões, passageiros e listas de embarque — integrado ao WooCommerce para automação completa do fluxo comercial.

Status: Produção. O sistema está funcional e rodando com dados reais de Fevereiro/2026. Todos os módulos descritos nesta documentação estão operacionais.

O que o sistema resolve

A Trip Sampa opera excursões rodoviárias com uma rede de vendedores por indicação. Antes do sistema, o rastreio de quem vendeu o quê, o cálculo de comissões e a geração de listas operacionais era manual. Isso gerava erros, conflitos e retrabalho constante.

O Trip Sampa automatiza todo esse fluxo:

🔗

Atribuição automática

Cada vendedor tem um link único. Vendas pelo link são atribuídas automaticamente a ele.

💰

Comissão calculada

O percentual é configurável por vendedor. O sistema calcula sobre vendas confirmadas em tempo real.

📋

Listas operacionais

Exportação em CSV das listas de guia e ônibus com todos os dados de embarque.

🛒

WooCommerce sync

Pedidos e produtos sincronizados via webhooks. Zero entrada manual de dados.

Quem usa o sistema

PerfilAcessoO que faz
Admin Acesso total Gerencia passageiros, vendedores, pacotes, listas operacionais e métricas. Cria contas de vendedores.
Vendedor Portal restrito Visualiza seus leads, vendas, comissão acumulada e gera links de venda personalizados.

Stack técnico rápido

React 18 Vite Tailwind CSS Supabase (Auth + DB) Edge Functions (Deno) WooCommerce API PostgreSQL Row Level Security

Arquitetado, desenvolvido e entregue por Elastre

Arquitetura & Stack

Visão técnica de como os componentes se conectam — do frontend React até o WooCommerce.

Fluxo principal

Site
WooCommerce
Webhook
Edge Function
Banco
Supabase DB
Interface
React App

Componentes

CamadaTecnologiaDetalhe
FrontendReact 18 + ViteSPA com componentes funcionais, hooks, Context API para Auth e Toast. Tailwind CSS para estilos.
AuthSupabase AuthEmail/password. Roles definidos na tabela profiles. Sessions gerenciadas via onAuthStateChange.
DatabasePostgreSQL (Supabase)7 tabelas principais + views otimizadas. RLS ativado em todas as tabelas.
Edge FunctionsDeno (Supabase)2 funções: woocommerce-order e woocommerce-product. Recebem webhooks e escrevem no banco.
E-commerceWooCommerce (WordPress)Vende os pacotes. Envia webhooks em pedido criado/atualizado e produto criado/atualizado.
ReferralPHP (functions.php)Captura ?ref= da URL, armazena em cookie/session, injeta no pedido como meta_data.

Estrutura do projeto

tripsampa/
├── src/
│   ├── App.jsx            ← Aplicação completa (componentes + lógica)
│   ├── lib/
│   │   └── supabase.js    ← Cliente Supabase (env vars)
│   ├── index.css           ← Tailwind directives
│   └── main.jsx            ← Entry point
├── supabase/
│   └── migrations/
│       └── 001_initial_schema.sql  ← Schema completo do banco
├── docs/
│   └── STEP_BY_STEP_INTEGRATION.md ← Guia de webhooks
├── .env                    ← Variáveis de ambiente
├── resync-orders.mjs       ← Script de re-sync de pedidos
├── vite.config.js
├── tailwind.config.js
└── package.json

Single-file architecture: Todo o frontend está em App.jsx (~2300 linhas). Isso é intencional — facilita deploy e manutenção sem configuração complexa de roteamento.

🔐

Autenticação & Roles

Como o sistema gerencia login, sessões, criação de contas e permissões baseadas em roles.

Fluxo de login

O sistema abre por padrão na tela de login. Ambos admins e vendedores acessam pelo mesmo ponto de entrada com email + senha.

Entrada
LoginScreen
Supabase
signInWithPassword
Profile
Role check
UI
Admin / Vendedor

Primeiro acesso (Admin)

Na tela de login existe o link "Primeira vez? Criar conta de administrador". Ao clicar:

  1. Chave de convite é solicitada (ex: TRIPSAMPA-2026-ALPHA)
  2. Onboarding wizard de 5 etapas guia a criação da conta admin
  3. Após conclusão, o admin é logado automaticamente

A chave de convite é sempre exigida ao clicar em "Criar conta". Os flags de localStorage são limpos para garantir que o fluxo completo seja refeito.

Conta de vendedor

Vendedores não criam conta sozinhos. O admin cria a conta na aba "Vendedores" e recebe credenciais temporárias (email + senha gerada). O vendedor faz login normalmente e vê seu portal restrito.

Gerenciamento de sessão

A sessão usa o Supabase Auth. O AuthProvider escuta onAuthStateChange para reagir a eventos de login/logout. Detalhe técnico importante:

🔑

saveVendedor: Quando o admin cria um vendedor, signUp() troca a sessão para o novo usuário. O sistema salva a sessão admin antes, e restaura após a criação usando um flag _skipAuthEvents para evitar que o listener de auth reaja à troca temporária.

Row Level Security (RLS)

Todas as 7 tabelas possuem RLS ativado. Políticas resumidas:

TabelaAdminVendedor
profilesLê/edita todosLê/edita próprio
leadsCRUD completoLê próprios leads
packagesCRUD completoLê ativos
parcelasCRUD completoSegue acesso do lead
configuracoesCRUD completoSem acesso
📊

Dashboard & Métricas

O painel de visão geral mostra os KPIs mais importantes em tempo real.

Filtros de período

O dashboard possui filtros de Semana, Mês e Tudo. Permitem visualizar KPIs e passageiros recentes apenas do período selecionado. Ideal para acompanhamento semanal/mensal de resultados.

Métricas do admin

Faturamento

Soma de valor_pago de todos os leads com status pago no período selecionado.

Comissões

Para cada lead pago com vendedor, calcula: valor_pago × (comissao_percentual / 100). Dinâmico por vendedor.

Novos Leads

Contagem de leads com status novo no período.

Vendas

Contagem de leads com status pago no período.

Comissão dinâmica: O sistema busca o comissao_percentual individual de cada vendedor (padrão 5%). Não usa valor fixo — se um vendedor tem 7%, o cálculo reflete isso.

Tabela de passageiros recentes

Abaixo dos KPIs, exibe os últimos 5 passageiros (filtrados pelo período selecionado) com nome, pacote, status e valor. Serve como snapshot rápido da atividade.

👥

Passageiros

Gestão completa de passageiros/leads com CRUD, busca, filtro e responsive design.

Funcionalidades

Campos do passageiro

CampoTipoObservação
Nome *textoObrigatório
TelefonetextoFormatado como (XX) XXXXX-XXXX
EmailemailOpcional
CPFtextoPara listas de embarque
RGtextoPara lista do ônibus
Órgão Emissor (RG)textoEx: SSP/SP — exibido na lista do ônibus
PacoteselectVinculado a packages
Vendedorselect"Orgânico" se sem vendedor
Statusenumnovo / pendente / pago / cancelado
Valor Total / PagodecimalValores financeiros
PoltronainteiroNúmero do assento
Local de EmbarquetextoEx: Terminal Tietê, Metrô Barra Funda
HospedagemtextoHotel, quarto — quando a viagem inclui hospedagem
PasseiostextoPasseios inclusos — quando a viagem inclui passeios
ObservaçõestextareaNotas livres

Passageiros adicionais (acompanhantes)

Quando uma compra inclui mais de uma pessoa, o admin pode adicionar acompanhantes ao passageiro principal:

A maioria dos passageiros chega automaticamente via WooCommerce. O CRUD manual existe para ajustes, vendas por WhatsApp ou cadastros presenciais. Campos como local de embarque, hospedagem e passeios são preenchidos manualmente pelo admin conforme a necessidade de cada viagem.

🤝

Vendedores & Comissões

Cadastro de vendedores com criação automática de conta, link de referência e cálculo de comissão individual.

Criando um vendedor

O fluxo completo de criação acontece dentro do painel admin:

  1. Admin clica em "+ Novo" na aba Vendedores
  2. Preenche nome, email, telefone, código de referência e % de comissão
  3. O sistema cria uma conta Supabase Auth com senha temporária gerada automaticamente
  4. Um modal exibe as credenciais (email + senha) para o admin copiar e enviar ao vendedor
  5. O vendedor usa essas credenciais para fazer login e acessar seu portal

Card do vendedor

Cada vendedor exibe em seu card:

Cálculo de comissão

comissão = leads.filter(status === 'pago' && vendedor_id)
    .reduce((sum, lead) => {
        const pct = vendedor.comissao_percentual / 100;
        return sum + (lead.valor_pago * pct);
    }, 0);

O percentual é individual por vendedor (padrão 5%). Pode ser alterado a qualquer momento editando o vendedor. A mudança reflete imediatamente no dashboard.

📦

Pacotes & Operacional

Pacotes de viagem sincronizados do WooCommerce e listas de embarque exportáveis.

Pacotes

A tela de pacotes é somente leitura. Os pacotes são criados e gerenciados no WooCommerce e sincronizados automaticamente via webhook. Cada card mostra:

Filtro de mês nos pacotes

A tela de pacotes possui filtros: Este mês, Próximo mês e Todos. Filtra os pacotes pela data de viagem, facilitando foco nas viagens mais próximas.

Operacional — Listas de embarque

Na aba Operacional, o admin seleciona um pacote e acessa duas listas:

Lista Guia

Nome, telefone, documentos (CPF/RG), observações, passeios e hospedagem de cada passageiro. Pensada para o guia no dia da viagem.

Lista Ônibus

Nome, CPF, RG, órgão emissor e número da poltrona. Pensada para a empresa de transporte.

Ambas podem ser exportadas em CSV com codificação UTF-8 (com BOM para compatibilidade com Excel). O CSV inclui todos os campos da lista correspondente.

As listas mostram apenas passageiros com status pago. Passageiros pendentes ou cancelados não aparecem nas listas operacionais.

Portal do Vendedor

Interface dedicada para vendedores acompanharem resultados e gerarem links de venda.

Primeiro acesso

Na primeira vez que um vendedor faz login, um tutorial interativo de 4 etapas explica:

  1. Boas-vindas personalizadas com o nome do vendedor
  2. Como funcionam os links de venda
  3. Como acompanhar vendas e comissão
  4. Dicas finais (alterar senha, usar links corretos, etc.)

O tutorial pode ser pulado e não aparece novamente após ser concluído (flag em localStorage).

Telas do vendedor

Dashboard pessoal com 4 KPIs: total de leads, vendas confirmadas, valor total vendido e comissão acumulada. A comissão usa o percentual individual do vendedor. Possui filtros de período (Semana / Mês / Tudo) para o vendedor acompanhar seus resultados por período.

Exibe um link geral (tripsampaviagens.com.br?ref=codigo) e links por pacote (tripsampaviagens.com.br/produto/slug?ref=codigo). Cada link tem botão de copiar com feedback visual.

Lista de todos os clientes que compraram via link do vendedor. Mostra nome, telefone, pacote, status e valor. Tabela no desktop, cards no mobile. Somente leitura.

Formulário para o vendedor trocar a senha temporária. Requer mínimo de 6 caracteres e confirmação.

🛒

WooCommerce & Webhooks

Como a loja WooCommerce se conecta ao sistema via Edge Functions e webhooks.

Arquitetura da integração

Cliente compra
WooCommerce
Webhook POST
JSON do pedido
Edge Function
woocommerce-order
Insere
leads table

Edge Functions

Recebe o JSON completo do pedido WooCommerce e:

1. Extrai dados do cliente (billing: nome, email, telefone, CPF)

2. Busca ref nos meta_data do pedido

3. Se encontra ref, busca o vendedor correspondente na tabela profiles

4. Busca o pacote correspondente via product_id ou sku

5. Cria o lead com status pago (se completed) ou pendente

6. Define origem como ref:codigo ou site

Recebe dados de produto e faz upsert na tabela packages:

→ Mapeia product.namenome, product.pricepreco

→ Usa woocommerce_id como chave de conflito para atualizar produtos existentes

→ Suporta meta_data customizado para capacidade_onibus e data_viagem

Captura de referral (?ref=)

No WordPress, um snippet em functions.php captura o parâmetro ?ref= da URL:

  1. Armazena em WooCommerce session e cookie de 30 dias
  2. No checkout, injeta como order meta_data (chaves ref e _ref)
  3. A Edge Function lê esse meta_data para atribuir ao vendedor

Webhooks necessários no WooCommerce

NomeEventoURL
Novo PedidoOrder created.../functions/v1/woocommerce-order
Pedido AtualizadoOrder updated.../functions/v1/woocommerce-order
Produto CriadoProduct created.../functions/v1/woocommerce-product
Produto AtualizadoProduct updated.../functions/v1/woocommerce-product

Script de re-sync

O arquivo resync-orders.mjs permite importar pedidos em lote (ex: todos de Fevereiro). Ele busca pedidos da API WooCommerce e envia cada um para a Edge Function.

node resync-orders.mjs

A Edge Function faz INSERT. Se rodar o resync duas vezes, pode criar duplicatas. Verifique com: SELECT woocommerce_order_id, COUNT(*) FROM leads GROUP BY woocommerce_order_id HAVING COUNT(*) > 1;

🗄

Banco de Dados

Schema PostgreSQL completo com 7 tabelas, views otimizadas, triggers e RLS.

Tabelas principais

profiles
id (PK, FK→auth.users) email nome telefone role (admin|vendedor|guia) referral_code (UNIQUE) comissao_percentual ativo
leads
id (PK) nome email telefone cpf / rg orgao_emissor_rg novo package_id (FK) vendedor_id (FK) status woocommerce_order_id valor_total / valor_pago poltrona origem local_embarque novo hospedagem novo passeios novo
packages
id (PK) woocommerce_id (UNIQUE) nome destino data_viagem preco capacidade_onibus status slug (UNIQUE)
parcelas
id (PK) lead_id (FK) numero valor data_vencimento status
acompanhantes
id (PK) lead_id (FK) nome cpf rg telefone novo
configuracoes / notificacoes
Tabelas auxiliares para settings e WhatsApp

Views

ViewUso
v_vendas_detalhadasJoins leads + packages + profiles com cálculo de comissão
v_metricas_vendedorAgrupado por vendedor: total leads, vendas, comissão
v_lista_guiaLista de embarque para guia (passageiros pagos)
v_lista_onibusLista para empresa de transporte (CPF, RG, poltrona)

Triggers

📖

Passo a Passo

Guia prático de como operar o sistema no dia a dia — para admins e vendedores.

Para o Administrador

1. Acesse a aba Vendedores no menu lateral

2. Clique no botão "+ Novo"

3. Preencha: nome, email, telefone, código de referência e % de comissão

4. Clique em "Salvar"

5. Um modal exibirá o email e a senha temporária

6. Clique em "Copiar credenciais" e envie ao vendedor via WhatsApp

A maioria dos passageiros chega automaticamente via WooCommerce. Para ajustes manuais:

Criar: Clique "+ Novo", preencha os dados e salve

Editar: Clique no ícone de lápis ao lado do passageiro

Mudar status: Edite e altere o dropdown de status (útil para marcar pagamentos)

Excluir: Clique no ícone de lixeira. Confirmação será solicitada.

1. Vá na aba Operacional

2. Selecione o pacote desejado no dropdown

3. Alterne entre "Lista Guia" e "Lista Ônibus"

4. Clique em "Exportar CSV"

O arquivo será baixado automaticamente e pode ser aberto no Excel.

O Dashboard (Visão Geral) mostra faturamento total, comissões totais, novos leads e vendas.

Para ver comissão individual, vá na aba Vendedores — cada card mostra a comissão acumulada.

Para alterar o percentual de comissão, edite o vendedor e ajuste o campo "Comissão (%)".

Para o Vendedor

1. Acesse o sistema com o email e senha temporária que o admin enviou

2. Um tutorial interativo de 4 etapas irá aparecer — siga ou pule

3. Vá na aba "Alterar Senha" e defina uma senha pessoal

1. Vá na aba "Gerar Links"

2. Copie o link geral ou o link de um pacote específico

3. Compartilhe com seus clientes via WhatsApp, Instagram, etc.

4. Quando alguém compra pelo seu link, a venda aparece automaticamente em "Meus Leads"

"Meu Painel" mostra seus KPIs em tempo real: leads, vendas, valor vendido e comissão acumulada.

"Meus Leads" lista todos os clientes que compraram pelo seu link, com status atualizado.

Boas Práticas

Regras, convenções e dicas importantes para operar o sistema corretamente no dia a dia.

"Email" é uma credencial — não um email real

O campo "Email" no sistema é uma credencial de acesso, não necessariamente um endereço de email funcional. Ele serve como identificador único para login. Não é necessário que seja um email real que recebe mensagens.

O sistema não envia emails (nem confirmação, nem recuperação de senha). O "email" é usado exclusivamente como login. Por isso, siga a convenção abaixo para manter tudo organizado.

Convenção obrigatória de credenciais

👤

Conta de Admin

Use o prefixo admin@
Ex: admin@tripsampa

🤝

Conta de Vendedor

Use o prefixo vendedor@
Ex: vendedor@joao, vendedor@maria

Isso é mais que uma sugestão — é a forma recomendada de uso. Seguir essa convenção facilita a identificação de quem é quem no banco, evita confusão e mantém o sistema organizado. O que define o nível de acesso é a role (admin/vendedor), não o "email".

Dados em produção

O sistema está populado com dados reais a partir de 1º de Fevereiro de 2026. Todos os pedidos do WooCommerce desde essa data foram importados via webhook e script de re-sync.

Conforme o tempo passa e mais dados acumulam, os filtros de período (semana, mês, tudo) se tornam essenciais. O sistema possui filtros de tempo no Dashboard e nas páginas de dados para consultar vendas da semana, do mês ou de todo o período.

Criação de contas

  1. Sempre crie a conta de admin primeiro, usando a chave de convite
  2. Contas de vendedores são criadas pelo admin na aba Vendedores
  3. O vendedor nunca cria a própria conta — ele recebe credenciais do admin
  4. A senha temporária deve ser alterada no primeiro acesso

Operacional do dia a dia

Se um pedido foi cancelado, mude o status para "Cancelado" em vez de excluir. Isso mantém o histórico e evita inconsistências com o WooCommerce.

O script resync-orders.mjs pode criar duplicatas se executado mais de uma vez. Antes de rodar, verifique se os dados já existem com a query:

SELECT woocommerce_order_id, COUNT(*) FROM leads GROUP BY woocommerce_order_id HAVING COUNT(*) > 1;

Defina o percentual de comissão no momento da criação do vendedor. Se alterar depois, o cálculo será retroativo (aplica o novo % sobre todas as vendas pagas). Padrão: 5%.

As listas de embarque (guia e ônibus) mostram apenas passageiros com status "Pago". Exporte o mais perto possível da viagem para ter dados atualizados. Recomendação: na véspera.

Após a compra, o admin pode editar qualquer passageiro: trocar poltrona, alterar local de embarque, atualizar documentos, adicionar acompanhantes, etc. Basta clicar no ícone de lápis na lista de passageiros.

Sobre os filtros de período

O sistema oferece filtros de semana, mês e todos nas seguintes telas:

TelaFiltros disponíveis
Dashboard (Admin)Esta semana / Este mês / Tudo
Meu Painel (Vendedor)Esta semana / Este mês / Tudo
PacotesEste mês / Todos
PassageirosBusca + filtro por status

Configuração & Deploy

Como configurar o ambiente de desenvolvimento e colocar o sistema em produção.

Variáveis de ambiente

Crie um arquivo .env na raiz do projeto:

VITE_SUPABASE_URL=https://SEU-PROJETO.supabase.co
VITE_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIs...
🔑

Nunca commite o .env em repositórios públicos. A anon key é pública (segura com RLS), mas o service_role_key das Edge Functions é secreto.

Rodando localmente

# Instalar dependências
npm install

# Iniciar dev server
npm run dev

# Acessar em http://localhost:5173

Deploy em produção

# Build para produção
npm run build

# Output em dist/ — serve com qualquer host estático
# (Vercel, Netlify, Cloudflare Pages, etc.)

Chaves de convite válidas

Para criar contas de admin, use uma destas chaves:

TRIPSAMPA-2026-TEST
TRIPSAMPA-2026-ALPHA
TRIPSAMPA-2026-BETA
TRIPSAMPA-2026-GAMMA

Cada chave só pode ser usada uma vez (controle via localStorage).

Checklist de deploy

Documentação técnica do projeto Trip Sampa.
Arquitetado, desenvolvido e entregue por Elastre — Fevereiro 2026.