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 ?