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.
Última atualização: 24/02/2026. Integração WooCommerce expandida com suporte a variações de produto, extração automática de passageiros, listas operacionais com acompanhantes e melhorias de UX. Ver detalhes →
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
| Perfil | Acesso | O 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
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
Componentes
| Camada | Tecnologia | Detalhe |
|---|---|---|
| Frontend | React 18 + Vite | SPA com componentes funcionais, hooks, Context API para Auth e Toast. Tailwind CSS para estilos. |
| Auth | Supabase Auth | Email/password. Roles definidos na tabela profiles. Sessions gerenciadas via onAuthStateChange. |
| Database | PostgreSQL (Supabase) | 7 tabelas principais + views otimizadas. RLS ativado em todas as tabelas. |
| Edge Functions | Deno (Supabase) | 2 funções: woocommerce-order e woocommerce-product. Recebem webhooks e escrevem no banco. |
| E-commerce | WooCommerce (WordPress) | Vende os pacotes. Envia webhooks em pedido criado/atualizado e produto criado/atualizado. |
| Referral | PHP (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.
Primeiro acesso (Admin)
Na tela de login existe o link "Primeira vez? Criar conta de administrador". Ao clicar:
- Chave de convite é solicitada (ex:
TRIPSAMPA-2026-ALPHA) - Onboarding wizard de 5 etapas guia a criação da conta admin
- 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:
| Tabela | Admin | Vendedor |
|---|---|---|
profiles | Lê/edita todos | Lê/edita próprio |
leads | CRUD completo | Lê próprios leads |
packages | CRUD completo | Lê ativos |
parcelas | CRUD completo | Segue acesso do lead |
configuracoes | CRUD completo | Sem 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
- Busca por nome, telefone ou email em tempo real
- Filtro por status — Novo, Pendente, Pago, Cancelado
- Filtro por pacote — filtra passageiros por viagem específica
- Criar/Editar via slide panel lateral com todos os campos
- Excluir com diálogo de confirmação
- Passageiros adicionais (acompanhantes) — ao editar/criar um passageiro, é possível adicionar acompanhantes com nome, telefone e RG
- Edição pós-compra — qualquer campo pode ser alterado após a compra: poltrona, local de embarque, hospedagem, documentos, etc.
- Responsivo — tabela no desktop, cards no mobile
Novo: Visualização rápida. Clique em qualquer linha da tabela para abrir um painel com todos os detalhes do passageiro (comprador, pacote, vendedor, status, valores, documentos, acompanhantes e pedido WooCommerce). Botão "Editar" dentro do painel permite alterações.
Campos do passageiro
| Campo | Tipo | Observação |
|---|---|---|
| Nome * | texto | Obrigatório |
| Telefone | texto | Formatado como (XX) XXXXX-XXXX |
| Opcional | ||
| CPF | texto | Para listas de embarque |
| RG | texto | Para lista do ônibus |
| Órgão Emissor (RG) | texto | Ex: SSP/SP — exibido na lista do ônibus |
| Pacote | select | Vinculado a packages |
| Vendedor | select | "Orgânico" se sem vendedor |
| Status | enum | novo / pendente / pago / cancelado |
| Valor Total / Pago | decimal | Valores financeiros |
| Poltrona | inteiro | Número do assento |
| Local de Embarque | texto | Ex: Terminal Tietê, Metrô Barra Funda |
| Hospedagem | texto | Hotel, quarto — quando a viagem inclui hospedagem |
| Passeios | texto | Passeios inclusos — quando a viagem inclui passeios |
| Observações | textarea | Notas livres |
Passageiros adicionais (acompanhantes)
Quando uma compra inclui mais de uma pessoa, o admin pode adicionar acompanhantes ao passageiro principal:
- Clique em "+ Adicionar" na seção "Passageiros adicionais" dentro do formulário de edição
- Cada acompanhante tem: Nome, Telefone e RG
- Os acompanhantes são salvos na tabela
acompanhantesdo banco de dados - Podem ser adicionados/removidos a qualquer momento editando o 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:
- Admin clica em "+ Novo" na aba Vendedores
- Preenche nome, email, telefone, código de referência e % de comissão
- O sistema cria uma conta Supabase Auth com senha temporária gerada automaticamente
- Um modal exibe as credenciais (email + senha) para o admin copiar e enviar ao vendedor
- O vendedor usa essas credenciais para fazer login e acessar seu portal
Card do vendedor
Cada vendedor exibe em seu card:
- Nome, email e badge de comissão (%)
- Link de referência copiável:
tripsampaviagens.com.br?ref=codigo - Métricas: total de leads, vendas confirmadas e comissão acumulada
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:
- Destino, nome completo e preço
- Data da viagem
- Barra de ocupação (vendas / capacidade do ônibus)
- Vagas disponíveis
- Botão "Ver passageiros" — navega direto para a lista de passageiros filtrada por aquele pacote
Filtro de mês nos pacotes
A tela de pacotes possui filtros: Esta semana, meses específicos (Fev, Mar, Abr...) e Todos. Também há uma busca por destino ou nome e um contador 'Mostrando X de Y pacotes'. Pacotes são ordenados por data de viagem (mais próximos primeiro).
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.
Acompanhantes incluídos: As listas operacionais agora incluem acompanhantes como sub-linhas abaixo de cada passageiro titular, tanto na visualização em tabela quanto na exportação CSV. A contagem total de passageiros inclui acompanhantes.
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:
- Boas-vindas personalizadas com o nome do vendedor
- Como funcionam os links de venda
- Como acompanhar vendas e comissão
- 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
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.name → nome, product.price → preco
→ 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:
- Armazena em WooCommerce session e cookie de 30 dias
- No checkout, injeta como
order meta_data(chavesrefe_ref) - A Edge Function lê esse meta_data para atribuir ao vendedor
Webhooks necessários no WooCommerce
| Nome | Evento | URL |
|---|---|---|
| Novo Pedido | Order created | .../functions/v1/woocommerce-order |
| Pedido Atualizado | Order updated | .../functions/v1/woocommerce-order |
| Produto Criado | Product created | .../functions/v1/woocommerce-product |
| Produto Atualizado | Product 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
As Edge Functions agora fazem upsert — buscam leads existentes por woocommerce_order_id antes de inserir. Rodar o resync múltiplas vezes é seguro e não cria duplicatas.
Banco de Dados
Schema PostgreSQL completo com 7 tabelas, views otimizadas, triggers e RLS.
Tabelas principais
Views
| View | Uso |
|---|---|
v_vendas_detalhadas | Joins leads + packages + profiles com cálculo de comissão |
v_metricas_vendedor | Agrupado por vendedor: total leads, vendas, comissão |
v_lista_guia | Lista de embarque para guia (passageiros pagos) |
v_lista_onibus | Lista para empresa de transporte (CPF, RG, poltrona) |
Triggers
update_updated_at()— Atualiza campoupdated_atem INSERT/UPDATEgenerate_referral_code()— Gera código de referência automático para novos vendedores
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
- Sempre crie a conta de admin primeiro, usando a chave de convite
- Contas de vendedores são criadas pelo admin na aba Vendedores
- O vendedor nunca cria a própria conta — ele recebe credenciais do admin
- 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:
| Tela | Filtros disponíveis |
|---|---|
| Dashboard (Admin) | Esta semana / Este mês / Tudo |
| Meu Painel (Vendedor) | Esta semana / Este mês / Tudo |
| Pacotes | Esta semana / Meses (Fev, Mar, Abr...) / Busca por nome / Todos |
| Operacional | Busca por pacote com agrupamento por mês |
| Passageiros | Busca + 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
- Supabase: Schema aplicado, RLS ativado, Edge Functions deployed
- WooCommerce: 4 webhooks configurados, ref capture em functions.php
- Frontend:
.envcom credenciais corretas, build limpo - DNS: Frontend acessível no domínio desejado
- Teste: Criar vendedor, gerar link, testar compra, verificar atribuição
Documentação técnica do projeto Trip Sampa.
Arquitetado, desenvolvido e entregue por Elastre — Fevereiro 2026.
Atualização v2
Resumo de todas as melhorias, correções e novas funcionalidades implementadas em 24 de fevereiro de 2026.
Todas as alterações estão em produção. Edge functions atualizadas, banco de dados migrado e dados re-sincronizados com 231 pedidos processados.
Novas funcionalidades
Variações de produto
Cada data de viagem agora gera um pacote separado. "Ilhabela" com 11 datas = 11 pacotes individuais com vendas separadas.
Extração de acompanhantes
O campo todos_passageiros_adicionais do WooCommerce é parseado automaticamente. Cada passageiro vira um registro na tabela acompanhantes.
Dados do checkout
Local de embarque, hospedagem e passeios adicionais são extraídos automaticamente dos meta dados do pedido.
Quantidade de tickets
O sistema agora rastreia quantos tickets foram comprados por pedido. Valor total exibido corretamente com indicador (x2), (x3).
Melhorias de UX
- Painel de detalhes do passageiro — clique em qualquer linha para abrir uma visualização completa com dados do comprador, pacote, vendedor, status, documentos, acompanhantes e pedido WooCommerce
- Badge +N — passageiros com acompanhantes exibem um badge verde ao lado do nome indicando quantos acompanhantes possuem
- Alerta de dados incompletos — quando a quantidade de tickets comprados é maior que o número de passageiros registrados (1 comprador + acompanhantes), um badge de alerta aparece indicando quantos passageiros faltam
- Busca nos Pacotes — campo de busca por destino ou nome, filtro por mês específico (Fev, Mar, Abr...) e filtro "Esta semana" para viagens da semana corrente
- Operacional com busca — o dropdown de seleção de pacote foi substituído por um campo de busca com resultados agrupados por mês
- Acompanhantes na lista operacional — as tabelas Lista Guia e Lista Ônibus agora incluem acompanhantes como sub-linhas abaixo de cada passageiro titular
- CSV com acompanhantes — as exportações CSV incluem acompanhantes como linhas logo após o passageiro responsável, identificados com "(Acompanhante)"
- Contagem total — a contagem de passageiros agora inclui acompanhantes: "12 passageiros confirmados (8 titulares + 4 acompanhantes)"
Correções
| Problema | Causa | Correção |
|---|---|---|
| Datas mostravam 1 dia antes | JavaScript new Date() convertia para UTC, causando shift de -1 dia no fuso de São Paulo (UTC-3) |
Datas agora são parseadas como string (split por "-") sem conversão de timezone |
| Apenas 1 acompanhante capturado | O parser esperava "Passageiro 1:" (com dois pontos), mas o WooCommerce envia "Passageiro 1" (sem dois pontos, com quebra de linha) | Regex atualizada para aceitar ambos os formatos: Passageiro\s*\d+\s*:? |
| Valor mostrava preço unitário | Edge function dividia item.total por item.quantity |
Agora armazena o valor total do line item. Campo quantidade adicionado para rastreio |
| Pacotes duplicados por variação | Sistema usava product_id (produto pai) para todas as variações, agrupando datas diferentes num único pacote |
Agora usa variation_id como identificador. Campo woocommerce_parent_id rastreia o produto pai |
Alterações no banco de dados
Migrations 004 e 005 aplicadas:
| Tabela | Alteração |
|---|---|
leads | Adicionados: local_embarque, hospedagem, passeios, orgao_emissor_rg, quantidade |
packages | Adicionado: woocommerce_parent_id (INTEGER). Unique index parcial recriado no woocommerce_id |
acompanhantes | Adicionado: telefone (TEXT) |
leads | telefone e data_viagem (packages) agora aceitam NULL |
Edge functions atualizadas
Ping handling: Responde "pong" para pings de verificação do WooCommerce (body não-JSON)
Ref tracking: Busca ref nos meta_data → lookup em profiles → seta vendedor_id e origem = ref:{code}
Package matching: 4 níveis de prioridade — variation_id → product_id pai → nome → auto-criar
Extração de dados: Local de embarque, passeios, hospedagem extraídos dos meta dados do item e do pedido
Acompanhantes: Parseia todos_passageiros_adicionais com regex que suporta formato com e sem dois pontos. Cria registros na tabela acompanhantes
Quantidade: Armazena item.quantity como quantidade. Valor total não é mais dividido por quantidade
Deduplicação: Busca leads existentes por woocommerce_order_id e faz update em vez de criar duplicata
Variações: Para produtos variáveis, cria um pacote POR variação (cada data = pacote separado)
Naming: Nome do pacote inclui a data: "Angra dos Reis – RJ | Bate e Volta – 14/02"
IDs: woocommerce_id = variation ID, woocommerce_parent_id = product ID pai
Data da viagem: Extraída automaticamente dos atributos da variação (ex: "14/02" → 2026-02-14)
Ping handling: Responde "pong" para verificações do WooCommerce
Resync
O script resync-all.mjs substitui o antigo resync-orders.mjs. Ele executa dois passos:
- Sincroniza produtos: Busca todos os produtos do WooCommerce com suas variações e envia para a edge function
woocommerce-product - Sincroniza pedidos: Busca todos os pedidos de 2026 e envia para a edge function
woocommerce-order
Seguro para re-execução. As edge functions agora fazem upsert (busca existente antes de inserir). Rodar o resync múltiplas vezes não cria duplicatas.
Recomendações para o cliente
Durante os testes de integração, identificamos oportunidades de melhoria no checkout do WooCommerce que impactam a qualidade dos dados capturados pelo sistema:
Importante: O sistema captura fielmente os dados enviados pelo WooCommerce. As recomendações abaixo visam melhorar a qualidade dos dados na origem — o checkout do site.
Problema: O checkout atual permite comprar 3 tickets e preencher dados de apenas 1 passageiro. Não há validação forçando o preenchimento de todos.
Impacto: Passageiros sem dados registrados não aparecem nas listas operacionais. O sistema sinaliza com um alerta, mas o admin precisa contactar o cliente manualmente.
Recomendação: Configurar o checkout para exigir que o número de passageiros preenchidos seja igual à quantidade de tickets comprados antes de permitir a finalização da compra.
Problema: O checkout tem dois momentos: "Dados pessoais" (dados do comprador/pagamento) e "Passageiros Adicionais" (dados de quem viaja). Não fica claro para o cliente se ele deve se incluir como passageiro.
Impacto: Alguns clientes se incluem (gerando dados duplicados), outros não (gerando dados faltantes). Não há padrão consistente.
Recomendação: Reestruturar o checkout em etapas claras: (1) "Dados de pagamento" — quem está pagando; (2) "Dados dos viajantes" — com instrução explícita: "Preencha os dados de TODAS as pessoas que vão viajar, incluindo você se for o caso". Idealmente com campos numerados pela quantidade de tickets.
Problema: Clientes marcam "Não viaja com criança" mas informam data de nascimento de menores nas observações ou nos dados de passageiros adicionais.
Recomendação: Validar automaticamente pela data de nascimento informada — se algum passageiro tem menos de 12 anos, marcar automaticamente como viagem com criança.
Implementar essas melhorias no checkout resultaria em:
→ Dados completos em 100% dos pedidos — sem necessidade de contato manual com clientes
→ Listas operacionais precisas — todos os passageiros com documentos, telefone e local de embarque
→ Menos retrabalho — admin não precisa verificar e completar dados manualmente
→ Maior segurança — documentação completa de todos os viajantes antes da viagem
→ Melhor experiência do cliente — checkout guiado e intuitivo reduz erros e dúvidas
Limitações conhecidas
- Dados são tão bons quanto a fonte — o sistema captura exatamente o que o WooCommerce envia. Se o cliente não preenche dados no checkout, o sistema não tem como inventá-los
- Hospedagem ≠ número de passageiros — "Quarto Quadruplo" indica o tipo de quarto, não que há 4 passageiros. O alerta de dados faltantes usa a
quantidadede tickets, não o tipo de hospedagem - Webhook de produto — datas de viagem atualizam quando o produto é editado e salvo no WooCommerce. Para forçar atualização, rode
node resync-all.mjs - Duplicação de nomes — quando o comprador se inclui como passageiro adicional, aparece como acompanhante de si mesmo. Isso é comportamento do checkout do cliente, não um bug do sistema
Atualização implementada em 24 de fevereiro de 2026.
Por Elastre.