'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
)}
)}
); }