feat(dashboard): painel Rafael — meta, comissão, inativos, pedidos recentes (C7)

GET /dashboard/rep retorna meta mensal, comissão (fixa + FLEX), clientes
inativos >30 dias e pedidos dos últimos 7 dias. RepTarget model com migration.
RafaelPainel conectado à API real via useRepDashboard().

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-28 00:29:31 +00:00
parent 356c8e3c2c
commit 6028bf1ba9
12 changed files with 432 additions and 105 deletions

View File

@@ -3,3 +3,4 @@ export * from './lib/auth.contract';
export * from './lib/client.contract';
export * from './lib/order.contract';
export * from './lib/product.contract';
export * from './lib/dashboard.contract';

View File

@@ -0,0 +1,29 @@
import { z } from 'zod';
import { OrderSummarySchema } from './order.contract';
export const ClienteInativoSchema = z.object({
id: z.string().uuid(),
name: z.string(),
diasSemCompra: z.number().int(),
ultimaCompraValor: z.string().nullable(),
});
export type ClienteInativo = z.infer<typeof ClienteInativoSchema>;
export const RepDashboardSchema = z.object({
meta: z.object({
atingido: z.number(),
total: z.number(),
pct: z.number(),
falta: z.number(),
}),
comissao: z.object({
fixa: z.number(),
flex: z.number(),
total: z.number(),
}),
pedidosMes: z.number().int(),
pedidosRecentes: z.array(OrderSummarySchema),
clientesInativos: z.array(ClienteInativoSchema),
syncedAt: z.iso.datetime(),
});
export type RepDashboard = z.infer<typeof RepDashboardSchema>;