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:
@@ -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';
|
||||
|
||||
29
libs/shared/api-interface/src/lib/dashboard.contract.ts
Normal file
29
libs/shared/api-interface/src/lib/dashboard.contract.ts
Normal 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>;
|
||||
Reference in New Issue
Block a user