Plano de Refatoração — Trip Sampa Viagens
Documento gerado em 2026-04-27 após reconhecimento completo do site atual via Puppeteer. Status: aguardando aprovação do Aldo. Nada implementado ainda. Local:
/home/claude/tripsampa/PLANO-REFATORACAO.md
1. Diagnóstico do site atual
Stack atual: WordPress 6.9.4 + WooCommerce, hospedado no Hestia deste mesmo servidor (porta 80/443, MySQL 3306). Domínio tripsampaviagens.com.br.
Performance medida agora:
- TTFB: 1.17s (alto — Lighthouse penaliza acima de 0.8s)
- Total transferido na home: 343 KB de HTML antes de assets
- Imagens da home: 64 arquivos baixados, várias com 400-800 KB (não há WebP/AVIF nas fotos principais, só nos banners de equipe)
SEO atual:
<meta description>vazia<meta keywords>vazia- Nenhum
<h1>na home (problema crítico de SEO) - Sem schema.org
TravelAgency/TouristTrip/Offer - Sem Open Graph nem Twitter Cards estruturados
Estrutura mapeada (16 rotas únicas, 12 visitadas):
- Home (
/) — hero + vitrine de pacotes + categorias + galeria + FAQ + sobre + contato (tudo single-page com âncoras) - Categorias WooCommerce:
/categoria-produto/praias-bate-volta/,/cidades-bate-volta/,/com-hospedagem/,/durante-a-semana/(esta última está vazia: "Nenhum Pacote foi encontrado") - Pacotes individuais (
/produto/...): galeria de fotos, datas selecionáveis, local de embarque, acomodações, incluso/não incluso, taxas, informações gerais, pacotes relacionados - Carrinho WooCommerce padrão (
/carrinho/) - Resíduo:
/pagina-exemplo/(página padrão do WP que ficou no ar)
Catálogo identificado (preços em R$):
- Praias bate-volta: 10 pacotes (Ilha do Coco/Paraty R$179, Guarujá R$139, Ilhabela R$149, Trindade R$179, Gruta Que Chora R$149, Santa Rita Ubatuba R$149, Angra dos Reis R$149, Arraial do Cabo, Ilha do Pelado, e 1 esgotado)
- Cidades bate-volta: 6 pacotes (Campos do Jordão R$129, Itu+Fazenda do Chocolate, Serra Negra, Aparecida, São Roque)
- Com hospedagem: 7 pacotes (Chile 5 dias R$3.750, Búzios+Arraial R$549, Cabo Frio+Arraial R$469, Beto Carrero+Camboriú R$399, Paraty+Ilha do Coco, Foz/Paraguai/Argentina)
- Durante a semana: vazia
- Locais de embarque ativos: Barra Funda, Itaquera, Santo Amaro, Tatuapé
- Equipe (fotos identificadas): Alexandre, Bia, Camila, Jaque, Leila, Lucian, Rafaela, Rayane, Rodnei
- Anomalia: "Show SHAKIRA em Copacabana" aparece misturado em "Praias bate-volta" — categorização confusa
Diagnóstico visual (screenshots em /home/claude/tripsampa/recon/screenshots/):
| Aspecto | Hoje | Problema |
|---|---|---|
| Paleta | Laranja #FF6B00 saturado puro | Lê como "fast food / promoção barata", não premium |
| Tipografia | Sans-serif default WP, peso único | Sem hierarquia, tudo "achatado" |
| Cards de pacote | WooCommerce padrão, mosaico apertado | Genéricos, parecem qualquer loja online |
| Hero | Slider com texto sobreposto difícil de ler | Sem impacto, sem call-to-action claro |
| Mobile | Funcional, mas tudo comprimido | Sem cuidado de spacing/touch targets |
| Galeria de equipe | 9 fotos pequenas amontoadas | Subaproveitada — é prova social forte |
| Trust signals | Quase ausentes | Sem reviews, sem CNPJ visível, sem CADASTUR |
| Checkout | WooCommerce padrão | Funciona, mas frio e quebra a estética |
2. Visão "Wow" — o que o cliente vai sentir ao abrir
Promessa de impacto: quando o Aldo abrir a versão nova lado a lado com o WP atual, ele deve pensar "isso parece um site da Smiles/CVC premium, não uma agência de bairro". A diferença não é cosmética — é hierarquia, ritmo e confiança.
Os 7 momentos de impacto da home:
Hero cinematográfico — vídeo curto em loop (10-15s) de uma das viagens reais (Chile, Foz, Búzios) com overlay tipográfico editorial. Headline forte ("Sua próxima viagem começa em São Paulo"), subhead curta, CTA único ("Ver pacotes deste mês"). Sem slider giratório — uma cena, uma mensagem.
Barra de busca inteligente logo abaixo do hero: "Para onde?" + "Quando?" + "Quantas pessoas?" — mesma sensação Booking/Airbnb, adaptada para excursão.
Próximas saídas (cronograma vivo) — em vez de só "categorias", mostrar as 6-8 próximas datas confirmadas em formato calendário visual. Cria urgência real ("sai sexta", "restam 4 vagas").
Categorias como cartões editoriais — não 4 quadradinhos laranja: 4 imagens grandes ocupando viewport com tipografia sobreposta (estilo revista de viagem).
Mapa interativo dos destinos — pinos clicáveis no mapa do Brasil + Cone Sul mostrando todos os destinos cobertos. Cliente vê a abrangência num piscar.
Galeria social "Quem foi com a gente" — grid de fotos reais de viagens (não estoque), com legendas curtas. Prova social esmagadora.
Equipe com personalidade — em vez de 9 retratos amontoados, 3-5 destaques com nome, função e quote curto ("eu cuido das saídas pro Chile"). Humaniza.
Bônus "shock factor":
- Modo escuro com transição suave (poucos sites de viagem têm — surpreende)
- Microanimações Framer Motion em cards e seções (sutis, não cansativas)
- Scroll suave com revelação progressiva (Intersection Observer)
- Lighthouse 95+ visível em qualquer Page Speed Insights — diferencial técnico que dá pra mostrar
3. Direção visual
Confirmar com Aldo antes de codar.
Paleta proposta:
- Primária: terracota/burnt orange profundo
#C9531A(ou#B84517) — laranja de barro queimado, não fluorescente - Secundária: areia / off-white
#F5EFE6— fundo principal, calorosa - Texto principal: marrom-café muito escuro
#1F1611(não preto puro) - Acento contraste: azul-marinho profundo
#1B2A41ou verde-musgo#3D4A2E— apenas para CTAs secundários e detalhes - Sucesso/disponível:
#5B7C4A(verde sálvia) - Esgotado/indisponível:
#7A4A3D(terracota desbotado, não vermelho)
Tipografia (Google Fonts, gratuitos):
- Display (headlines): Fraunces (serif moderno, com personalidade) ou Instrument Serif (mais editorial)
- Sans corpo: Inter ou General Sans — neutro, legível
- Acentos/números: JetBrains Mono ou tabular Inter (preços, datas)
Ritmo / espaçamento:
- Sistema 8pt (Tailwind default)
- Seções com altura mínima respirada (
min-h-[60vh]em hero/categorias) - Max-width de leitura: 65ch para texto, 1280px para layout
Componentes-chave (shadcn/ui base):
- Botão primário com hover em escala sutil (1.02) + sombra direcional
- Cards com
aspect-[4/5](cinematic), foto cobre, gradient inferior, texto branco - Inputs com border invisível padrão, ring laranja no focus
- Badge "Últimas vagas" em terracota desbotado, "Saída garantida" em verde sálvia
4. Stack técnica recomendada
Confirmada com Aldo na conversa: ele quer não mexer em código nunca. Isso favorece ecossistemas com mais exemplos e padrões consolidados que a IA executa com menos erro.
| Camada | Escolha | Por quê |
|---|---|---|
| Framework | Next.js 15 (App Router, Turbopack) | Volume gigante de exemplos de e-commerce + Mercado Pago = menos bug |
| UI | Tailwind 4 + shadcn/ui + Framer Motion | Componentes prontos premium, animações performáticas |
| Banco | PostgreSQL 16 (local no servidor) | Aguenta concorrência (carrinho + admin + webhook MP simultâneos) |
| ORM | Prisma 5 | Schema-first, migrations automáticas, type-safety total |
| Auth | Auth.js v5 (NextAuth) | Login admin + cliente, magic link, OAuth Google |
| Pagamento | Mercado Pago SDK Node oficial | Checkout Pro + Checkout Transparente + PIX |
| Imagens | Sharp (build) + next/image (runtime) + Cloudflare R2 ou pasta local | WebP/AVIF automático, responsive srcset |
| Resend ou SMTP do Hestia | Confirmação de compra, lembretes de saída | |
| Maps | MapLibre GL + tiles OpenStreetMap ou Maptiler free tier | Sem custo Google Maps |
| Analytics | Plausible self-hosted ou Umami | Privacy-first, leve |
| Forms | Server Actions nativos do Next | Zero biblioteca extra |
| Process manager | PM2 | Já roda Node nesse servidor, padrão Hestia |
| Reverse proxy | Nginx (já configurado pelo Hestia) | Subdomínio dedicado durante dev |
Por que NÃO outras opções:
Astro estático→ não serve, precisa de runtime para checkout/admin/webhooksRemix/SvelteKit→ menos exemplos prontos de Mercado Pago, mais chance de erroSQLite→ serializa escritas, ruim para vendas concorrentesVercel hosting→ você já tem servidor pago, sem motivo para custo extra mensal
5. Arquitetura de páginas (sitemap proposto)
/ Home (hero + busca + próximas saídas + categorias + mapa + sobre + FAQ)
/pacotes Catálogo completo com filtros (destino, mês, preço, tipo)
/pacotes/[slug] Página individual de pacote (galeria, datas, embarque, incluso, FAQ específica)
/categoria/[slug] Listagem por categoria (praias, cidades, hospedagem, internacional, semana)
/destinos Mapa interativo + lista de destinos
/destinos/[slug] Hub de destino (Ilhabela, Búzios...) com todos pacotes que vão lá
/sobre Página dedicada (não âncora) — história, equipe, CADASTUR, CNPJ
/embarque Locais de embarque com mapa (Barra Funda, Itaquera, Santo Amaro, Tatuapé)
/galeria Fotos reais de viagens passadas, organizadas por destino/ano
/blog Conteúdo SEO (rotas de viagem, dicas) — opcional fase 2
/faq FAQ completa (não só âncora na home)
/contato WhatsApp + form + endereço + mapa
/checkout Fluxo próprio (carrinho + dados + pagamento Mercado Pago)
/conta Área do cliente: pedidos, próximas viagens, downloads de voucher
/conta/login Login (magic link ou Google)
/admin Dashboard (vendas, pacotes, datas, clientes, financeiro)
/admin/pacotes CRUD de pacotes (slug, preço, datas, fotos, incluso, embarque)
/admin/pedidos Lista de vendas + status pagamento
/admin/clientes CRM básico
/admin/relatorios Vendas por período, ocupação por saída
6. Modelo de dados (Prisma — esboço)
model User {
id String @id @default(cuid())
email String @unique
name String?
phone String?
cpf String? @unique
isAdmin Boolean @default(false)
orders Order[]
createdAt DateTime @default(now())
}
model Pacote {
id String @id @default(cuid())
slug String @unique
titulo String
subtitulo String?
descricao String @db.Text
destino String // "Ilhabela - SP", "Chile", etc.
categoria Categoria // PRAIAS_BATE_VOLTA, CIDADES_BATE_VOLTA, COM_HOSPEDAGEM, INTERNACIONAL, DURANTE_SEMANA
precoBase Int // em centavos
precoCrianca Int?
duracaoDias Int // 1 = bate-volta
incluso String[]
naoIncluso String[]
observacoes String? @db.Text
fotos Foto[]
saidas Saida[]
acomodacoes Acomodacao[]
destaque Boolean @default(false)
ativo Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Saida {
id String @id @default(cuid())
pacoteId String
pacote Pacote @relation(fields: [pacoteId], references: [id])
dataSaida DateTime
dataRetorno DateTime?
vagasTotal Int
vagasOcupadas Int @default(0)
precoOverride Int? // se diferente do precoBase
status StatusSaida @default(DISPONIVEL) // DISPONIVEL, ULTIMAS_VAGAS, ESGOTADA, CANCELADA
observacao String?
itens OrderItem[]
}
model PontoEmbarque {
id String @id @default(cuid())
nome String // "Barra Funda", "Itaquera"
endereco String
lat Float?
lng Float?
ativo Boolean @default(true)
}
model Acomodacao {
id String @id @default(cuid())
pacoteId String
pacote Pacote @relation(fields: [pacoteId], references: [id])
nome String // "Hostel duplo", "Hotel triplo c/ café"
precoExtra Int @default(0) // diferença sobre o precoBase
}
model Foto {
id String @id @default(cuid())
pacoteId String
pacote Pacote @relation(fields: [pacoteId], references: [id])
url String
alt String
ordem Int @default(0)
capa Boolean @default(false)
}
model Order {
id String @id @default(cuid())
numero Int @unique @default(autoincrement())
userId String?
user User? @relation(fields: [userId], references: [id])
email String
nome String
telefone String
cpf String
itens OrderItem[]
total Int // centavos
status OrderStatus @default(PENDENTE) // PENDENTE, PAGO, CANCELADO, REEMBOLSADO
mpPaymentId String? // ID do Mercado Pago
mpPreferenceId String?
metodoPagamento String? // PIX, CREDIT_CARD, BOLETO
pontoEmbarqueId String?
observacoes String?
createdAt DateTime @default(now())
pagoEm DateTime?
}
model OrderItem {
id String @id @default(cuid())
orderId String
order Order @relation(fields: [orderId], references: [id])
saidaId String
saida Saida @relation(fields: [saidaId], references: [id])
passageiros Passageiro[]
precoUnitario Int
quantidade Int
acomodacaoId String?
}
model Passageiro {
id String @id @default(cuid())
orderItemId String
orderItem OrderItem @relation(fields: [orderItemId], references: [id])
nome String
rg String?
dataNasc DateTime?
isCrianca Boolean @default(false)
}
model Cupom {
id String @id @default(cuid())
codigo String @unique
desconto Int // % ou valor fixo
tipo TipoDesconto // PERCENT, FIXO
validoAte DateTime?
usosMax Int?
usosFeitos Int @default(0)
ativo Boolean @default(true)
}
model Review {
id String @id @default(cuid())
pacoteId String
nome String
nota Int // 1-5
texto String @db.Text
fotoUrl String?
aprovado Boolean @default(false)
createdAt DateTime @default(now())
}
7. Sprints de entrega (autonomia total)
Aldo pediu (2026-04-27): agrupar fases e entregar mais coisa de uma vez, sem travar pra validação granular. Reorganizado em 3 sprints ao invés de 5 fases — cada sprint vira uma entrega completa e testável.
Sprint 1 — Fundação + Site público completo + SEO básico — ~16h
Infra:
- PostgreSQL 16 instalado e configurado
- Scaffold Next.js 15 (App Router + Turbopack) + Tailwind 4 + shadcn/ui
- Prisma com schema da seção 6
- Auth.js v5 (preparado mas só ativo na próxima sprint)
- PM2 + Nginx em
novo.tripsampaviagens.com.br - Seed completo: 24 pacotes do scrape, 4 pontos de embarque, categorias, primeiras saídas
Site público (todos os 7 momentos "wow" da seção 2):
- Home cinematográfica (hero estático premium, busca, próximas saídas, categorias editoriais, mapa, galeria social, equipe placeholder, FAQ, sobre)
/pacotes— catálogo com filtros (categoria, mês, preço, duração)/pacotes/[slug]— página individual com galeria, datas, embarque, acomodações, incluso/não incluso, FAQ específica, pacotes relacionados/categoria/[slug]— listagem por categoria/destinos+/destinos/[slug]— hub de destinos com conteúdo autoral escrito por mim/embarque— mapa dos 4 pontos/galeria— fotos reais por destino/sobre,/faq,/contato
SEO:
- Schema.org
TravelAgency+TouristTrip+Offer+Organization - Sitemap.xml dinâmico + robots.txt
- Open Graph + Twitter Cards por página
- Meta descriptions únicas por pacote/destino
- Otimização de imagens (Sharp → WebP/AVIF, responsive srcset via next/image)
Sprint 2 — E-commerce funcional + Admin completo — ~18h
Loja:
- Auth.js ativo (login admin + cliente, magic link, Google OAuth opcional)
- Carrinho persistente (localStorage anônimo + DB se logado)
- Checkout em 4 etapas (carrinho → dados do cliente → passageiros → embarque → pagamento)
- Integração Mercado Pago (Checkout Pro + PIX + cartão + boleto) — stub funcional + ativação real quando token chegar
- Webhook MP idempotente confirmando pagamento
- Geração de voucher PDF com QR code
- Resend integrado (config quando token chegar): email pedido recebido, pagamento confirmado, lembrete 48h antes
- Cupons de desconto
Admin (/admin):
- Dashboard com KPIs (vendas mês, próximas saídas, ocupação)
- CRUD pacotes (upload de fotos drag-drop, ordenação)
- CRUD saídas (data, vagas, status, observações)
- Lista de pedidos + ações (confirmar pago manual, reembolsar, cancelar)
- Lista de clientes com histórico
- Manifesto de embarque imprimível (PDF) por saída/ponto
- Gestão de cupons + pontos de embarque
- Aprovação de reviews
- Relatórios (vendas por período, ocupação por saída, top destinos)
Sprint 3 — Diferenciais + Cutover — ~10h
Polimento "wow":
- Wishlist
- "Me avise quando abrir nova data" (lead capture)
- WhatsApp flutuante
- Mapa interativo de destinos (MapLibre)
- Calendário visual de saídas (mês/semana)
- Sistema de reviews com email pós-viagem automatizado
- Modo escuro com transição suave
- Microanimações Framer Motion
Migração:
- Mapeamento 301 de TODAS URLs WP → novas (ex
/produto/ilhabela-bate-e-volta/→/pacotes/ilhabela-sp-bate-e-volta) - Validação Rich Results Test (Google)
- Submissão Search Console
cs-seo-localaplicado (GBP, NAP, citations)- Cutover: trocar DNS de
tripsampaviagens.com.brpro Next quando aprovado por Aldo - WP arquivado em
backup-tripsampa.bravosdigital.com.brpor 30 dias
Total estimado: ~44h de trabalho meu, em 3 entregas grandes ao invés de 5 fases pequenas. Reporto a você apenas no fim de cada sprint, com URL pra revisar.
8. Como o WordPress atual fica protegido
- Nada será desligado/removido do WP até Fase 5 cutover aprovada por você
- Trabalho em subdomínio separado (
dev.tripsampaviagens.com.br) durante todas as fases - Banco MySQL do WP intocado
- Nginx do Hestia configurado com novo server block apontando pro Next na porta 3100, sem alterar configs do site original
- Backup do WP via Hestia (automático já existente) reforçado antes de qualquer DNS swap
- Plano de rollback: se algo der errado no cutover, basta reverter o A record do domínio → 5 minutos pra voltar pro WP
9. Decisões registradas (2026-04-27)
| # | Decisão | Status |
|---|---|---|
| 1 | Paleta terracota/burnt orange premium (#C9531A + areia #F5EFE6 + marrom-café #1F1611) |
✅ Confirmada |
| 2 | Logo atual (Site-logo.png) mantido para Fase 1 |
✅ Confirmado |
| 3 | Hero com imagem estática premium (sem vídeo na Fase 1) | ✅ Confirmado |
| 4 | CADASTUR / CNPJ — espaço reservado no rodapé/sobre, valores virão depois | 🕒 Pendente |
| 5 | Mercado Pago — conta existe; tokens (Access Token + Public Key) virão na Fase 2 | 🕒 Pendente |
| 6 | Email transacional — Resend (config quando chegar a Fase 2) | ✅ Confirmado |
| 7 | Fotos dos pacotes — varredura automática da galeria de cada pacote do WP via Puppeteer (em /home/claude/tripsampa/assets/pacotes/[slug]/) + JSON estruturado pronto pra seed |
✅ Confirmado e em execução |
| 8 | Subdomínio dev — novo.tripsampaviagens.com.br (criado em Hestia, SSL ativo, placeholder publicado) |
✅ Provisionado |
| 9 | Equipe — bios serão levantadas com Aldo depois | 🕒 Pendente |
| 10 | Conteúdo dos destinos — eu escrevo (1 parágrafo autoral por destino) | ✅ Confirmado |
10. Inventário do que já tenho pronto
- ✅ Recon completo do WP em
/home/claude/tripsampa/recon/meta-home.json— metadados, links, imagenspages-report.json— 12 páginas internas mapeadashome.html— HTML cru da home (referência)screenshots/— desktop e mobile de todas páginas visitadaspacotes-completos.json— dump estruturado de todos 24 pacotes (título, slug, preço, categorias, descrição, imagens, datas, embarques, acomodações)wp-categorias.json— categorias do WooCommerce
- ✅ 64 imagens da home baixadas em
/home/claude/tripsampa/assets/legacy-home/ - ✅ 1.614 fotos de pacotes baixadas (156 MB) em
/home/claude/tripsampa/assets/pacotes/[slug]/— galeria completa de cada pacote, pronta pra virar conteúdo do site novo - ✅ Subdomínio
docs.tripsampaviagens.com.brcom este plano renderizado em HTML premium (HTTPS Let's Encrypt, modo escuro, noindex) - ✅ Subdomínio
novo.tripsampaviagens.com.brprovisionado com placeholder, SSL ativo — pronto pra receber a Fase 0 - ✅ 36 skills user-level instaladas (design, web quality, SEO, copy/CRO)
- ✅ Node 20.20.2, MySQL 5.7 já rodando, PostgreSQL ainda não instalado
Catálogo final mapeado (24 pacotes, R$ 99 a R$ 3.750)
Praias bate-volta (10): Guarujá, Ilhabela, Trindade, Arraial do Cabo, Angra dos Reis, Ilha do Pelado, Ilha do Coco/Paraty, Gruta que Chora/Lázaro/Sununga (Ubatuba), Praia da Santa Rita/Enseada (Ubatuba), Show Shakira em Copacabana (categorização confusa — sugiro mover pra "Eventos")
Cidades bate-volta (6): Campos do Jordão, Itu+Fazenda do Chocolate, Serra Negra, Aparecida, São Roque (Rota dos Vinhos+Templo Zu Lai), Holambra (Cidade das Flores)
Com hospedagem (7): Chile 5 dias internacional (R$3.750), Búzios+Arraial, Cabo Frio+Arraial, Beto Carrero+Camboriú, Paraty+Ilha do Coco, Tríplice Fronteira (Foz/Paraguai/Argentina), Copacabana/Lapa
Bate-volta (1): Poços de Caldas — MG
Pendências de qualidade dos dados:
- Vários slugs ainda têm sufixo "-copia" / "-copy" / "-2" (resíduo de duplicação no admin WP) — vou normalizar no seed do banco novo
- 3 pacotes sem preço definido na API (Poços, Paraty-Hospedagem, Arraial bate-volta) — vou checar manualmente nas páginas individuais
11. Status atual — Todas as 3 sprints entregues ✅
Sprint 3 entregue em 2026-04-28
Polimento e diferenciais:
- Upload drag-drop de fotos no admin com Sharp (otimização automática para 2400px max + JPEG progressive 85%) — pode definir capa, excluir, reordenar
- Wishlist funcional (botão coração nos pacotes, página
/conta/wishlist) - "Avise-me quando abrir nova data" — form em pacotes sem saídas, leads agregados em
/admin/leads - Sistema de Reviews com aprovação no admin (
/admin/reviews) — apenas aprovadas aparecem público - Modo escuro com toggle no header (preserva preferência via localStorage), variantes dark em todo o site
- Calendário de saídas em
/saidasagrupado por mês, em ordem cronológica - Mapa interativo de destinos em
/destinoscom pinos dos 20 destinos (BR + Cone Sul) - 301 redirects completos: 36 URLs do WordPress mapeadas → novas URLs (incluindo
/produto/...,/categoria-produto/...,/carrinho/,/finalizar-compra/,/pagina-exemplo/)
Documentos prontos:
/home/claude/tripsampa/CUTOVER.md— checklist completo de cutover (pré-requisitos, sequência hora-a-hora, rollback em 5 min, pós-cutover 7d/30d)
Pendências cosméticas (cliente precisa fornecer):
- WhatsApp number, CADASTUR, CNPJ, endereço, bios da equipe
- Token Mercado Pago (Access Token + Public Key)
- API Key Resend + verificação de domínio
- Aprovação visual final via Aldo
Decisão sobre o cutover: está congelado aguardando os tokens e dados acima. Quando todos chegarem, o cutover é executado seguindo CUTOVER.md. Até lá, novo.tripsampaviagens.com.br segue como ambiente de homologação completamente funcional.
11.0 Status — Sprints 1 e 2 entregues ✅
Sprint 2 entregue em 2026-04-28
E-commerce funcional:
- Auth.js v5 com Credentials provider, login/cadastro em
/conta/logine/conta/cadastro - Admin user pré-seedado via env (credenciais entregues separadamente)
- Carrinho persistente via cookie (
/carrinho) com edição de quantidade e remoção - Checkout em 4 etapas (
/checkout): dados → passageiros → embarque → pagamento - Integração Mercado Pago stub-funcional: enquanto não tem token, simula pagamento por uma página de confirmação manual; quando token chegar, ativa Checkout Pro real automaticamente (PIX, cartão, boleto)
- Webhook em
/api/mp/webhookidempotente - Email transacional via Resend stub (loga em dev, envia quando key chegar)
- Voucher PDF gerado on-demand em
/api/voucher/[id]com QR code - Manifesto de embarque PDF em
/api/manifesto/[saidaId] - Cupom de desconto (modelo + admin)
- Desconto PIX automático de 5%
Área do cliente (/conta):
- Dashboard com lista de pedidos (status, total, voucher PDF)
- Detalhe de pedido com passageiros, embarque, ações
Admin (/admin):
- Layout próprio sem header/footer públicos (sidebar fixa)
- Dashboard com KPIs (vendas mês, pedidos, próximas saídas, clientes)
- Lista de pedidos com filtro por status + detalhe + ação manual de marcar como pago/cancelado
- Lista de saídas com ocupação, receita, manifesto PDF por saída
- CRUD pacotes (lista, criar, editar campos completos, listar saídas e fotos)
- Lista de clientes com histórico
- CRUD cupons
- Gestão de pontos de embarque
Pendências identificadas pra Sprint 3:
- Upload drag-drop de fotos no admin de pacotes (atualmente só lista)
- Email transacional de pagamento depende de RESEND_API_KEY
- Mercado Pago real depende de token MP
11.0 Status — Sprint 1 entregue ✅
Site público completo no ar em https://novo.tripsampaviagens.com.br/.
O que está rodando
Infra:
- PostgreSQL 16 + Prisma 6 + 24 pacotes seedados, 671 fotos, 144 saídas geradas, 4 pontos de embarque
- Next.js 15 (App Router + Turbopack) servido pelo PM2 na porta 3100
- Nginx do Hestia fazendo proxy reverso com SSL Let's Encrypt
- Build estático/SSR híbrido: home, catálogo, pacote individual, categorias e destinos pré-renderizados
Páginas no ar:
/— home com hero, busca, próximas saídas, categorias editoriais, destaques, sobre, embarque, FAQ teaser, CTA final/pacotes— catálogo com filtro por categoria/pacotes/[slug]— 24 páginas (galeria, datas selecionáveis, embarque, acomodações, incluso/não incluso, schema TouristTrip)/categoria/[slug]— 6 categorias com descrição autoral/destinos— 20 destinos em grid editorial/destinos/[slug]— 20 hubs com 1 parágrafo autoral + 1 longo cada/sobre,/embarque,/galeria(80 fotos),/faq(5 seções, 18 perguntas com schema FAQPage),/contato/sitemap.xml,/robots.txt,/not-found
SEO:
- Schema.org: TravelAgency (root), TouristTrip + Offer (pacotes), FAQPage (FAQ)
- Open Graph + meta description + canonical em todas as páginas
- robots.txt bloqueando indexação até cutover (Sprint 3)
- Imagens otimizadas via next/image (WebP/AVIF + responsive srcset + lazy loading)
Decisões técnicas executadas:
- Show da Shakira mantido em "Praias bate-volta" (confirmação pendente com dono)
- 3 pacotes esgotados (
Poços de Caldas,Paraty-Ilha do Coco Janeiro,Arraial do Cabo bate-volta) seedados comoativo: false(visíveis no admin futuramente) - Slugs sujos do WP normalizados (ex:
ilhabela-sp-bate-e-volta-copia→guaruja-sp-bate-e-volta) - Capas dos pacotes priorizando paisagem ao invés de fotos casuais
- Galeria mudou de masonry pra grid quadrada por consistência visual
Pendências reconhecidas (entram em sprints futuras)
- WhatsApp FAB usa número placeholder (
5511000000000) — substituir quando Aldo passar - CADASTUR/CNPJ exibidos como "a definir" no rodapé/sobre — preencher quando Aldo passar
- Equipe em
/sobrecom nomes mas sem bio — coletar bios com Aldo - Locais de embarque com endereço genérico — refinar quando Aldo confirmar endereços exatos
- "Resposta em até 1h em horário comercial" no contato — confirmar com Aldo
- Logo atual usado, sem refinamento
O que vem na Sprint 2
E-commerce funcional + admin completo (carrinho, checkout em etapas, Mercado Pago stub, voucher PDF, dashboard admin com CRUD pacotes/saídas/pedidos/clientes/cupons/manifesto de embarque/relatórios).
Quando o Aldo abrir o site novo, o que ele vai ver:
| Aspecto | WP atual | novo.tripsampaviagens.com.br |
|---|---|---|
| TTFB | 1.17s | ~50-100ms |
| Paleta | Laranja saturado fluorescente | Terracota premium + areia + marrom-café |
| Hero | Slider genérico, texto ilegível | Cinematic com tipografia editorial Fraunces, CTA único |
| Cards | WooCommerce padrão | Aspect 4:5 cinematic com gradient e badges |
| Catálogo | Lista de pacotes amontoada | Grid responsivo com filtros |
| Páginas de destino | Não existem | 20 hubs com conteúdo autoral |
| Schema SEO | Inexistente | TravelAgency + TouristTrip + Offer + FAQPage |
| Mobile | Apertado | Layout próprio, touch targets, header sticky |
| Galeria | 9 fotos da equipe amontoadas | 80 fotos reais de viagens em grid |
| Próximas saídas | Aparecem misturadas | Cronograma vivo com data destacada |