Oportunidades (Elegibilidade)¶
O que é¶
Tela /oportunidades/elegibilidade (menu Comercial → Vendas → "Oportunidades
(Elegibilidade)") que lista os clientes elegíveis para uma nova oferta de
crédito — a base de disparo/abordagem do time comercial. É a "2ª tela de
Oportunidades": mesma forma da tela irmã /oportunidades (ver "Onde vive no
código"), mas restrita à interseção com elegibilidade (clientes que
passam nas regras de algum perfil de elegibilidade ativo), em vez do público
geral da carteira.
Como funciona¶
- Base de dados: cada linha é um contato elegível, vindo da RPC
disparo_base_elegibilidade, que rodadisparo_base_oportunidades(a mesma query da tela/oportunidades) e filtra pelocontato_id IN(disparo_elegibilidade_elegiveis⋈elegibilidade_presetsativos). A base registrada emdisparo_basestemslug = 'perfil_elegibilidade'("Perfil de Elegibilidade") — não há mais seletor de perfil manual: um cliente entra se algum perfil ativo o aprovar. - Condição elegível vs. quente: cada linha carrega
condicao:elegivel(passa hoje) ouquente(só entraria se quitasse as "Parcelas Quentes" — janela curta de dias úteis; ADR-0003, "Oportunidade Quente"). A UI mostra o badge 🔥 Quente e tem o toggle "Só quentes". - Filtros da tela (client-side sobre o resultado já trazido do servidor, exceto os que vão na RPC):
- Busca por nome ou CPF (server-side, debounce 400ms).
- Status comercial (select) — filtra por status comercial
do contato (ex.: sem contato, em dia, atrasado etc.) e, quando setado,
habilita um filtro de intervalo de datas ("De"/"Até") sobre
status_comercial_em. - Tags de elegibilidade (multi-select) — reflete os perfis/tags que tornaram o contato elegível.
- Status do contrato (select "Status"):
em_dia/atrasado/quitado/ todos — deriva dedisparo_base_oportunidades.tag(contrato atrasado > contrato quitado sem em-dia > em dia). - % pago (contratos ativos) — buckets de 20%:
0–20%,20–40%,40–60%,60–80%,80–100%(última faixa aberta, inclui 100%). Alinhado (PR #… "refactor(elegibilidade)") aos mesmos buckets de/oportunidades, evitando a divergência de granularidade que existia antes. - "🔥 Só quentes" — filtra
condicao === 'quente'. - Paginação e ordenação (por qualquer coluna) são client-side — a lista inteira chega numa carga e é fatiada em memória (50 por página).
- Clicar numa linha abre o
OportunidadeDrilldownSheet(mesmo componente de drill-down de/oportunidades) com o perfil e as operações do contato.
Regras de negócio¶
⚠️ A documentar. Esta tela ainda não tem as regras de negócio levantadas do código.
O que entra aqui: invariante (o que nunca pode acontecer), permissão (quem pode fazer o quê), bloqueio (o que impede a ação e a mensagem que o usuário vê), cálculo (fórmula e arredondamento) e efeito colateral (o que mais muda quando isso acontece).
Regra só entra aqui com origem no código — arquivo e linha. Regra que alguém "acha que é assim" é pior que seção vazia, porque vira decisão de produto baseada em memória.
Onde vive no código¶
- CRM (page):
apps/crm-menos-juros/client/src/pages/comercial/oportunidades-elegibilidade/index.tsx - CRM (domínio):
apps/crm-menos-juros/client/src/domains/comercial/oportunidades-elegiveis/(api/oportunidades-elegiveis-api.tschamaPOST /v2/comercial/disparos/elegiveis,hooks/use-oportunidades-elegiveis.ts,hooks/use-tags-elegibilidade.ts,types/index.ts) - Tela irmã (público geral, mesmas colunas/buckets):
apps/crm-menos-juros/client/src/pages/comercial/oportunidades/index.tsx - Configuração dos perfis de elegibilidade (quem entra na base):
apps/crm-menos-juros/client/src/pages/configuracoes/elegibilidade/+apps/crm-menos-juros/client/src/domains/mesa-analise/elegibilidade/ - DB:
supabase/migrations/20260623120700_create_disparo_base_oportunidades.sql(RPCdisparo_base_oportunidades, baseoportunidades),supabase/migrations/20260623130300_base_unica_perfil_elegibilidade.sql(RPCdisparo_base_elegibilidade, baseperfil_elegibilidade),supabase/migrations/20260626172734_elegibilidade_condicao_quente.sql(colunacondicao)
Relacionado¶
comercial · elegibilidade · negocio · pipe-e-etapa
Histórico¶
- 2026-07-10 (conversa): página criada como parte da ingestão de telas do Comercial fora do Kanban.