From 9ee3cc1e3b480b89b93fd386537d071c2c78afc4 Mon Sep 17 00:00:00 2001 From: Administrator Date: Wed, 26 Aug 2026 13:23:39 -0500 Subject: [PATCH] Actualizar frontend/src/pages/Cobranza.jsx --- frontend/src/pages/Cobranza.jsx | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/frontend/src/pages/Cobranza.jsx b/frontend/src/pages/Cobranza.jsx index 3ed9739..05cedc2 100644 --- a/frontend/src/pages/Cobranza.jsx +++ b/frontend/src/pages/Cobranza.jsx @@ -95,6 +95,14 @@ export default function Cobranza() { return () => { activo = false; }; }, [ano, mes, sectorista]); + // Cargar matrículas POR RETIRAR (para el "Saldo por Retirar" de las tarjetas) + const [porRetirar, setPorRetirar] = useState(new Set()); + useEffect(() => { + api.alumnosPorRetirar() + .then((r) => setPorRetirar(new Set((r.matriculas || []).map(String)))) + .catch(() => {}); + }, [ano, mes]); + // Cargar clasificación de sede (sede.json) para los programas visibles useEffect(() => { if (!esPrograma) return; @@ -165,6 +173,17 @@ export default function Cobranza() { return a.programa; } + // Saldo por retirar (ANT/MES/TOTAL) de los alumnos marcados POR RETIRAR (según filtros) + const retiroKpi = useMemo(() => { + let sAnt=0, sMes=0; + alumnosFiltrados.forEach((a) => { + if (!porRetirar.has(String(a.matricula))) return; + sAnt += ((Number(a.cta_ant)||0) - (Number(a.cob_ant)||0)); + sMes += ((Number(a.cta_cur)||0) - (Number(a.cob_cur)||0)); + }); + return { sAnt, sMes, sTot: sAnt + sMes }; + }, [alumnosFiltrados, porRetirar]); + // Exportar el DETALLE DE ALUMNOS (rápido: usa el dataset ya cargado, sin N consultas) async function exportarDetalle() { setExportando(true); @@ -262,7 +281,7 @@ export default function Cobranza() { {loading ? : error ? : <> - +
@@ -358,7 +377,8 @@ export default function Cobranza() { ); } -function Tarjetas({ kpis }) { +function Tarjetas({ kpis, retiro }) { + const rt = retiro || { sAnt:0, sMes:0, sTot:0 }; const alDia = kpis.saldo <= 0.01; if (alDia) { return ( @@ -371,13 +391,13 @@ function Tarjetas({ kpis }) { ); } const cards = [ - ["⚠ MES ANTERIOR","#d97706",kpis.cAnt,kpis.obAnt], - ["📅 MES EN CURSO","#059669",kpis.cMes,kpis.obMes], - ["💰 CARTERA TOTAL","#7c3aed",kpis.cTot,kpis.obTot], + ["⚠ MES ANTERIOR","#d97706",kpis.cAnt,kpis.obAnt, rt.sAnt], + ["📅 MES EN CURSO","#059669",kpis.cMes,kpis.obMes, rt.sMes], + ["💰 CARTERA TOTAL","#7c3aed",kpis.cTot,kpis.obTot, rt.sTot], ]; return (
- {cards.map(([titulo,color,cta,cob]) => { + {cards.map(([titulo,color,cta,cob,saldoRetiro]) => { const ratio = cta>0 ? (cob/cta*100) : 0; const c = colorSemaforo(ratio); const saldo = cta - cob; @@ -388,6 +408,7 @@ function Tarjetas({ kpis }) { 0?"#dc2626":"#10b981"} /> + {cta>0 && (