Gestão da plataforma -- mock de revisão (ONWAY-107). Este endereço não é o app da agência. Dado ilustrativo onde não marcado como real.

Visão geral

Números agregados de toda a plataforma, sem entrar em nenhuma organização.

Agências
4
Viagens ativas
17
Passageiros
3.181
Receita 30d
R$ 14.980
Erros 7d
0
Os 5 números são REAIS, puxados do PROD em 22/08 -- nenhum é ilustrativo. Erros 7d veio de telemetria_erros: a tabela está zerada na plataforma inteira (conferido hoje, nos últimos 7 dias e no acumulado). Os 4 primeiros viram uma única chamada a plataforma_metricas() no card C2, sem nenhuma linha de passageiro/reserva/pagamento trafegando pro navegador. Exclui organizações demo. Todos os números: reais de hoje -- quebra por agência na aba Analytics
Precisa da sua atenção Critério: só entra aqui o que tem uma ação clara a seguir -- não é um resumo de tudo, é a lista do que vale seu tempo agora. Os 2 itens abaixo são achados reais desta revisão (22/08), não placeholder de layout. 2 itens
Guatambu Travel já está marcada como inativa no banco (agencias.ativo = false desde 26/06) -- mas essa coluna não bloqueia nada hoje.
Login, RLS e rotas ignoram ela (conferido no código). A auditoria mostra quem desativou (ia_agente, via SQL direto) mas não registrou o motivo -- e a mesma agência seguiu recebendo edição de configuração depois disso, até 21/08. Vale decidir: reativar de vez, ou construir o bloqueio real (card C9).
11 de 47 viagens da Caravana Caminhos de Luz têm data de saída/retorno gravada como 31/12/2099.
Valor-sentinela, não data real -- provavelmente campo que ficou sem preencher no cadastro. Vale confirmar com a agência antes que alguém confie nessa data.

Organizações

Todo inquilino do banco compartilhado. Cliente novo entra aqui com organização própria -- nunca dentro da organização de outro cliente.

OrganizaçãoAgênciasMasterCriada emStatusAções
Família (OnWay) 4 [email protected] 19/06/2026
[DEMO] OnWay Demo 1 [email protected] 23/08/2026
Agência cliente 1 e-mail do master 24/08/2026 Ativa
Clique no pill pra ver os dois estados -- aqui é só cor. É status de ORGANIZAÇÃO (bloqueio real no login ainda não existe, card C9). Achado em 22/08: no nível de AGÊNCIA já existe uma coluna de verdade (agencias.ativo) -- Guatambu Travel já está com ela em false desde 26/06. Mas hoje essa coluna não bloqueia nada: login, RLS e rotas ignoram ela (conferido no código). C9 foi corrigido -- não é "criar coluna", é "ligar a coluna que já existe". Status de organização é só mock; status de agência já existe no banco mas não trava nada ainda (ver C9)
Esta tabela é por ORGANIZAÇÃO -- a Família é 1 organização com 4 agências dentro. Pra ver o detalhe de UMA agência (usuários, viagens, auditoria, erros), a entrada é a aba Analytics: lá cada linha já É uma agência, e clicar nela abre o drill-down. cada linha aqui é uma organização, não uma agência -- o detalhe por agência mora na aba Analytics
Administradores da plataforma Quem tem permissions.plataforma = true, ou seja, enxerga esta tela inteira. O guard A4 já garante que hoje é exatamente 1 conta. Adicionar um segundo admin (por exemplo um sócio) hoje é só via SQL direto, sem tela -- card C12. 1 conta
[email protected] desde 19/06/2026

100% manual hoje (SQL direto no PROD). Sem tela pra isso ainda -- card C12.

Analytics

Vendas e destino por agência, sem nenhuma linha de passageiro, telefone ou CPF. Pedido em 22/08: "não quero os dados dos clientes, quero a visão analítica".

