feat(web+api): cockpit gerente — painel, equipe, políticas e positivação
## API - GET /dashboard/manager: KPIs agregados (faturamento, pedidos, ticket médio, promoções ativas), meta total do período, ranking top 10 com clientes atendidos e % meta, positivação por representante, venda necessária/dia - Parâmetros opcionais ?mes&ano para filtrar período - GET /equipe: lista de reps com pedidos, faturamento, ticket médio e % meta (deduplicação de vw_representantes) - GET/POST /politicas/descontos: alçada de desconto por rep (AlcadaDesconto) - GET/POST/PATCH/DELETE /politicas/promocoes: CRUD de promoções com validade - Metas lidas de sar.vw_metas (tipo=GR), não de vw_metas do ERP ## Schema - Novo model Promocao (sar.promocoes) criado via prisma db execute ## Frontend - Cockpit /ger: GerPainel, EquipePage, PoliticasPage - GerPainel: filtro mes/ano, cards KPI, cards de meta vs realizado (atingimento, falta, venda/dia), ranking com clientes atendidos, positivação de clientes por representante (paginada) - Sidebar e BottomNav role-aware: rep / supervisor / gerente (manager+admin) - Clientes acessível ao gerente (carteira completa de todos os reps) - Rotas: HomeRoute redireciona por role; /ger, /ger/equipe, /ger/politicas Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -409,6 +409,8 @@ function CustomerDetailsModal({
|
||||
onAnalyze: () => void;
|
||||
}) {
|
||||
const navigate = useNavigate();
|
||||
const screens = useBreakpoint();
|
||||
const isMobile = !screens.md;
|
||||
const { data: detail, isLoading: loadingDetail } = useClientDetail(summary?.idCliente);
|
||||
const { data: orders = [], isLoading: loadingOrders } = useClientOrders(summary?.idCliente);
|
||||
|
||||
@@ -451,7 +453,7 @@ function CustomerDetailsModal({
|
||||
open={!!summary}
|
||||
onCancel={onClose}
|
||||
centered
|
||||
width={860}
|
||||
width={isMobile ? '95vw' : 860}
|
||||
destroyOnHidden
|
||||
styles={{
|
||||
body: { padding: '20px 24px', maxHeight: 'calc(85vh - 110px)', overflowY: 'auto' },
|
||||
@@ -741,6 +743,8 @@ function CustomerAnalysisModal({
|
||||
summary: ClientSummary | null;
|
||||
onClose: () => void;
|
||||
}) {
|
||||
const screens = useBreakpoint();
|
||||
const isMobile = !screens.md;
|
||||
const { data: detail } = useClientDetail(summary?.idCliente);
|
||||
|
||||
if (!summary) return null;
|
||||
@@ -771,7 +775,7 @@ function CustomerAnalysisModal({
|
||||
open={!!summary}
|
||||
onCancel={onClose}
|
||||
centered
|
||||
width={720}
|
||||
width={isMobile ? '95vw' : 720}
|
||||
destroyOnHidden
|
||||
styles={{ body: { padding: '20px 24px' } }}
|
||||
footer={
|
||||
|
||||
Reference in New Issue
Block a user