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 (
);
})}
);
})}
{/* 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
| Provincia |
{MESES.map((m) => ({m} | ))}
TOTAL |
% |
{PROVS.map((prov) => {
const total = MESES.reduce((s, m) => s + DATA.monthly_prov[m][prov], 0);
return (
| 📍 {prov} |
{MESES.map((m) => ({fmtFull(DATA.monthly_prov[m][prov])} | ))}
{fmtFull(total)} |
{pct(total, DATA.total_cuatri)} |
);
})}
| TOTAL |
{MESES.map((m) => ({fmtFull(DATA.monthly_prov[m].total)} | ))}
{fmtFull(DATA.total_cuatri)} |
100% |
MATRIZ RUBRO × MES
| Rubro |
{MESES.map((m) => ({m} | ))}
TOTAL |
{RUBROS.map((rubro) => {
const total = MESES.reduce((s, m) => s + (DATA.monthly_rubro[m][rubro] || 0), 0);
return (
|
{rubro}
|
{MESES.map((m) => ({fmtFull(DATA.monthly_rubro[m][rubro] || 0)} | ))}
{fmtFull(total)} |
);
})}
)}
Dashboard generado desde datos crudos CHESS ERP · Enero–Abril 2026 · Total: {fmtFull(DATA.total_cuatri)}
);
}