import { useState } from "react"; import { BarChart, Bar, LineChart, Line, PieChart, Pie, Cell, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, Area, AreaChart, ComposedChart } from "recharts"; const DATA = { monthly_prov: { Enero: { "LA RIOJA": 4490533.92, "SANTIAGO DEL ESTERO": 5348797.29, CATAMARCA: 6855118.3, total: 16694449.51, lineas: 196 }, Febrero: { "LA RIOJA": 11460163.87, "SANTIAGO DEL ESTERO": 6443328.62, CATAMARCA: 13989420.92, total: 31892913.41, lineas: 305 }, Marzo: { "LA RIOJA": 14565640.9, "SANTIAGO DEL ESTERO": 7747119.29, CATAMARCA: 13610076.8, total: 35922836.99, lineas: 373 }, Abril: { "LA RIOJA": 17463974.38, "SANTIAGO DEL ESTERO": 10935618.77, CATAMARCA: 13590755.36, total: 41990348.51, lineas: 322 }, }, monthly_rubro: { Enero: { SALARIOS: 6794092.92, "GASTOS DE PERSONAL": 4037795.92, "COMBUSTIBLES Y LUBRICANTES": 1288329.02, "OTROS GASTOS FIJOS": 1036426, "MOVILIDAD Y VIÁTICOS": 962137.8, "REPARACIONES Y MANTENIMIENTO": 859815, "SERVICIOS BÁSICOS": 687333.73, ALQUILERES: 594230 }, Febrero: { SALARIOS: 9747542.44, "GASTOS DE PERSONAL": 4156123.01, "COMBUSTIBLES Y LUBRICANTES": 1787381.26, "OTROS GASTOS FIJOS": 6193322.04, "MOVILIDAD Y VIÁTICOS": 2079745.2, "REPARACIONES Y MANTENIMIENTO": 1448736.36, "SERVICIOS BÁSICOS": 1741154.9, ALQUILERES: 3949561 }, Marzo: { SALARIOS: 8710459.32, "GASTOS DE PERSONAL": 4828811.65, "COMBUSTIBLES Y LUBRICANTES": 2945757.57, "OTROS GASTOS FIJOS": 8226660, "MOVILIDAD Y VIÁTICOS": 2509728.32, "REPARACIONES Y MANTENIMIENTO": 2314741.98, "SERVICIOS BÁSICOS": 862224.15, ALQUILERES: 4986754 }, Abril: { SALARIOS: 7661785.43, "GASTOS DE PERSONAL": 5784478.84, "COMBUSTIBLES Y LUBRICANTES": 2458409.08, "OTROS GASTOS FIJOS": 13615638.94, "MOVILIDAD Y VIÁTICOS": 1985145, "REPARACIONES Y MANTENIMIENTO": 1966271.56, "SERVICIOS BÁSICOS": 927081.17, ALQUILERES: 5158604 }, }, total_cuatri: 126500548.42, total_lineas: 1196, }; const MESES = ["Enero", "Febrero", "Marzo", "Abril"]; const PROVS = ["LA RIOJA", "SANTIAGO DEL ESTERO", "CATAMARCA"]; const PROV_COLORS = { "LA RIOJA": "#2E7D32", "SANTIAGO DEL ESTERO": "#1565C0", CATAMARCA: "#C62828" }; const RUBRO_COLORS = { SALARIOS: "#F9A825", "GASTOS DE PERSONAL": "#42A5F5", "COMBUSTIBLES Y LUBRICANTES": "#EF6C00", "OTROS GASTOS FIJOS": "#7E57C2", "MOVILIDAD Y VIÁTICOS": "#66BB6A", "REPARACIONES Y MANTENIMIENTO": "#EF5350", "SERVICIOS BÁSICOS": "#26A69A", ALQUILERES: "#FDD835", }; const fmt = (v) => `$${(v / 1e6).toFixed(1)}M`; const fmtFull = (v) => new Intl.NumberFormat("es-AR", { style: "currency", currency: "ARS", maximumFractionDigits: 0 }).format(v); const pct = (v, t) => `${((v / t) * 100).toFixed(1)}%`; const CustomTooltip = ({ active, payload, label }) => { if (!active || !payload) return null; return (

{label}

{payload.map((p, i) => (

{p.name}: {fmtFull(p.value)}

))}
); }; export default function Dashboard() { const [view, setView] = useState("provincia"); const [selectedProv, setSelectedProv] = useState(null); const monthlyData = MESES.map((m) => ({ mes: m.substring(0, 3), mesFull: m, ...DATA.monthly_prov[m], total: DATA.monthly_prov[m].total, lineas: DATA.monthly_prov[m].lineas, })); const rubroData = MESES.map((m) => ({ mes: m.substring(0, 3), ...DATA.monthly_rubro[m] })); const RUBROS = Object.keys(DATA.monthly_rubro.Enero); const pieData = PROVS.map((p) => ({ name: p, value: MESES.reduce((s, m) => s + DATA.monthly_prov[m][p], 0), })); const provDetail = selectedProv ? MESES.map((m) => ({ mes: m.substring(0, 3), mesFull: m, total: DATA.monthly_prov[m][selectedProv], ...Object.fromEntries(RUBROS.map((r) => [r, DATA.monthly_rubro[m][r] || 0])), })) : null; const varEneAbr = ((DATA.monthly_prov.Abril.total - DATA.monthly_prov.Enero.total) / DATA.monthly_prov.Enero.total * 100).toFixed(0); return (
{/* Header */}

GASTOS DE CAJA 2026

CHESS ERP · ENERO — ABRIL

{/* KPIs */}
{[ { label: "Total Cuatrimestre", value: fmt(DATA.total_cuatri), sub: fmtFull(DATA.total_cuatri), color: "#66BB6A" }, { label: "Líneas Procesadas", value: DATA.total_lineas.toLocaleString(), sub: `${Math.round(DATA.total_lineas / 4)}/mes promedio`, color: "#42A5F5" }, { label: "Promedio Mensual", value: fmt(DATA.total_cuatri / 4), sub: fmtFull(DATA.total_cuatri / 4), color: "#FFA726" }, { label: "Crecimiento Ene→Abr", value: `+${varEneAbr}%`, sub: `${fmt(DATA.monthly_prov.Enero.total)} → ${fmt(DATA.monthly_prov.Abril.total)}`, color: "#EF5350" }, ].map((kpi, i) => (

{kpi.label}

{kpi.value}

{kpi.sub}

))}
{/* View Toggle */}
{[ { key: "provincia", label: "🌎 Por Provincia" }, { key: "rubro", label: "📊 Por Rubro" }, { key: "tabla", label: "📋 Tabla Cruzada" }, ].map((v) => ( ))}
{/* VIEW: PROVINCIA */} {view === "provincia" && (
{/* Bar chart */}

EVOLUCIÓN MENSUAL POR PROVINCIA

fmt(v)} tick={{ fill: "#888", fontSize: 10 }} /> } /> {PROVS.map((p) => ( setSelectedProv(p)} />))}
{/* Pie + trend */}

DISTRIBUCIÓN ACUMULADA

`${name.split(" ")[0]} ${(percent * 100).toFixed(0)}%`} labelLine={false} style={{ fontSize: 9 }}> {pieData.map((_, i) => ())} fmtFull(v)} />

