feat(api,web): detalhamento da carteira do representante

Tela dedicada que abre pelo botao "Detalhar carteira" na listagem de
clientes, com leitura acionavel da carteira em vez de so uma tabela.

- `/reports/carteira` passa a devolver `faturamentoTotal`,
  `participacaoPct` e `faturamentoRepTotal`, permitindo medir o peso de
  cada cliente no faturamento do rep.
- `CarteirePage`: cards de resumo (ativos / em risco / inativos / sem
  pedido), faturamento total e InsightCards que apontam concentracao em
  poucos clientes, maior cliente em risco, maior inativo e clientes nunca
  positivados.
- Clientes classificados por dias sem comprar (30d em risco, 60d inativo),
  com navegacao direta para a ficha.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-20 18:16:47 +00:00
parent 2649bc9e94
commit 51602dd47e
5 changed files with 485 additions and 36 deletions

View File

@@ -30,6 +30,8 @@ export const CarteiraClienteSchema = z.object({
diasSemPedido: z.number().nullable(),
totalPedidos: z.number(),
ticketMedio: z.string(),
faturamentoTotal: z.string(),
participacaoPct: z.number(),
});
export type CarteiraCliente = z.infer<typeof CarteiraClienteSchema>;
@@ -39,6 +41,7 @@ export const ReportCarteiraResponseSchema = z.object({
inativos30: z.number(),
inativos60: z.number(),
semPedido: z.number(),
faturamentoRepTotal: z.string(),
});
export type ReportCarteiraResponse = z.infer<typeof ReportCarteiraResponseSchema>;