Hoje todo subdominio do grupo usa o mesmo tenant grupo-1001. Evita erro
'tenant nao encontrado' em reservas.hoteis1001noites.com.br.
Quando tiver multi-marca por subdominio, remover esse atalho.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Vercel preview deployments tem hostname tipo reserva-chatmotel-xxx.vercel.app
que era interpretado como slug de tenant, causando 'tenant nao encontrado'.
Agora qualquer host .vercel.app cai no VITE_DEFAULT_TENANT_SLUG, igual ngrok.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Nova rota pública /roleta/:token com animação 7s (cubic-bezier
desaceleração contínua) + landing aleatório dentro da slice vencedora.
- Aba admin /admin/roleta pra CRUD de prêmios (peso como probabilidade
relativa, % calculado em tempo real, validação "não pode tudo ser nada").
- Integração chatwootApi.notifyRouletteResult() — avisa backend quando
o prêmio é revelado.
- Fix: useReservationForm com matchCanonical() case-insensitive resolve
mismatch entre "pernoite"/"Pernoite" vindo do URL do Chatwoot vs
permanências canônicas da marca no Supabase.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- PrecosTab: lista periodos como chips clicaveis (editar/excluir inline)
- Modal de CRUD de periodo: nome + checkboxes dos 7 dias da semana
- Grid de precos filtrado pelo periodo selecionado
- Salvar afeta so o periodo ativo (delete + insert scoped)
- Nao permite excluir o ultimo periodo
- catalogoService.findPrecoForDate resolve o periodo pelo dia da semana
- useReservationForm usa findPrecoForDate quando checkinAt esta preenchido
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- HeroSection com reveal escalonado (framer-motion)
- ImageGallery com embla-carousel + lightbox full-screen + navegacao por teclado
- PriceSummary com pulse anime.js quando preco muda
- PixCheckout com QR code glow pulsante infinito
- SuccessScreen com confetti + check SVG desenhado
- Skeleton component + shimmer keyframe
- Button com active:scale press feedback
- ReservationFlow com AnimatePresence entre phases
- StayDetailsStep com stagger container
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- CategoriasTab: edita marcas.categorias[] via lista reordenavel
- PrecosTab: grid categoria x permanencia, salva via delete + insert
- FotosTab: upload pro Supabase Storage (bucket reserva-fotos) + URL manual + reorder
- ExtrasTab: CRUD padrao com titulo/preco/descricao
- ReservasTab: read-only com filtros (status/datas) + link pra conversa no Chatwoot
- AdminLayout TABS com as 8 abas
- Router com todas as rotas
- react-router-dom + rotas / publica e /admin/*
- src/hooks/useAuth.ts com Supabase Auth
- AuthGate, LoginPage, AdminLayout com nav tabs e logout
- AparenciaTab edita identidade visual: textos, logo, 5 cores via
react-colorful, 2 fontes via dropdown curado (Fraunces/Playfair/etc)
- Apos salvar, TenantProvider.refresh() re-aplica tema
- App.tsx renomeado pra pages/ReservationPage.tsx
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Novas tabelas reserva_hotel.tenants e reserva_hotel.app_config
- Coluna tenant_id adicionada em todas as tabelas de catalogo/reservas
- Tenant default 'grupo-1001' criado + backfill das rows existentes
- RLS + grants pro anon ler tenants e app_config
- Types TS regenerados
Aplicado via MCP. Arquivos de migration sao source of truth historica.
Usa --project-id em vez de --linked pra evitar exigir senha do DB.
Tipos gerados diretamente do schema reserva_hotel do projeto InAudit Hotel
(acdvblhzzaneddlxqyst).