'use client'; import React, { useState, useEffect } from 'react'; import { AreaChart, Area, PieChart, Pie, Cell, ResponsiveContainer, CartesianGrid, XAxis, YAxis, Tooltip, Legend } from 'recharts'; import { ArrowTrendingUpIcon, ArrowTrendingDownIcon, CubeIcon, CurrencyDollarIcon, CreditCardIcon, ClockIcon, } from "@heroicons/react/24/outline"; import { erpApi, FinancialTransaction, Order, FinancialCategory, Entity } from '@/lib/api-erp'; import { formatCurrency } from '@/lib/format'; import { PageHeader, StatsCard, Card } from "@/components/ui"; import { SolutionGuard } from '@/components/auth/SolutionGuard'; const COLORS = ['#8b5cf6', '#ec4899', '#f43f5e', '#f59e0b', '#10b981', '#3b82f6']; function ERPDashboardContent() { const [transactions, setTransactions] = useState([]); const [orders, setOrders] = useState([]); const [categories, setCategories] = useState([]); const [entities, setEntities] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { const fetchData = async () => { try { const [txData, orderData, categoriesData, entitiesData] = await Promise.all([ erpApi.getTransactions(), erpApi.getOrders(), erpApi.getFinancialCategories(), erpApi.getEntities() ]); setTransactions(Array.isArray(txData) ? txData : []); setOrders(Array.isArray(orderData) ? orderData : []); setCategories(Array.isArray(categoriesData) ? categoriesData : []); setEntities(Array.isArray(entitiesData) ? entitiesData : []); } catch (error) { console.error('Error fetching dashboard data:', error); } finally { setLoading(false); } }; fetchData(); }, []); const paidTransactions = (transactions || []).filter(t => t.status === 'paid'); const totalIncome = paidTransactions .filter(t => t.type === 'income') .reduce((sum, t) => sum + Number(t.amount || 0), 0); const totalExpense = paidTransactions .filter(t => t.type === 'expense') .reduce((sum, t) => sum + Number(t.amount || 0), 0); const pendingIncome = (transactions || []) .filter(t => t.type === 'income' && t.status === 'pending') .reduce((sum, t) => sum + Number(t.amount || 0), 0); const pendingExpense = (transactions || []) .filter(t => t.type === 'expense' && t.status === 'pending') .reduce((sum, t) => sum + Number(t.amount || 0), 0); const balance = totalIncome - totalExpense; // Process chart data (Income vs Expense by Month) const getChartData = () => { const months = ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez']; const currentYear = new Date().getFullYear(); const data = months.map((month, index) => { const monthTransactions = paidTransactions.filter(t => { const date = new Date(t.payment_date || t.due_date || ''); return date.getMonth() === index && date.getFullYear() === currentYear; }); const income = monthTransactions .filter(t => t.type === 'income') .reduce((sum, t) => sum + Number(t.amount || 0), 0); const expense = monthTransactions .filter(t => t.type === 'expense') .reduce((sum, t) => sum + Number(t.amount || 0), 0); return { name: month, income, expense }; }); const currentMonthIndex = new Date().getMonth(); // Mostrar pelo menos os últimos 6 meses ou o ano todo se for o caso return data.slice(Math.max(0, currentMonthIndex - 5), currentMonthIndex + 1); }; // Process category data (Expenses by Category) const getCategoryData = () => { const expenseTransactions = paidTransactions.filter(t => t.type === 'expense'); const breakdown: Record = {}; expenseTransactions.forEach(t => { const category = categories.find(c => c.id === t.category_id)?.name || 'Outros'; breakdown[category] = (breakdown[category] || 0) + Number(t.amount || 0); }); return Object.entries(breakdown) .map(([name, value]) => ({ name, value })) .sort((a, b) => b.value - a.value) .slice(0, 6); }; const chartData = getChartData(); const categoryData = getCategoryData(); if (loading) return (
); return (
} trend={{ value: formatCurrency(pendingIncome), label: 'pendente', type: 'up' }} /> } trend={{ value: formatCurrency(pendingExpense), label: 'pendente', type: 'down' }} /> } /> } />
{chartData.some(d => d.income > 0 || d.expense > 0) ? ( `R$${val}`} /> formatCurrency(value || 0)} /> ) : (
Ainda não há dados financeiros suficientes para exibir o gráfico.
)}
{categoryData.length > 0 ? ( {categoryData.map((entry, index) => ( ))} formatCurrency(value || 0)} /> ) : (
Ainda não há despesas pagas registradas.
)}
{transactions.slice(0, 5).map((t) => ( ))} {transactions.length === 0 && ( )}
Descrição Categoria Data Valor Status
{t.description} {categories.find(c => c.id === t.category_id)?.name || 'Outros'} {new Date(t.payment_date || t.due_date || '').toLocaleDateString('pt-BR')} {t.type === 'income' ? '+' : '-'} {formatCurrency(t.amount)} {t.status === 'paid' ? 'Pago' : t.status === 'pending' ? 'Pendente' : 'Cancelado'}
Nenhuma transação encontrada.
); } export default function ERPPage() { return ( ); }