Actualizar frontend/src/pages/Cobranza.jsx

This commit is contained in:
2026-09-01 12:10:44 -05:00
parent e39f979482
commit 098adbe59e

View File

@@ -127,7 +127,7 @@ export default function Cobranza() {
// Cargar matrículas POR RETIRAR (para el "Saldo por Retirar" de las tarjetas) // Cargar matrículas POR RETIRAR (para el "Saldo por Retirar" de las tarjetas)
const [porRetirar, setPorRetirar] = useState(new Set()); const [porRetirar, setPorRetirar] = useState(new Set());
useEffect(() => { useEffect(() => {
api.alumnosPorRetirar() api.alumnosPorRetirar(ano, mes)
.then((r) => setPorRetirar(new Set((r.matriculas || []).map(String)))) .then((r) => setPorRetirar(new Set((r.matriculas || []).map(String))))
.catch(() => {}); .catch(() => {});
}, [ano, mes]); }, [ano, mes]);
@@ -601,6 +601,7 @@ export default function Cobranza() {
alumnos={alumnosFiltrados} alumnos={alumnosFiltrados}
agrupacion={agrupacion} agrupacion={agrupacion}
sectorista={sectorista} sectorista={sectorista}
ano={ano} mes={mes}
onClose={() => setBuscadorAbierto(false)} onClose={() => setBuscadorAbierto(false)}
/> />
)} )}
@@ -779,18 +780,18 @@ function TarjetasResumen({ r, retiro }) {
); );
} }
function ModalBuscador({ alumnos, agrupacion, sectorista, onClose }) { function ModalBuscador({ alumnos, agrupacion, sectorista, ano, mes, onClose }) {
const [texto, setTexto] = useState(""); const [texto, setTexto] = useState("");
const [query, setQuery] = useState(""); const [query, setQuery] = useState("");
const [porRetirar, setPorRetirar] = useState(new Set()); // matrículas POR RETIRAR const [porRetirar, setPorRetirar] = useState(new Set()); // matrículas POR RETIRAR
const [infoAlumno, setInfoAlumno] = useState(null); // alumno del pop-up INFO const [infoAlumno, setInfoAlumno] = useState(null); // alumno del pop-up INFO
const cargarPorRetirar = () => { const cargarPorRetirar = () => {
api.alumnosPorRetirar() api.alumnosPorRetirar(ano, mes)
.then((r)=>setPorRetirar(new Set((r.matriculas||[]).map(String)))) .then((r)=>setPorRetirar(new Set((r.matriculas||[]).map(String))))
.catch(()=>{}); .catch(()=>{});
}; };
useEffect(() => { cargarPorRetirar(); }, []); useEffect(() => { cargarPorRetirar(); }, [ano, mes]);
const resultados = useMemo(() => { const resultados = useMemo(() => {
const q = query.trim().toLowerCase(); const q = query.trim().toLowerCase();
@@ -926,7 +927,7 @@ function ModalBuscador({ alumnos, agrupacion, sectorista, onClose }) {
</> </>
)} )}
{infoAlumno && ( {infoAlumno && (
<ModalInfoAlumno alumno={infoAlumno} onClose={()=>setInfoAlumno(null)} <ModalInfoAlumno alumno={infoAlumno} ano={ano} mes={mes} onClose={()=>setInfoAlumno(null)}
onGuardado={cargarPorRetirar} /> onGuardado={cargarPorRetirar} />
)} )}
</Modal> </Modal>
@@ -950,11 +951,11 @@ function ModalEstadoCuenta({ grupo, ano, mes, sectorista, agrupacion, progFiltro
// Cargar (y recargar) las matrículas marcadas POR RETIRAR para tachar sus filas // Cargar (y recargar) las matrículas marcadas POR RETIRAR para tachar sus filas
const cargarPorRetirar = () => { const cargarPorRetirar = () => {
api.alumnosPorRetirar() api.alumnosPorRetirar(ano, mes)
.then((r) => setPorRetirar(new Set((r.matriculas || []).map(String)))) .then((r) => setPorRetirar(new Set((r.matriculas || []).map(String))))
.catch(() => {}); .catch(() => {});
}; };
useEffect(() => { cargarPorRetirar(); }, []); useEffect(() => { cargarPorRetirar(); }, [ano, mes]);
const COLS = ["PROGRAMA","ALUMNO","N° CUOTA","F. VENC.","CTA ANT.","COB ANT.","% ANT","CTA MES","COB MES","% MES","CTA TOT","COB TOT","% TOT","SALDO","INFO"]; const COLS = ["PROGRAMA","ALUMNO","N° CUOTA","F. VENC.","CTA ANT.","COB ANT.","% ANT","CTA MES","COB MES","% MES","CTA TOT","COB TOT","% TOT","SALDO","INFO"];
@@ -1194,7 +1195,7 @@ function ModalEstadoCuenta({ grupo, ano, mes, sectorista, agrupacion, progFiltro
</div> </div>
</>} </>}
{infoAlumno && ( {infoAlumno && (
<ModalInfoAlumno alumno={infoAlumno} onClose={()=>setInfoAlumno(null)} <ModalInfoAlumno alumno={infoAlumno} ano={ano} mes={mes} onClose={()=>setInfoAlumno(null)}
onGuardado={cargarPorRetirar} /> onGuardado={cargarPorRetirar} />
)} )}
</Modal> </Modal>
@@ -1203,7 +1204,7 @@ function ModalEstadoCuenta({ grupo, ano, mes, sectorista, agrupacion, progFiltro
// Pop-up de INFO por alumno: cambiar estado (EN CURSO / POR RETIRAR) y observaciones. // Pop-up de INFO por alumno: cambiar estado (EN CURSO / POR RETIRAR) y observaciones.
// Carga y guarda en Supabase (tabla cobranza_alumno_estado). // Carga y guarda en Supabase (tabla cobranza_alumno_estado).
function ModalInfoAlumno({ alumno, onClose, onGuardado }) { function ModalInfoAlumno({ alumno, ano, mes, onClose, onGuardado }) {
const [estado, setEstado] = useState("EN CURSO"); // EN CURSO | POR RETIRAR const [estado, setEstado] = useState("EN CURSO"); // EN CURSO | POR RETIRAR
const [nuevaObs, setNuevaObs] = useState(""); const [nuevaObs, setNuevaObs] = useState("");
const [observaciones, setObservaciones] = useState([]); const [observaciones, setObservaciones] = useState([]);
@@ -1214,12 +1215,12 @@ function ModalInfoAlumno({ alumno, onClose, onGuardado }) {
// Cargar estado/observaciones actuales del alumno al abrir // Cargar estado/observaciones actuales del alumno al abrir
useEffect(() => { useEffect(() => {
let activo = true; let activo = true;
api.alumnoEstado(alumno.matricula) api.alumnoEstado(alumno.matricula, ano, mes)
.then((r)=>{ if(activo){ setEstado(r.estado||"EN CURSO"); setObservaciones(r.observaciones||[]); } }) .then((r)=>{ if(activo){ setEstado(r.estado||"EN CURSO"); setObservaciones(r.observaciones||[]); } })
.catch(()=>{}) .catch(()=>{})
.finally(()=>{ if(activo) setCargando(false); }); .finally(()=>{ if(activo) setCargando(false); });
return ()=>{ activo=false; }; return ()=>{ activo=false; };
}, [alumno.matricula]); }, [alumno.matricula, ano, mes]);
const agregarObs = () => { const agregarObs = () => {
const t = nuevaObs.trim(); const t = nuevaObs.trim();
@@ -1233,7 +1234,7 @@ function ModalInfoAlumno({ alumno, onClose, onGuardado }) {
const guardar = async () => { const guardar = async () => {
setGuardando(true); setGuardado(false); setGuardando(true); setGuardado(false);
try { try {
await api.alumnoEstadoGuardar(alumno.matricula, estado, observaciones); await api.alumnoEstadoGuardar(alumno.matricula, ano, mes, estado, observaciones);
setGuardado(true); setGuardado(true);
if (onGuardado) onGuardado(); // refresca el tachado en la tabla if (onGuardado) onGuardado(); // refresca el tachado en la tabla
} catch { } catch {