TENDENCIA TOTAL

fmt(v)} tick={{ fill: "#888", fontSize: 9 }} /> } />
{/* Province cards */}
{PROVS.map((prov) => { const total = MESES.reduce((s, m) => s + DATA.monthly_prov[m][prov], 0); const ene = DATA.monthly_prov.Enero[prov]; const abr = DATA.monthly_prov.Abril[prov]; const growth = ((abr - ene) / ene * 100).toFixed(0); const selected = selectedProv === prov; return (
setSelectedProv(selected ? null : prov)} style={{ background: selected ? `${PROV_COLORS[prov]}18` : "rgba(255,255,255,0.03)", borderRadius: 14, padding: 18, border: `1px solid ${selected ? PROV_COLORS[prov] + "60" : "rgba(255,255,255,0.06)"}`, cursor: "pointer", transition: "all 0.2s" }}>
📍 {prov} 0 ? "#66BB6A" : "#EF5350", fontWeight: 600 }}> {Number(growth) > 0 ? "▲" : "▼"} {growth}%

{fmt(total)}

{pct(total, DATA.total_cuatri)} del total · {fmtFull(total)}

{MESES.map((m) => { const v = DATA.monthly_prov[m][prov]; const maxV = Math.max(...MESES.map((mm) => DATA.monthly_prov[mm][prov])); return (

{m.substring(0, 3)}

); })}
); })}
{/* Drill-down */} {selectedProv && (

📊 Detalle: {selectedProv}

{MESES.map((m) => (

{m}

{fmt(DATA.monthly_prov[m][selectedProv])}

{pct(DATA.monthly_prov[m][selectedProv], DATA.monthly_prov[m].total)} del mes

))}
)}
)} {/* VIEW: RUBRO */} {view === "rubro" && (

EVOLUCIÓN POR RUBRO (APILADO)

fmt(v)} tick={{ fill: "#888", fontSize: 10 }} /> } /> {RUBROS.map((r) => ( 22 ? r.substring(0, 20) + "…" : r} />))}
{RUBROS.map((rubro) => { const total = MESES.reduce((s, m) => s + (DATA.monthly_rubro[m][rubro] || 0), 0); return (

{rubro}

{fmt(total)}

{pct(total, DATA.total_cuatri)}

); })}
)} {/* VIEW: TABLA */} {view === "tabla" && (

MATRIZ PROVINCIA × MES

{MESES.map((m) => ())} {PROVS.map((prov) => { const total = MESES.reduce((s, m) => s + DATA.monthly_prov[m][prov], 0); return ( {MESES.map((m) => ())} ); })} {MESES.map((m) => ())}
Provincia{m}TOTAL %
📍 {prov}{fmtFull(DATA.monthly_prov[m][prov])}{fmtFull(total)} {pct(total, DATA.total_cuatri)}
TOTAL{fmtFull(DATA.monthly_prov[m].total)}{fmtFull(DATA.total_cuatri)} 100%

MATRIZ RUBRO × MES

{MESES.map((m) => ())} {RUBROS.map((rubro) => { const total = MESES.reduce((s, m) => s + (DATA.monthly_rubro[m][rubro] || 0), 0); return ( {MESES.map((m) => ())} ); })}
Rubro{m}TOTAL
{rubro} {fmtFull(DATA.monthly_rubro[m][rubro] || 0)}{fmtFull(total)}
)}

Dashboard generado desde datos crudos CHESS ERP · Enero–Abril 2026 · Total: {fmtFull(DATA.total_cuatri)}

); }