'use client'; import { useState } from 'react'; import { DashboardShell } from '@/components/layouts/dashboard-shell'; import { Card, CardContent, CardHeader, CardTitle, Tabs, TabsContent, TabsList, TabsTrigger } from '@horux/shared-ui'; import { PeriodSelector, RegimenSelector, KpiCard } from '@horux/shared-ui'; import { useEstadoResultados, useFlujoEfectivo, useComparativo, useConcentradoRfc, useCuentasXPagar, useCuentasXCobrar } from '@/lib/hooks/use-reportes'; import { useRegimenesDelPeriodo } from '@/lib/hooks/use-dashboard'; import { BarChart } from '@/components/charts/bar-chart'; import { formatCurrency } from '@/lib/utils'; import { FileText, TrendingUp, TrendingDown, Users, CreditCard, Banknote } from 'lucide-react'; import { FiscalDisclaimer } from '@/components/fiscal-disclaimer'; export default function ReportesPage() { const now = new Date(); const [fechaInicio, setFechaInicio] = useState(`${now.getFullYear()}-01-01`); const [fechaFin, setFechaFin] = useState(`${now.getFullYear()}-12-31`); const [regimenSeleccionado, setRegimenSeleccionado] = useState(null); const año = new Date(fechaInicio + 'T00:00:00').getFullYear(); const { data: regimenesPeriodo, isLoading: regimenesLoading } = useRegimenesDelPeriodo(fechaInicio, fechaFin); const { data: estadoResultados, isLoading: loadingER, error: errorER } = useEstadoResultados(fechaInicio, fechaFin); const regimenesDisponibles = regimenesPeriodo || []; if (regimenSeleccionado && regimenesDisponibles.length > 0 && !regimenesDisponibles.find(r => r.clave === regimenSeleccionado)) { setRegimenSeleccionado(null); } 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); const { data: cxp, isLoading: loadingCXP } = useCuentasXPagar(fechaInicio, fechaFin, regimenSeleccionado || undefined); const { data: cxc, isLoading: loadingCXC } = useCuentasXCobrar(fechaInicio, fechaFin, regimenSeleccionado || undefined); return ( { setFechaInicio(fi); setFechaFin(ff); }} /> } >
Estado de Resultados Flujo de Efectivo Comparativo Concentrado RFC Cuentas X Pagar Cuentas X Cobrar {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 Año Anterior
= 0 ? 'text-success' : 'text-destructive'}`}> {comparativo.variacionIngresos >= 0 ? '+' : ''}{comparativo.variacionIngresos.toFixed(1)}%
Var. Egresos vs Año Anterior
{comparativo.variacionEgresos >= 0 ? '+' : ''}{comparativo.variacionEgresos.toFixed(1)}%
Año 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
)}
)}
{loadingCXP ? (
Cargando...
) : ( <>
} /> } trend={(cxp?.saldoTotal || 0) > 0 ? 'up' : 'neutral'} trendValue="Por pagar" />
Saldo por Proveedor {cxp?.detalle.length === 0 ? (

No hay cuentas por pagar en el periodo

) : (
{cxp?.detalle.map((d) => ( ))}
RFC Nombre CFDIs Saldo Pendiente
{d.rfc} {d.nombre} {d.cantidad} {formatCurrency(d.saldo)}
)}
)}
{loadingCXC ? (
Cargando...
) : ( <>
} /> } trend={(cxc?.saldoTotal || 0) > 0 ? 'up' : 'neutral'} trendValue="Por cobrar" />
Saldo por Cliente {cxc?.detalle.length === 0 ? (

No hay cuentas por cobrar en el periodo

) : (
{cxc?.detalle.map((d) => ( ))}
RFC Nombre CFDIs Saldo Pendiente
{d.rfc} {d.nombre} {d.cantidad} {formatCurrency(d.saldo)}
)}
)}
); }