Por agência Números reais, consultados no PROD em 22/08 pra este mock (não são ilustrativos). Fonte proposta: função nova plataforma_analytics(), security definer, só escalares -- card C11. Não reaproveita analytics_resumo() (essa é rica demais e roça em PII, feita pra uma agência só). "Último login" vem de auth.users.last_sign_in_at, ligado por agentes_viagem.user_id -- exige service role. Clique numa linha pra abrir o detalhe completo daquela agência.
AgênciaViagens cadastradasRealizadasPassageirosReceita 30dÚltimo login
Mundo a Passeio & Caminhos de Luz00872R$ 10.95022/08/2026
Caravana Caminhos de Luz47301.678R$ 3.53030/03/2026
Mundo a Passeio00631R$ 500sem usuário
Guatambu Travel000R$ 0sem usuário

3 das 4 mostram 0 viagens cadastradas com passageiros > 0: a Família grava a viagem numa marca só (Caravana Caminhos de Luz) e credita o passageiro à marca que vendeu. É assim que a família opera hoje, não é bug -- um cliente novo, com 1 organização = 1 agência, não tem esse efeito. Exclui [DEMO] OnWay Demo, como o resto da plataforma.

Cuidado ao ler "último login" como sinal isolado de uso: a Caravana não loga desde 30/03, mas é a agência com MAIS atividade real da família -- a operação dela passa por um canal mediado por IA (ator ia_agente na Auditoria), não por login direto. Login sozinho mede acesso humano à tela, não uso do sistema.

Clique numa linha pra abrir o detalhe completo da agência: usuários, viagens, auditoria e erros.

Destinos mais vendidos Direto de viagens.destino, campo 100% preenchido no PROD (48 de 48 linhas) -- por isso dá pra confiar nele, diferente do ponto de embarque (ver card abaixo). É texto livre, não um campo estruturado de cidade/estado -- por isso não dá pra abrir "por estado" sem inventar uma separação que o dado não tem hoje.
Destino (como está gravado)ViagensRealizadas
Triangulo Mineiro (Minas Gerais)1815
Termas Romanas (Rio Grande do Sul)41
+ 26 outros destinos (1 viagem cada, texto livre sem padrão -- "MG", "Gramado / RS", "Chile: Mendoza | Santiago | Córdoba" convivem)2614
De onde as viagens saem fora deste mock

Pedido em 22/08, mas não entra agora: o ponto de embarque (ponto_embarque) está vazio em 1.218 de 1.219 linhas no PROD hoje. Mostrar uma origem aqui seria inventar dado sobre uma coluna que, na prática, ninguém preenche -- fica de fora até esse campo virar confiável (fora do escopo deste épico).

Nova agência

Cria organização, agência e usuário master numa tacada -- o mesmo fluxo do script provisionar-cliente.mjs, agora com tela.

O que acontece ao clicar em "Criar agência"

Nessa ordem, numa transação só: organização nova → agência dentro dela → usuário master (e-mail já confirmado, sem precisar clicar em link nenhum) → permissões gravadas (dono da própria agência, não enxerga as outras) → prova de isolamento adversarial contra o dado da Família.

Não sai e-mail automático nenhum ainda. A senha temporária aparece UMA vez, aqui embaixo -- você repassa pro cliente por fora (WhatsApp, e-mail manual). Convite automático fica pra depois; não é o caminho simples de agora.

Organização criada
Agência criada
Usuário master criado
Permissões gravadas
Isolamento PROVADO -- probe adversarial: 0 linhas cruzando
Senha temporária •••••••••• exibida uma única vez
O último passo roda a mesma prova adversarial do script hoje: cria organização sintética, tenta ler dado do cliente novo com ela e vice-versa, dos dois lados. Se qualquer linha vazar, o passo mostra REPROVADO e a tela instrui não entregar o acesso. cada passo falha visivelmente com a mensagem crua, sem toast genérico

Segurança e isolamento

Superfície nova, pedida em 22/08: mostra o resultado da auditoria de permissões ao vivo, pra não virar relatório que envelhece. Alimentada pelos cards C5, C6 e C7 -- hoje nenhum rodou ainda, os números abaixo são ilustrativos de layout.

Isolamento cross-agência Card C5. Toda tabela com dado de cliente precisa ter RLS habilitada, a policy certa e prova por probe adversarial -- não uma amostra, o schema inteiro. Tabela sem essa prova completa é achado, não suposição. pendente -- C5
Família (OnWay)OK
[DEMO] OnWay DemoOK
Tabelas sem prova completaa mapear
Guard de dado chumbado Card C7. Generaliza o marca.guard.test.ts (hoje uma lista fechada de nomes proibidos) pra uma varredura mais ampla por nome próprio de agência, cidade ou CNPJ fora de teste/seed. verde

