import { useMemo } from 'react'; import { useOutletContext } from 'react-router-dom'; import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, PieChart, Pie, Cell } from 'recharts'; import { DollarSign, ShoppingCart, TrendingUp } from 'lucide-react'; import DateRangePicker from '../components/DateRangePicker'; import type { OrderData, DateRange } from '../types'; import { parseOrderDate } from '../dataService'; const COLORS = [ '#10b981', '#3b82f6', '#8b5cf6', '#f43f5e', '#f97316', '#06b6d4', '#ec4899', '#eab308', '#6366f1', '#14b8a6' ]; const Dashboard = () => { const { dateRange, setDateRange, ordersData } = useOutletContext<{ dateRange: DateRange, setDateRange: (range: DateRange) => void, ordersData: OrderData[] }>(); const filteredData = useMemo(() => { const orders = ordersData; return orders.filter(order => { const orderDate = parseOrderDate(order.Data_Pedido); return orderDate >= dateRange.start && orderDate <= dateRange.end; }); }, [dateRange, ordersData]); const { totalRevenue, totalOrders, averageOrderValue, salesByProduct } = useMemo(() => { let revenue = 0; let totalItems = 0; const productSalesMap: Record = {}; filteredData.forEach(order => { revenue += (order.Quantidade * order.Valor_Unitario); totalItems += order.Quantidade; const productName = order.Descricao_Produto.split(' TAMANHO')[0]; if (productSalesMap[productName]) { productSalesMap[productName] += order.Quantidade; } else { productSalesMap[productName] = order.Quantidade; } }); const productsData = Object.keys(productSalesMap).map(key => ({ name: key, value: productSalesMap[key] })).sort((a, b) => b.value - a.value).slice(0, 10); return { totalRevenue: revenue, totalOrders: totalItems, averageOrderValue: revenue / (filteredData.length || 1), salesByProduct: productsData }; }, [filteredData]); const formatCurrency = (value: number) => { return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(value); }; return (

Visão Geral

Resumo de vendas e performance dos produtos.

Receita Total

{formatCurrency(totalRevenue)}

Total de Produtos Vendidos

{totalOrders}

Ticket Médio (Por Item)

{formatCurrency(averageOrderValue)}

Produtos Mais Vendidos

{salesByProduct.map((_, index) => ( ))}

Distribuição de Produtos

{salesByProduct.map((_, index) => ( ))}
{salesByProduct.map((entry, index) => (
{entry.name}
))}
); }; export default Dashboard;