83 issues encontradas, 20 verificadas via teste E2E direto, cobertura de 100% dos perfis.
Stack: Supabase (PostgreSQL + PostgREST) + Frontend HTML/JS estático no HostGator
Contexto técnico do projeto para correção no Antigravity 2.0
/auth/login.html — Login/admin/dashboard.html — Admin/requester/dashboard.html — Solicitante/approver/dashboard.html — Aprovador/buyer/dashboard.html — Comprador/supplier/dashboard.html — Fornecedor/supplier/respond-quotation.html — Responder cotação4 agentes IA especializados, cada um com foco diferente
7 etapas do fluxo principal — apenas 2 funcionando corretamente
20 issues confirmadas via teste E2E direto pelo coordenador
admin@officestore e vendas@officestore veem dados de Tech Supplies. admin@moveispremium aparece como "TRADEIVE". Fornecedores acessam dados comerciais de concorrentes. Isolamento inexistente.
Admin da TechCorp vê usuários da AcmeCorp e admin da plataforma. Query sem filtro por company_id.
Requisição preenchida, botão clicado, nada acontece. Permanece em RASCUNHO. Console mostra erros JS. Bloqueia todo o fluxo de requisição.
aprovador.final@techcorp.demo → /approver/dashboard.html → "Acesso Negado". Perfil approver_final não reconhecido. Tela vaza admin@acmecorp (empresa errada).
Modal abre com 0 itens. Supabase retorna HTTP 400 para card_items. Botão fica desabilitado. Bloqueia fluxo de cotação.
Root cause de múltiplos bugs. Queries mal formatadas no PostgREST. Afeta: contador aprovações, carregamento de itens, criação de cotações.
cotacoes@infotech.demo (perfil quotation_resp) recebe "Acesso Negado" em /supplier/respond-quotation.html. Função primária bloqueada.
admin@infotech acessa respond-quotation mas itens não carregam. Endereço: "- /", CEP em branco.
admin@officestore.demo → "Tech Supplies" | vendas@officestore.demo → "Tech Supplies" | admin@moveispremium.demo → "TRADEIVE" (plataforma)
Dashboard comprador mostra "undefined propostas recebidas". Links de cotação geram /cotacao/undefined.
Dashboard fornecedor mostra R$ 0,00 em todos os pedidos. Campo de valor não lido do response API.
Permanece em 0 após aprovar requisição. Causado pelo card_history 400.
Códigos técnicos exibidos em vez de PT-BR. Afeta todos os fornecedores.
Queries diferentes retornando resultados inconsistentes.
Dados de performance são placeholder/hardcoded. Nunca substituídos por dados reais.
11 perfis, cobertura 100% — todos testados via login direto
| Perfil | Login | Empresa Exibida | Status |
|---|---|---|---|
| Admin | admin@techcorp.demo | TechCorp ✅ | ⚠️ Vê usuários de outras empresas |
| Solicitante | solicitante@techcorp.demo | TechCorp ✅ | ❌ Botão Enviar p/ Aprovação broken |
| Aprovador CC | aprovador.cc@techcorp.demo | TechCorp ✅ | ✅ Aprovação funciona |
| Aprovador Final | aprovador.final@techcorp.demo | AcmeCorp ❌ | ❌ Acesso Negado |
| Comprador | comprador@techcorp.demo | TechCorp ✅ | ❌ Criar Cotação broken (0 itens) |
| Admin InfoTech | admin@infotech.demo | Tech Supplies ❌ | ⚠️ Empresa errada, catálogo vazio |
| Cotações InfoTech | cotacoes@infotech.demo | Tech Supplies ❌ | ❌ Acesso Negado respond-quotation |
| Admin OfficeStore | admin@officestore.demo | Tech Supplies ❌ | ❌ Empresa errada, vê dados de outro |
| Vendas OfficeStore | vendas@officestore.demo | Tech Supplies ❌ | ❌ Empresa errada |
| Admin Móveis Premium | admin@moveispremium.demo | TRADEIVE ❌ | ❌ Mapeado como plataforma (!) |
| Comercial Móveis | comercial@moveispremium.demo | Móveis Premium ✅ | ⚠️ R$ 0,00, status não traduzidos |
12 observações positivas do Pixel — manter e expandir
Cards organizados, métricas claras, layout profissional.
Call-to-action principal em posição destaque. Cards urgentes com visual que chama atenção.
Fluxo visual claro do pipeline de compras. Mensagens amigáveis quando não há dados.
Métricas objetivas, widget de vitórias gamificado, emojis humanizam estados vazios.
Responsividade funcional. Visual consistente independente do perfil logado.
19 tasks de design system para evolução futura (após correção de bugs)
13 issues de UX identificadas, aguardando correção
Link visível mas perfil comprador não tem permissão. UX confusa.
Dashboard admin usa nomes placeholder. Deveria buscar nomes reais da tabela companies.
Falta spinner no login, labels no menu, e call-to-action nos estados vazios.
Menu deveria iniciar fechado em mobile. Badges e ícones precisam de explicação.
Card do pedido aparece sem nome do produto. Campo não preenchido ou não propagado.
7 prompts revisados — descrevem sintomas observados, não afirmam causas.
⚠️ v2: Corrigidos após validação do Antigravity que contestou causas assumidas na v1.
CONTEXTO: Sistema Tradeive — e-procurement com Supabase backend e frontend HTML/JS estático no HostGator. Sem framework — JS vanilla embutido nos arquivos .html, queries via supabase-js. SINTOMA OBSERVADO (testado manualmente): - Login como solicitante@techcorp.demo (senha Demo@2026!) - Criar nova requisição, preencher todos os campos obrigatórios - Clicar em "Enviar para Aprovação" - NADA acontece. A requisição permanece em status RASCUNHO - O console do browser mostra erros JavaScript FLUXO ESPERADO: Botão deveria mudar o status da requisição para "Aguardando Aprovação CC" via update no Supabase. INVESTIGAR: 1. Abrir /requester/ e encontrar o arquivo com o formulário de requisição 2. Localizar o event handler do botão "Enviar para Aprovação" 3. Verificar quais erros JS aparecem no console (podem ser de sintaxe, variável undefined, ou chamada API falhando) 4. Se é uma chamada Supabase: testar a query no SQL Editor do Supabase Dashboard 5. Corrigir o que estiver impedindo a execução
CONTEXTO: Supabase + frontend estático. Multi-tenancy: cada empresa deveria ver apenas seus dados. SINTOMAS OBSERVADOS (todos testados manualmente com login direto): 1. ADMIN VÊ USUÁRIOS DE OUTRA EMPRESA: - Login: admin@techcorp.demo → /admin/users.html - A lista mostra usuários da AcmeCorp e da plataforma (platform@tradeive.demo) - Deveria mostrar apenas usuários da TechCorp 2. FORNECEDORES MAPEADOS PARA EMPRESA ERRADA: - admin@officestore.demo → header mostra "Tech Supplies" (deveria ser Office Store) - vendas@officestore.demo → header mostra "Tech Supplies" (deveria ser Office Store) - admin@moveispremium.demo → header mostra "TRADEIVE" (deveria ser Móveis Premium) - admin@infotech.demo → "Tech Supplies" (deveria ser InfoTech Soluções) - ÚNICO CORRETO: comercial@moveispremium.demo → "Móveis Premium Ltda" ✅ 3. TELA DE ACESSO NEGADO VAZA ADMIN ERRADO: - Login: aprovador.final@techcorp.demo → tela mostra "Contate admin@acmecorp.com.br" INVESTIGAR: 1. Verificar tabela profiles/users no Supabase — qual é o company_id de cada usuário demo? 2. Corrigir os company_id errados via SQL UPDATE 3. Verificar se existem RLS policies — se não, criar 4. Na listagem de /admin/users.html: a query filtra por company_id? 5. Na tela de Acesso Negado: de onde vem o email do admin mostrado?
CONTEXTO: Tradeive usa perfis para controlar acesso. Cada página .html verifica o perfil do usuário logado via JS e redireciona se não autorizado. Auth é Supabase Auth com JWT. SINTOMAS OBSERVADOS: 1. APROVADOR FINAL — SEM DASHBOARD: - Login: aprovador.final@techcorp.demo (senha Demo@2026!) - Redireciona para /approver/dashboard.html → "Acesso Negado — perfil approver_final" - O aprovador final deveria poder aprovar requisições 2. QUOTATION_RESP — NÃO PODE RESPONDER COTAÇÕES: - Login: cotacoes@infotech.demo (senha Demo@2026!) - /supplier/respond-quotation.html → "Acesso Negado" - Este perfil existe ESPECIFICAMENTE para responder cotações INVESTIGAR: 1. No JS de /approver/dashboard.html: qual é a lista de perfis permitidos? Adicionar 'approver_final' 2. No JS de /supplier/respond-quotation.html: adicionar 'quotation_resp' 3. Buscar padrão: if (!allowedProfiles.includes(userProfile)) redirectToAccessDenied() 4. Verificar se há OUTROS perfis bloqueados de suas páginas
CONTEXTO: Supabase + frontend estático. Fluxo: Comprador vê requisição aprovada → clica "Criar Cotação" → modal abre com itens → seleciona fornecedores → cria cotação.
SINTOMAS OBSERVADOS:
- Login: comprador@techcorp.demo (senha Demo@2026!)
- Dashboard mostra SOL-2026-00042 em "Prontas para Cotação"
- Clico em "Criar Cotação" → modal abre com "0 itens" e "R$ 0,00"
- Os itens (Papel Sulfite A4 x20, Pasta Plástica A4 x1) NÃO aparecem
- Botão criar fica desabilitado
OBSERVAÇÃO ADICIONAL:
- Contador "Aprovadas Hoje" no dashboard aprovador CC mostra 0 após aprovar
⚠️ NOTA: A query usa select('*') — sintaxe correta. O problema NÃO é sintaxe.
INVESTIGAR:
1. Como o card_id é obtido? Vem da URL? Está correto?
2. Testar no SQL Editor: SELECT * FROM card_items WHERE card_id = '(id real)'
3. Pode ser que a requisição não tenha card_items no banco (seed data)
4. Contador: verificar se há registros em card_history para o dia atual
5. Possível problema de timezone (UTC vs local) no filtro de data
CONTEXTO: Frontend JS vanilla renderiza dados do Supabase com template literals. Dados vêm da API em JSON. SINTOMAS OBSERVADOS (todos vistos diretamente na tela): 1. "UNDEFINED" PROPOSTAS: - Login: comprador@techcorp.demo → dashboard mostra "undefined propostas recebidas" - Links de cotação geram URLs /cotacao/undefined 2. PEDIDOS COM R$ 0,00: - Login: qualquer fornecedor → Pedidos Recentes todos R$ 0,00 - Exemplos: PED-TRACE-001, PED-2026-00210, PED-ACM-0104 3. STATUS NÃO TRADUZIDOS: - Pedidos mostram: "in_preparation", "completed", "in_transit" 4. PEDIDO SEM TÍTULO: - PED-ACM-0104 aparece sem nome do produto INVESTIGAR: 1. Buscar no JS onde "propostas" é renderizado — a variável é populada do response? 2. Verificar qual campo do response tem o valor do pedido (total_value? amount? total?) 3. Criar mapa de tradução no JS para status 4. Verificar campo title no banco para PED-ACM-0104
CONTEXTO: Supabase backend com tabelas de fornecedores, pedidos, cotações, performance. SINTOMAS OBSERVADOS: 1. CATÁLOGO VAZIO: - Login: admin@infotech.demo → /supplier/respond-quotation.html - Mostra "Catálogo vazio" — itens da cotação não carregam - Endereço de entrega: "- /" com CEP em branco 2. CONTAGEM INCONSISTENTE: - Dashboard mostra "2 Pedidos Ativos" - Página /supplier/orders.html mostra 0 pedidos 3. PERFORMANCE SUSPEITA: - Dashboard mostra 4.5/5.0 com "0 avaliações" - Pode ser hardcoded no JS ou score real com count errado INVESTIGAR: 1. De onde vêm os itens em respond-quotation? O quotation_id na URL existe? 2. O campo delivery_address é propagado na criação da cotação? 3. Comparar query do dashboard vs query da listagem de pedidos 4. O 4.5 vem do banco ou está hardcoded no HTML/JS?
CONTEXTO: Frontend HTML/JS estático. Melhorias visuais e de usabilidade — menor prioridade, executar DEPOIS dos prompts 1-6. SINTOMAS OBSERVADOS: 1. LOGIN SEM FEEDBACK: clicar em "Entrar" não mostra loading/spinner — usuário não sabe se clicou 2. MENU LATERAL: apenas ícones sem labels de texto — difícil de entender pra novos usuários 3. ESTADOS VAZIOS: cards vazios sem call-to-action (ex: "Nenhuma requisição → Criar nova") 4. NOMES GENÉRICOS: Dashboard admin mostra "Fornecedor 1, Fornecedor 2" no Top 10 5. MENU FLYOUT: dashboard solicitante abre com menu expandido — deveria iniciar fechado em mobile 6. BADGES: "HOJE" repetidos sem contexto explicativo 7. TOOLTIPS: ícones de status sem tooltip no hover 8. LINK INACESSÍVEL: Menu "Requisições → Em Andamento" visível pro comprador mas sem permissão de acesso AÇÃO: Ajustes de CSS e JS simples nos respectivos arquivos HTML. Sem mudança de lógica de negócio.
27 issues encontradas via teste direto como solicitante@techcorp.demo — navegação completa, RBAC, fluxos, UX
Navegar para /buyer/dashboard.html carrega o dashboard COMPLETO do comprador com 22 requisições, pipeline de compras, botões "Criar Cotação" e links "Consolidar". Solicitante pode operar como Comprador.
Ao acessar URLs restritas (/admin/users.html, /approver/, /supplier/), a tela mostra admin@acmecorp.com.br e superadmin@demo.com como administradores — emails de empresas concorrentes vazam.
No dashboard comprador (acessado indevidamente), todas as 16 cotações em andamento têm request-detail.html?id=undefined e mostram "undefined propostas recebidas". Funcionalidade core inacessível.
"Meus Pedidos" mostra PED-2026-00208 e PED-2026-00207 com R$ 0,00. Histórico mostra requisições concluídas com R$ 0,00 e 0 itens. Valores financeiros completamente incorretos.
PED-ACM-0104 mostra "Fornecedor d9cceb37" em vez do nome real. Join com tabela de fornecedores faltando.
Clicar "Enviar para Aprovação" com formulário vazio não mostra nenhum erro, nenhum highlight, nenhum toast. Usuário não sabe o que preencher.
Opção "RR - dsdsg" aparece nos dropdowns de Centro de Custo do dashboard e do formulário. Dado de teste/lixo visível para o usuário final.
Card mostra "1 Ativo" mas lista 4 contratos. CTR-2026-61990 de R$ 15.000 aparece como "Sem fornecedor".
SOL-2026-00039 mostra status "Rascunho" mas tem chat ativo com mensagens do aprovador ("não sei se vou aprovar isso"). Status deveria ser "Devolvida para Revisão".
SOL-2026-00102, 00103, 00104, 00105, 00106 — todas com status "Compra" ou "Concluído" e "0 itens". Como uma requisição sem itens chegou até o final?
"Links Rápidos" incluem Config. Workflow, Gerenciar Usuários e Fornecedores — todos redirecionam para "Acesso Negado". Deveria renderizar condicionalmente.
| URL Testada | Resultado | Correto? |
|---|---|---|
/admin/dashboard.html | Redirect → requester | ✅ |
/admin/users.html | Acesso Negado (vaza emails) | ⚠️ |
/approver/dashboard.html | Acesso Negado (vaza emails) | ⚠️ |
/buyer/dashboard.html | ACESSO TOTAL ❌ | ❌ |
/supplier/dashboard.html | Acesso Negado (vaza emails) | ⚠️ |
/requester/* | OK | ✅ |
/shared/* | OK | ✅ |