Última corrida: -- (guard atual, escopo restrito)

Achados conhecidos corrigidos: 1 (regex de marca em contratos/analytics, 22/08)

Roles nesta organização Card C6. Referência, não edição -- a matriz completa (toda role x toda tela/ação) fica documentada e testada, isto aqui é só a leitura rápida.

5 roles ativas na Família -- ver matriz completa abaixo

Matriz de permissões por role
RoleVer financeiroExcluir registroGerenciar equipeVer outras agênciasProvisionar cliente
Plataforma (dono)
Owner (master do cliente)
Financeiro
Agente
Excluir (permissão avulsa)

Layout de referência -- a matriz real (card C6) confere cada célula contra o código, não contra a intenção de cada tela.

Auditoria

Eventos de plataforma, com PII redigida pra quem não tem escopo declarado na organização do evento.

Data/horaAtorAçãoTabelaDetalhe
22/08 00:07ia_agenteupdateagentes_viagemperm_plataforma
22/08 03:14cretive.lab@...insertplataforma_sessaoescopo org X
23/08 09:12cretive.lab@...insertagenciasnova organização
Fonte: a view redigida do card B6 (audit.eventos_plataforma). Se o evento é de uma organização em que você não tem escopo declarado, antes/depois mostram só as chaves, sem os valores. filtro por tabela e período (igual ao /master de hoje)

Negócio

A visão da OnWay como empresa (faturamento, custo, margem) -- separada da visão operacional de cada agência cliente. Pedido em 22/08; hoje nenhuma das três caixas tem de onde puxar dado real, então nenhuma delas mostra número.

Faturamento da plataforma bloqueado

Depende de um gateway de pagamento (Stripe ou parecido) cobrando cada agência cliente. Hoje ninguém é cobrado -- o produto ainda não fatura por assinatura. Sem gateway, não existe número real; mostrar um aqui seria inventado.

Custos de infra não integrado

Vercel, Supabase e o que mais entrar. Achado nesta revisão: o Supabase já expõe custo por organização via API própria -- dá pra puxar sem esperar o gateway. Vercel exigiria uma integração à parte. Nenhum dos dois está ligado ao painel ainda.

Margem depende dos 2 ao lado

Faturamento menos custo de infra. Só existe depois que as duas caixas ao lado tiverem dado real -- não faz sentido calcular margem sobre número inventado.

Nada nesta aba tem valor fictício. As 3 caixas ficam vazias de propósito até existir gateway de pagamento integrado -- popular com número chutado seria pior do que deixar em branco, principalmente numa tela de decisão de negócio. aba nova, não bloqueia nada desta semana -- vira card C13 (futuro)

Caravana Caminhos de Luz

Ativa

Tudo o que a plataforma sabe sobre esta agência -- sem entrar na organização dela (isso é declarar_escopo_org(), botão Gerenciar).

DADO REAL -- números verificados no PROD em 22/08.
Perfil da agência Campos de agencias: responsável, telefone, e-mail, CNPJ, cidade -- existem na tabela desde sempre, mas hoje NENHUMA das 4 agências da família preenche a maioria deles (achado de 22/08, não é um buraco só desta tela). "Cliente desde" é agencias.criado_em; nas agências que nasceram junto (04/04/2026) reflete a criação original da linha, anterior ao modelo de organização (19/06/2026) -- pra um cliente novo de verdade, essa data já vai significar exatamente "dia que entrou pelo provisionamento".
Responsável--
Telefone--
E-mail comercial--
CNPJ--
Cidade--
Cliente desde--
Plano--
Master do sistema
Atividade -- último acesso ok

Último login: --

Pagamentos desta agência sem gateway

agencias já tem as colunas stripe_customer_id / stripe_subscription_id / pix_chave -- hoje null pra esta e pra toda agência, porque não existe gateway de pagamento integrado ainda (card C13, ONWAY-121). Quando existir, esta seção vira a cobrança de verdade desta agência específica.

