import { useState, useEffect } from 'react'; import { reportsApi } from '../api/client'; import { formatMoney } from '../utils/calc'; const INCLUDE_OPTS = [ { key: 'ventas', label: 'Ventas' }, { key: 'servicios', label: 'Servicios' }, { key: 'alquileres', label: 'Alquileres' }, { key: 'gastos_diarios', label: 'Gastos diarios' }, { key: 'gastos_fijos', label: 'Gastos fijos' }, { key: 'personal', label: 'Personal' }, ]; export default function ReportesPage() { const [tipo, setTipo] = useState('mensual'); const [desde, setDesde] = useState(''); const [hasta, setHasta] = useState(''); const [include, setInclude] = useState( Object.fromEntries(INCLUDE_OPTS.map((o) => [o.key, true])) ); const [report, setReport] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const loadReport = async () => { setLoading(true); setError(null); try { const data = await reportsApi.get({ tipo, desde: desde || undefined, hasta: hasta || undefined, include: JSON.stringify(include), }); setReport(data); } catch (e) { setError(e.message); } finally { setLoading(false); } }; useEffect(() => { loadReport(); }, []); const toggleInclude = (key) => setInclude((p) => ({ ...p, [key]: !p[key] })); return (

Planilla de Reportes

Planillas a incluir en el cálculo:

{INCLUDE_OPTS.map((o) => ( ))}
{error &&
{error}
} {report && ( <>

Desglose por planilla

Ventas (ingresos) {formatMoney(report.desglose.ventas.totalIngresos)} Utilidad: {formatMoney(report.desglose.ventas.totalUtilidad)}
Servicios {formatMoney(report.desglose.servicios.totalIngresos)} Utilidad: {formatMoney(report.desglose.servicios.totalUtilidad)}
Alquileres {formatMoney(report.desglose.alquileres.totalIngresos)} Utilidad: {formatMoney(report.desglose.alquileres.totalUtilidad)}
Gastos diarios {formatMoney(report.desglose.gastosDiarios.total)}
Gastos fijos {formatMoney(report.desglose.gastosFijos.total)}
Gastos variables (clasificados) {formatMoney(report.desglose.gastosVariables.total)}
Planilla de personal {formatMoney(report.desglose.personal.total)}
Total ingresos: {formatMoney(report.totales.totalIngresos)} Total gastos: {formatMoney(report.totales.totalGastos)} Total personal: {formatMoney(report.totales.totalPersonal)}
{report.cierreSemanal && Object.keys(report.cierreSemanal).length > 0 && (

Cierre semanal — gastos diarios por semana

Total gastos semanales en periodo:{' '} {formatMoney(report.totalGastosSemanales)}

)} {report.cierreMensual && (

Cierre mensual consolidado

Gastos fijos en periodo: {formatMoney(report.cierreMensual.gastosFijosEnPeriodo)}

Total gastos mensuales consolidado:{' '} {formatMoney(report.cierreMensual.totalGastosMensualesConsolidado)}

)}
Resultado neto ({tipo}): {formatMoney(report.totales.resultadoNeto)} —{' '} {report.totales.estado === 'utilidad' ? 'UTILIDAD (Ganancia)' : 'PÉRDIDA'}

Fórmula: (Ventas + Alquileres + Servicios) − Total Gastos − Total Personal

)}
); }