API do Seggest
Referência da superfície de dados da plataforma: o que existe, em que aba é usado, e como um sistema parceiro consome isso de fora.
O catálogo cobre os módulos operacionais do Seggest — comercial, cadastro, financeiro, relacionamento e atendimento. Módulos de administração interna do Grupo VSX não constam aqui.
Só a seção “Endpoints da API” é acessível de fora, e apenas nos recursos liberados para a sua chave. O restante existe para dar contexto do que a plataforma cobre.
A API está no ar. Sem chave ela responde “não autenticado”; com chave e sem escopo, “sem acesso” — os dois são esperados até a liberação ser combinada.
Levantado direto do banco de produção e do código publicado, não de documentação anterior. Volumes refletem a leitura de 26/07/2026.
Como o Seggest expõe dados
Não existe uma camada de aplicação entre o navegador e o banco. O front-end fala direto com o PostgreSQL por quatro caminhos, e é isso que a expressão “endpoint do Seggest” significa na prática.
1. Tabelas e views
Cada tabela vira um endpoint REST automaticamente, via PostgREST. Quem decide o que cada pessoa enxerga é o Row Level Security do próprio banco — não o código do front-end.
2. Funções (RPC)
Rotinas em SQL chamadas por POST /rest/v1/rpc/<nome>. Concentram o que não cabe em uma consulta: cálculo de comissão, fechamento mensal, motores de repasse.
3. Edge Functions
Código Deno para o que precisa de rede ou segredo: envio de e-mail, WhatsApp, leitura de PDF, webhooks de terceiros.
4. Storage
Arquivos em buckets — documentos de apólice, anexos de tarefa, fotos. Todos privados, exceto os de identidade visual.
Autenticação
Toda chamada exige uma chave de API no cabeçalho Authorization. A chave é emitida pelo Grupo VSX, pertence a um parceiro específico e carrega três coisas: a corretora que ela enxerga, os recursos liberados e o limite de requisições por minuto.
Guarde a chave no ato
O Seggest guarda apenas o hash SHA-256 da chave. Ela aparece em texto claro uma única vez, no momento da criação. Se for perdida, o caminho é revogar e emitir outra — não há recuperação.
O que a chave não alcança
O corretora_id da chave é aplicado pelo gateway em toda consulta, depois dos filtros que você enviou. Não há parâmetro que remova esse filtro. Recursos sem coluna de corretora são recusados por padrão, porque neles não haveria como garantir o isolamento.
Revogação
A revogação tem efeito na chamada seguinte, sem propagação nem cache. Chaves podem também ter data de validade e uma lista de IPs autorizados.
Paginação, filtros e erros
Paginação
São 50 registros por página, no máximo 500. A resposta traz paginacao.proxima_pagina com a URL pronta da página seguinte, ou null quando acabou — percorrer a lista é seguir esse campo até ele ser nulo.
Filtros
A sintaxe é a do PostgREST: ?status=eq.ativo, ?created_at=gte.2026-01-01, ?nome=ilike.*silva*. Operadores: eq, neq, gt, gte, lt, lte, like, ilike, in, is. Só é possível filtrar e ordenar por colunas liberadas para a sua chave — o resto responde 400 dizendo quais são.
Erros
Todo erro tem o mesmo formato: codigo estável para o seu código tratar, mensagem em português para a pessoa ler e, quando ajuda, dica com o próximo passo.
Limite de requisições
O padrão é 120 por minuto, por chave, em janela deslizante. Ao estourar, a resposta é 429 e o pedido não é processado. Para carga maior, o limite é ajustável por chave.
Endpoints da API
Base: https://api.seggest.com.br/functions/v1/parceiro-api
GET /v1/_recursos
Devolve o que a sua chave alcança: recursos, permissão de cada um e colunas visíveis. É o ponto de partida de qualquer integração, e o jeito de descobrir mudanças de escopo sem precisar perguntar.
GET /v1/<recurso>
Lista registros com filtros e paginação. <recurso> é o nome que aparece em /v1/_recursos.
GET /v1/<recurso>/<id>
Busca um registro pelo identificador.
POST, PATCH e DELETE
Disponíveis apenas em recursos cuja permissão é escrita. Campos fora da lista liberada são descartados; id e corretora_id nunca vêm do corpo da requisição — o gateway os carimba. Outros verbos, como PUT, respondem 405.
GET /health
Sonda de disponibilidade. Não exige chave.
Recursos que a API pode expor
A API entrega dado de negócio. Configuração, integração, permissão, regra de comissão e motor de automação não saem por ela, mesmo com escopo criado por engano. Os recursos possíveis são estes 25:
| Área | Recursos |
|---|---|
| Cadastro | clientes cliente_documentos |
| Ciclo de venda | cotacoes propostas proposta_vendedores |
| Contratos | apolices apolice_vidas apolice_vendedores apolice_documentos |
| Comercial | negociacoes |
| Financeiro | comissoes_a_receber parcelas_cliente parcelamentos pagamentos_unicos baixas_recebimento financeiro_lancamentos |
| Sinistro | sinistros sinistro_tipos sinistro_eventos sinistro_documentos |
| Catálogo | operadoras produtos tipos_produto categorias_produto |
| Operação | tarefas |
O que a sua chave alcança é um subconjunto disso, definido caso a caso — consulte /v1/_recursos. Precisando de algo que está na tabela acima mas não na sua chave, é só pedir: liberar é configuração, sai no mesmo dia.
Uma consulta por recurso
Não é possível trazer tabelas relacionadas na mesma chamada. Um select com cliente:clientes(nome) responde 400. Consulte cada recurso separadamente e junte os dados do seu lado — é a forma de garantir que o recorte por corretora valha para tudo que sai daqui, sem exceção.
A especificação OpenAPI 3.1 acompanha esta documentação e pode ser importada direto no Postman, Insomnia ou em um gerador de cliente.
Edge Functions
As funções de borda dos módulos operacionais. Nenhuma faz parte da API de parceiros — estão aqui porque compõem a superfície de rede da plataforma. A coluna de acesso descreve o tipo de integração de cada uma.
| Função e aba | Acesso | O que faz | Entrada |
|---|---|---|---|
analisar-conversa-iaCRM (NegociacaoPanel, WhatsAppChatDrawer), Atendimento (PersistentAtendeSEG), Cadastro (OportunidadesIATab), Configurações › Integrações (botão de teste) |
Chamada pública | Analisa conversa de WhatsApp / negociação / perfil do cliente com Claude (Anthropic, tool calling estruturado) e devolve prioridade, score, sentimento, produtos de interesse, script sugerido e próximo passo. Grava o resultado em crm_ia_analises, atualiza prioridade+justificativa em crm_conversas_whatsapp e cria notificação para o atendente quando a prioridade sai 'alta'. Modo 'oportunidades' sugere 3 produtos novos para o cliente. | JSON. Modos: {teste:true} (só checa se ANTHROPIC_API_KEY existe); {modo:'oportunidades', contexto_cliente:{cliente, produtos_ja_contratados[], produtos_disponiveis[], regras_vigentes[], scores_atuais[]}}; {modo:'resumo', mensagens:[{direcao,conteudo,enviado_em}], conversa_id?, cliente_id?}; {modo:'negociacao', negociacao_titulo, negociacao_valor, negociacao_etapa, negociacao_prioridade, qtd_tarefas, qtd_mensagens, produtos_ativos, cliente_id?, conversa_id?}; padrão {conversa_id (obrigatório), cliente_id?} — busca as últimas 30 mensagens em crm_mensagens_whatsapp. |
atendeseg-ai-summaryCRM (NegociacaoPanel — botão de resumo IA no card), Cadastro (ClientePerfilModal → WhatsAppChatDrawer) |
Chamada pública | Gera resumo do atendimento do cliente no AtendeSeg. Modo 'escopo' (quando vem negociacao_id): filtra os tickets pelo corretor da negociação (profiles.atendeseg_user_id) e pela data de criação do card, baixa até 300 mensagens e resume com Claude Haiku, com cache de 60 min em atendeseg_ai_cache. Modo 'historico' (padrão): chama o endpoint nativo /contacts/{id}/ai-summary do AtendeSeg. | {cliente_id (obrigatório), negociacao_id? (ativa o modo escopo), user_id? (chave do cache)} |
atendeseg-auth-refreshConfigurações › Integrações (AtendeSeg) para o modo 'configurar', na prática o modo cron roda por pg_cron (*/30 min, migration 20260609154000_motor_v2_cron.sql) — não há chamador no frontend hoje |
Rotina agendada | Mantém vivo o JWT da API do AtendeSeg guardado em config_atendeseg.api_token (sem ele, disparo-campanha, atendeseg-send e o motor-automacao param de enviar). Valida o token atual, e se voltar 401/403 faz POST /auth/login com as credenciais cifradas e grava o token novo. Registra falha em config_atendeseg.refresh_erro e notifica os Administradores ativos (só na primeira falha, pra não spammar o cron). O modo 'configurar' grava admin_email/admin_senha_enc. | {} (cron: valida e renova se preciso) | {forcar:true} (renova mesmo com token aparentemente válido) | {modo:'configurar', email, senha} |
atendeseg-import-historyAtendimento / CRM (histórico das conversas de WhatsApp) — sem chamador no frontend atual |
Chamada pública | Recupera o histórico completo de mensagens de um ticket do AtendeSeg (API interna /messages/{ticket}, até 30 páginas) e grava em crm_mensagens_whatsapp com upsert por atendeseg_msg_id (re-execução não duplica). Se a conversa não tiver atendeseg_contato_id, busca no detalhe do ticket e corrige o registro. | {conversa_id} (UUID de crm_conversas_whatsapp; a conversa precisa ter atendeseg_conversa_id) |
atendeseg-recursosRelacionamento › editor de automações (PickerRecurso, VariaveisTemplateEditor), Central de Disparos |
Sessão do usuário | Proxy só-leitura da API externa do AtendeSeg para popular dropdowns do app (usuários, templates WABA, chat-flows/bots, produtos, etapas do funil, tags) sem expor o api_token no browser. Normaliza cada envelope diferente da API para [{id, nome, extra}] e mantém cache em memória do isolate por (apiId, recurso) com TTL de 120s. | {recurso:'users'|'templates'|'chat-flows'|'products'|'pipeline-steps'|'tags', refresh?:boolean (ignora o cache)} |
atendeseg-sendAtendimento / CRM (chat de WhatsApp dentro do card) — sem chamador no frontend atual |
Chamada pública | Envia uma mensagem de texto no ticket do AtendeSeg a partir de uma conversa do CRM (POST /v1/api/external/{token}/messages, com fallback para /ticket/{id}/messages) e, quando dá certo, registra a mensagem enviada em crm_mensagens_whatsapp e atualiza ultima_mensagem_em na conversa. | {conversa_id, mensagem, usuario_id?} — usuario_id é desestruturado do body mas NUNCA é usado |
atendeseg-webhookConfigurações › Integrações (URL do webhook + botão 'Testar conexão'), alimenta as abas Atendimento, CRM |
Webhook de terceiro | Recebe os eventos do AtendeSeg (NewMessage, TicketFinished/FinishedTicketHistoricMessages, UpdateContact/NewContact), canonicaliza o telefone para +55DDD9N, casa o cliente pelos últimos 8 dígitos (clientes + cliente_telefones), resolve a negociação (funil SDR → qualquer funil), cria/atualiza a conversa e grava/edita a mensagem (texto ou mídia). Cria card 'orgânico' no funil SDR quando é inbound espontâneo no canal 284 sem atendente humano. Roda 4 detectores determinísticos sobre o texto: OPT-OUT (recuperacao_optout + move p/ Lead Descartado), TRANSFERÊNCIA/qualificação (recuperacao_setor + move p/ Lead Reaquecido), AGENDAMENTO de renovação (recuperacao_data_renovacao + setor='seguros') e VIGÊNCIA vinda do campo customizado do contato. | JSON do AtendeSeg: {event, message:{id, body|caption|text, fromMe, mediaType, mediaUrl, quotedMsgId, msgCreatedAt, ticket:{id, userId, whatsappId, contact:{id, number, name|pushname}}}}. Variantes: {messages:[...]} ou {historico:[...]} nos eventos de finalização; {contact:{id, number, customFields:{'vigência'}}} em UpdateContact/NewContact; {teste_conexao:true, api_token} para o botão de teste. |
cadastro-produtorFormulário público /cadastro-parceiro (public/cadastro-parceiro.html), a fila de aprovação fica em Configurações › Parceiros Pendentes (ParceirosPendentes / useParceirosCadastro) |
Chamada pública | Recebe o formulário público de cadastro de parceiro/produtor, sobe os anexos (base64) no bucket privado produtores-anexos, grava a inscrição em produtores_cadastro com status 'pendente' e protocolo gerado no servidor, e notifica os admins. NÃO toca em `vendedores` — isso só acontece quando um admin confirma, via fn_confirmar_produtor. | {dados:{tipo_pessoa:'PF'|'PJ', nome|razao_social, documento (CPF/CNPJ), email?, telefone?, aceite_estorno:'Sim', aceite_declaracoes:'Sim', assinatura, termos_versao?, aceite_em?, autoriza_posvenda?,...demais campos livres}, arquivos:{<chave>:{name, type, base64 — aceita data URL}}} |
calendario-agendar-reuniaoCalendário (AgendarReuniaoModal via hook useAgendarReuniao) |
Sessão do usuário | {convidadoIds:string[] (UUIDs de profiles), titulo, inicio (ISO), fim (ISO), descricao?, local?, comMeet?:boolean=true} | |
calendario-disponibilidadeCalendário (AgendarReuniaoModal via hook useAgendarReuniao) |
Chamada pública | Devolve os blocos ocupado/livre de VÁRIAS pessoas para montar a grade de horários da reunião: junta os eventos do Google (todas as contas conectadas da pessoa, via events.list com fields=items(start,end,status,transparency) — só início/fim, nunca títulos) com os eventos internos do Seggest (criados por ela ou com participação 'aceito'), e mescla os blocos sobrepostos. | {usuarioIds:string[], inicio (ISO), fim (ISO)} |
calendario-oauth-startCalendário › Sincronização externa (SincronizacaoExterna via hook useCalendarioSync) |
Retorno OAuth | Inicia o fluxo OAuth de conexão de calendário externo: valida o provider, confere se as credenciais estão configuradas na plataforma e devolve a URL de consentimento do Google/Microsoft para o frontend redirecionar o navegador. O callback é tratado por outras functions (google-calendar-callback / outlook-calendar-callback). | Query string: ?provider=google|microsoft&origin=<origem que iniciou> (o origin também pode vir do header Origin). Header Authorization com o JWT do usuário. |
calendario-push-eventoCalendário (hook useEventos — disparado fire-and-forget logo após salvar a edição do evento) |
Sessão do usuário | Propaga a EDIÇÃO de um evento do Seggest para o provedor externo (PATCH no Google Calendar com sendUpdates=all, ou PATCH no Microsoft Graph), quando o evento já tem external_id + conexao_id. Renova o access_token da conexão se faltar menos de 2 min. Atualiza eventos.ultima_sync. | {eventoId} (UUID de eventos) |
calendario-syncCalendário › Sincronização externa (botão 'Sincronizar agora' — SincronizacaoExterna / useCalendarioSync) |
Rotina agendada | Motor de sincronização bidirecional do Calendário (Google Calendar + Microsoft Graph) numa janela de -30d a +180d: PULL (eventos externos → tabela eventos, com dedup por external_id/ical_uid e delete quando o externo é cancelado) e PUSH (eventos com fonte='seggest' no calendário mapeado → provedor externo), respeitando calendario_conexoes.direcao (push/pull/bidirecional). Renova tokens e grava ultima_sync/ultimo_erro. | {} (cron: todas as conexões ativas) | {conexao_id} | {usuario_id} — esses dois só têm efeito quando NÃO há JWT de usuário no header |
cron-comissoes-vencidasFinanceiro › Comissões (sem UI — job de pg_cron, nenhuma chamada em src/) |
Rotina agendada | Job agendado que chama a RPC motor_marcar_comissoes_vencidas() para marcar comissões cujo vencimento passou. | Nenhum payload (o body é ignorado). |
cron-lembretes-eventosCalendário (sem UI — pg_cron job 'lembretes-eventos-5min', */5 * * * *) |
Rotina agendada | Despachar lembretes de eventos do Calendário: varre eventos com lembrete_minutos preenchido, não recorrentes (recorrencia is null), ainda não avisados (lembrete_enviado_em is null) e com inicio no futuro; quando agora >= inicio - lembrete_minutos, insere linhas em notificacoes para o criador + participantes com status 'aceito' (evento_participantes) e marca eventos.lembrete_enviado_em (dedupe idempotente). Recorrência é TODO. | Nenhum payload. |
disparo-atendeseg-statusCentral de Disparos › Configuração (a URL do webhook é exibida em ConfiguracaoTab.tsx:137) |
Chamada pública | Webhook público de STATUS do AtendeSeg (hookMessageStatus / urlMessageStatus da credencial de API). Casa o ack pelo externalKey (= id da linha em disparo_destinatarios, setado no envio) e atualiza status/entregue_em/lido_em/erro + grava a trilha em disparo_eventos. Mapeamento do ack (whatsapp-web.js): -1 = falha, 1 = enviado (sem ação, evita ruído), 2 = entregue (não rebaixa quem já está 'lido'), 3/4 = lido/played. | POST JSON — um objeto ou um array de: { type?: 'hookMessageStatus', ack: number, messageId?: string, externalKey: string (id do disparo_destinatarios), status?, error? }. Eventos com type diferente de hookMessageStatus ou sem externalKey são ignorados. |
disparo-campanhaCentral de Disparos (hooks/useDisparos.ts — preparar, enviar, enrolar, sincronizar, listar templates, submeter template) |
Sessão do usuário | Orquestrador único do ciclo de vida da campanha da Central de Disparos. Modos: 'preparar' (resolve o público a partir de campanha.segmento — lista via disparo_lista_contatos ou segmento sobre clientes ativos filtrando tipo_cadastro/origem —, aplica disparo_supressao e materializa 1 linha por campanha×canal×destino em disparo_destinatarios, com suporte a modo_canal 'ambos' vs 'fallback' criando linhas 'reserva'); 'enviar' (pré-voo de prontidão dos canais, lote de pendentes com backoff, e-mail via Resend e WhatsApp via Graph API v21.0 ou via API externa do AtendeSeg, retry com backoff 60/300/900/1800s, auto-pausa por % de falha com notificação ao criador, fallback de canal, conclusão da campanha); 'enrolar' (adiciona UM contato vindo de automação e dispara na hora, idempotente por campanha+canal+destino); 'sincronizar' (pull de reconciliação dos acks no AtendeSeg); 'listar-templates-atendeseg'; 'template' (submete HSM à Meta em /{waba_id}/message_templates e grava meta_template_id/nome). | POST JSON: { modo: 'preparar'|'enviar'|'enrolar'|'sincronizar'|'listar-templates-atendeseg'|'template', campanha_id?, template_id?, limite? (padrão 50, teto 200 no enviar; 300/1000 no sincronizar), contato?: { cliente_id?, nome?, email?, telefone?, variaveis?, origem_automacao_id? } }. No modo 'enviar' campanha_id é OPCIONAL — sem ele, varre todas as campanhas 'agendada'/'enviando' devidas. |
disparo-dominioCentral de Disparos › Configuração (domínios de e-mail — useDisparos.ts:499) |
Sessão do usuário | Onboarding self-service de domínio de e-mail na Central de Disparos, integrando com a API de Domínios do Resend (conta única do Seggest, região sa-east-1) — cada corretora registra e verifica o próprio domínio por baixo dessa conta e cadastra os remetentes autorizados. | POST JSON: { acao: 'add' | 'verificar' | 'listar' | 'remetentes', dominio? (regex /^(?:[a-z0-9-]+\.)+[a-z]{2,}$/i, obrigatório no add), dominio_id? (uuid local, obrigatório em verificar/remetentes), remetentes?: [{ email, nome? }] (array não-vazio; cada email deve terminar em @<dominio>) }. |
disparo-trackCentral de Disparos (KPIs de abertura/clique/descadastro das campanhas de e-mail) |
Rastreamento de e-mail | Tracking de e-mail da Central de Disparos: /open serve um GIF 1x1 e registra a PRIMEIRA abertura (sobe status para 'aberto' se estava enviado/entregue + evento 'aberto'); /click registra o clique (evento por clique, sobe status para 'clicou', preenche aberto_em) e redireciona; /unsubscribe marca 'descadastrou', grava evento e insere em disparo_supressao (upsert com onConflict corretora_id,canal,destino), devolvendo uma página HTML de confirmação em pt-BR. Erros de banco nunca bloqueiam a resposta ao usuário final. | Querystring: t=<tracking_token> (todas as rotas) e u=<url destino urlencoded> (apenas /click). Header user-agent é gravado em disparo_eventos.dados. |
disparo-webhookCentral de Disparos (webhook da Meta, citado em ConfiguracaoTab.tsx:547) |
Webhook de terceiro | Webhook público da Meta (WhatsApp Cloud API / Graph) para a Central de Disparos. Trata: (A) recibos de status statuses[] — sent (só log) / delivered / read / failed → atualiza disparo_destinatarios (sem rebaixar 'lido' para 'entregue') e grava disparo_eventos; (B) mensagens recebidas messages[] do tipo texto com palavra-chave de opt-out (ehOptout: SAIR/PARAR/STOP/...) → insere em disparo_supressao (motivo 'keyword') e marca o destinatário mais recente como 'descadastrou'; (C) field 'message_template_status_update' → APPROVED/REJECTED/PENDING atualiza status e motivo_rejeicao em disparo_templates. A corretora é resolvida por value.metadata.phone_number_id → whatsapp_config (com cache local por request). | GET: ?hub.mode=subscribe&hub.verify_token=<token>&hub.challenge=<challenge>. POST: payload Graph { entry: [{ changes: [{ field, value: { metadata: { phone_number_id }, statuses: [...], messages: [...] } }] }] } ou { field:'message_template_status_update', value:{ message_template_id, message_template_name, event, reason } }. |
email-account-saveEmail (pages/Email.tsx), Configurações › Contas de Email (ContasEmailTab.tsx) |
Sessão do usuário | Criar/atualizar a conta de e-mail (SMTP/IMAP) do módulo Email. Self-service: cada usuário salva a sua. Administrador pode salvar para outro via owner_profile_id. A senha da caixa é cifrada com AES-GCM (_shared/crypto.ts, chave EMAIL_CRED_KEY) e gravada na tabela isolada email_account_secrets — o browser nunca lê a senha de volta. Update é PARCIAL (só altera os campos presentes no body). | POST JSON: { id? (update), email (obrigatório na criação), senha (obrigatória na criação; opcional no update — se vier, re-cifra), display_name?, owner_profile_id? (só admin), tipo?: 'pessoal'|'compartilhada', smtp_host?, smtp_port? (default 465), smtp_secure? (default true), smtp_user?, imap_host?, imap_port? (default 993), imap_secure? (default true), imap_user?, ativo?, assinatura?, reply_to? }. |
email-account-testEmail (pages/Email.tsx), Configurações › Contas de Email (ContasEmailTab.tsx) |
Sessão do usuário | Testar a conexão SMTP + IMAP de uma conta de e-mail. Dois modos: { account_id } carrega a conta e decifra a senha de email_account_secrets, e grava o resultado em email_accounts.last_test_ok / last_test_em / last_test_erro; { creds } testa credenciais cruas antes de salvar. Usa probeSmtp/probeImap de _shared/mailer.ts. | POST JSON — um dos dois: { account_id: uuid } OU { creds: { email, senha (obrigatória), smtp_host, smtp_port (465), smtp_secure (true), smtp_user, imap_host, imap_port (993), imap_secure (true), imap_user } }. |
email-imapEmail (pages/Email.tsx — leitura da caixa, busca, pastas, anexos, rascunhos) |
Sessão do usuário | Cliente IMAP da caixa do próprio usuário (estilo Outlook) via imapflow. O corpo é extraído baixando só a parte text/html|plain da bodyStructure e decodificando manualmente base64/quoted-printable (sem mailparser, que estoura a CPU do edge runtime), com fallback de charset utf-8 estrito → iso-8859-1/windows-1252 e inline de imagens cid: (até 8, máx ~800 KB cada) convertidas em data: URI. | POST JSON: { action, account_id (obrigatório), folder? (default INBOX), uid?, page?, pageSize? (1-100, default 30), flag?, value?, dest?, query?, part?, to?, cc?, bcc?, subject?, html?, text? }. Ações: list_folders | list_messages | get_message | mark_seen | mark_unseen | set_flag | move | delete_message | search | download_attachment | save_draft. |
email-sendEmail (pages/Email.tsx), CRM › card do cliente, botão ✉️ (components/crm/EnviarEmailModal.tsx) |
Sessão do usuário | Enviar e-mail por SMTP a partir da caixa do próprio usuário (nodemailer), com suporte a resposta/encaminhamento (inReplyTo/references), anexos e prioridade. Define o HELO/EHLO com o domínio real do remetente (sem isso o edge-runtime anuncia EHLO [127.0.0.1] e a HostGator bloqueia a entrega silenciosamente). Depois do envio, arquiva uma cópia MIME na pasta Enviados via IMAP append (best-effort — detecta a pasta por specialUse \Sent, fallback INBOX.Sent). | POST JSON: { account_id (obrigatório), to (obrigatório, string ou array), cc?, bcc?, subject?, text?, html?, inReplyTo?, references?, attachments?: [{ filename, base64, contentType }], priority?: 'high'|'low' }. |
extrair-dados-pdfPlataforma |
Chamada pública | STUB temporário. A extração de dados de PDF por IA dependia do Lovable AI Gateway, que não existe no Supabase self-hosted; a função apenas loga a invocação e devolve 503. O TODO no arquivo prevê substituir por chamada direta a OpenAI/Google AI. | Ignorada (o body nem é lido). |
extrair-documento-segurosCadastro › Importar PDF (ImportPDFModal.tsx / ImportPDFBatchModal.tsx via hooks/useExtrairPDF.ts) |
Sessão do usuário | Extrair dados estruturados de PDF do mercado segurador chamando a Anthropic Messages API (modelo claude-sonnet-4-6) com vision nativa de PDF, structured output forçado por tool_use + tool_choice e prompt caching (cache_control ephemeral no system, que cacheia também as tools). Bifurca o JSON Schema entre Seguros Gerais (proposta/apólice: cliente, bem segurado, coberturas, pagamento, comissão, renovação) e Saúde (contrato: contratante, produto ANS, vidas, financeiro, carências). Consolida campos_faltantes da IA com uma checagem server-side de campos críticos. Toda a operação passa por executarOperacaoIA (_shared/credits.ts → RPCs fn_iniciar_operacao_ia / fn_finalizar_operacao_ia): idempotência, débito de créditos e estorno automático em falha. | Header Idempotency-Key (ou body.idempotency_key), mínimo 16 caracteres — OBRIGATÓRIO. POST JSON: { pdf_base64 (aceita com ou sem o prefixo data:application/pdf;base64,; máx 10 MB decodificados), nome_arquivo, tipo_documento: 'proposta'|'apolice'|'contrato', ramo_hint? }. |
google-calendar-callbackCalendário (retorno do fluxo iniciado em calendario-oauth-start) |
Retorno OAuth | Callback OAuth do Google Calendar (a redirect URI registrada no Google Cloud DEVE ser https://<edge>/functions/v1/google-calendar-callback). Troca o `code` por tokens (exchangeCode), descobre o e-mail da conta conectada (getContaEmail), resolve a corretora do usuário em profiles e faz upsert em calendario_conexoes (onConflict usuario_id,provider,conta_email) com access_token, refresh_token, token_expira, scope, external_calendar_id='primary', sync_ativo=true. | Querystring do Google: ?code=<authorization_code>&state=<payload.assinatura> — ou ?error=<motivo> quando o usuário nega o consentimento. |
lead-webhookConfigurações › Campanhas (CampanhasCard.tsx, CampanhaFormDialog.tsx montam a URL `${SUPABASE_URL}/functions/v1/lead-webhook?token=...`), logs no LeadWebhookLogsDialog / hook useLeadWebhookLogs. Os leads caem no CRM (Gestão de Leads / Negociações). |
Webhook de terceiro | Endpoint público para formulários de site criarem leads no CRM. Acha a campanha pelo token, aplica rate limit por IP, valida payload mínimo (nome) e chama a RPC fn_criar_lead, que cria/reaproveita o cliente, cria a negociação, resolve produto, faz round-robin de consultor e notifica. Toda tentativa (sucesso ou falha) vai para lead_webhook_log. | POST /functions/v1/lead-webhook?token=<webhook_token> com JSON { nome | name (obrigatório), email?, telefone | phone?, cpf_cnpj | cpf?,...campos livres }. O payload inteiro é repassado a fn_criar_lead e gravado no log. |
meta-leads-webhookCRM / Gestão de Leads (entrada de leads de anúncios Meta), a configuração fica em config_meta_ads, as campanhas em Configurações › Campanhas (campo meta_form_id). |
Webhook de terceiro | Recepção nativa de leads do Meta Lead Ads (substitui o Bitrix). Para cada change do tipo 'leadgen': deduplica por negociacoes.external_id, acha a campanha por crm_campanhas.meta_form_id (ativa), busca os field_data do lead na Graph API v21.0 com o page token, normaliza nome/e-mail/telefone (BR, tira +55) e chama fn_criar_lead — que cria cliente, card, faz round-robin e notifica. | GET: query hub.mode=subscribe, hub.verify_token, hub.challenge. POST: payload padrão da Meta { entry: [ { id, changes: [ { field:'leadgen', value:{ leadgen_id, form_id, page_id } } ] } ] } + header x-hub-signature-256. |
meta-spend-syncBackend/cron — alimenta meta_ad_insights (CPL/CAC/ROI de Marketing). Na main não encontrei nenhuma tela consumindo meta_ad_insights fora de src/integrations/supabase/types.ts, ou seja, hoje é dado sem UI. |
Rotina agendada | Sincroniza o gasto de anúncios do Meta Ads (level=campaign, time_increment=1) para public.meta_ad_insights, com retry/backoff em rate limit da Graph API. Percorre todas as ad accounts acessíveis pelo token, pagina os insights do período e faz upsert em lotes de 200 por (corretora_id, meta_campaign_id, dia). Agendada por pg_cron ('meta-spend-sync-diario', 0 5 * * *, migration 20260606140000). | JSON { meta_token?: string (senão cai no env META_PAGE_ACCESS_TOKEN), corretora_id?: uuid (default hardcoded a091d013-fcb4-4b07-a5bb-3e6bf23c203f = VSX), dias?: number (default 7) }. |
motor-automacaoRelacionamento › editor de automações (TestarAutomacaoDialog + hook useTestarAutomacao chamam { modo:'testar' }), em produção roda majoritariamente por pg_cron. |
Rotina agendada | Executor v2/v3 do motor de automação do Relacionamento. Lê regras de rel_automacoes + rel_automacao_acoes (+ rel_automacao_arestas no modo grafo), casa com eventos de rel_eventos, avalia condições de gatilho e por ação, e executa: chamadas HTTP (AtendeSeg/WhatsApp), envio de e-mail, db_update, db_insert, criar_tarefa (com observadores via fn_add_tarefa_observador), criar_negociacao (túnel entre funis) e disparo_enrolar. Respeita dry_run, idempotência por evento+ação e por janela de horas, e registra tudo em rel_disparos. | JSON, variando pelo modo: { modo:'drain', limite?:number (máx 100, default 25) } — claim atômico via RPC rel_claim_eventos; { modo:'agendado', forcar_envio:true } — varredura legada (sem forcar retorna 'pulado'); { modo:'evento', evento_id:uuid }; { modo:'testar', automacao_id:uuid, negociacao_id|entidade_id:uuid, payload?:{} } — sempre simula, nada é gravado; { tipo:'negociacao_criada', negociacao_id:uuid, corretora_id?, payload? } — execução sob demanda sem fila. A flag global forcar_envio:true IGNORA o dry_run e executa de verdade. |
outlook-calendar-callbackCalendário (conexão de calendário externo Outlook/Microsoft, par do calendario-oauth-start, do google-calendar-callback). |
Retorno OAuth | Callback OAuth da Microsoft/Outlook: troca o `code` por tokens, descobre o e-mail da conta, e faz upsert em calendario_conexoes (usuario_id, corretora_id herdada de profiles, access_token, refresh_token, token_expira, scope, external_calendar_id='primary', sync_ativo=true), redirecionando o usuário de volta para /calendario. O fluxo é iniciado pela edge calendario-oauth-start, que exige JWT e assina o state. | Query string do provedor: ?code=<authorization_code>&state=<payload.assinatura>, ou ?error=<erro_oauth>. A redirect URI registrada no Azure precisa ser https://<edge>/functions/v1/outlook-calendar-callback. |
send-pushChat interno do Seggest (notificações push do navegador, tabelas chat_mensagens, chat_participantes, chat_conversas, push_subscriptions). |
Chamada pública | Envia Web Push (npm:web-push) da mensagem nova do chat interno para todos os participantes da conversa, exceto o remetente e os que silenciaram. Monta título (nome do grupo ou do remetente) e prévia por tipo (imagem/gif/sticker/arquivo/áudio/vídeo/texto truncado em 120 chars) e remove automaticamente as push_subscriptions que retornarem 404/410. | JSON { record: <linha de chat_mensagens> } (formato do trigger) ou o próprio registro direto. Campos usados: id, conversa_id, remetente_id, tipo, conteudo, anexo_tipo, anexo_nome, excluida_em. Se vier `id`, a função re-busca a mensagem no banco e prefere os dados de lá. |
send-recovery-emailTela de Login › "Esqueci minha senha" (src/components/auth/EsqueciSenhaDialog.tsx), Configurações › Usuários (UsuariosTab.tsx, para o admin disparar o reset de um usuário). |
Chamada pública | Envia o e-mail de recuperação de senha com o link do GoTrue apontando para <APP_BASE>/redefinir-senha, usando template próprio com o branding da plataforma (getBranding) e o nome do usuário (busca best-effort em profiles). Blinda enumeração de contas: qualquer entrada devolve sempre a mesma resposta genérica. | JSON { email: string } (validado por regex simples; e-mail inválido também recebe a resposta genérica). |
telefonia-gravacao-syncTelefonia (histórico de Chamadas / player de gravação), a configuração fica em Configurações › Integrações › Telefonia Sonax. |
Rotina agendada | Backfill das gravações de chamadas: busca em `chamadas` até 25 registros com duracao_seg > 0, sonax_call_id preenchido e gravacao_path nulo (mais recentes primeiro), baixa o áudio da API dbdial do Sonax (acao=pega_gravacao), valida que o binário é áudio de verdade (RIFF/ID3/0xFF e >1000 bytes) e sobe para o bucket `gravacoes` em <corretora_id>/<ano>/<mes>/<sonax_call_id>.<wav|mp3>, atualizando chamadas.gravacao_path. | Nenhuma — sem body nem query params. Todo o estado vem de config_telefonia e da tabela chamadas. |
telefonia-webhookConfigurações › Integrações › Telefonia Sonax (TelefoniaSonaxCard.tsx monta a URL do webhook), os dados aparecem no módulo Telefonia / histórico de Chamadas, no card do cliente. |
Webhook de terceiro | Recebe os eventos de chamada do Sonax (acao=recebida|finaliza) e faz upsert idempotente em `chamadas` por (corretora_id, sonax_call_id). Resolve a corretora e o corretor pelo ramal (telefonia_ramais / telefonia_ramal_membros), tenta casar o cliente pelos últimos 8 dígitos do telefone, consulta o /history do webphone Sonax para descobrir a direção (entrada/saída), baixa a gravação para o bucket `gravacoes` quando vem URL, e faz merge NÃO-regressivo (não rebaixa status finalizado para em_andamento nem zera duração/gravação já conhecidas), tratando corrida 23505 com fallback para UPDATE. | GET/POST em /functions/v1/telefonia-webhook?secret=XXXX com campos do Sonax: acao, id_chamada (ou call_id/id/uniqueid/callid/protocolo), ramal (ou aliasramal/extension/agent), numero/telefone/destino/origem, tipo/direcao/direction, status/situacao/resultado, duracao/duration/billsec, data/inicio/start, gravacao/recording/url_gravacao, failed_code/codigo/cause. O payload cru é gravado na coluna `raw`. |
Catálogo por aba
Cada aba do Seggest com os recursos que ela lê e escreve, levantado do código publicado e conferido contra o banco de produção. A coluna de registros mostra o volume real hoje — útil para dimensionar paginação.
Use a busca no topo para encontrar uma tabela ou função específica.
Dashboard e Metas3 abas
Dashboard
/dashboard
30 tabelas · 2 RPCs
Home multi-perfil: useTipoUsuarioDashboard escolhe entre 6 variantes (admin/CEO, gerente, líder/supervisor, financeiro, consultor interno e administrativo) — vendedor externo é redirecionado para /meu-extrato. Toda variante fecha com o bloco Mural (feed + Tarefas do Dia + agenda de Eventos).
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
vendedores |
285 | 46 | SELECT | lookup do vendedor vinculado ao usuário (tipo interno/externo) para decidir a variante; lista de internos p/ média da equipe (consultor); externos ativos p/ alerta de saldo negativo (admin); nome+usuario_id no ranking; vendedores ativos do downline (gerente) |
financeiro_lancamentos |
4.607 | 35 | SELECT | KPIs Receita/Despesa/Resultado do período + período anterior (Δ MoM) no admin; saúde de caixa, série de fluxo diário/semanal, alertas de atraso/próximos 7d/sem categoria e resumo por categoria e natureza no financeiro |
comissoes_a_receber |
27.686 | 21 | SELECT | KPI "A Receber" do admin (status aguardando_pagamento, por data_previsao_pagamento, paginado de 1000 em 1000); também alimenta o painel gerencial do hook useDashboardFinanceiro |
apolices |
4.837 | 66 | SELECT | evolução de vendas 6m por data_emissao e ranking de vendedores (admin); alerta e lista de apólices vencendo em 7d; apólices vigentes e renovações 30d do consultor; média de prêmio da equipe; atividade recente; contagem de vencimento (gerente e administrativo) |
produtos |
129 | 15 | SELECT | embed produto_id nas apólices para chegar na categoria (regra premioParaMeta/premioParaPeriodo); nome do produto nas renovações do consultor |
categorias_produto |
0 | 15 | SELECT | embed categoria_id dentro de produtos — nome da categoria define se o prêmio é recorrente (Saúde) ou integral no mês (Seguros) |
profiles |
36 | 22 | SELECT | foto_path do top 5 do ranking (admin); resolução do downline por lider_id em BFS e fotos dos subordinados (gerente); liderados diretos (líder); autores/destinatários no mural |
funis_etapas |
72 | 8 | SELECT | etapas tipo 'livre' para contar/listar negociações paradas há 7+ dias (admin); embed etapa_rel(tipo) para classificar fechado/descartado no dashboard do líder |
negociacoes |
23.607 | 45 | SELECT | contagem e lista de negociações sem movimentação há 7+ dias (admin e gerente); pipeline pessoal do consultor (leads novos, em negociação, fechando em 7d); pipeline/ganhos da equipe e pessoal do líder |
propostas |
60 | 46 | SELECT | contagem de propostas assinada/transmitida aguardando emissão (admin, gerente e administrativo) |
clientes |
25.598 | 45 | SELECT | embed cliente_id para exibir o nome do cliente na lista de apólices vencendo, nas renovações do consultor e nas notas do diário |
fin_contas_bancarias |
0 | 12 | SELECT | soma de saldo_atual das contas ativas = KPI "Saldo" do dashboard financeiro |
fin_categorias |
27 | 9 | SELECT | nome e natureza das categorias para o bloco "Resumo por categoria/natureza" do dashboard financeiro |
comissoes_a_pagar |
0 | 31 | SELECT | alerta de comissões a pagar (status aprovada/pendente) no financeiro; total de comissões geradas pela equipe no período (gerente) |
tarefas |
12.047 | 18 | SELECT/UPDATE | top 5 pendentes + contagem total do consultor, tarefas concluídas na atividade recente, contagem de hoje/atrasadas do administrativo, pendentes/atrasadas dos liderados (líder), Tarefas do Dia no mural. UPDATE ao concluir/reabrir tarefa pelo card MinhasTarefasCard |
cliente_diario |
19.643 | 19 | SELECT | notas do diário do consultor nos últimos 7 dias na timeline de Atividade Recente |
operadoras |
47 | 14 | SELECT | embed via alias `seguradoras:operadora_id ( nome )` nas apólices da atividade recente do consultor |
corretoras |
102 | 30 | SELECT | branding (nome/logo da corretora) exibido no DashboardHeader do admin (BrandingContext) |
comunicacao_config |
0 | 17 | SELECT | gate feed_habilitado — decide se o bloco Mural aparece |
feed_posts |
0 | 13 | SELECT/INSERT/UPDATE/DELETE | posts do mural (lista paginada de 10, criar publicação, fixar/desafixar, moderar, excluir); também contagem de não-lidos para a bolinha do menu |
feed_curtidas |
45 | 5 | SELECT/INSERT/DELETE | curtidas dos posts do mural + lista de quem curtiu |
feed_comentarios |
0 | 7 | SELECT/INSERT | comentários e respostas nos posts do mural |
feed_comentario_curtidas |
0 | 4 | SELECT/INSERT/DELETE | curtidas nos comentários do mural |
feed_seguindo |
0 | 5 | SELECT/INSERT/DELETE | seguir/deixar de seguir um post do mural |
feed_midias |
0 | 5 | SELECT/INSERT | imagens anexadas ao post (registra o path no bucket feed-anexos e resolve signed URLs) |
eventos |
7 | 22 | SELECT/INSERT/UPDATE/DELETE | agenda lateral do mural (EventosCard) — listar, criar, editar e excluir eventos |
evento_participantes |
25 | 6 | SELECT/INSERT/UPDATE/DELETE | convidados do evento e RSVP (aceitar/recusar); reconciliação de convidados na edição |
calendarios |
345 | 15 | SELECT | lista de calendários no modal de novo/editar evento aberto pelo card de Eventos |
calendario_membros |
0 | 4 | SELECT | calendários em que o usuário é membro (regra de escrita no modal de evento) |
notificacoes |
34.796 | 10 | INSERT | cria notificação (sino) ao publicar post, curtir, comentar, responder e ao convidar/responder evento |
Funções (RPC)
| Função | Parâmetros | Papel |
|---|---|---|
fn_metas_com_realizado |
p_ano integer DEFAULT NULL::integer, p_ativo boolean DEFAULT NULL::boolean | fonte única de meta+realizado (cards ganhos aprovados): meta do mês do consultor, meta pessoal do gerente, KPIs e lista de subordinados do gerente, alertas comerciais e o card de metas do dashboard do líder |
obter_saldo_vendedor |
p_vendedor_id uuid, p_data_corte timestamp with time zone DEFAULT NULL::timestamp with time zone | saldo de cada vendedor externo ativo (chamada em paralelo, 1 por vendedor) para o alerta "Vendedores externos com saldo negativo" do admin |
Edge Functions
calendario-push-evento
Arquivos (Storage)
avatars feed-anexos
Tempo real
- feed-realtime (feed_posts, feed_curtidas, feed_comentarios, feed_comentario_curtidas)
- eventos-realtime (eventos, evento_participantes)
- mural-nao-lidos (INSERT em feed_posts)
- calendarios-<random> (calendarios)
Metas
/metas
19 tabelas · 9 RPCs
Gestão de metas com 6 sub-abas (Acompanhamento, Visão do Gestor, Cards Pendentes, Feedback da Equipe, Visão do Corretor e Histórico), com visibilidade por perfil.
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
metas |
43 | 21 | INSERT/UPDATE/DELETE | criar, editar e excluir metas pelo NovaMetaModal (a leitura NÃO é SELECT direto — vem da RPC fn_metas_com_realizado); também é a tabela assinada pelo realtime |
profiles |
36 | 22 | SELECT | lista de corretores no seletor de meta por corretor (useProfiles). |
operadoras |
47 | 14 | SELECT | lista de operadoras no seletor de meta por seguradora/operadora (useSeguradoras); embed operadoras:operadora_id no painel do card |
negociacoes |
23.607 | 45 | SELECT/UPDATE | carrega o card ganho completo no CardProcessoPanel (fila de avaliação e modal de cards da meta) e atualiza etapa/campos pelo painel do CRM reusado |
clientes |
25.598 | 45 | SELECT | embed cliente_id (nome/email/telefone) no card aberto pela fila de avaliação; busca de cliente dentro do painel do CRM |
produtos |
129 | 15 | SELECT | embed produto_id (nome) no card e seletor de produto dentro do painel do CRM |
interacoes |
2.791 | 8 | SELECT/INSERT | histórico e registro de interações do card, via painel do CRM reusado (CardProcessoPanel → NegociacaoPanel) |
tarefas |
12.047 | 18 | SELECT/INSERT/UPDATE | aba de tarefas do card aberto na fila de avaliação (listar, criar, iniciar, concluir, reagendar) — via painel do CRM reusado |
tarefas_observadores |
8.129 | 5 | SELECT/INSERT | observadores das tarefas do card — via painel do CRM reusado |
negociacao_eventos |
77.537 | 7 | SELECT/INSERT | linha do tempo/auditoria do card — via painel do CRM reusado |
negociacao_transferencias |
16.132 | 8 | SELECT | histórico de transferências do card entre funis/corretores — via painel do CRM reusado |
chamadas |
13.035 | 21 | SELECT | ligações vinculadas à negociação exibidas no card — via painel do CRM reusado |
cliente_diario |
19.643 | 19 | SELECT/INSERT/DELETE | diário/anotações do cliente dentro do card — via painel do CRM reusado |
cliente_diario_email |
107 | 8 | SELECT | histórico de e-mails enviados pelo card — via painel do CRM reusado |
funis |
9 | 9 | SELECT | funis disponíveis para o seletor de etapa/transferência do card — via painel do CRM reusado |
funis_etapas |
72 | 8 | SELECT | etapas do funil para mover o card de etapa — via painel do CRM reusado |
motivos_descarte |
618 | 6 | SELECT | catálogo de motivos ao descartar o card — via painel do CRM reusado |
origens_lead |
0 | 15 | SELECT | catálogo de origens de lead no seletor do card — via painel do CRM reusado |
categorias_produto |
0 | 15 | SELECT | categorias no fluxo de criação rápida de produto dentro do card — via painel do CRM reusado |
Funções (RPC)
| Função | Parâmetros | Papel |
|---|---|---|
fn_metas_com_realizado |
p_ano integer DEFAULT NULL::integer, p_ativo boolean DEFAULT NULL::boolean | lista as metas visíveis ao usuário já com o realizado calculado a partir dos cards ganhos aprovados — alimenta Acompanhamento, Gestor, Corretor e Histórico |
fn_meta_cards |
p_meta_id uuid | cards ganhos que compõem uma meta específica, com status de revisão e flag `conta` (MetaCardsModal) |
fn_cards_avaliacao |
p_ano integer DEFAULT NULL::integer, p_mes integer DEFAULT NULL::integer, p_corretor_id uuid DEFAULT NULL::uuid, p_status text DEFAULT NULL::text | fila de avaliação do gestor: todos os cards ganhos da equipe no ano/mês, com filtros de corretor e status (aba Cards Pendentes) |
fn_revisar_card |
p_negociacao_id uuid, p_status text, p_motivo text DEFAULT NULL::text | gestor define o status de revisão do card (a_revisar / aprovado / pendenciado / reprovado) com motivo |
fn_resolver_pendencia |
p_negociacao_id uuid | consultor dono reenvia um card pendenciado, devolvendo-o para 'a_revisar' |
fn_aprovar_meta |
p_meta_id uuid | gestor aprova meta criada automaticamente na virada de mês (aprovada=false) |
fn_equipe_para_feedback |
— | colaboradores para quem o usuário pode registrar feedback (gestão/RH vê todos, líder só os diretos) — aba Feedback da Equipe |
fn_add_tarefa_observador |
p_tarefa_id uuid, p_user_id uuid | adiciona observador em tarefa do card, via painel do CRM reusado |
fn_venda_detalhe |
p_negociacao_id uuid | detalhe da venda para conferência (hook useVendaDetalhe / VendaDetalheModal) — ATENÇÃO: o VendaDetalheModal não é importado por nenhuma tela, então na main esta RPC está inalcançável pela UI |
Edge Functions
atendeseg-ai-summary analisar-conversa-ia
Arquivos (Storage)
rh-pdi-anexos documentos-clientes avatars
Tempo real
- metas-realtime (tabela metas)
Relatórios
/relatorios
9 tabelas · 0 RPCs
Central de relatórios com 6 abas (Produção Geral, Por Segmento, Por Operadora, Leads e Conversão, Carteira e Renovação, Comissões) sobre um filtro global de período, corretor, operadora e segmento. É 100% leitura — nenhuma escrita, RPC, edge function, storage ou realtime.
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
apolices |
4.837 | 66 | SELECT | base das 3 abas de produção (agrupa por corretor, por segmento/produto e por operadora, aplicando premioParaPeriodo) e das 4 contagens da aba Carteira e Renovação (vigentes, a vencer em 60d, canceladas, vencidas) |
profiles |
36 | 22 | SELECT | embed apolices_corretor_id_fkey e financeiro_lancamentos_corretor_id_fkey para o nome do corretor; e a lista de corretores ativos do filtro global (useCorretoresList) |
operadoras |
47 | 14 | SELECT | embed com alias `seguradora:operadoras(nome)` na produção e nas comissões; e a lista de operadoras ativas do filtro global (useSeguradorasList) |
produtos |
129 | 15 | SELECT | embed produto_id nas apólices para alcançar a categoria do produto |
categorias_produto |
0 | 15 | SELECT | embed categoria_id dentro de produtos — a categoria define se o prêmio é rateado por mês vigente (Saúde) ou contado integral no mês da venda (Seguros) |
negociacoes |
23.607 | 45 | SELECT | aba Leads e Conversão: total de leads no período, fechados, taxa de conversão, distribuição por etapa e por origem |
funis_etapas |
72 | 8 | SELECT | embed etapa_rel(nome, tipo) nas negociações para classificar a etapa e identificar os cards do tipo 'fechado' |
clientes |
25.598 | 45 | SELECT | embed cliente(nome) nas negociações da aba Leads e Conversão |
financeiro_lancamentos |
4.607 | 35 | SELECT | aba Comissões: receitas com categoria='comissao' agrupadas por operadora (prevista x recebida) e despesas com categoria='repasse_vendedor' agrupadas por corretor |
CRM e Leads2 abas
CRM
/crm
38 tabelas · 9 RPCs
Pipeline de vendas em Kanban/lista por funil, com filtros avançados (origem, responsável, prioridade, tarefas, etapa, movimentação/parados, negociação iniciada, transferido, cotação enviada), seleção múltipla com ações em lote (mudar etapa, transferir funil, atribuir, ganho/perdido, excluir) e painel lateral completo do card (detalhes, diário, tarefas, interações, ligações, WhatsApp, e-mail, IA). Tem também a aba "Oportunidades" (motor de score) quando a permissão crm.aba_oportunidades libera.
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
negociacoes |
23.607 | 45 | SELECT, INSERT, UPDATE, DELETE | Tabela central. useNegociacoes carrega server-side por funil + etapas (paginado de 1000 em 1000). UPDATE de etapa/etapa_id, fechado_em, operadora_id/produto_id/produto, motivo_descarte, cotacao_enviada_em, score_ia/avaliacao_ia/sugestao_ia/ia_avaliado_em e campos inline do painel. UPDATE em lote em chunks de 100 ids (etapa, corretor_id, funil_id). INSERT por NovaNegociacaoModal e pela aba Oportunidades. DELETE individual (painel/kanban) e em lote. Também SELECT direto de funil_id para resolver deep-link ?neg=. |
funis |
9 | 9 | SELECT | useFunis lista funis ativos com embed funis_etapas(*) — alimenta o seletor de funil, o TransferirFunilModal e o NovaNegociacaoModal. |
funis_etapas |
72 | 8 | SELECT, UPDATE | useFunilEtapas traz as colunas do Kanban do funil aberto (ordem/tipo livre|fechado|descartado). UPDATE só do campo nome, pelo rename inline da coluna no KanbanBoard (useUpdateEtapaNome, gate crm.renomear_etapa). |
usuarios_funis_autorizados |
101 | 6 | SELECT | useFunisAutorizados — define quais funis um usuário não-Administrador enxerga; sem linhas o CRM mostra "Acesso restrito". |
profiles |
36 | 22 | SELECT | useProfiles (filtro Responsável, diálogo Atribuir, nomes no histórico de transferências, autocomplete de menções @) + embed profiles!negociacoes_corretor_id_fkey na lista e profiles!interacoes_usuario_id_fkey / cliente_diario_consultor_id_fkey / negociacao_eventos_usuario_id_fkey no painel. AuthContext também lê profiles. |
clientes |
25.598 | 45 | SELECT, INSERT, UPDATE | Embed clientes(nome, telefone, email) na lista de cards. SELECT * ao abrir a ficha (ClientePerfilModal). ClienteAutocomplete busca por nome. NovoClienteModal cria/edita cliente (useCreateCliente/useUpdateCliente) a partir do painel do card. |
cliente_telefones |
0 | 7 | SELECT | Telefones adicionais do cliente, listados nas opções do botão de ligar do card. |
cliente_pessoas |
0 | 9 | SELECT | Pessoas de contato de cliente PJ, também listadas nas opções de discagem do card. |
interacoes |
2.791 | 8 | SELECT, INSERT, UPDATE | Histórico de interações do card (useInteracoes/useCreateInteracao). INSERT também grava o motivo do descarte como anotação ("❌ Lead descartado — Motivo:..."). UPDATE edita a descrição de uma interação (autor ou admin). |
negociacao_eventos |
77.537 | 7 | SELECT, INSERT | Log de auditoria do card. INSERT de tipo "abriu" a cada abertura do painel e "editou" a cada campo alterado inline. SELECT escopado ao funil (embed negociacoes!inner) e com tipo != "abriu" para calcular a última movimentação (filtros Parados/Movimentado). SELECT com limit 100 na aba Histórico do painel. |
negociacao_transferencias |
16.132 | 8 | SELECT | Última transferência por card (filtro "Transferido" / "só pra mim", escopado ao funil por embed inner) e linha do tempo de dono na aba Histórico do painel. |
cliente_diario |
19.643 | 19 | SELECT, INSERT, UPDATE, DELETE | Diário do card (limit 30, com embeds de consultor/editor/fixador). INSERT de registro com anexos, de "📄 Cotação enviada", do resumo de IA e do resumo do e-mail enviado. UPDATE para editar texto (com historico_edicoes) e fixar/desafixar. DELETE remove o registro. |
cliente_diario_email |
107 | 8 | SELECT, INSERT | Corpo/assunto/destinatário do e-mail enviado pelo card (leitura restrita a autor/líder/admin). INSERT no EnviarEmailModal, SELECT por diario_id ao carregar o diário. |
tarefas |
12.047 | 18 | SELECT, INSERT, UPDATE, DELETE | Resumo por card (query "tarefas-resumo-crm" paginada de 1000 em 1000, ordenada por id) que alimenta badges e o filtro de tarefas, incluindo tarefas órfãs por cliente_id. No painel: lista por vinculo_id ou cliente_id, criação rápida (status em_andamento), concluir, retomar (RetomarTarefaDialog) e excluir (useDeleteTarefa). |
tarefas_observadores |
8.129 | 5 | SELECT, DELETE | Observadores da tarefa no NovaTarefaModal aberto pelo card (o INSERT é feito pela RPC fn_add_tarefa_observador). Também é uma das tabelas assinadas no canal realtime. |
tarefas_diario |
29.103 | 17 | SELECT, INSERT, UPDATE, DELETE | Diário da tarefa (aba dentro do NovaTarefaModal aberto pelo card), com anexos e menções. |
tarefas_anexos |
13.589 | 11 | SELECT, INSERT, DELETE | Anexos da tarefa criada/aberta pelo card (useTarefaAnexos). |
tarefa_modelos |
16 | 13 | SELECT | Modelos reusáveis que pré-preenchem o NovaTarefaModal aberto pelo card. |
chamadas |
13.035 | 21 | SELECT | Ligações do card na aba Histórico (por negociacao_id, limit 50) e no bloco de ligações do cliente (useChamadasCliente / busca por numero_externo). |
operadoras |
47 | 14 | SELECT | Seletor de operadora no painel (useSeguradoras/useOperadoras) e no popup obrigatório de Ganho (OperadoraProdutoFields). |
produtos |
129 | 15 | SELECT, INSERT | Produtos filtrados por operadora no painel e no popup de Ganho. CriarProdutoDialog faz o INSERT (useCreateProduto). |
origens_lead |
0 | 15 | SELECT | Catálogo de origens ativas (useOrigensLead → useOrigensLeadNomes) usado no filtro Origem do CRM, no painel e no NovaNegociacaoModal. |
motivos_descarte |
618 | 6 | SELECT | Lista de motivos no diálogo de descarte (drag para etapa descartada e troca de etapa pelo painel). |
notificacoes |
34.796 | 10 | INSERT | Notificação de menção (@) gravada por notificarMencionados ao salvar diário/interação, e notificação de tarefa iniciada (lib/iniciar-tarefa). |
email_accounts |
19 | 23 | SELECT | Conta de e-mail IMAP/SMTP ativa do próprio usuário (id, email, assinatura) usada pelo EnviarEmailModal disparado no ✉️ do card. |
email_quick_replies |
0 | 6 | SELECT | Modelos de e-mail salvos, oferecidos no EnviarEmailModal. |
crm_oportunidades |
0 | 11 | SELECT, INSERT, UPDATE | Aba Oportunidades: lista com embeds de clientes e crm_produtos. UPDATE para status "descartada"/"convertida". INSERT gerado pelo scoring-engine no botão Recalcular. |
crm_produtos |
0 | 7 | SELECT | Catálogo de produtos do motor de score (aba Oportunidades e recalcularScoreCliente). |
crm_regras_score |
0 | 10 | SELECT | Regras/pontuação do motor de score usadas no Recalcular da aba Oportunidades. |
crm_scores |
2.122 | 7 | INSERT, UPDATE | Upsert (onConflict cliente_id,produto_id) do score por cliente/produto no Recalcular. |
crm_oportunidades_ia |
0 | 13 | SELECT, INSERT, UPDATE | Aba "Oportunidades IA" dentro do ClientePerfilModal aberto pelo card. |
crm_conversas_whatsapp |
2.939 | 16 | SELECT | Conversa WhatsApp mais recente do contato no WhatsAppChatDrawer aberto pelo card. |
crm_ia_analises |
1.021 | 13 | SELECT | Última análise de IA da conversa exibida no WhatsAppChatDrawer. |
apolices |
4.837 | 66 | SELECT, DELETE | Apólices do cliente na ficha (ClientePerfilModal/DocumentosTab/WhatsAppChatDrawer) e no motor de score. DELETE ao excluir apólice pela ficha. |
contratos |
0 | 27 | SELECT | Produtos já contratados considerados pelo motor de score e listados na aba Documentos da ficha. |
cliente_documentos |
53 | 13 | SELECT, DELETE | Aba Documentos da ficha do cliente aberta pelo card. |
cadastro_eventos |
1.253 | 8 | SELECT, INSERT | Trilha de auditoria do cadastro: INSERT por logCadastroEvento ao criar/editar cliente pelo card. SELECT no bloco "Histórico" da ficha. |
financeiro_lancamentos |
4.607 | 35 | SELECT, DELETE | Checagem e limpeza de lançamentos ao excluir uma apólice pela ficha do cliente (useApolices). |
Funções (RPC)
| Função | Parâmetros | Papel |
|---|---|---|
fn_crm_consultor_primeira_acao |
p_funil_id uuid | SECDEF. Agrega no banco (diário+tarefa+interação+evento) a PRIMEIRA ação do dono por card do funil aberto; só é chamada quando o filtro "Negociação iniciada" está ativo. Args: p_funil_id. |
get_liderados |
p_lider_id uuid | SECDEF. Ids dos liderados do usuário — controla quem vê os cards da equipe e popula o seletor "Visualizar leads de:". Args: p_lider_id. |
fn_add_negociacao_observador |
p_negociacao_id uuid, p_user_id uuid | SECDEF. Ao mencionar alguém (@) no diário/interação de um card, adiciona a pessoa como observadora da negociação (dá acesso). Chamada por lib/notif-mention a partir do link /crm?neg=. |
fn_add_tarefa_observador |
p_tarefa_id uuid, p_user_id uuid | SECDEF. Adiciona observador na tarefa pelo NovaTarefaModal aberto do card (idempotente, cria notificação). |
fn_add_tarefa_observador_silent |
p_tarefa_id uuid, p_user_id uuid | SECDEF. Mesma coisa, sem notificar — usada quando a menção @ acontece no diário da tarefa (link /tarefas?id=). |
fn_marcar_diario_visto |
p_tarefa_id uuid | Marca o diário da tarefa como visto (some o selo de comentário novo) na aba Diário do NovaTarefaModal aberto pelo card. |
apolice_tem_comissoes |
_apolice_id uuid | SECDEF. Pré-checagem de comissões antes de excluir uma apólice pela ficha do cliente aberta no card. |
fn_excluir_apolice_cascade |
p_apolice_id uuid, p_numero_confirmacao text, p_motivo text | SECDEF. Exclusão em cascata da apólice (com número de confirmação e motivo), disparada pela ficha do cliente. |
motor_gerar_previsao_apolice |
p_apolice_id uuid | SECDEF. Gera a previsão de receita ao salvar uma apólice pelo ApoliceWizardUnificado, alcançável em CRM › card › ficha do cliente › nova apólice. |
Edge Functions
atendeseg-ai-summary analisar-conversa-ia email-send
Arquivos (Storage)
documentos-clientes tarefas-anexos avatars apolices-documentos documentos-apolices
Tempo real
- canal "tarefas-realtime" (useTarefasRealtime, chamado direto em CRM.tsx): postgres_changes event=* em public.tarefas, public.tarefas_observadores e public.tarefas_diario — invalida ["tarefas"], ["tarefas-resumo-crm"] e ["tarefas-diario-nao-lido"]
Gestão de Leads
/gestao-leads
24 tabelas · 11 RPCs
Painel analítico dos leads de campanha (Meta Ads), com filtro de período e 6 abas liberadas individualmente por permissão: Visão Geral (KPIs, série diária, funil por etapa, campanhas, consultores), Leads (lista/kanban paginado com drill-down), Campanhas Meta, ROI (CPL/CAC/ROI cruzando gasto Meta), Engajamento SDR (funil de qualificação + fila de repesca com deep-link do AtendeSeg) e Monitor de Entrada.
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
negociacoes |
23.607 | 45 | SELECT, UPDATE, DELETE | SELECT paginado na aba Leads (useGLLista) com count exact, bordas de data em BRT (-03:00), escopo obrigatório crm_campanha_id não nulo e embeds de clientes/funis/funis_etapas/profiles/produtos. SELECT * do card ao abrir o painel (LeadPanelLoader). UPDATE e DELETE só acontecem quando o usuário edita/move/exclui o card pelo NegociacaoPanel embutido — é o mesmo painel do CRM. |
funis_etapas |
72 | 8 | SELECT | useGLEtapasOrdem lê nome/ordem/tipo para ordenar as colunas do modo Kanban nas abas Leads e Engajamento SDR; também é o embed etapa_rel (inner join quando há filtro por resultado/etapa) na lista, e alimenta o seletor de etapa do painel. |
clientes |
25.598 | 45 | SELECT | Embed cliente:clientes(nome, telefone) na lista de leads e clientes(nome, telefone) no carregamento do card; a ficha completa do cliente pode ser aberta pelo painel. |
profiles |
36 | 22 | SELECT | Embed corretor:profiles!negociacoes_corretor_id_fkey(nome) na lista; useProfiles no painel (responsável, menções, avatares). |
funis |
9 | 9 | SELECT | Embed funil:funis(nome) na lista de leads; useFunis quando o painel abre o modal de transferir funil. |
produtos |
129 | 15 | SELECT | Embed produto_rel:produtos(nome) na lista de leads e seletor de produto no painel. |
operadoras |
47 | 14 | SELECT | Embed seguradoras:operadoras(nome) no carregamento do card (LeadPanelLoader) e seletor de operadora do painel. |
negociacao_eventos |
77.537 | 7 | SELECT, INSERT | Via LeadPanelLoader → NegociacaoPanel: INSERT "abriu"/"editou" e SELECT da aba Histórico do lead. |
negociacao_transferencias |
16.132 | 8 | SELECT | Histórico de troca de dono do lead na aba Histórico do painel. |
interacoes |
2.791 | 8 | SELECT, INSERT, UPDATE | Interações do lead no painel, incluindo o registro do motivo de descarte. |
cliente_diario |
19.643 | 19 | SELECT, INSERT, UPDATE, DELETE | Diário do lead no painel (texto, anexos, fixar, editar, excluir, cotação enviada, resumo IA). |
cliente_diario_email |
107 | 8 | SELECT, INSERT | Corpo do e-mail enviado pelo painel do lead. |
cliente_telefones |
0 | 7 | SELECT | Telefones extras do contato nas opções de discagem do painel. |
cliente_pessoas |
0 | 9 | SELECT | Contatos PJ nas opções de discagem do painel. |
tarefas |
12.047 | 18 | SELECT, INSERT, UPDATE, DELETE | Aba Tarefas do painel do lead: listar por vinculo_id/cliente_id, criar, concluir, retomar e excluir. |
chamadas |
13.035 | 21 | SELECT | Ligações do lead exibidas no painel (histórico + bloco de ligações). |
origens_lead |
0 | 15 | SELECT | Catálogo de origens do seletor de origem dentro do painel do lead. |
motivos_descarte |
618 | 6 | SELECT | Motivos oferecidos ao descartar o lead pelo seletor de etapa do painel. |
email_accounts |
19 | 23 | SELECT | Conta de e-mail do usuário para o EnviarEmailModal disparado do painel do lead. |
email_quick_replies |
0 | 6 | SELECT | Modelos de e-mail no EnviarEmailModal do painel. |
crm_conversas_whatsapp |
2.939 | 16 | SELECT | Conversa WhatsApp do contato no drawer aberto pelo painel do lead. |
crm_ia_analises |
1.021 | 13 | SELECT | Última análise de IA da conversa no drawer do painel. |
notificacoes |
34.796 | 10 | INSERT | Notificação de menção (@) ao comentar no diário/interação do lead. |
apolices |
4.837 | 66 | SELECT | Apólices do contato listadas no drawer de WhatsApp/ficha alcançável pelo painel do lead. |
Funções (RPC)
| Função | Parâmetros | Papel |
|---|---|---|
fn_gl_resumo |
p_inicio date, p_fim date | KPIs do período da Visão Geral: recebidos, ganhos, perdidos, abertos, não atribuídos, parados, valor total/aberto e taxa de conversão. Args: p_inicio, p_fim. |
fn_gl_serie |
p_inicio date, p_fim date | Série de leads por dia (gráfico de área da Visão Geral). |
fn_gl_por_etapa |
p_inicio date, p_fim date | Distribuição funil/etapa/tipo — funil da Visão Geral e opções de etapa na aba Leads. |
fn_gl_por_campanha_meta |
p_inicio date, p_fim date | Métricas por campanha Meta (LEFT JOIN, campanhas com 0 leads aparecem) — aba Campanhas Meta, gráfico da Visão Geral e filtro de campanha da aba Leads. |
fn_gl_por_consultor |
p_inicio date, p_fim date | Recebidos/ganhos/perdidos/abertos e conversão por consultor — Visão Geral e filtro de consultor da aba Leads. |
fn_gl_telefone_invalido |
p_inicio date, p_fim date | Total + lista de leads com telefone inválido; usada na Visão Geral, no Monitor de Entrada e para alimentar o filtro por ids da aba Leads. |
fn_gl_roi |
p_inicio date, p_fim date | Aba ROI: cruza leads atribuídos (crm_campanha_id) com gasto Meta (meta_ad_insights) e devolve CPL, CAC e ROI por campanha. |
fn_gl_entrada |
p_inicio date, p_fim date | Aba Monitor de Entrada: total recebido e quebra por origem. |
fn_gl_sdr_por_campanha |
p_inicio date, p_fim date | Aba Engajamento SDR: funil de qualificação por campanha (contatado/sem contato, respondeu, qualificado, resp. sem qualificação, em qualificação, novo lead, avançado, descartado, fechado). |
fn_gl_leads_quentes |
p_inicio date, p_fim date | Aba Engajamento SDR: fila de repesca (leads que responderam e não foram qualificados), com ticket do AtendeSeg e horário da última mensagem recebida. |
fn_add_negociacao_observador |
p_negociacao_id uuid, p_user_id uuid | SECDEF. Mencionar alguém (@) no diário do lead pelo painel adiciona a pessoa como observadora do card. |
Edge Functions
atendeseg-ai-summary analisar-conversa-ia email-send
Arquivos (Storage)
documentos-clientes avatars tarefas-anexos
Atendimento e Telefonia2 abas
Atendimento
/atendimento
6 tabelas · 0 RPCs
Aba que embute o AtendeSEG (app.atendeseg.com.br) num iframe persistente montado globalmente em App.tsx (PersistentAtendeSEG) — a page em si e vazia. O componente ainda carrega dois modais Supabase: importar/vincular conversa de WhatsApp ao cliente do CRM e avaliacao de negociacao por IA.
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
clientes |
25.598 | 45 | SELECT, INSERT | Busca do cliente por telefone (ilike nos ultimos 4/6/8 digitos e por DDD) no modal Importar. SELECT por id (nome/telefone/email) no modal IA; busca por nome/CPF-CNPJ/telefone e INSERT do cadastro rapido dentro do ClienteAutocomplete (useCreateCliente) |
crm_conversas_whatsapp |
2.939 | 16 | SELECT, UPDATE, INSERT | Acha a conversa do cliente (por cliente_id ou por telefone ilike, ordenada por ultima_mensagem_em). UPDATE grava cliente_id ao vincular. INSERT cria conversa (status 'aberta', prioridade 'baixa') quando o cliente ainda nao tem nenhuma |
crm_mensagens_whatsapp |
37.906 | 15 | SELECT | Preview e historico completo das mensagens da conversa (conversa_id, ordenado por enviado_em) para importar; e amostra das 30 primeiras (direcao/conteudo/enviado_em) enviada para a IA no modo 'resumo' |
cliente_diario |
19.643 | 19 | INSERT | Grava o historico do WhatsApp importado como registro do diario do cliente (categoria 'whatsapp', consultor_id = usuario logado) |
negociacoes |
23.607 | 45 | SELECT, UPDATE | Localiza o card mais recente do cliente (order created_at desc, limit 1) e grava nele o telefone da conversa importada |
cadastro_eventos |
1.253 | 8 | INSERT | Auditoria best-effort 'criou cliente' disparada pelo useCreateCliente quando se cadastra um cliente novo pelo ClienteAutocomplete do modal IA (lib/cadastro-eventos.ts) |
Edge Functions
analisar-conversa-ia
Telefonia
/telefonia
6 tabelas · 4 RPCs
Central de telefonia Sonax com 4 abas internas: Painel (KPIs agregados por corretor), Chamadas (log com filtros, player de gravacao e atalho para o card), Receptivo (define o ramal que recebe, transferencia automatica e disponibilidade da equipe) e Ramais (CRUD de ramais internos, membros e token do webphone). O softphone WebRTC (SonaxWebphone/DiscadorHeader/CallWidget) fica montado no AppLayout e alimenta a mesma base.
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
chamadas |
13.035 | 21 | SELECT | Log de ligacoes — ChamadasTab (filtros corretor/direcao/status/periodo/duracao/numero, limit 500, embed cliente:clientes e corretor:profiles!chamadas_corretor_id_fkey), historico do discador no header (limit 15) e ligacoes por cliente (useChamadasCliente). Tambem e a tabela assinada em realtime |
telefonia_ramais |
17 | 13 | SELECT, INSERT, UPDATE, DELETE | CRUD dos ramais na aba Ramais (upsert onConflict corretora_id,ramal, incluindo webphone_data/nome_exibicao/ativo/observacao e DELETE por id). SELECT tambem alimenta o seletor do receptivo. UPDATE isolado de eh_receptivo (desmarca todos da corretora e marca um) e de auto_transfer na aba Receptivo. SELECT via join para descobrir o ramal do usuario logado (useMeuRamal) |
telefonia_ramal_membros |
19 | 4 | SELECT, INSERT, DELETE | Vinculo consultor<->ramal: SELECT embutido em telefonia_ramais (membros + profiles), SELECT por profile_id para achar o ramal do usuario logado; ao salvar um ramal apaga os membros dele, apaga os selecionados de outros ramais e insere os novos |
profiles |
36 | 22 | SELECT | Lista de usuarios ativos (id, nome, perfil) para os filtros do Painel/Chamadas e para escolher os membros do ramal; embed de nome/foto_path nos membros e do corretor no log; e leitura de corretora_id no helper de storage quando o cache esta vazio (assinatura da gravacao) |
clientes |
25.598 | 45 | SELECT | Embed cliente:clientes(id,nome) no SELECT das chamadas, para mostrar o nome do cliente no log e no historico do discador |
negociacoes |
23.607 | 45 | SELECT | Botao 'Card' do log: resolve o card mais recente do cliente da ligacao (order created_at desc, limit 1) para abrir no ItemOpener; se nao houver, abre o proprio contato |
Funções (RPC)
| Função | Parâmetros | Papel |
|---|---|---|
telefonia_stats |
p_desde timestamp with time zone, p_ate timestamp with time zone DEFAULT NULL::timestamp with time zone, p_min_duracao integer DEFAULT 0 | Agrega no servidor os KPIs do Painel por corretor no periodo (p_desde/p_ate/p_min_duracao): total, atendidas, saida, entrada e duracao — evita baixar milhares de chamadas no browser |
telefonia_ramais_status |
— | Lista ramais (id/ramal/nome/online) legivel por qualquer autenticado; alimenta o painel de transferencia do CallWidget e a escolha do proximo destino na transferencia automatica (refetch 20s) |
receptivo_agentes_status |
— | Equipe do receptivo com disponibilidade calculada no servidor (online/ultima_atividade) exibida na aba Receptivo; refetch a cada 15s |
get_webphone_client_id |
— |
Arquivos (Storage)
gravacoes
Tempo real
- Canal 'telefonia-chamadas' — postgres_changes event '*' em public.chamadas (useChamadasRealtimeEffect, chamado uma vez em Telefonia.tsx); ao receber evento invalida as queries ['chamadas'] e ['telefonia_stats']
Cadastro7 abas
Cadastro › Apólices
/cadastro?tab=apolices (deep-links: /cadastro?tab=apolices&apolice=<id>, ?vencendo=<dias>, ?vencendo7d=1)
23 tabelas · 6 RPCs
Lista as apólices com paginação/filtros server-side (situação, status, operadora, vencimento em N dias, auditoria), drawer de detalhe com valores, parcelas geradas, origem (proposta/cotação), coberturas, documentos e histórico. Permite criar/editar/completar pelo ApoliceWizardUnificado, cancelar, excluir em cascata (soft delete via RPC), desfazer emissão (super admin), ver parcelas e importar apólice por PDF (individual, com bifurcação saúde/seguros, e em lote).
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
apolices |
4.837 | 66 | SELECT, INSERT, UPDATE, DELETE | Lista paginada (useApolicesPaginado com SELECT_APOLICE_LIST, is deleted_at null, count exact, filtros situacao/status/operadora_id/vigencia_fim/created_by/created_at e busca por numero ou ids de cliente). SELECT_APOLICE_FULL por id ao abrir o detalhe e no fallback do deep-link. INSERT pelo wizard (useCreateApoliceComissao) e pelo ImportApolicePDFModal (com dedup por cliente_id+numero e 'cura' das colunas de parcela). UPDATE do wizard (editar/completar) e dos opcionais pós-criação (forma_pagamento, coberturas, mensalidade, documento_*). UPDATE {status:'cancelada'} no cancelamento. DELETE direto no caminho legado useDeleteApolice; exclusão principal é soft-delete via RPC de cascade. |
apolice_vendedores |
4.275 | 10 | SELECT, INSERT, DELETE | Rateio de vendedores: lido no join do detalhe; recriado (delete + insert) a cada save do wizard; contagem (count head) + insert fill-if-empty de 100% no ImportApolicePDFModal; contagem de vínculos no ExclusaoSeguraDialog. |
apolice_vidas |
68 | 21 | SELECT, INSERT | Vidas do plano de saúde (titular + dependentes/agregados) extraídas do PDF pelo ImportApolicePDFModal. Faz count exact head para não duplicar em re-import e insere as linhas normalizando o vínculo (titular/dependente/agregado/beneficiario/conjuge/filho/filha/outros) e o CPF. |
apolice_documentos |
1.007 | 13 | SELECT | Anexos multi-documento da apólice (id, nome, tipo, url, tamanho) exibidos no bloco Documentos do drawer; se vazio, cai no campo único apolices.documento_url. |
parcelas_cliente |
43.612 | 16 | SELECT, INSERT | Parcelas do cliente exibidas inline no detalhe (numero, valor, data_vencimento, status, is deleted_at null) e no ParcelasDrawer. INSERT das parcelas geradas pelo wizard (criar e completar) e das 12 mensalidades do import de saúde; contagem de vínculos no dialog de exclusão. |
comissoes_a_receber |
27.686 | 21 | SELECT | Guard de idempotência antes de chamar o motor de previsão (só chama se não existir previsão para a apólice) e contagem de vínculos no dialog de exclusão. |
comissoes |
0 | 10 | SELECT | Contagem de vínculos legado ('comissão(ões) (legado)') no ExclusaoSeguraDialog. |
financeiro_lancamentos |
4.607 | 35 | SELECT, UPDATE, DELETE | Contagem de lançamentos liquidados (filtro status='pago') no dialog de exclusão; no caminho legado useDeleteApolice, DELETE dos lançamentos 'previsto'/'em_atraso' e UPDATE {apolice_id:null} nos 'pago'/'recebido'/'parcial'. |
clientes |
25.598 | 45 | SELECT, INSERT, UPDATE | Join do nome na lista/detalhe; resolução de ids pela busca por nome. ClienteAutocomplete do wizard. SELECT por cpf_cnpj + INSERT/UPDATE (fill-if-empty + promoção a tipo_cadastro='cliente') no ImportApolicePDFModal. |
operadoras |
47 | 14 | SELECT | useSeguradoras alimenta o filtro 'Operadora'; join seguradoras:operadoras(nome) na lista/detalhe; select do wizard e do import de saúde. |
produtos |
129 | 15 | SELECT | Join produtos(...) na lista/detalhe; catálogo do wizard por operadora; match do produto no ImportApolicePDFModal. |
categorias_produto |
0 | 15 | SELECT | Join aninhado (nome, base_calculo_default) — discrimina seguro x plano de saúde e define a base de comissão exibida. |
tipos_produto |
618 | 10 | SELECT | Join aninhado tipo_produto:tipos_produto(slug, nome) — slug é o discriminador primário usado pelo wizard ('seguro' vs plano). |
regras_comissionamento |
45 | 17 | SELECT | Join regras_comissionamento(nome, total_comissao_pct) no detalhe; regra vigente do produto no RegraDoProdutoBloco; regra usada para vincular produto_id no import de saúde. |
eventos_recebimento |
117 | 21 | SELECT | Eventos da regra vigente para o preview de comissão do wizard. |
origens_lead |
0 | 15 | SELECT | Join origens_lead(nome) no SELECT_APOLICE_FULL do detalhe. |
origens_apolice |
0 | 9 | SELECT | useOrigensApolice alimenta o select 'Origem da apólice' no ApoliceWizardUnificado. |
vendedores |
285 | 46 | SELECT | Join apolice_vendedores→vendedores(nome) no detalhe; select de rateio do wizard (ativo=true); select do ImportApolicePDFModal (com usuario_id para pré-selecionar quem importa). |
propostas |
60 | 46 | SELECT | Join propostas!apolices_proposta_id_fkey(id, numero_proposta, cotacao_origem_id, data_emissao) no detalhe — bloco 'Originada da Proposta' e link para a cotação original. |
cadastro_eventos |
1.253 | 8 | SELECT, INSERT | Auditoria com entidade_tipo='apolice': INSERT 'criou' (useCreateApoliceComissao), 'editou' (wizard) e 'abriu' (ao abrir o drawer). SELECT alimenta o Histórico no rodapé do drawer. |
profiles |
36 | 22 | SELECT | Join profiles!apolices_corretor_id_fkey(nome) no detalhe; filtro 'Cadastrado por'; nomes no Histórico de auditoria. |
cliente_documentos |
53 | 13 | INSERT | Quando o PDF importado é de SEGUROS, o fluxo é repassado ao ImportPDFModal, que registra o arquivo como documento do cliente (tipo 'Apólice'). |
cliente_diario |
19.643 | 19 | INSERT | Registro automático da importação no diário do cliente, no hand-off para o ImportPDFModal. |
Funções (RPC)
| Função | Parâmetros | Papel |
|---|---|---|
fn_excluir_apolice_cascade |
p_apolice_id uuid, p_numero_confirmacao text, p_motivo text | Exige numero_confirmacao e motivo. |
apolice_tem_comissoes |
_apolice_id uuid | Usada pelo caminho legado useDeleteApolice para impedir hard delete de apólice que já gerou comissões. |
motor_gerar_previsao_apolice |
p_apolice_id uuid | Gera a previsão de receita da apólice (best-effort): chamada após criar a apólice pelo wizard, no modo 'completar' (com guard de idempotência) e após gerar as mensalidades no ImportApolicePDFModal. |
get_effective_corretora_id |
— | ImportApolicePDFModal resolve a corretora_id no client porque apolices.corretora_id é NOT NULL e não tem trigger de preenchimento nesse caminho. |
desfazer_emissao_proposta |
p_proposta_id uuid, p_motivo text | Botão 'Desfazer Emissão' do drawer (super admin): apaga a apólice e as parcelas e devolve a proposta para 'Assinada'. |
converter_proposta_em_apolice |
p_proposta_id uuid, p_numero_apolice text, p_data_emissao date | Usada indiretamente quando o PDF importado é de apólice de SEGUROS e o fluxo é repassado ao ImportPDFModal, que cria a proposta-sombra e converte. |
Edge Functions
extrair-documento-seguros (só no ramo SEGUROS: ImportApolicePDFModal repassa ao ImportPDFModal, e o ImportPDFBatchModal chama direto para o lote). O ramo SAÚDE do ImportApolicePDFModal extrai 100% no navegador via lib/extratorPdfLocal.ts, sem edge function e sem IA.
Arquivos (Storage)
apolices-documentos (upload do PDF no ApoliceWizardUnificado em `{corretora_id}/{apolice_id}/{timestamp}_{nome}` e download/abrir dos anexos de apolice_documentos via downloadAndOpenFile) documentos-clientes (usado no hand-off para o ImportPDFModal, que grava o PDF importado como documento do cliente)
Tempo real
- cadastro-realtime (herdado do shell: invalida ['apolices'] a cada mudança na tabela apolices)
Cadastro › Clientes
/cadastro?tab=clientes (deep-link do item: /cadastro?tab=clientes&cliente=<id>)
42 tabelas · 8 RPCs
Lista os clientes efetivados (`clientes` com tipo_cadastro='cliente') com paginação/busca/filtros server-side, cadastro completo (com Perfil de Vida), importação CSV, exportação CSV/PDF, importação de proposta por PDF e exclusão segura em cascata. A linha abre o ClientePerfilModal (dados, contatos extras, documentos, apólices, negociações, oportunidades IA, diário, histórico, tarefas, ligações).
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
clientes |
25.598 | 45 | SELECT, INSERT, UPDATE | Lista paginada (useClientesPaginado com tipo_cadastro='cliente'). SELECT por id no fallback do deep-link. INSERT/UPDATE do NovoClienteModal. UPDATE {ativo} em inativar/reativar. SELECT completo no ExportModal (com filtros de status e período). INSERT linha a linha no ImportCSVModal. SELECT por cpf_cnpj + UPDATE de cura (fill-if-empty + promoção a tipo_cadastro='cliente') no ImportPDFModal. SELECT no ClienteAutocomplete. |
cliente_telefones |
0 | 7 | SELECT, INSERT, UPDATE, DELETE | Telefones adicionais do cliente PF (delete+insert no modal de cadastro. CRUD por linha no bloco Contatos do perfil). |
cliente_pessoas |
0 | 9 | SELECT, INSERT, UPDATE, DELETE | Pessoas vinculadas ao CNPJ do cliente PJ (mesmo padrão). |
cadastro_eventos |
1.253 | 8 | SELECT, INSERT | Auditoria: INSERT de 'criou'/'editou'/'abriu' com entidade_tipo='cliente'. SELECT alimenta a seção Histórico (só liderança). |
cliente_documentos |
53 | 13 | SELECT, INSERT, DELETE | Aba Documentos do perfil (lista e exclui). INSERT do PDF importado pelo ImportPDFModal (tipo 'Proposta' ou 'Apólice', url = path do storage, origem='importacao_pdf'). |
exportacoes_log |
0 | 8 | INSERT | Registro de auditoria de cada exportação (tipo csv/pdf, campos_exportados, total_registros, filtros_aplicados) no ExportModal. |
origens_lead |
0 | 15 | SELECT | Catálogo de origens no filtro e no select do formulário; e origem_lead_id do ImportPDFModal. |
profiles |
36 | 22 | SELECT | Filtro 'Cadastrado por', select 'Corretor' do ExportModal, nomes na auditoria e menções @ do Diário. |
apolices |
4.837 | 66 | SELECT, DELETE | Contagem de vínculos na exclusão; aba Apólices do perfil; aba Documentos (documento_url das apólices). DELETE pelo botão de lixeira da aba (admin); leitura de produtos vigentes pelo scoring-engine. |
contratos |
0 | 27 | SELECT, UPDATE | Contagem de vínculos na exclusão; aba Documentos (documento_url). UPDATE limpando documento_url/nome/tamanho ao excluir o anexo; leitura no scoring-engine. |
cotacoes |
0 | 16 | SELECT | Contagem de vínculos no ExclusaoSeguraDialog. |
propostas |
60 | 46 | SELECT, INSERT | Contagem de vínculos na exclusão. SELECT por numero_proposta (dedupe) e INSERT da proposta no ImportPDFModal (com migrado_de_legado=true quando o PDF é de apólice já emitida). |
proposta_vendedores |
19 | 10 | INSERT | Rateio 100% do vendedor detectado no PDF, gravado junto com a proposta criada pelo import. |
financeiro_lancamentos |
4.607 | 35 | SELECT | Contagem de vínculos no ExclusaoSeguraDialog do cliente. |
negociacoes |
23.607 | 45 | SELECT, INSERT | Contagem de vínculos; aba Negociações do perfil. INSERT pela conversão de oportunidade IA e pelo NovaNegociacaoModal. |
tarefas |
12.047 | 18 | SELECT, INSERT, UPDATE | Contagem de vínculos; aba Tarefas do perfil. INSERT da tarefa 'Acompanhar emissão' criada pelo ImportPDFModal e da tarefa manual do perfil. UPDATE {status} no checkbox. |
cliente_diario |
19.643 | 19 | SELECT, INSERT, UPDATE, DELETE | Contagem de vínculos; aba Diário do perfil (CRUD + fixar). INSERT automático 'Proposta importada via PDF...' pelo ImportPDFModal. |
crm_oportunidades |
0 | 11 | SELECT, INSERT | Banner de oportunidades no topo do perfil e geração pelo scoring-engine. |
crm_produtos |
0 | 7 | SELECT | Catálogo do motor de score e do contexto da IA. |
crm_regras_score |
0 | 10 | SELECT | Regras ativas do motor de score. |
crm_scores |
2.122 | 7 | SELECT, INSERT, UPDATE | Upsert do score por produto ao salvar o cadastro. SELECT no contexto da análise de IA. |
crm_oportunidades_ia |
0 | 13 | SELECT, INSERT, UPDATE, DELETE | Aba Oportunidades (IA) do perfil: listar ativas, substituir por nova análise, descartar, converter. |
notificacoes |
34.796 | 10 | INSERT | Notificações de menção @ nos comentários do Diário. |
tarefas_observadores |
8.129 | 5 | SELECT | Observadores exibidos/criados na tarefa aberta pelo perfil. |
tarefas_anexos |
13.589 | 11 | SELECT, INSERT, DELETE | Anexos da tarefa criada pelo NovaTarefaModal do perfil. |
tarefa_modelos |
16 | 13 | SELECT | Modelos oferecidos no NovaTarefaModal. |
funis |
9 | 9 | SELECT | NovaNegociacaoModal aberto pelo perfil. |
funis_etapas |
72 | 8 | SELECT | Etapas do funil no NovaNegociacaoModal. |
chamadas |
13.035 | 21 | SELECT | Aba Ligações do perfil do cliente. |
crm_conversas_whatsapp |
2.939 | 16 | SELECT | WhatsAppChatDrawer aberto pelo botão WhatsApp. |
crm_ia_analises |
1.021 | 13 | SELECT | Análises salvas da conversa no WhatsAppChatDrawer. |
vendedores |
285 | 46 | SELECT | Select de vendedores no ImportPDFModal (useVendedoresAtivos) e no ApoliceWizardUnificado aberto pelo perfil. |
produtos |
129 | 15 | SELECT | useProdutosComDetalhes no ImportPDFModal (produto + regra + eventos) e catálogo do wizard de apólice. |
operadoras |
47 | 14 | SELECT | Operadora do produto no import de PDF e no wizard de apólice. |
categorias_produto |
0 | 15 | SELECT | Discriminador seguro x plano (base_calculo_default / tipo_produto) no wizard. |
tipos_produto |
618 | 10 | SELECT | Join aninhado no select de apólices/produtos (slug do tipo declarado). |
regras_comissionamento |
45 | 17 | SELECT | Regra vigente do produto no import de PDF e no RegraDoProdutoBloco do wizard. |
eventos_recebimento |
117 | 21 | SELECT | Eventos da regra usados no preview de comissão. |
origens_apolice |
0 | 9 | SELECT | Catálogo de origem no wizard de apólice aberto do perfil. |
apolice_vendedores |
4.275 | 10 | INSERT, DELETE | Rateio de vendedores da apólice criada pelo wizard aberto no perfil. |
parcelas_cliente |
43.612 | 16 | SELECT, INSERT | Parcelas geradas pelo wizard de apólice; também criadas pela RPC de conversão disparada no import de apólice por PDF. |
comissoes_a_receber |
27.686 | 21 | SELECT | Guard de idempotência antes de gerar a previsão no wizard. |
Funções (RPC)
| Função | Parâmetros | Papel |
|---|---|---|
fn_delete_cliente_cascade |
p_cliente_id uuid, p_nome_confirmacao text, p_motivo text DEFAULT NULL::text | |
fn_contar_filhas_cliente |
p_cliente_id uuid | Contadores das filhas usados no dialog de exclusão. |
converter_proposta_em_apolice |
p_proposta_id uuid, p_numero_apolice text, p_data_emissao date | Chamada pelo ImportPDFModal quando o PDF importado é de APÓLICE já emitida: cria apolices + apolice_vendedores + parcelas_cliente e muda a proposta-sombra para 'emitida'. |
motor_gerar_previsao_apolice |
p_apolice_id uuid | Best-effort após criar apólice pelo wizard aberto no perfil do cliente. |
fn_add_tarefa_observador |
p_tarefa_id uuid, p_user_id uuid | Observador da tarefa criada pelo perfil. |
fn_add_tarefa_observador_silent |
p_tarefa_id uuid, p_user_id uuid | Observador silencioso do mencionado com @ quando o link é de tarefa. |
fn_add_negociacao_observador |
p_negociacao_id uuid, p_user_id uuid | Observador silencioso do mencionado com @ quando o link é de card do CRM. |
eh_lider |
— | UI condicional de tarefas de liderados (useTarefas). |
Edge Functions
extrair-documento-seguros (ImportPDFModal — extração do PDF de proposta/apólice de seguros, com Idempotency-Key derivada do sha256 do arquivo) analisar-conversa-ia (aba Oportunidades IA do perfil e análise da conversa no WhatsAppChatDrawer) atendeseg-ai-summary (resumo da conversa no WhatsAppChatDrawer)
Arquivos (Storage)
documentos-clientes (upload do PDF importado via uploadFile com prefixo {corretora_id}/ e download/abrir/delete pela aba Documentos) apolices-documentos (documentos de apólice na aba Documentos e upload do wizard de apólice) documentos-apolices (bucket legado para documentos vindos de contratos) gravacoes (getSignedUrl das gravações na aba Ligações)
Tempo real
- cadastro-realtime (herdado do shell: invalida ['clientes'] a cada mudança na tabela clientes)
Cadastro › Cotações
/cadastro?tab=cotacoes (deep-link do item: /cadastro?tab=cotacoes&cotacao=<id>)
13 tabelas · 0 RPCs
Lista e gerencia as cotações (fase pré-proposta) com paginação/filtros server-side, wizard de criação/edição com upload do PDF de multicálculo, cancelamento com motivo, exclusão lógica (deleted_at) e conversão em Proposta abrindo o PropostaWizardUnificado com cotacaoOrigemId.
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
cotacoes |
0 | 16 | SELECT, INSERT, UPDATE | Lista paginada (useCotacoesPaginado, joins clientes(nome) e vendedores(nome), is deleted_at null, count exact, filtros status/vendedor_id/created_by/created_at e busca resolvida por ids de cliente). SELECT por id no fallback do deep-link e no useCotacaoParaConverter. INSERT no CotacaoWizard (status 'em_andamento') seguido de UPDATE {pdf_multicalculo_url}. UPDATE de cancelamento (status='cancelada', data_cancelamento, motivo_cancelamento). UPDATE {deleted_at} na exclusão (soft delete). UPDATE (status='convertida_em_proposta', proposta_id, data_conversao) em marcarCotacaoConvertida. |
clientes |
25.598 | 45 | SELECT | Join do nome na listagem; resolução de ids pelo termo de busca (ilike nome, limit 1000). ClienteAutocomplete do wizard (busca por nome/cpf_cnpj/telefone). |
vendedores |
285 | 46 | SELECT | useVendedoresAtivos (ativo=true, deleted_at null) alimenta o filtro 'Vendedor' e o select 'Vendedor responsável' do CotacaoWizard; e o select de rateio do PropostaWizardUnificado. |
profiles |
36 | 22 | SELECT | resolveCorretoraId (corretora_id do usuário logado) antes do upload do PDF; filtro 'Cadastrado por'; nomes no Histórico de auditoria. |
cadastro_eventos |
1.253 | 8 | SELECT, INSERT | Auditoria com entidade_tipo='cotacao': INSERT de 'criou'/'editou' (hooks) e 'abriu' (drawer de detalhe). SELECT alimenta a seção Histórico do drawer. |
propostas |
60 | 46 | SELECT, INSERT, UPDATE | PropostaWizardUnificado aberto pela conversão: INSERT da proposta com cotacao_origem_id. UPDATE {documento_url, documento_nome} após o upload do PDF. SELECT (useProposta) quando o wizard abre em modo editar. |
proposta_vendedores |
19 | 10 | INSERT, DELETE | Rateio de vendedores gravado/recriado pelo PropostaWizardUnificado na conversão. |
produtos |
129 | 15 | SELECT | Catálogo de produtos do PropostaWizardUnificado (filtrado por operadora). |
operadoras |
47 | 14 | SELECT | Select de operadora do PropostaWizardUnificado. |
categorias_produto |
0 | 15 | SELECT | Categoria/base de cálculo usada para bifurcar Seguros x Saúde no wizard de proposta. |
regras_comissionamento |
45 | 17 | SELECT | Regra vigente do produto no RegraDoProdutoBloco do wizard de proposta. |
eventos_recebimento |
117 | 21 | SELECT | Eventos da regra vigente para o preview de comissão no wizard de proposta. |
origens_lead |
0 | 15 | SELECT | Select de origem do lead no PropostaWizardUnificado. |
Arquivos (Storage)
cotacoes-multicalculo (upload do PDF de multicálculo em `{corretora_id}/{cotacao_id}-{timestamp}.{ext}`, createSignedUrl de 10 min para abrir e remove ao trocar/remover o arquivo) propostas-documentos (upload do PDF quando a cotação é convertida em proposta pelo PropostaWizardUnificado)
Tempo real
- cadastro-realtime (herdado do shell: invalida ['cotacoes'] a cada mudança na tabela cotacoes)
Cadastro › Propostas
/cadastro?tab=propostas (deep-link do item: /cadastro?tab=propostas&proposta=<id>)
18 tabelas · 2 RPCs
Lista as propostas com KPIs, paginação/filtros server-side e drawer de detalhe. Permite criar/editar/completar pelo PropostaWizardUnificado, alterar status pelo fluxo de transições válidas, cancelar com motivo, excluir logicamente, importar proposta ou apólice por PDF (individual e em lote) e converter a proposta em apólice (com desfazer para super admin).
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
propostas |
60 | 46 | SELECT, INSERT, UPDATE | Lista paginada (usePropostasPaginado com SELECT_PROPOSTA_FULL, is deleted_at null, or(migrado_de_legado.eq.false,migrado_de_legado.is.null) que esconde as propostas-sombra do import de apólice, count exact, filtros status/produto por operadora/created_by/created_at); usePropostasStats para os KPIs e o dropdown de operadoras. SELECT por id no fallback do deep-link e no useProposta. INSERT no wizard e no ImportPDFModal. UPDATE de edição, de alteração de status (com data_envio_cliente/data_assinatura_cliente/data_pendencia/data_cancelamento e motivos), de cancelamento, de {deleted_at} na exclusão e de {documento_url, documento_nome} após upload; count head para gerar o próximo número PRO-xxxxx. |
proposta_vendedores |
19 | 10 | SELECT, INSERT, DELETE | Rateio de vendedores: lido no join do SELECT_PROPOSTA_FULL, recriado (delete + insert) a cada update do wizard, inserido no create. |
clientes |
25.598 | 45 | SELECT, INSERT, UPDATE | Join do nome; resolução de ids pela busca (ilike nome). ClienteAutocomplete do wizard. SELECT por cpf_cnpj + INSERT/UPDATE de cura e promoção a tipo_cadastro='cliente' no ImportPDFModal. |
produtos |
129 | 15 | SELECT | Filtro por operadora (resolve produto_id), catálogo do wizard e useProdutosComDetalhes (produto + regra + eventos) no ImportPDFModal. |
operadoras |
47 | 14 | SELECT | Join no produto para exibir/filtrar operadora; select do wizard. |
categorias_produto |
0 | 15 | SELECT | Categoria do produto — discrimina Seguros x Saúde no drawer e no wizard (isCategoriaSeguros/isCategoriaSaude). |
regras_comissionamento |
45 | 17 | SELECT | Regra vigente do produto no RegraDoProdutoBloco e no bloqueio pré-emissão (produto sem regra vigente não converte em apólice). |
eventos_recebimento |
117 | 21 | SELECT | Eventos da regra no preview de comissão e no bloqueio pré-emissão (count exact head: regra sem eventos não converte). |
origens_lead |
0 | 15 | SELECT | Join origens_lead(nome) no detalhe e select de origem no wizard/import. |
vendedores |
285 | 46 | SELECT | Select de vendedores do wizard (ativo=true) e do ImportPDFModal. |
cadastro_eventos |
1.253 | 8 | SELECT, INSERT | Auditoria com entidade_tipo='proposta': INSERT 'criou'/'editou' nos hooks e 'abriu' no PropostaDetalhesDrawer. SELECT alimenta o Histórico no drawer. |
profiles |
36 | 22 | SELECT | Filtro 'Cadastrado por' e nomes no Histórico de auditoria. |
cliente_documentos |
53 | 13 | INSERT | ImportPDFModal registra o PDF importado como documento do cliente (tipo 'Proposta' ou 'Apólice', url = path do storage). |
cliente_diario |
19.643 | 19 | INSERT | ImportPDFModal grava um registro 'Anotação Interna' no diário do cliente descrevendo a importação. |
tarefas |
12.047 | 18 | INSERT | ImportPDFModal cria a tarefa 'Acompanhar emissão' (prazo +7 dias, vinculo_tipo='proposta') quando o import é de PROPOSTA. |
apolices |
4.837 | 66 | INSERT (via RPC) | Criada pela RPC converter_proposta_em_apolice quando a proposta é emitida (pelo drawer ou pelo import de PDF de apólice). |
apolice_vendedores |
4.275 | 10 | INSERT (via RPC) | Rateio copiado da proposta pela RPC de conversão. |
parcelas_cliente |
43.612 | 16 | INSERT (via RPC) | Parcelas geradas pela RPC de conversão (a UI só invalida a query ['parcelas_cliente']). |
Funções (RPC)
| Função | Parâmetros | Papel |
|---|---|---|
converter_proposta_em_apolice |
p_proposta_id uuid, p_numero_apolice text, p_data_emissao date | Emite a apólice a partir da proposta (p_proposta_id, p_numero_apolice, p_data_emissao). Cria apólice, rateio e parcelas e move a proposta para 'emitida'. Usada no botão 'Converter em Apólice' do drawer e no import de PDF de apólice. |
desfazer_emissao_proposta |
p_proposta_id uuid, p_motivo text | Só super admin: soft-delete da apólice + parcelas e volta a proposta para 'Assinada'. Exige motivo (>=10 chars) e digitar DESFAZER. |
Edge Functions
extrair-documento-seguros (ImportPDFModal e ImportPDFBatchModal — extração dos dados do PDF de proposta/apólice; body com pdf_base64 + nome_arquivo + tipo_documento e header Idempotency-Key com cache por sha256+tipo)
Arquivos (Storage)
propostas-documentos (upload do PDF anexado no PropostaWizardUnificado, path `{corretora_id}/{proposta_id}/{timestamp}_{nome}`) documentos-clientes (upload do PDF importado pelo ImportPDFModal via uploadFile, que já prefixa {corretora_id}/ e sanitiza o nome)
Tempo real
- cadastro-realtime (herdado do shell: invalida ['propostas'] a cada mudança na tabela propostas)
Cadastro › Prospects
/cadastro?tab=prospects (deep-link do item: /cadastro?tab=prospects&cliente=<id>)
38 tabelas · 8 RPCs
Lista os pré-clientes (mesma tabela `clientes` filtrada por tipo_cadastro='prospect') com paginação e busca server-side, filtros de status/origem/auditoria, cadastro simplificado (NovoClienteModal em modo prospect), promoção manual a cliente via RPC e exclusão segura em cascata. Clicar na linha abre o ClientePerfilModal completo (diário, documentos, apólices, negociações, tarefas, ligações, oportunidades IA, histórico de auditoria).
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
clientes |
25.598 | 45 | SELECT, INSERT, UPDATE | Fonte da lista (useClientesPaginado com tipo_cadastro='prospect', count exact, or(nome.ilike,cpf_cnpj.ilike), filtros ativo/origem/created_by/created_at, range). SELECT por id como fallback do deep-link ?cliente=. INSERT/UPDATE pelo NovoClienteModal. UPDATE {ativo:false/true} em inativar/reativar. Exclusão é feita pela RPC de cascade, não por DELETE direto. |
cliente_telefones |
0 | 7 | SELECT, INSERT, UPDATE, DELETE | Telefones ADICIONAIS de prospect PF. NovoClienteModal faz delete+insert (sync replace); o bloco ContatosSection do ClientePerfilModal faz CRUD linha a linha. clientes.telefone continua sendo o principal. |
cliente_pessoas |
0 | 9 | SELECT, INSERT, UPDATE, DELETE | Pessoas de contato vinculadas ao CNPJ (prospect PJ). Mesmo padrão delete+insert no modal e CRUD por linha no perfil. |
cadastro_eventos |
1.253 | 8 | SELECT, INSERT | Auditoria do cadastro. INSERT best-effort de 'criou'/'editou' (useCreateCliente/useUpdateCliente) e 'abriu' (ClientePerfilModal). SELECT (últimos 100, por entidade_tipo='cliente') alimenta a seção Histórico, visível só para liderança. |
origens_lead |
0 | 15 | SELECT | Catálogo unificado de origens (useOrigensLead via useOrigensLeadNomes) que preenche o filtro 'Origem' e o select 'Origem do lead' do formulário. |
profiles |
36 | 22 | SELECT | Lista de usuários da corretora para o filtro 'Cadastrado por' (FiltrosAuditCadastro), para resolver nomes no Histórico de auditoria e para o autocomplete de menção @ no Diário. |
cotacoes |
0 | 16 | SELECT | Contagem de vínculos (select id, count exact, head) no ExclusaoSeguraDialog antes de excluir o prospect. |
propostas |
60 | 46 | SELECT | Contagem de vínculos no ExclusaoSeguraDialog. |
negociacoes |
23.607 | 45 | SELECT, INSERT | Contagem de vínculos na exclusão; lista de negociações do prospect na aba Negociações do perfil (useNegociacoes). INSERT ao clicar 'Criar negociação' numa oportunidade da aba Oportunidades IA e pelo NovaNegociacaoModal. |
tarefas |
12.047 | 18 | SELECT, INSERT, UPDATE | Contagem de vínculos na exclusão; aba Tarefas do perfil (useTarefas com joins de responsavel/criado_por/cliente/observadores). INSERT via useCreateTarefa (NovaTarefaModal pré-vinculado ao contato). UPDATE {status} ao marcar/desmarcar concluída. |
cliente_diario |
19.643 | 19 | SELECT, INSERT, UPDATE, DELETE | Contagem de vínculos na exclusão; aba Diário (useClienteDiario filtrando negociacao_id is null, com joins consultor/editor/fixador em profiles). INSERT de novo registro. UPDATE {fixado, fixado_em} ao fixar/desafixar. DELETE do registro. |
apolices |
4.837 | 66 | SELECT, DELETE | Aba Apólices do perfil (useApolices carrega todas com joins pesados e filtra por cliente_id no client). DELETE direto pela lixeira da aba quando o usuário é Administrador. |
contratos |
0 | 27 | SELECT | Aba Documentos do perfil (documentos vindos de contratos) e leitura de produtos contratados pelo scoring-engine. |
cliente_documentos |
53 | 13 | SELECT, DELETE | Aba Documentos do perfil: lista os anexos do contato e exclui (linha + arquivo no storage). |
crm_oportunidades |
0 | 11 | SELECT, INSERT | Banner de oportunidades no topo do perfil (status='aberta' e score>=60, join crm_produtos). INSERT gerado pelo scoring-engine ao salvar o cadastro (score >= 50). |
crm_produtos |
0 | 7 | SELECT | Catálogo de produtos do motor de score e do contexto enviado à IA de Oportunidades. |
crm_regras_score |
0 | 10 | SELECT | Regras (ativo=true) do motor de score, com join no produto. |
crm_scores |
2.122 | 7 | SELECT, INSERT, UPDATE | Score por produto do contato. Upsert (onConflict cliente_id,produto_id) do recalcularScoreCliente disparado ao salvar o cadastro. SELECT alimenta o contexto da IA. |
crm_oportunidades_ia |
0 | 13 | SELECT, INSERT, UPDATE, DELETE | Aba Oportunidades (IA) do perfil: lista as 'ativa', apaga as anteriores e insere o resultado da análise, marca 'descartada' ou 'convertida' (com negociacao_id). |
notificacoes |
34.796 | 10 | INSERT | Notificação 'X te mencionou' para cada usuário marcado com @ num registro do Diário (notificarMencionados). |
tarefas_observadores |
8.129 | 5 | SELECT, INSERT | Observadores da tarefa criada pelo perfil do contato (useTarefaObservadores lê; a escrita passa pela RPC fn_add_tarefa_observador). |
tarefas_anexos |
13.589 | 11 | SELECT, INSERT, DELETE | Anexos da tarefa criada pelo NovaTarefaModal aberto de dentro do perfil. |
tarefa_modelos |
16 | 13 | SELECT | Modelos de tarefa oferecidos pelo NovaTarefaModal. |
funis |
9 | 9 | SELECT | NovaNegociacaoModal (aberto do perfil) lista os funis disponíveis. |
funis_etapas |
72 | 8 | SELECT | NovaNegociacaoModal carrega as etapas do funil escolhido. |
chamadas |
13.035 | 21 | SELECT | Aba Ligações do perfil (useChamadasCliente, join cliente/corretor). |
crm_conversas_whatsapp |
2.939 | 16 | SELECT | WhatsAppChatDrawer aberto pelo botão WhatsApp na aba Dados. |
crm_ia_analises |
1.021 | 13 | SELECT | Análises de IA já salvas para a conversa exibida no WhatsAppChatDrawer. |
vendedores |
285 | 46 | SELECT | Select de vendedores do ApoliceWizardUnificado, aberto pelo botão 'Nova Apólice' da aba Apólices do perfil. |
produtos |
129 | 15 | SELECT | ApoliceWizardUnificado (aberto do perfil): catálogo de produtos por operadora. |
operadoras |
47 | 14 | SELECT | ApoliceWizardUnificado (aberto do perfil): select de operadora. |
categorias_produto |
0 | 15 | SELECT | ApoliceWizardUnificado: base_calculo_default / tipo_produto que discrimina seguro x plano. |
regras_comissionamento |
45 | 17 | SELECT | ApoliceWizardUnificado: regra vigente do produto (RegraDoProdutoBloco). |
eventos_recebimento |
117 | 21 | SELECT | ApoliceWizardUnificado: eventos da regra vigente para o preview da comissão. |
origens_apolice |
0 | 9 | SELECT | ApoliceWizardUnificado: catálogo de origem da apólice. |
apolice_vendedores |
4.275 | 10 | INSERT, DELETE | Rateio de vendedores gravado quando a apólice é criada pelo wizard aberto de dentro do perfil. |
parcelas_cliente |
43.612 | 16 | SELECT, INSERT | Parcelas geradas pelo wizard de apólice aberto no perfil (e guard de idempotência no modo completar). |
comissoes_a_receber |
27.686 | 21 | SELECT | Guard de idempotência antes de chamar o motor de previsão no wizard de apólice. |
Funções (RPC)
| Função | Parâmetros | Papel |
|---|---|---|
fn_delete_cliente_cascade |
p_cliente_id uuid, p_nome_confirmacao text, p_motivo text DEFAULT NULL::text | Recebe p_cliente_id, p_nome_confirmacao (confirmação dupla revalidada no servidor) e p_motivo. |
fn_contar_filhas_cliente |
p_cliente_id uuid | Conta as filhas do cadastro antes da exclusão (useContarFilhasCliente, staleTime/gcTime 0). |
fn_promover_cliente_manual |
p_cliente_id uuid | Promove prospect -> cliente com validação server-side (vínculo com apólice/proposta válida + dados obrigatórios). Chamada pelo PromoverProspectDialog; devolve o checklist do que falta quando bloqueia. |
fn_add_tarefa_observador |
p_tarefa_id uuid, p_user_id uuid | Adiciona observador na tarefa criada pelo perfil do contato (useAddObservador). |
fn_add_tarefa_observador_silent |
p_tarefa_id uuid, p_user_id uuid | Adiciona o usuário mencionado com @ como observador da tarefa, sem notificação extra (notificarMencionados, quando o link é /tarefas?id=). |
fn_add_negociacao_observador |
p_negociacao_id uuid, p_user_id uuid | Adiciona o mencionado com @ como observador do card, quando o link do comentário é /crm?neg=. |
eh_lider |
— | Consultado por useTarefas para a UI condicional de tarefas de liderados. |
motor_gerar_previsao_apolice |
p_apolice_id uuid | Best-effort após criar apólice pelo wizard aberto no perfil do prospect. |
Edge Functions
analisar-conversa-ia (aba Oportunidades IA do perfil: modo='oportunidades' com contexto do cliente; e também no WhatsAppChatDrawer para análise da conversa) atendeseg-ai-summary (resumo da conversa no WhatsAppChatDrawer)
Arquivos (Storage)
documentos-clientes (aba Documentos do perfil: download/abrir e delete de anexos de cliente_documentos) apolices-documentos (documentos de apólice exibidos/baixados na aba Documentos e upload pelo wizard de apólice aberto no perfil) documentos-apolices (bucket legado usado quando o documento vem da tabela contratos) gravacoes (aba Ligações: getSignedUrl para tocar a gravação da chamada)
Tempo real
- cadastro-realtime (herdado do shell da página: invalida ['clientes'] quando a tabela clientes muda)
Cadastro (shell da página / troca de sub-abas)
/cadastro
4 tabelas · 0 RPCs
Página container da área de Cadastro: monta as 5 sub-abas (Prospects, Clientes, Cotações, Propostas, Apólices) com deep-link por ?tab= e liga o realtime que atualiza as listas sozinhas. Não faz consulta de dados própria além das permissões de visibilidade das abas.
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
clientes |
25.598 | 45 | SELECT (realtime) | Canal realtime 'cadastro-realtime' escuta postgres_changes (INSERT/UPDATE/DELETE) e invalida a query ['clientes']. |
apolices |
4.837 | 66 | SELECT (realtime) | Canal realtime 'cadastro-realtime' invalida ['apolices'] a cada mudança. |
propostas |
60 | 46 | SELECT (realtime) | Canal realtime 'cadastro-realtime' invalida ['propostas'] a cada mudança. |
cotacoes |
0 | 16 | SELECT (realtime) | Canal realtime 'cadastro-realtime' invalida ['cotacoes'] a cada mudança. |
Tempo real
- cadastro-realtime (supabase.channel em src/hooks/useCadastroRealtime.ts; postgres_changes event='*' schema='public' nas tabelas clientes, apolices, propostas, cotacoes)
Cadastro de Parceiro
/cadastro-parceiro
3 tabelas · 0 RPCs
Formulário público (sem login) de cadastro de parceiro/produtor PF ou PJ, com dados cadastrais, endereço, dados financeiros (PIX ou bancário), anexos e aceites/assinatura eletrônica. Gera um protocolo e grava como PENDENTE, aguardando aprovação manual de um admin.
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
produtores_cadastro |
0 | 23 | SELECT, INSERT | Intake do formulário. SELECT com count exact/head para o rate-limit anti-spam (máx. 5 cadastros por IP a cada 10 min) e INSERT do cadastro pendente (protocolo, tipo_pessoa, nome, documento, dados jsonb, anexos jsonb, aceites, assinatura, termos_versao, ip_origem, user_agent, status='pendente'). |
profiles |
36 | 22 | SELECT | Lido pela edge para descobrir os admins com corretora_id e notificá-los do novo cadastro. |
notificacoes |
34.796 | 10 | INSERT | Notificação 'Novo cadastro de parceiro' (tipo produtor_cadastro) para cada admin encontrado. Best-effort — falha não bloqueia o cadastro. |
Edge Functions
cadastro-produtor
Arquivos (Storage)
produtores-anexos
Financeiro3 abas
Fechamento Mensal
/financeiro/fechamento-mensal
4 tabelas · 9 RPCs
Workflow mensal de aprovação e pagamento das comissões devidas aos vendedores: uma linha por vendedor (com meta, atingido, % e contagem por status) que expande numa sub-tabela de comissões individuais. o front lê a tela inteira de uma só chamada e faz as ações por RPC.
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
comissoes_a_pagar |
0 | 31 | SELECT | Única leitura direta da tela: a sub-tabela de comissões do vendedor expandido busca por vendedor_id + mes_referencia (deleted_at is null), trazendo valor_calculado/valor_aprovado/valor_pago, status, bateu_meta_no_fechamento e motivos de rejeição/perdão. As mudanças de estado (aprovar, rejeitar, suspender, liberar, pagar) são feitas exclusivamente via RPC. |
comissoes_a_receber |
27.686 | 21 | SELECT | Somente leitura via embed comissao:comissoes_a_receber!comissao_a_receber_id(...) para chegar até a apólice de origem de cada comissão a pagar. |
apolices |
4.837 | 66 | SELECT | Somente leitura via embed aninhado comissoes_a_pagar → comissoes_a_receber → apolices!apolice_id(numero) para exibir o número da apólice na sub-tabela. |
clientes |
25.598 | 45 | SELECT | Somente leitura via embed aninhado... → apolices → clientes!cliente_id(nome) para exibir o nome do cliente na sub-tabela. |
Funções (RPC)
| Função | Parâmetros | Papel |
|---|---|---|
obter_fechamento_mensal |
p_mes date | Carrega a tela inteira numa chamada (evita N+1): cabeçalho do fechamento com status_geral, KPIs (total calculado, aguardando, aprovadas, pagas) e a lista de vendedores com meta/atingido/percentual e contagens por status. Arg: p_mes (primeiro dia do mês). |
iniciar_fechamento_mensal |
p_mes date | Abre o fechamento do mês, calcula o total e suspende por meta quem não bateu. Botão 'Iniciar Fechamento' (permissão fechamentos.iniciar). |
aprovar_comissoes_pagar |
p_ids uuid[] | Aprova comissões específicas por lista de ids. Botão 'Aprovar' de cada linha da sub-tabela. |
rejeitar_comissao_pagar |
p_id uuid, p_motivo text | Rejeita uma comissão individual exigindo motivo (MotivoModal). Args: p_id, p_motivo. |
suspender_comissoes_por_meta |
p_ids uuid[] | Suspende comissões por não atingimento de meta. Botão 'Suspender' da sub-tabela. |
liberar_comissao_com_justificativa |
p_id uuid, p_motivo text | Libera excepcionalmente uma comissão suspensa por meta, exigindo justificativa (permissão comissoes_pagar.perdoar_meta). |
pagar_comissoes |
p_ids uuid[], p_forma text, p_data date DEFAULT NULL::date, p_comprovante text DEFAULT NULL::text | Marca comissões selecionadas como pagas registrando forma, data e comprovante (MarcarPagasModal). Args: p_ids, p_forma, p_data, p_comprovante. |
aprovar_todas_fechamento |
p_mes date | Ação em massa do rodapé: aprova todas as comissões aguardando aprovação no mês. Arg: p_mes. |
pagar_todas_aprovadas_fechamento |
p_mes date, p_forma text, p_data date DEFAULT NULL::date, p_comprovante text DEFAULT NULL::text | Ação em massa do rodapé: paga todas as comissões aprovadas do mês com forma/data/comprovante informados no MarcarPagasModal. Args: p_mes, p_forma, p_data, p_comprovante. |
Financeiro
/financeiro
19 tabelas · 10 RPCs
Módulo financeiro completo em single-page com sidebar de seções (?secao=): Dashboard, Receber, Pagar, Conciliação, Borderôs, Comissões a Receber/a Pagar, Antecipações, Conta-Corrente, Estornos e Relatórios. Cada seção é um componente montado dentro do AppLayout; a visibilidade de cada uma é controlada por usePodeVerSecao('financeiro.<id>').
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
financeiro_lancamentos |
4.607 | 35 | SELECT, INSERT, UPDATE, DELETE | Tabela central de contas a receber/pagar. SELECT paginado (1000/pg) em Receber/Pagar/Relatórios/Conciliação/Comissões a Pagar, com embeds seguradora:operadoras(nome), apolice:apolices(...), vendedor:vendedores(nome), categoria_obj:fin_categorias. INSERT: novo lançamento simples, parcelado (loop de N parcelas com lancamento_pai_id) e lançamento criado a partir da conciliação. UPDATE: dar baixa (valor_realizado/data_pagamento/status), edição leve pelo NovoLancamentoModal, marcar em_atraso em massa (marcarAtrasados), auto-matching de borderô. DELETE: excluir lançamento apenas com status previsto/em_atraso. |
fin_categorias |
27 | 9 | SELECT, INSERT | Catálogo de categorias por tipo (receita/despesa) com campo natureza usado para agrupar o DRE. SELECT em todos os selects de categoria e no resumo por natureza. INSERT só no seed automático (seedCategorias no mount do Dashboard, quando a contagem é 0). |
fin_centros_custo |
0 | 6 | SELECT, INSERT | Catálogo de centros de custo para os selects de lançamento/conciliação. INSERT só no seed automático (seedCentrosCusto no mount do Dashboard, quando a contagem é 0). |
fin_contas_bancarias |
0 | 12 | SELECT, INSERT, UPDATE | Contas bancárias da corretora. SELECT (useContasBancarias, ativo=true) alimenta cards do Dashboard, filtros e selects de conta. INSERT: modal Nova Conta Bancária. UPDATE: edição manual de saldo_atual no Dashboard e atualização automática do saldo_atual com o LEDGERBAL/BALAMT ao importar OFX na Conciliação. |
fin_baixas |
0 | 9 | SELECT, INSERT | Histórico de baixas parciais de um lançamento. SELECT ao abrir o modal Dar Baixa (calcula saldo restante). INSERT ao confirmar cada baixa. |
fin_conciliacao |
961 | 12 | SELECT, INSERT, UPDATE | Itens do extrato bancário importado (OFX/CSV/PDF). SELECT por conta_id. INSERT de cada transação parseada com dedup por (conta_id, fitid) ou por data+valor+tipo. UPDATE para vincular lancamento_id + status conciliado, desvincular (volta a pendente) e ignorar. |
fin_borderos |
0 | 11 | SELECT, INSERT, UPDATE | Borderôs de comissão importados por CSV, com embed seguradora:operadoras(nome). INSERT ao confirmar a importação. UPDATE do status final (importado/divergente/conciliado) após o auto-matching. |
fin_bordero_itens |
0 | 11 | INSERT | Itens (apólice, cliente, produto, valor_comissao) do borderô importado; gravados em lote logo após criar o fin_borderos. |
comissoes_a_receber |
27.686 | 21 | SELECT | Motor transacional de comissões. Lista paginada da seção Comissões > A Receber (com embeds de apólice/cliente/produto/operadora/parcela/evento); somatório de comissões a receber no Painel Gerencial (balanço patrimonial); e base do DRE no modo Gerencial (regime competência x caixa) em Relatórios. |
baixas_recebimento |
2.648 | 8 | SELECT | Histórico de baixas de uma comissão a receber, exibido no Sheet 'Histórico de baixas' da seção Comissões > A Receber. |
operadoras |
47 | 14 | SELECT | Catálogo de operadoras/seguradoras (useOperadoras e useSeguradoras, ambos com deleted_at is null). Alimenta filtros do Dashboard, Receber/Pagar, Borderôs, Comissões a Receber e o select de 'Fonte pagadora'; também vem como embed nos lançamentos. |
apolices |
4.837 | 66 | SELECT | Somente leitura via embeds: apolice:apolices(numero, produto, vigencia_fim) nos lançamentos e apolices(...) dentro de comissoes_a_receber para mostrar número/cliente na lista de comissões. |
clientes |
25.598 | 45 | SELECT | Somente leitura via embed aninhado comissoes_a_receber → apolices → clientes(nome), usado para exibir e filtrar comissões por nome do cliente. |
produtos |
129 | 15 | SELECT | Somente leitura via embed aninhado comissoes_a_receber → apolices → produtos(nome, operadora_id, operadoras(nome)); também usado para filtrar comissões por operadora no cliente. |
parcelas_cliente |
43.612 | 16 | SELECT | Somente leitura via embed parcelas_cliente(numero) na lista de Comissões > A Receber (coluna Evento). |
eventos_recebimento |
117 | 21 | SELECT | Somente leitura via embed eventos_recebimento(tipo, ordem, percentual) na lista de Comissões > A Receber (coluna Evento). |
vendedores |
285 | 46 | SELECT | Lista de vendedores ativos no filtro do relatório de Repasses; lista de vendedores externos (tipo in externo_pj/externo_pf) nas seções Antecipações, Conta-Corrente e Estornos; e leitura de corretora_id do vendedor antes de gravar um ajuste manual de conta-corrente. |
antecipacoes_comissao |
0 | 20 | SELECT | Listagem da seção Antecipações (filtros por vendedor/período/busca), com embed vendedores!inner(id, nome, tipo). A criação não é INSERT direto — passa pela RPC criar_antecipacao. |
conta_corrente_vendedor |
0 | 13 | SELECT, INSERT | Extrato de movimentações do vendedor externo. SELECT na Conta-Corrente (janela de dias, saldo acumulado calculado no cliente) e na aba Estornos (débitos tipo debito_estorno + os créditos credito_perdao_estorno correspondentes). INSERT apenas no ajuste manual (tipo_movimentacao='ajuste_manual', valor com sinal). |
Funções (RPC)
| Função | Parâmetros | Papel |
|---|---|---|
fn_dashboard_financeiro |
p_inicio date, p_fim date, p_operadora_id uuid DEFAULT NULL::uuid | Agrega no banco os KPIs, o gráfico de entradas x saídas (6 meses), a pizza de receita por operadora e os próximos vencimentos (7 dias) do Dashboard. Args: p_inicio, p_fim, p_operadora_id. |
fn_lancamentos_kpis |
p_tipo text, p_inicio date, p_fim date | Soma no banco os 4 KPIs do Receber/Pagar (total previsto, realizado no período, em atraso, a vencer em 30 dias + contagem de atrasados). Args: p_tipo, p_inicio, p_fim. |
fn_criar_transferencia |
p_conta_origem_id uuid, p_conta_destino_id uuid, p_valor numeric, p_data date, p_descricao text DEFAULT NULL::text, p_observacoes text DEFAULT NULL::text | Cria o par de lançamentos de transferência entre contas (não afeta DRE). Usada no modal de Transferência do Receber/Pagar e no botão 'Transferência entre contas' da Conciliação (retorna origem_id para vincular ao item do extrato). |
fn_criar_rateio |
p_tipo text, p_descricao text, p_vencimento date, p_conta_bancaria_id uuid DEFAULT NULL::uuid, p_operadora_id uuid DEFAULT NULL::uuid, p_observacoes text DEFAULT NULL::text, p_partes jsonb DEFAULT '[]'::jsonb | Cria o lançamento-envelope (pai) mais as cotas filhas por categoria. Usada no checkbox 'Ratear entre categorias' do NovoLancamentoModal e no 'Desmembrar Lançamento' da Conciliação (retorna pai_id para conciliar). |
fn_comissoes_kpis |
p_inicio date DEFAULT NULL::date, p_fim date DEFAULT NULL::date, p_operadora_id uuid DEFAULT NULL::uuid | Soma no banco os cards do topo de Comissões > A Receber (total esperado, já recebido, a receber, vencidas), independente do filtro de status da lista. Args: p_inicio, p_fim, p_operadora_id. |
motor_registrar_baixa |
p_comissao_id uuid, p_valor numeric, p_observacao text DEFAULT NULL::text, p_data_baixa timestamp with time zone DEFAULT NULL::timestamp with time zone | Registra a baixa (total ou parcial) de uma comissão a receber e recalcula o status. Chamada pelo modal 'Dar baixa' da aba Comissões a Receber. |
motor_cancelar_comissao |
p_comissao_id uuid, p_justificativa text | Cancela uma previsão de comissão a receber exigindo justificativa, preservando o valor já baixado. Chamada pelo modal Cancelar. |
obter_saldo_vendedor |
p_vendedor_id uuid, p_data_corte timestamp with time zone DEFAULT NULL::timestamp with time zone | Retorna o saldo atual da conta-corrente do vendedor externo. Usada no SaldoBadge da Conta-Corrente e no modal de Nova Antecipação (para prever o novo saldo). |
criar_antecipacao |
p_vendedor_id uuid, p_valor numeric, p_forma_pagamento text, p_data_pagamento timestamp with time zone DEFAULT now(), p_observacoes text DEFAULT NULL::text, p_comprovante_url text DEFAULT NULL::text, p_parcelas integer DEFAULT 1 | Cria a antecipação de comissão e a movimentação de débito na conta-corrente. Chamada pelo modal Nova Antecipação. |
perdoar_estorno |
p_movimentacao_estorno_id uuid, p_justificativa text | Gera o crédito de perdão de um estorno (exige justificativa >= 10 caracteres). Chamada pelo modal Perdoar Estorno da aba Estornos. |
Meu Extrato
/meu-extrato
4 tabelas · 1 RPCs
Tela self-service, somente leitura, do vendedor externo (PJ/PF) logado: saldo atual da conta-corrente, total de comissões futuras e três abas — comissões futuras, antecipações recebidas e extrato completo dos últimos 90 dias com saldo acumulado. Se o usuário não tiver vendedor vinculado (vendedores.usuario_id = profile.id) ou não for externo, a página mostra 'Acesso indisponível'.
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
vendedores |
285 | 46 | SELECT | Resolve o vendedor vinculado ao usuário logado: select id, nome, tipo, ativo, corretora_id where usuario_id = profile.id and deleted_at is null (maybeSingle). É o gate da tela — sem vendedor externo, nada mais é carregado. |
comissoes_a_pagar |
0 | 31 | SELECT | Card 'Comissões futuras' e aba Futuras: comissões do vendedor com status diferente de paga/rejeitada, deleted_at is null, ordenadas por mes_referencia, limit 50 (usa valor_aprovado com fallback para valor_calculado). |
antecipacoes_comissao |
0 | 20 | SELECT | Aba Antecipações: antecipações do próprio vendedor (valor, data_baixa/autorizada_em, forma_pagamento_antecipacao, motivo, comprovante_url, baixada), ordenadas por autorizada_em desc. O comprovante é aberto como link externo (href), não passa por Storage. |
conta_corrente_vendedor |
0 | 13 | SELECT | Aba Extrato: movimentações do vendedor nos últimos 90 dias (deleted_at is null), ordenadas cronologicamente; o saldo acumulado e o sinal de cada movimento são calculados no cliente pelo mapa TIPO_MOV_SINAL (ajuste_manual respeita o sinal gravado no valor). |
Funções (RPC)
| Função | Parâmetros | Papel |
|---|---|---|
obter_saldo_vendedor |
p_vendedor_id uuid, p_data_corte timestamp with time zone DEFAULT NULL::timestamp with time zone | Retorna o saldo atual da conta-corrente do vendedor logado, exibido no card grande 'Saldo atual' (positivo = corretora deve a ele; negativo = ele deve à corretora). Arg: p_vendedor_id. |
Relacionamento e Disparos4 abas
Central de Disparos (Campanhas / Templates / Relatório / Supressão / Configuração)
/disparos
10 tabelas · 1 RPCs
Broadcast de email e WhatsApp para clientes e prospects: cria campanha, define público (segmento de clientes ou lista importada de CSV), prepara/envia em lotes pela edge function, acompanha KPI de entrega/leitura, mantém a lista de supressão (opt-out) e configura domínio de email verificado + credenciais do WhatsApp. Todo o acesso a dados vive em src/hooks/useDisparos.ts.
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
disparo_campanhas |
0 | 25 | SELECT, INSERT, UPDATE | Campanha (canal, público/segmento, template, agendamento, continua, status). SELECT da lista com embeds template_email:template_email_id(nome), template_wa:template_wa_id(nome, status) e disparo_destinatarios(count), filtrando deleted_at is null. SELECT single por id (useCampanha). INSERT no wizard (grava criado_por). UPDATE ao editar e no soft-delete (deleted_at + status='cancelada'). |
disparo_destinatarios |
7 | 24 | SELECT | Linha por destinatário com o ciclo de vida da mensagem. SELECT direto no Relatório ('id, nome, canal, destino, status, enviado_em, entregue_em, lido_em, aberto_em, erro' por campanha_id, limit 200) e como count agregado embutido no select das campanhas (total_destinatarios). A escrita é toda do backend (edge disparo-campanha). |
disparo_templates |
0 | 22 | SELECT, INSERT, UPDATE | Templates de email e WhatsApp (HSM). SELECT filtrando canal e deleted_at is null. INSERT ao criar/importar template. UPDATE ao editar e no soft-delete (grava deleted_at). Note que o mesmo hook useCreateTemplate é usado tanto pela aba Templates quanto pelo wizard de campanha. |
disparo_listas |
0 | 10 | SELECT, INSERT | Listas avulsas importadas (CSV/colar). SELECT lista as ativas (deleted_at is null). INSERT cria a lista com nome, consentimento, total e origem='importacao'. |
disparo_lista_contatos |
4.131 | 9 | INSERT | Contatos (nome/email/telefone) da lista importada, inseridos em bloco logo após criar a disparo_listas. O frontend não faz SELECT direto aqui — quem lê é a edge function ao preparar o público. |
disparo_supressao |
0 | 7 | SELECT, INSERT (upsert), DELETE | Opt-out por canal+destino. SELECT dos 500 mais recentes. INSERT via.upsert com onConflict 'corretora_id,canal,destino' e ignoreDuplicates (motivo default 'manual'). DELETE remove a supressão por id. |
disparo_email_dominios |
0 | 11 | SELECT | Domínios de envio de email com registros DNS e remetentes. Somente leitura pelo frontend (lista ordenada por created_at desc) — adicionar, verificar DNS e salvar remetentes passam pela edge function disparo-dominio. |
whatsapp_config |
0 | 10 | SELECT, INSERT, UPDATE | Credenciais da Cloud API por corretora. SELECT de 'id, phone_number_id, waba_id, verify_token, ativo' (limit 1, maybeSingle — o access_token nunca é lido de volta). INSERT quando ainda não existe config e UPDATE quando existe, com access_token só sendo sobrescrito se informado. |
clientes |
25.598 | 45 | SELECT | Base do público. SELECT de 'origem' (limit 5000, origem not null) para montar as opções do filtro de segmento; e SELECT com { count: 'exact', head: true } filtrando ativo=true + tipo_cadastro +.in('origem',...) para o preview 'público estimado' do wizard. |
origens_lead |
0 | 15 | SELECT | Catálogo oficial de origens (Config › Comissões › Políticas › Origens de Lead): SELECT de 'nome' com ativo=true e deleted_at is null, unido no cliente com as origens históricas achadas em clientes. |
Funções (RPC)
| Função | Parâmetros | Papel |
|---|---|---|
fn_disparo_kpis |
p_campanha_id uuid | KPIs agregados da campanha para o Relatório (enviados/entregues/lidos/abertos/falhas etc.). Chamada com { p_campanha_id }, retorna jsonb. O hook useKpis roda com refetchInterval de 5000ms para dar progresso ao vivo durante o envio. |
Edge Functions
disparo-campanha disparo-dominio
Relacionamento › Canvas da jornada (todas as regras lado a lado)
/relacionamento/jornadas/:id
6 tabelas · 0 RPCs
Mostra numa tela só todas as regras (gatilhos) de uma jornada, cada uma como uma lane do canvas React Flow. Permite renomear a jornada, ligar/desligar e alternar simulação (cascateando para as regras-membro) e criar um gatilho novo já dentro da jornada, navegando para o editor da regra criada. É visão/navegação: qualquer clique num nó abre o editor daquela regra.
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
rel_jornadas |
0 | 9 | SELECT, UPDATE | SELECT lista todas as jornadas (useJornadas) e a página acha a atual pelo :id. UPDATE renomeia (useRenomearJornada) e alterna ativo/dry_run do container (useToggleJornada). |
rel_automacoes |
11 | 19 | SELECT, INSERT, UPDATE | SELECT traz todas as automações (useAutomacoes) e a página filtra jornada_id === :id no cliente para montar as lanes. INSERT cria a regra nova do botão 'Adicionar gatilho' (useCriarRegraNaJornada: nome 'Nova regra', gatilho/canal legados NOT NULL preenchidos, gatilho_tipo='negociacao_criada', ativo=false, dry_run=true, jornada_id). UPDATE recebe a cascata de ativo/dry_run filtrando por jornada_id. |
rel_automacao_acoes |
38 | 13 | SELECT | Ações de cada regra, lidas no embed acoes:rel_automacao_acoes(*) do useAutomacoes — são os nós que formam a cadeia de cada lane (jornadaToFlow). |
rel_templates |
0 | 11 | SELECT | Lido apenas como embed template:rel_templates(nome, canal) dentro do useAutomacoes. |
funis_etapas |
72 | 8 | SELECT | useEtapasMap (id→nome) usado pelo ActionNode renderizado nas lanes para exibir a etapa de destino. |
profiles |
36 | 22 | SELECT | useProfilesMap (id→nome) usado pelo ActionNode renderizado nas lanes para exibir o responsável. |
Relacionamento › Editor de automação (canvas linear v2 e canvas livre/grafo v3)
/relacionamento/automacoes/:id (e /relacionamento/automacoes/nova, com ?modo=grafo)
11 tabelas · 1 RPCs
Construtor visual da regra: carrega a automação com as ações, monta o canvas React Flow (AutomacaoEditorShell linear ou AutomacaoGrafoShell freeform), configura gatilho/ações/condições pelos pickers e salva tudo numa transação. Traz ainda painel de execuções, painel de leads em espera e dialog de teste dry-run contra uma negociação real.
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
rel_automacoes |
11 | 19 | SELECT (escrita via RPC) | SELECT em useAutomacao(id): '*, acoes:rel_automacao_acoes(*)' por id (.single). Traz gatilho_tipo/gatilho_config/condicoes/layout/modo/ativo/dry_run que hidratam o draft. Toda a escrita (INSERT da automação nova e UPDATE da existente) passa pela RPC rel_salvar_automacao, nunca por.update() direto. |
rel_automacao_acoes |
38 | 13 | SELECT (escrita via RPC) | Nós/ações da regra. SELECT no embed do useAutomacao e um SELECT extra de 'id' filtrado por automacao_id em useSaveAutomacaoGraph (para só mandar à RPC ids que já existem no banco — ações novas nascem com UUID client-side). INSERT/UPDATE/DELETE em diff pela RPC. |
rel_automacao_arestas |
20 | 7 | SELECT (escrita via RPC) | Ligações do canvas livre (motor v3). SELECT direto em AutomacaoGrafoShell.tsx:118 —.from('rel_automacao_arestas').select('*').eq('automacao_id',...) — e as arestas são resolvidas de origem_id/destino_id para node_key na hidratação. Escrita pelo parâmetro p_arestas da RPC rel_salvar_automacao. |
rel_disparos |
6.077 | 23 | SELECT | Painel 'Execuções': últimos 50 disparos da regra, '*, cliente:clientes(nome)' filtrado por automacao_id, ordem criado_em desc (useExecucoesAutomacao). |
rel_eventos |
44.792 | 13 | SELECT | Duas leituras: (a) eventos que originaram cada disparo, buscados por.in('id', eventoIds) no painel de execuções; (b) painel 'Em espera' — eventos pendentes da automação filtrados por.eq('payload->>automacao_id', id), status='pendente' e tipo in ('grafo_retomar','agendado'), que dão o selo de quantos leads estão parados em cada nó Aguardar/SLA. |
negociacoes |
23.607 | 45 | SELECT | Duas leituras: (a) busca do dialog 'Testar automação' por nome do cliente — 'id, titulo, produto, created_at, cliente:clientes!inner(nome), etapa_rel:funis_etapas(nome)' com.ilike em cliente.nome, limit 20; (b) título/cliente dos leads em espera, via.in('id', negIds) com embed cliente:clientes(nome). |
clientes |
25.598 | 45 | SELECT | Apenas como embed: cliente:clientes(nome) no painel de execuções, na busca de negociações (!inner, usado para filtrar o pai pelo nome) e na lista de leads em espera. |
funis_etapas |
72 | 8 | SELECT | Picker interno de etapas: 'id, nome, funil_id, ordem' ordenado por ordem (useEtapas, staleTime 5min); também via useEtapasMap (id→nome) no rótulo do ActionNode e como embed etapa_rel:funis_etapas(nome) na busca de negociações. |
funis |
9 | 9 | SELECT | Picker interno de funis: 'id, nome' com ativo=true ordenado por nome (useFunis, staleTime 5min). |
profiles |
36 | 22 | SELECT | Picker de responsáveis (single e múltiplo): 'id, nome' ordenado por nome (useProfiles); e useProfilesMap (id→nome) para o rótulo do ActionNode. |
disparo_campanhas |
0 | 25 | SELECT | Picker da ação 'Adicionar à campanha': 'id, nome' filtrando continua=true e deleted_at is null (useCampanhasContinuas) — é o ponto de acoplamento entre Relacionamento e a Central de Disparos. |
Funções (RPC)
| Função | Parâmetros | Papel |
|---|---|---|
rel_salvar_automacao |
p_automacao jsonb, p_acoes jsonb DEFAULT '[]'::jsonb, p_arestas jsonb DEFAULT NULL::jsonb | Salva regra + cadeia de ações (+ arestas no modo grafo) em UMA transação, com diff: ação/nó não reenviado é deletado. Assinatura em produção: p_automacao jsonb, p_acoes jsonb default '[]', p_arestas jsonb default NULL. Modo linear (useSaveAutomacaoGraph) manda só p_automacao+p_acoes e pode chamar a RPC uma SEGUNDA vez para regravar o layout com os ids definitivos das ações novas (senão a posição arrastada se perde no reload). Modo grafo (useSaveAutomacaoGrafo) manda p_arestas e nós com tipo_no/node_key, sintetizando o nó de gatilho com node_key fixo 'trigger'. |
Edge Functions
motor-automacao atendeseg-recursos
Relacionamento (lista: Templates / Automações / Disparos Manuais / Histórico)
/relacionamento
9 tabelas · 0 RPCs
Hub de comunicação com o cliente: catálogo de templates (WhatsApp/email), lista de automações do motor agrupadas em jornadas, disparo manual avulso e histórico dos últimos 100 disparos. Página shell com 4 abas (TemplatesTab, AutomacoesTab, DisparosManuaisTab, HistoricoTab), toda a leitura/escrita via hooks/useRelacionamento.ts.
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
rel_templates |
0 | 11 | SELECT, INSERT, UPDATE | Catálogo de mensagens (canal, categoria, assunto, conteúdo, variáveis). SELECT filtra ativo=true ordenado por criado_em. INSERT em 'Novo template' (useCreateTemplate, grava criado_por). UPDATE ao editar (useUpdateTemplate). Também vem embutido como template:rel_templates(nome, canal) nos selects de rel_automacoes e rel_disparos. |
rel_automacoes |
11 | 19 | SELECT, UPDATE, DELETE | Regras do motor de automação. SELECT lista com embeds (template + acoes:rel_automacao_acoes(*)). UPDATE liga/desliga (useToggleAutomacao), cascata ativo/dry_run por jornada_id (useToggleJornada) e move regra entre jornadas via jornada_id (useAtribuirJornada). DELETE exclui a regra (ações caem por ON DELETE CASCADE). Criação NÃO acontece aqui: os botões 'Nova automação' e 'Fluxo livre' navegam para /relacionamento/automacoes/nova. |
rel_automacao_acoes |
38 | 13 | SELECT | Cadeia de ações de cada regra, lida junto via embed acoes:rel_automacao_acoes(*) e ordenada por 'ordem' no cliente; usada para descrever a automação na lista (descreverAcao/acaoTipoLabel). |
rel_jornadas |
0 | 9 | SELECT, INSERT, UPDATE | Container que agrupa regras com gatilhos diferentes. SELECT lista as jornadas (ordem criado_em asc). INSERT cria jornada nova pelo prompt 'Nova jornada' (ativo=false, dry_run=true) e navega para o canvas. UPDATE liga/desliga e alterna simulação da jornada (que depois cascateia para rel_automacoes). |
rel_disparos |
6.077 | 23 | SELECT, INSERT | Log/histórico de mensagens. SELECT dos 100 mais recentes com embeds cliente:clientes(nome), template:rel_templates(nome, canal) e automacao:rel_automacoes(nome) — alimenta as abas Disparos Manuais e Histórico. INSERT registra o disparo manual (status default 'simulado', tipo 'manual', criado_por). |
clientes |
25.598 | 45 | SELECT, INSERT | Destinatário do disparo manual. SELECT no embed cliente:clientes(nome) do histórico e na busca do ClienteAutocomplete (nome/cpf_cnpj/telefone via.or, limit 8, mais um SELECT single de 'nome' para hidratar o valor escolhido). INSERT quando o usuário usa 'Cadastrar novo' no autocomplete (cadastro rápido — cadastroCompleto não é passado nesta aba). |
funis_etapas |
72 | 8 | SELECT | useEtapasMap monta o mapa id→nome para traduzir a etapa de destino nas descrições das ações da lista de automações (staleTime 5min). |
profiles |
36 | 22 | SELECT | useProfilesMap monta o mapa id→nome para traduzir o responsável nas descrições das ações da lista de automações (staleTime 5min). |
cadastro_eventos |
1.253 | 8 | INSERT | Trilha de auditoria gravada por logCadastroEvento('cliente', id, 'criou') quando o cadastro rápido do ClienteAutocomplete cria um cliente. |
Tarefas, Suporte e E-mail4 abas
Calendário
/calendario
11 tabelas · 0 RPCs
Agenda da empresa com visões Mês/Semana/Agenda, múltiplos calendários (com visibilidade/escrita e membros), eventos com convidados, recorrência e lembretes. Agrega ainda camadas virtuais read-only (Tarefas, Renovações de apólice e prazos de RH), exporta.ics e sincroniza com Google Agenda/Outlook via OAuth, incluindo agendamento de reunião com checagem de disponibilidade e Google Meet.
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
calendarios |
345 | 15 | SELECT, INSERT, UPDATE, DELETE | Catálogo de calendários visíveis ao usuário. Criado/editado/excluído pelo CalendarioModal via useCalendarios/useCreateCalendario/useUpdateCalendario/useDeleteCalendario. Também lido pela edge calendario-agendar-reuniao para achar o calendário de gestão. |
calendario_membros |
0 | 4 | SELECT, INSERT, DELETE | Membros selecionados de um calendário (base da regra de escrita 'membros' e da visibilidade). useCalendarios lê os do usuário logado; useCalendarioMembros/useSetCalendarioMembros leem e reconciliam a lista no modal. |
eventos |
7 | 22 | SELECT, INSERT, UPDATE, DELETE | Eventos da agenda (título, início/fim, dia inteiro, cor, recorrência, lembrete, fonte, ical_uid, conexao_id). Lidos por useEventos, criados/editados/excluídos pelo EventoModal. DELETE em massa por conexao_id ao desconectar uma conta externa; também escritos pelas edges calendario-sync, calendario-push-evento e calendario-agendar-reuniao. |
evento_participantes |
25 | 6 | SELECT, INSERT, UPDATE, DELETE | Convidados do evento e status (pendente/aceito/recusado). Lidos junto dos eventos para calcular meuStatus/confirmados; reconciliados na edição. UPDATE de status pelo próprio convidado no EventoDetalhe (useResponderEvento). |
notificacoes |
34.796 | 10 | INSERT | Avisa convidados de novo convite (tipo evento_convite) e avisa o criador quando alguém aceita/recusa (tipo evento_resposta), via lib/notificar.ts. A edge calendario-agendar-reuniao também insere notificações de convite. |
profiles |
36 | 22 | SELECT | Lista de pessoas da corretora (useProfiles) para o MultiSelect de convidados no EventoModal/AgendarReuniaoModal e de membros no CalendarioModal. As edges calendario-disponibilidade, calendario-agendar-reuniao e o callback OAuth também leem profiles (nome / corretora_id). |
calendario_conexoes_pub |
0 | 14 | SELECT | VIEW (security_invoker) sobre calendario_conexoes SEM as colunas de token; é o que o frontend lê em SincronizacaoExterna para mostrar contas conectadas, direção, sync_ativo, última sync e último erro (useCalendarioConexoes). |
calendario_conexoes |
1 | 18 | UPDATE, DELETE | Conexão OAuth com Google/Outlook. O frontend só faz UPDATE (calendario_id, direcao, sync_ativo, external_calendar_id) e DELETE (desconectar) — nunca SELECT direto (usa a view _pub). Também é a tabela ouvida no realtime. |
tarefas |
12.047 | 18 | SELECT | Camada virtual 'Tarefas' (useCalendarioVirtual): só as tarefas do usuário logado, com prazo na faixa visível e status não concluída/cancelada, limit 500. Read-only no calendário. |
apolices |
4.837 | 66 | SELECT | Camada virtual 'Renovações': apólices com vigencia_fim na faixa visível e deleted_at nulo, viram itens de vencimento de vigência. Read-only. |
clientes |
25.598 | 45 | SELECT | Lido por embed do PostgREST em apolices (select 'clientes(nome)') só para montar o título 'Renovação: <cliente>' da camada virtual. |
Edge Functions
calendario-oauth-start calendario-sync calendario-push-evento calendario-disponibilidade calendario-agendar-reuniao google-calendar-callback outlook-calendar-callback
Tempo real
- canal calendarios-<random> — postgres_changes em public.calendarios (nome aleatório por instância do hook para evitar colisão de tópico)
- canal eventos-realtime — postgres_changes em public.eventos e public.evento_participantes
- canal cal-conexoes-<uid> — postgres_changes em public.calendario_conexoes
Email
/email
4 tabelas · 0 RPCs
Cliente de e-mail completo estilo Outlook/Gmail (multi-conta IMAP/SMTP por usuário): lista paginada com threading, leitura em iframe com tema claro/escuro e zoom, compor/responder/encaminhar com anexos e assinatura, rascunho, mover/excluir/flag, pastas, modelos de resposta rápida e agenda de contatos com importação CSV/vCard. A leitura vem do banco (sincronizado por um worker) com fallback on-demand para IMAP; toda operação IMAP/SMTP passa por Edge Functions.
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
email_messages |
20.841 | 23 | SELECT, UPDATE | Espelho local das mensagens sincronizadas pelo worker. SELECT paginado (range + count exact) por account_id+folder para a lista. SELECT do corpo completo (html, corpo_texto, recipients, attachments) por uid. SELECT('folder') em lotes de 1000 para montar a lista de pastas (DISTINCT manual) e para contar não-lidas por pasta (seen=false). UPDATE apenas do campo `urgente` (marcação manual de urgência na thread). Flags \Seen/\Flagged, move e delete NÃO passam por aqui — vão via Edge Function email-imap. |
email_accounts |
19 | 23 | SELECT, DELETE | Contas de e-mail do usuário. SELECT das contas ativas por owner_profile_id (id, email, display_name, reply_to, assinatura, hosts/portas IMAP e SMTP) para o seletor multi-conta. SELECT('folders') da conta para obter a lista de pastas IMAP gravada pelo worker (com specialUse). DELETE exclui a conta (e por cascata os e-mails sincronizados). Criação e atualização (senha, hosts, assinatura, identidade) NÃO são feitas por PostgREST — são via Edge Function email-account-save. |
email_quick_replies |
0 | 6 | SELECT, INSERT, UPDATE, DELETE | Modelos de mensagem rápida do usuário. SELECT(id,titulo,corpo_html) no dropdown 'Modelos' do Compor e no editor. INSERT (com owner_profile_id), UPDATE (titulo/corpo_html/atualizado_em) e DELETE no QuickRepliesEditor/QuickRepliesManager. |
email_contacts |
0 | 7 | SELECT, INSERT, UPDATE, DELETE | Agenda de contatos do usuário (aba Contatos das Configurações). SELECT(id,nome,email,telefone,empresa) ordenado por nome. INSERT manual de contato. UPSERT em lote na importação de CSV/vCard (onConflict 'owner_profile_id,email', ignoreDuplicates). DELETE por id. |
Edge Functions
email-imap email-send email-account-test email-account-save
Arquivos (Storage)
email-assets
Tempo real
- email-sync-${accountId} (postgres_changes event '*' em public.email_messages com filter account_id=eq.<id> — invalida ['email-messages'] e ['email-folder-unread'] e acende o indicador 'sincronizando' por 4s)
Suporte
/suporte
6 tabelas · 0 RPCs
Central de suporte com 3 abas controladas por permissão (Central de Ajuda/FAQ, Contato e Chamados). A aba Chamados é um intake único que ROTEIA por assunto: Seggest/GEAP/RH viram ticket nativo em suporte_tickets, enquanto AtendeSeg e Marketing vão para o Portal Alfa79 (API HTTP externa, fora do Supabase); a lista 'Meus chamados' mescla as duas origens.
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
faq_items |
0 | 9 | SELECT, UPDATE | Central de Ajuda (SuporteFAQ/useFaqItems): SELECT dos itens ativos ordenados por categoria+ordem. O UPDATE é apenas o incremento do contador `views` ao abrir uma pergunta (useIncrementFaqView faz SELECT views + UPDATE). |
suporte_tickets |
51 | 19 | SELECT, INSERT, UPDATE | Chamados nativos. SELECT em useMeusTickets e SELECT por `numero` no SuporteChamados para resolver o deep-link ?ticket=<numero>. INSERT em useCriarTicket (assunto com tag de roteamento, categoria, prioridade, descrição, canal 'suporte' ou 'rh'). UPDATE em useAtualizarTicket a partir do TicketDrawer (mudança de status e gravação de avaliacao_cliente/avaliacao_comentario). |
suporte_ticket_mensagens |
230 | 9 | SELECT, INSERT | Thread do chamado. SELECT em useTicketMensagens (ordem cronológica). INSERT da primeira mensagem na abertura do ticket e de cada resposta no TicketDrawer (autor_tipo cliente/suporte/sistema, flag `interno` para nota interna). |
suporte_ticket_anexos |
49 | 11 | SELECT, INSERT | Metadados dos anexos do chamado (path no bucket suporte-anexos, nome, tipo, tamanho, interno). SELECT em useTicketAnexos. INSERT vinculado ao ticket_id + mensagem_id tanto na abertura quanto em cada resposta com anexo. |
suporte_ticket_leituras |
111 | 4 | INSERT, UPDATE | useMarcarLeitura faz upsert (onConflict ticket_id,user_id) de ultima_leitura_em quando o TicketDrawer é aberto/fechado — controla o marcador de 'lido' do chamado. |
corretoras |
102 | 30 | SELECT | Via BrandingContext (provider global): SuporteContato usa nomeExibicao da corretora para montar a mensagem pré-preenchida do WhatsApp de suporte. |
Arquivos (Storage)
suporte-anexos
Tarefas
/tarefas
11 tabelas · 5 RPCs
Gestão de tarefas da corretora em 4 visões (Lista, Kanban, Calendário e Modelos), com criação/edição em modal, observadores, diário de comentários com anexos e menções, anexos por slot obrigatório e deep-link ?id=<uuid>. Todo o acesso é PostgREST direto + RPCs; não usa nenhuma Edge Function.
Tabelas e views
| Recurso | Registros | Campos | Operações | Papel nesta aba |
|---|---|---|---|---|
tarefas |
12.047 | 18 | SELECT, INSERT, UPDATE, DELETE | Tabela principal. useTarefas faz SELECT com embeds (responsavel/criado_por em profiles, cliente em clientes, observadores em tarefas_observadores). INSERT em useCreateTarefa. UPDATE em useUpdateTarefa, toggleConcluida, reabrirTarefa (status/concluida_em/prazo), concluirEmLote (.in('id', ids)), handleUpdateStatus do Kanban, lib/iniciar-tarefa (pendente->em_andamento) e TarefaDiarioTab.atualizarStatusSeNecessario. DELETE em useDeleteTarefa. Também SELECT count head-only em useTarefasPendentesCount (badge da sidebar). |
tarefas_observadores |
8.129 | 5 | SELECT, DELETE | Junction M2M de observadores. SELECT em useTarefaObservadores (com embed profiles), no diff de observadores do handleSave (qc.fetchQuery) e no TarefaDiarioTab (destinatários da notificação de comentário). DELETE em useRemoveObservador. O INSERT é feito pelas RPCs fn_add_tarefa_observador / fn_add_tarefa_observador_silent. |
tarefas_diario |
29.103 | 17 | SELECT, INSERT, UPDATE, DELETE | Diário/comentários da tarefa (TarefaDiarioTab). SELECT ordenado por fixado/fixado_em/created_at. INSERT de novo registro com texto + campos legados arquivo_url/nome/tipo + array `arquivos`. UPDATE para editar texto (grava versão antiga em historico_edicoes) e para fixar/desafixar. DELETE de registro (admin ou autor dentro de 24h). |
tarefas_anexos |
13.589 | 11 | SELECT, INSERT, DELETE | Anexos por slot da tarefa (TarefaAnexosTab/useTarefaAnexos). SELECT com embed profiles (uploaded_by). INSERT após subir o arquivo no bucket. DELETE junto com o arquivo. Também SELECT('slot_nome') em Tarefas.tsx para validar slots obrigatórios antes de concluir. |
tarefa_modelos |
16 | 13 | SELECT, INSERT, UPDATE | Templates de tarefa da aba Modelos e do seletor de modelo no NovaTarefaModal. SELECT só ativos. INSERT/UPDATE no ModeloFormDialog; exclusão é soft delete via UPDATE ativo=false. |
profiles |
36 | 22 | SELECT | Embeds de responsável/criador/observador nas tarefas; useProfiles carrega a lista de usuários da corretora (seleção de responsável, observadores e dropdown de menções @ do MentionTextarea). TarefaDiarioTab busca nome+foto_path de autor/editor/fixador; useUploadAnexo e lib/storage.getCurrentCorretoraId leem corretora_id para prefixar o path do bucket. |
notificacoes |
34.796 | 10 | INSERT | Notificações disparadas pela aba: tipo 'tarefa_aceita' (lib/iniciar-tarefa avisa o criador), tipo 'tarefa_comentario' (TarefaDiarioTab notifica criador + responsável + observadores, exceto o autor) e tipo 'mencao' (lib/notif-mention para cada @ marcado). |
clientes |
25.598 | 45 | SELECT, INSERT | Embed clientes(id, nome, telefone) na query de tarefas (nome/telefone do vínculo). O ClienteAutocomplete do NovaTarefaModal faz SELECT por nome/CPF-CNPJ/telefone e SELECT do nome do cliente já selecionado; useCreateCliente permite INSERT de um cliente novo direto do modal. |
negociacoes |
23.607 | 45 | SELECT | useNegociacoes(undefined, undefined, {enabled: open}) no NovaTarefaModal — lista de cards do CRM para vincular a tarefa a uma negociação (paginado de 1000 em 1000). |
operadoras |
47 | 14 | SELECT | Embed operadoras(nome) dentro do SELECT de negociacoes usado pelo seletor de vínculo do NovaTarefaModal. |
produtos |
129 | 15 | SELECT | Embed produtos(nome) dentro do SELECT de negociacoes usado pelo seletor de vínculo do NovaTarefaModal. |
Funções (RPC)
| Função | Parâmetros | Papel |
|---|---|---|
eh_lider |
— | UI condicional: TarefasList e TarefasKanban (via useEhLider) liberam ações sobre tarefas da equipe para quem é líder de alguém. |
fn_add_tarefa_observador |
p_tarefa_id uuid, p_user_id uuid | Adiciona observador à tarefa (useAddObservador, chamado no save do NovaTarefaModal) e cria a notificação tarefa_observador_adicionado quando o alvo não é o próprio usuário. |
fn_add_tarefa_observador_silent |
p_tarefa_id uuid, p_user_id uuid | Chamado por lib/notif-mention quando o link é /tarefas?id=<uuid>: adiciona o usuário mencionado como observador SEM notificação extra (a notificação de menção já foi enviada). |
fn_tarefas_com_diario_nao_lido |
— | useTarefasDiarioNaoLido — devolve os tarefa_id com comentário novo pro usuário atual; alimenta o selo 'comentário não lido' na lista/kanban. Degrada com Set vazio se a RPC não existir. |
fn_marcar_diario_visto |
p_tarefa_id uuid | Chamada ao abrir a aba Diário de uma tarefa; marca o diário como visto (grava em tarefa_diario_leitura) e faz o selo sumir. |
Arquivos (Storage)
tarefas-anexos
Tempo real
- tarefas-realtime (postgres_changes event '*' em public.tarefas, public.tarefas_observadores e public.tarefas_diario — invalida ['tarefas'], ['tarefas-resumo-crm'] e ['tarefas-diario-nao-lido'])
- tarefas-diario-nao-lido (postgres_changes event INSERT em public.tarefas_diario — invalida o selo de comentário não lido)
Rastreamento de uso
Toda chamada à API vira um registro, inclusive as recusadas por chave inválida, escopo insuficiente ou limite excedido. Ficam guardados: chave e parceiro, método e caminho, filtros enviados, status, duração, quantidade de registros retornados, IP e user-agent.
O conteúdo dos dados nunca é guardado — o registro serve para auditoria de acesso, não para duplicar a base.
O que isso significa para você
O volume que sua integração consome é visível do nosso lado, por dia e por recurso. Se precisar de um limite maior, de um recurso novo ou de uma janela de carga pesada, é só combinar antes — é mais simples que descobrir depois por um pico no gráfico.