Viagens cadastradas
47
Realizadas
30
Passageiros
1.678
Receita 30d
R$ 3.530
Destinos desta agência
DestinoViagens
Triangulo Mineiro (Minas Gerais)18
Termas Romanas (Rio Grande do Sul)4
+ 25 outros destinos (1 viagem cada)25
Viagens cadastradas
0
Realizadas
0
Passageiros
0
Receita 30d
R$ 0

Nenhuma viagem cadastrada por esta agência -- é um dos dois achados que a trouxeram pra "Precisa da sua atenção" na Visão Geral.

NomeE-mailTipoMasterFinanceiroExcluirAtivo
Alva Cinara Manfro Schinoffnão informadoagenteSim

Fonte: agentes_viagem (cadastro operacional, já existe hoje). A camada de papéis mais rica (membros, com role_id) alimenta a matriz do card C6 -- pra esta tela, o caminho simples primeiro.

Nenhum usuário cadastrado
Esta agência não tem nenhuma linha em agentes_viagem -- é um dos dois achados que a trouxeram pra "Precisa da sua atenção" na Visão Geral.
ViagemDestinoVagasStatus
Setembro 2027: PantanalPantanal (Mato Grosso do Sul)43ativa
Junho 2027: Chile - Santiago e os AndesSantiago e os Andes (Chile)43ativa
Julho 2027: Minas EspiritaTriangulo Mineiro (MG)43ativa
Junho 2027: Aparecida e Frei GalvãoAparecida e Guaratingueta (SP)43ativa
Maio 2027: Paraty e Angra dos ReisParaty e Angra dos Reis (RJ)43ativa
Abril 2027: MinasTriangulo Mineiro (MG)43ativa
Janeiro 2027: Caminho das ÁguasSão Thomé das Letras, Caxambu e Capitólio (MG)43ativa
Novembro 2027: MinasTriangulo Mineiro (MG)43ativa
+ 39 outras viagens desta agência (47 no total)
Achado: data de viagem gravada como 31/12/2099 11 de 47

data_saida e data_retorno de 11 das 47 viagens desta agência estão gravadas como 2099-12-31 -- valor-sentinela, não data real. Por isso as colunas de data ficam fora desta tabela: mostrar 2099 como se fosse uma viagem real seria inventar informação. Vale confirmar com a agência se é campo que nunca foi preenchido no cadastro.

Nenhuma viagem cadastrada
Esta agência não tem nenhuma linha em viagens -- consistente com 0 passageiros e R$ 0 de receita na aba Analytics.
Data/horaAtorAçãoTabela
22/08 14:41:55ia_agenteupdatepassageiros
22/08 14:41:40ia_agenteupdatepassageiros
21/08 14:30:40ia_agenteupdatepagamentos
21/08 14:30:40ia_agenteupdatereservas
21/08 14:29:09ia_agenteinsertreservas
21/08 14:29:09ia_agenteinsertpagamentos
Data/horaAtorAçãoTabela
03/08 00:13:10ia_agenteupdatesite_config
17/07 12:15:05ia_agenteupdatesite_config
12/07 22:41:45ia_agenteupdatesite_config
04/07 10:12:41postgresupdatesite_config

Só edição de configuração do site, nenhum evento de viagem/passageiro/pagamento -- consistente com a agência estar sem atividade comercial. Repare que a auditoria NÃO está vazia mesmo a agência estando dormente: é um rastro administrativo, não comercial.

Fonte: audit.eventos_plataforma filtrada por agencia_id -- direto, sem JOIN (diferente de Erros, ao lado).

Erros (7d)
0
Erros (total)
0
telemetria_erros não tem agencia_id nuance de arquitetura

Diferente de auditoria, esta tabela só guarda user_id -- filtrar por agência exige JOIN com agentes_viagem.user_id, não é um simples "where agencia_id = X". Hoje a tabela está zerada pra plataforma inteira (conferido em 22/08, últimos 7 dias e acumulado), então o JOIN nem foi necessário pra este mock -- mas vai ser preciso assim que o primeiro erro acontecer.

Mock do épico ONWAY-107 -- arquitetura completa no runbook 1-pra-facilitar-talvez-tingly-adleman.md, secao 8. Nenhum card de tela (C1-C4, C8-C12, e o novo card do detalhe por agência) comeca antes do aceite neste mock. C13 (Negócio) é futuro, não bloqueia nada desta semana.