Skip to content

feat(crosssell): visao por cliente no pipeline#134

Merged
Warleypablo merged 11 commits intomainfrom
feature/crosssell-cliente-view
Apr 28, 2026
Merged

feat(crosssell): visao por cliente no pipeline#134
Warleypablo merged 11 commits intomainfrom
feature/crosssell-cliente-view

Conversation

@Warleypablo
Copy link
Copy Markdown
Owner

Summary

  • Pipeline CrossSell passa a renderizar um card por cliente (era um por oportunidade)
  • Card mostra serviços ativos (chips) e oportunidades mapeadas (lista vertical de até 3)
  • Filtros enxutos (4) + dropdown de ordenação (potencial, MRR, recente, alfabético)
  • Dashboard ganha 2 KPIs novos: Clientes em Negociação e Cobertura da Base

Spec & Plan

  • docs/superpowers/specs/2026-04-27-crosssell-cliente-view-design.md
  • docs/superpowers/plans/2026-04-27-crosssell-cliente-view.md

Mudança técnica

  • Sem mudança de schema — refatoração 100% de apresentação.
  • GET /api/comercial/crosssell agora retorna lista agrupada por cliente (CTE com json_agg).
  • Endpoints PATCH/POST/comentários/ganho/mapear inalterados.
  • 3 arquivos modificados: server/routes/crosssell.ts, client/src/pages/CrossSellPipeline.tsx, client/src/pages/CrossSellDashboard.tsx.

Validação automatizada

  • GET /api/comercial/crosssell: 112 clientes, ordenados por scoreMaximo desc ✅
  • Filtros aplicáveis (etapa, cluster) responsivos ✅
  • GET /api/comercial/crosssell/dashboard: KPIs novos retornam valores válidos (clientesEmNegociacao=0, coberturaBase=38.9%) ✅
  • Compilação TSX dos dois componentes: OK ✅

⚠️ Test plan (validação no browser ainda pendente)

Não consegui testar no browser nesta sessão. Antes de mergear, validar visualmente:

  • Pipeline carrega cards por cliente, ordenados por potencial
  • Filtros (cluster/CX/etapa/produto) reduzem a lista corretamente
  • Trocar ordenação altera a ordem
  • Trocar etapa numa linha atualiza o card
  • Linha em "Sugerido" mostra ✓ Aceitar e ✗ Descartar + frase de motivo abaixo
  • Aceitar uma sugestão move pra "Fazer Contato"
  • Descartar move pra "Descartado" e some
  • Dialog "Nova Oportunidade" funciona (busca cliente + cria)
  • Dialog "Ganho" mostra "Cliente: " e funciona
  • Drawer de comentários mostra "Comentários — " e funciona
  • Botão "Mapear Oportunidades" funciona
  • Dashboard mostra 9 KPIs com os 2 novos com valores válidos
  • Dark mode íntegro em ambas as páginas

🤖 Generated with Claude Code

Warleypablo and others added 11 commits April 27, 2026 14:08
Spec aprovado de mudança da página CrossSell Pipeline de card-por-oportunidade
para card-por-cliente, com serviços ativos e oportunidades mapeadas dentro
do mesmo card. Sem mudança de schema — refatoração 100% de apresentação.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Plano em 8 tasks (1 setup + 2 backend + 4 frontend pipeline + 1 dashboard
+ 1 verificacao). Refatoracao 100% de apresentacao, sem mudanca de schema.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…hadas

GET /api/comercial/crosssell agora retorna lista agrupada por cliente,
com servicosAtivos[], oportunidades[] e scoreMaximo para ordenacao.
Modelo de dados nao muda — mudanca apenas de shape da resposta.

Validado:
- 112 clientes retornados, ordenados por scoreMaximo desc
- Filtro etapa=sugerido_sistema retorna os mesmos 112 (toda base atual)
- Filtro etapa=fazer_contato retorna 0 (nao ha nessa etapa ainda)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Endpoint /api/comercial/crosssell/dashboard ganha clientesEmNegociacao
(COUNT DISTINCT cnpj de oportunidades em etapas ativas, excluindo
sugerido_sistema/ganho/descartado) e coberturaBase (% da base com pelo
menos 1 oportunidade aberta).

Validado: clientesEmNegociacao=0, coberturaBase=38.9% na base atual.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Substitui OpCard por ClienteCard (header CX/cluster/status/lifetime/R/P,
  chips de servicos ativos, lista de OportunidadeRow).
- OportunidadeRow: linha compacta com produto, dropdown de etapa, valor
  R em negociacao compacto, comentarios e ganho. Para sugerido_sistema
  mostra acoes Aceitar/Descartar + motivo abaixo.
- Reduz filtros de 6 para 4 (Cluster, CX, Etapa, Produto). Filtros agora
  aplicados no servidor via querystring.
- Adiciona dropdown de ordenacao (Maior potencial / MRR atual / Mais
  recentes / Alfabetico).
- Resumo no rodape passa a contar clientes e oportunidades.
- Dialogs Ganho/Comentarios recebem clienteNome como prop separada.
- Remove DataCell, PRIORIDADE_COLORS/LABELS e imports nao usados
  (Package, Calendar, ChevronDown).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ertura

Adiciona 2 cards de KPI focados em cobertura de cliente (alem dos
KPIs de funil ja existentes). Grid passa de 7 para 9 cards
(lg: 5 colunas, xl: 9 colunas).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Substitui a grid plana por accordion vertical, uma secao por etapa.
Cliente com oportunidades em N etapas aparece em N secoes, cada vez
focado na oportunidade daquela etapa. Backend permanece inalterado
(agrupamento puro de frontend).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6 tasks: 1 backend (POST aceita etapa opcional) + 4 frontend (group
helper, EtapaSection, refactor main, NewOpDialog) + 1 verificacao.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Permite criar oportunidade ja em uma etapa especifica via campo
'etapa' no body. Default permanece 'fazer_contato' quando nao
enviado. Habilita o botao "+" do accordion criar oportunidade
diretamente em etapas alem da inicial.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Substitui a grid plana por accordion vertical, uma secao por etapa.
Cliente com oportunidades em N etapas aparece em N secoes, focado
na oportunidade daquela etapa.

- Novo componente EtapaSection com header colapsavel + grid interno.
  Header mostra badge da etapa, contagem e botao + para nova
  oportunidade pre-preenchida com a etapa.
- ClienteCard ganha prop oportunidadesFiltradas? para renderizar
  apenas oportunidades da etapa correspondente.
- groupClientesByEtapa agrupa o array plano em Map<Etapa, ...>.
- 3 primeiras etapas com itens iniciam expandidas; sugerido_sistema
  e descartado iniciam colapsadas.
- NewOpDialog ganha prop etapaInicial? e mostra mensagem
  "Sera criada em: X" quando etapa difere de fazer_contato.
- Sort dropdown passa a ordenar dentro de cada secao.
- Resumo no rodape mostra "X clientes unicos" (clientes nao
  duplicados, mesmo aparecendo em multiplas secoes).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adiciona linha dedicada no card do pipeline com labels CxCs (responsavel
do cliente) e Vendedor (cup_clientes.vendedor), separada dos demais
metadados (cluster, status, lifetime) para melhor legibilidade.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@Warleypablo Warleypablo merged commit 9169d43 into main Apr 28, 2026
1 check passed
@Warleypablo Warleypablo deleted the feature/crosssell-cliente-view branch April 28, 2026 15:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant