O painel classifica 100% da carteira do time IS em cinco grupos mutuamente exclusivos, recalculados a cada acesso a partir da data de hoje — sem escrever nada no banco, sem estado acumulado e sem depender de fechamento manual. É sempre uma foto do presente.
Fonte de dados e travas
| Item | Regra |
|---|---|
| Banco | Supabase murano-clientes-v2, alimentado pela sincronização do ERP WinThor. Somente leitura: o app nunca grava nada. |
| Tabelas | faturamento e clientes. |
| Titularidade | Sempre clientes.rca_vendedor (RCA1). rca2_vendedor e rca3_vendedor são apoio e nunca definem o dono ou o time do cliente. |
| Time IS | RCA 10 (Thamires) · 27 (Anne) · 28 (Milene) · 29 (Thiago) · 46 (Luana) · 51 (Kamilly). |
| Filial | Filial 1 em toda leitura. |
Por que o apelido do vendedor é escrito à mão no código
O que liga a conta do vendedor ao RCA é uma chave explícita, não o nome vindo do ERP. Casar por nome quebraria — e quebraria em silêncio, mostrando a carteira errada — no dia em que alguém corrigisse a grafia de um nome no WinThor.
Tempo: nenhum mês fixo no código
- Mês atual — em andamento. Nunca conta como quebra de sequência e não entra no faturamento nem em meses ativos.
- Mês anterior (M-1) — mês fechado mais recente. É ele que decide ativo ou em reativação.
- Janela de análise — os 12 meses fechados, de M-12 a M-1.
- Fuso da operação — Belém: é ele que define quando “hoje” vira o dia seguinte.
- Até os rótulos de mês da tela são derivados da data de hoje, nunca tabelados.
Faturamento líquido
Bruto = SUM(vlr_atendido) tipo='VENDA' posicao='F - Faturado' tv=1 codfilial=1
Devolução = SUM(vlr_atendido) tipo='DEV' posicao='DEV - Devolucao' codfilial=1
-- sem filtrar tv: DEV sempre tem tv nulo
Líquido = Bruto − Devolução- Sempre pela data de faturamento (
datafat), que reflete o movimento real, inclusive nas devoluções. - Bonificação nunca entra.
- Só movimento dentro dos 12 meses fechados soma no valor exibido.
- Devolução não é evento de compra: não conta como mês ativo, não entra no streak e não vira última compra.
O que é calculado para cada cliente
| Métrica | Definição |
|---|---|
| Faturamento líquido | Venda menos devolução nos 12 meses fechados. |
| Meses ativos | Meses distintos com venda na janela, de 0 a 12. |
| Streak | Meses fechados consecutivos comprando, terminando em M-1. |
| Comprou no mês atual | Tem venda no mês corrente. |
| Última compra | Última venda, inclusive no mês atual. |
| Dias sem comprar | Dias corridos desde a última venda anterior ao mês atual, contados até hoje. Vazio se nunca comprou. |
Streak: sequência sem buraco
Anda do mês fechado mais recente para trás e para no primeiro mês sem compra. O mês atual não participa, porque ainda não fechou.
M-4 M-3 M-2 M-1 streak
· venda · venda → 1 ← M-2 quebrou a continuidade
venda venda venda venda → 4
venda venda venda · → 0 ← não comprou no mês fechado mais recenteErro já cometido e corrigido
Nunca é “quantos dos últimos 3 meses ele comprou”. Contagem solta classifica errado quem tem buraco no meio: comprou em M-3 e M-1 sem M-2 é streak 1, não 2.
Segmentação: a árvore completa
Duas perguntas resolvem a classificação inteira, e nenhuma delas depende de histórico salvo.
Contorno tracejado é decisão; contorno colorido é grupo final. Etapa ao vivo de 1 ou mais vai para Consolidação; etapa 0 desce para a última pergunta.
🏆 Top 30 por RCA
streak ≥ 3 · entre os 30 maiores scores do próprio RCA1
Os melhores clientes de cada vendedor, por combinação de frequência e faturamento. Saem do grupo Recorrentes — nunca aparecem duplicados.
🔁 Recorrentes
streak ≥ 3 · fora do Top 30 do seu RCA
A base fiel e previsível fora do topo do ranking.
✅ Consolidação
streak de 0 a 2 · com sequência ativa (etapa ≥ 1)
Quem está voltando a comprar e ainda não completou 3 meses seguidos. Kanban de 3 etapas.
⚠️ Reativação
streak = 0 · sem compra no mês atual · até 120 dias parado
Janela de atenção: ainda dá tempo de reverter.
🔴 +120 dias
streak = 0 · sem compra no mês atual · mais de 120 dias parado
Carteira fria — precisa de ação de reativação mais forte. Quem nunca comprou entra aqui.
Top 30: como o score é apurado
- Elegibilidade: só quem está no pool de Recorrentes (streak de 3 meses ou mais).
- Score = metade faturamento líquido, metade meses ativos, ambos normalizados dentro do pool de cada RCA1 — nenhuma das duas métricas domina o ranking só por ter escala maior.
- O corte do #30 é relativo àquele vendedor, nunca um valor fixo em reais: varia conforme o tamanho do pool de cada RCA.
- Pool com 30 clientes ou menos entra inteiro, sem disputa.
- Média mensal de faturamento aparece como referência e não entra no score.
Consolidação: as 3 etapas
A etapa é o streak “ao vivo”: o fechado mais a compra do mês corrente, quando ela existe.
| Situação | Etapa |
|---|---|
| streak 0 + comprou no mês atual | 1 — voltou de Reativação |
| streak 1 + comprou no mês atual | 2 |
| streak 1, ainda sem comprar | Permanece na 1, aguardando o mês fechar |
| streak 2 + comprou no mês atual | 3 |
| streak 2, ainda sem comprar | Permanece na 2, aguardando o mês fechar |
| Etapa 3 mantida na virada | Gradua para Recorrente (3 meses seguidos) |
Quebra de sequência
Pular um mês fechado devolve o cliente para Reativação ou +120 dias automaticamente. Não existe lógica de histórico: a classificação é recalculada do zero, e o que veio antes da quebra não conta — a sequência reinicia.
Reativação e +120 dias
Os dois grupos exigem streak 0 e nenhuma compra no mês atual. O corte de 120 dias sem comprar separa um do outro. Cliente que nunca comprou cai em +120: é carteira fria, não janela de atenção.
Quem vê o quê
O papel chega carimbado pelo hub no ato do login. Este app nunca consulta o cadastro de acesso por conta própria.
| Papel | Visão |
|---|---|
| Supervisão | Carteira inteira do time. |
| Vendedor do time IS | Só os próprios clientes, recortados pelo RCA1. |
| Vendedor de outro time | Passa como vendedor, mas a carteira aparece vazia: o app cobre Filial 1 e os RCAs do IS. |
| Qualquer outro papel | Acesso não autorizado, com a explicação de onde revisar o cadastro. |
- O recorte acontece depois da segmentação. O Top 30 é apurado sobre a carteira do time, então a posição do cliente na visão do vendedor é a mesma que a supervisão vê — a visão individual é um subconjunto exato da geral.
- Na dúvida, nega. Papel ausente, desconhecido ou sem carteira definida não entra: erro nunca pode resultar em ver dado a mais.
- Mudança de papel no hub vale na próxima carga da página, sem precisar sair e entrar de novo.
Leitura, cache e falhas
- Toda leitura é paginada e o total lido é conferido contra a contagem do servidor: linha faltando derruba a tela com erro, em vez de mostrar número menor em silêncio.
- O histórico é buscado bem além da janela só para a última compra de cliente frio continuar aparecendo.
- O resultado é reaproveitado dentro do mesmo dia; erro não fica preso no cache até a virada.
- Nada é pré-renderizado — a classificação depende de “hoje”.
Como a tela se comporta
- Os seis indicadores do topo são clicáveis: os cinco grupos levam à aba de cada um, e o total ao lado abre a carteira completa — a mesma lista sem recorte, com a coluna “Grupo” dizendo onde cada cliente caiu. O número dele continua sendo a validação visual de que a soma bate com a carteira inteira.
- Cada aba guarda seu próprio estado de busca, filtro de RCA e ordenação — trocar de aba não perde o que você montou na anterior.
- Clicar no cabeçalho de uma coluna ordena do maior para o menor; clicar de novo inverte. “Nunca comprou” ordena como o caso mais extremo.
- Dias sem comprar mudam de cor: vermelho acima de 120, laranja acima de 60.
- No Top 30, ordenar por RCA agrupa a lista por vendedor e a posição reinicia dentro de cada carteira.
O que é verificado automaticamente
- Os cinco grupos somam o total da carteira, e nenhum cliente aparece em dois.
- A virada de mês não muda a classificação relativa — nada está fixo no código.
- Os recortes por vendedor somados reconstroem a carteira inteira, preservando posição no Top 30 e etapa.
- Streak exige sequência; devolução não gera mês ativo; o corte do Top é por RCA, não global.
Correções que não devem ser revertidas
AntesJanela rolante de 365 dias, que chegava a mostrar 13 meses ativos.
AgoraJanela de 12 meses fechados, de M-12 a M-1.
AntesDias sem comprar contados do dia 1 do mês, deslocando cerca de 77 clientes entre os grupos.
AgoraContados de hoje — a leitura literal de "dias sem comprar".
AntesRecorrente considerava o mês atual mais dois anteriores.
AgoraSó os 3 meses fechados, porque o corrente ainda não terminou.
AntesReativação por corte fixo de dias a partir do dia 1, com erro de borda.
AgoraBaseada em "não comprou no mês anterior".
AntesUm grupo "Carteira Ativa" solto, para cobrir quem não era Recorrente nem Top.
AgoraConsolidação com etapas cobre o mesmo público, de forma mais precisa.
AntesConsolidação contava quantos dos 3 meses o cliente comprou.
AgoraExige sequência sem quebra.
AntesTop saía de "comprou no mês anterior", sem frequência mínima.
AgoraSó concorre quem está no pool de Recorrentes.
AntesRecorte do vendedor aplicado na entrada dos dados.
AgoraAplicado na saída, depois da segmentação.