'use client'; import { useState } from 'react'; import { DashboardShell } from '@/components/layouts/dashboard-shell'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { PeriodSelector } from '@/components/period-selector'; import { useEstadoResultados, useFlujoEfectivo, useComparativo, useConcentradoRfc } from '@/lib/hooks/use-reportes'; import { BarChart } from '@/components/charts/bar-chart'; import { formatCurrency } from '@/lib/utils'; import { FileText, TrendingUp, TrendingDown, Users } from 'lucide-react'; export default function ReportesPage() { const [año, setAño] = useState(new Date().getFullYear()); const fechaInicio = `${año}-01-01`; const fechaFin = `${año}-12-31`; const { data: estadoResultados, isLoading: loadingER, error: errorER } = useEstadoResultados(fechaInicio, fechaFin); const { data: flujoEfectivo, isLoading: loadingFE, error: errorFE } = useFlujoEfectivo(fechaInicio, fechaFin); const { data: comparativo, isLoading: loadingComp, error: errorComp } = useComparativo(año); const { data: clientes, error: errorClientes } = useConcentradoRfc('cliente', fechaInicio, fechaFin); const { data: proveedores, error: errorProveedores } = useConcentradoRfc('proveedor', fechaInicio, fechaFin); return ( } > Estado de Resultados Flujo de Efectivo Comparativo Concentrado RFC {loadingER ? ( Cargando... ) : errorER ? ( Error: {(errorER as Error).message} ) : !estadoResultados ? ( No hay datos disponibles para el período seleccionado ) : ( <> Total Ingresos {formatCurrency(estadoResultados.totalIngresos)} Total Egresos {formatCurrency(estadoResultados.totalEgresos)} Utilidad Bruta = 0 ? 'text-success' : 'text-destructive'}`}> {formatCurrency(estadoResultados.utilidadBruta)} Utilidad Neta = 0 ? 'text-success' : 'text-destructive'}`}> {formatCurrency(estadoResultados.utilidadNeta)} Top 10 Ingresos por Cliente {estadoResultados.ingresos.map((item, i) => ( {item.concepto} {formatCurrency(item.monto)} ))} Top 10 Egresos por Proveedor {estadoResultados.egresos.map((item, i) => ( {item.concepto} {formatCurrency(item.monto)} ))} > )} {loadingFE ? ( Cargando... ) : errorFE ? ( Error: {(errorFE as Error).message} ) : !flujoEfectivo ? ( No hay datos de flujo de efectivo ) : ( <> Total Entradas {formatCurrency(flujoEfectivo.totalEntradas)} Total Salidas {formatCurrency(flujoEfectivo.totalSalidas)} Flujo Neto = 0 ? 'text-success' : 'text-destructive'}`}> {formatCurrency(flujoEfectivo.flujoNeto)} ({ mes: e.concepto, ingresos: e.monto, egresos: flujoEfectivo.salidas[i]?.monto || 0, }))} /> > )} {loadingComp ? ( Cargando... ) : errorComp ? ( Error: {(errorComp as Error).message} ) : !comparativo ? ( No hay datos comparativos ) : ( <> Var. Ingresos vs Ano Anterior = 0 ? 'text-success' : 'text-destructive'}`}> {comparativo.variacionIngresos >= 0 ? '+' : ''}{comparativo.variacionIngresos.toFixed(1)}% Var. Egresos vs Ano Anterior {comparativo.variacionEgresos >= 0 ? '+' : ''}{comparativo.variacionEgresos.toFixed(1)}% Ano Actual {año} ({ mes, ingresos: comparativo.ingresos[i], egresos: comparativo.egresos[i], }))} /> > )} {errorClientes || errorProveedores ? ( Error: {((errorClientes || errorProveedores) as Error).message} ) : ( Clientes {clientes && clientes.length > 0 ? ( clientes.slice(0, 10).map((c, i) => ( {c.nombre} {c.rfc} - {c.cantidadCfdis} CFDIs {formatCurrency(c.totalFacturado)} )) ) : ( Sin clientes )} Proveedores {proveedores && proveedores.length > 0 ? ( proveedores.slice(0, 10).map((p, i) => ( {p.nombre} {p.rfc} - {p.cantidadCfdis} CFDIs {formatCurrency(p.totalFacturado)} )) ) : ( Sin proveedores )} )} ); }