diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx index f273114..1146fbd 100644 --- a/src/pages/Dashboard.tsx +++ b/src/pages/Dashboard.tsx @@ -1,7 +1,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import { useOutletContext, useNavigate } from 'react-router-dom'; import { AreaChart, Area, BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, PieChart, Pie, Cell } from 'recharts'; -import { AlertTriangle, Bot, ClipboardList, DollarSign, Package, ShoppingCart, TrendingUp } from 'lucide-react'; +import { DollarSign, ShoppingCart, TrendingUp } from 'lucide-react'; import DateRangePicker from '../components/DateRangePicker'; import RefreshStatus from '../components/RefreshStatus'; import type { DashboardAnalytics, OrderData, DateRange } from '../types'; @@ -161,15 +161,6 @@ const kpiIconStyle = (color: string) => ({ color }); -type OperationalInsight = { - title: string; - description: string; - icon: typeof Bot; - accentClassName: string; - actionLabel: string; - actionTo: string; -}; - const DashboardSkeleton = () => (
@@ -511,60 +502,6 @@ const Dashboard = () => { const focusedSeller = focusedSellerId ? sellerTimeSeries.sellers.find(seller => seller.id === focusedSellerId) : null; const effectiveFocusedSellerId = focusedSeller?.id || null; - const operationalInsights = useMemo(() => { - const insights: OperationalInsight[] = []; - const topProduct = salesByProduct[0]; - const topRevenueProduct = revenueByProduct[0]; - const topSeller = chartRevenueBySeller[0]; - const soldUnits = salesByProduct.reduce((total, product) => total + product.value, 0); - const topProductShare = topProduct && soldUnits ? topProduct.value / soldUnits : 0; - - if (topProduct && topProductShare >= 0.35) { - insights.push({ - title: `${topProduct.name} concentra ${Math.round(topProductShare * 100)}% das unidades vendidas`, - description: 'Priorize a conferência de estoque e corte para evitar ruptura no item mais sensível do período.', - icon: AlertTriangle, - accentClassName: 'border-amber-400/30 bg-amber-400/10 text-amber-300', - actionLabel: 'Abrir corte', - actionTo: '/cutting' - }); - } - - if (topRevenueProduct && topRevenueProduct.value > 0) { - insights.push({ - title: `${topRevenueProduct.name} lidera a receita do período`, - description: `${formatCurrency(topRevenueProduct.value)} em receita. Compare disponibilidade e necessidade de compra antes de vender sem cobertura.`, - icon: Package, - accentClassName: 'border-sky-400/30 bg-sky-400/10 text-sky-300', - actionLabel: 'Ver suprimentos', - actionTo: '/supplies' - }); - } - - if (topSeller && topSeller.value > 0) { - insights.push({ - title: `${topSeller.name} puxa a maior receita por vendedor`, - description: `${formatCurrency(topSeller.value)} no período selecionado. Use o gráfico abaixo para comparar ritmo e concentração.`, - icon: TrendingUp, - accentClassName: 'border-emerald-400/30 bg-emerald-400/10 text-emerald-300', - actionLabel: 'Analisar vendas', - actionTo: '/graph' - }); - } - - if (totalOrders > 0 && averageOrderValue > 0) { - insights.push({ - title: `Ticket médio por item em ${formatCurrency(averageOrderValue)}`, - description: `${new Intl.NumberFormat('pt-BR').format(totalOrders)} unidades vendidas no período. Revise mix de produtos e abastecimento dos campeões.`, - icon: ClipboardList, - accentClassName: 'border-brand-primary/30 bg-brand-primary/10 text-brand-primary', - actionLabel: 'Ver produtos', - actionTo: '/products' - }); - } - - return insights.slice(0, 4); - }, [averageOrderValue, chartRevenueBySeller, revenueByProduct, salesByProduct, totalOrders]); const handleManualRefresh = () => { void loadDashboardMetrics(dateRange, { force: true }); @@ -594,63 +531,6 @@ const Dashboard = () => { ) : (
- -
-
-
-
-
- -
-
-

Copiloto operacional

-

- Leituras automáticas do período selecionado para orientar vendas, estoque e produção. -

-
-
- -
-
- - {operationalInsights.length ? ( -
- {operationalInsights.map((insight) => ( -
-
-
- -
-
-

{insight.title}

-

{insight.description}

- -
-
-
- ))} -
- ) : ( -
-
- Sem sinais operacionais suficientes no período selecionado. -
-
- )} -
-