Actualizar backend/services.py

This commit is contained in:
2026-09-01 12:13:07 -05:00
parent 098adbe59e
commit ee44f166b1

View File

@@ -281,9 +281,9 @@ def cobranza(ano, mes, sectorista="TODOS", agrupacion="SEDE", sede_filtro="TODOS
def _load(): def _load():
dm = get_dm() dm = get_dm()
logic = CobranzaLogic(dm) logic = CobranzaLogic(dm)
# Matrículas POR RETIRAR (Supabase) para calcular la columna SALDO POR RETIRAR # Matrículas POR RETIRAR (Supabase) de ESTE mes/año, para la columna SALDO POR RETIRAR
try: try:
mats_retirar = set(alumnos_por_retirar().get("matriculas", [])) mats_retirar = set(alumnos_por_retirar(ano, mes).get("matriculas", []))
except Exception: except Exception:
mats_retirar = set() mats_retirar = set()
filas = logic.obtener_datos_tabla(str(ano), str(mes), sectorista, agrupacion, sede_filtro, prog_filtro, venc_hasta, mats_retirar) filas = logic.obtener_datos_tabla(str(ano), str(mes), sectorista, agrupacion, sede_filtro, prog_filtro, venc_hasta, mats_retirar)
@@ -719,37 +719,43 @@ def _sb():
return dm.supabase_client return dm.supabase_client
# ── Estado/observaciones por alumno (tabla cobranza_estado_alumno) ── # ── Estado/observaciones por alumno (tabla cobranza_estado_alumno) ──
def alumno_estado_obtener(matricula): def alumno_estado_obtener(matricula, ano, mes):
"""Devuelve {estado, observaciones} de un alumno. Si no existe, valores por defecto.""" """Devuelve {estado, observaciones} de un alumno en (ano, mes). Default si no existe."""
sb = _sb() sb = _sb()
res = sb.table("cobranza_estado_alumno").select("*").eq("matricula", str(matricula)).execute() res = (sb.table("cobranza_estado_alumno").select("*")
.eq("matricula", str(matricula)).eq("ano", int(ano)).eq("mes", int(mes))
.execute())
fila = (res.data or [None])[0] fila = (res.data or [None])[0]
if not fila: if not fila:
return {"estado": "EN CURSO", "observaciones": []} return {"estado": "EN CURSO", "observaciones": []}
return {"estado": fila.get("estado") or "EN CURSO", return {"estado": fila.get("estado") or "EN CURSO",
"observaciones": fila.get("observaciones") or []} "observaciones": fila.get("observaciones") or []}
def alumno_estado_guardar(matricula, estado, observaciones, usuario=None): def alumno_estado_guardar(matricula, ano, mes, estado, observaciones, usuario=None):
"""Guarda (upsert) el estado y la lista de observaciones del alumno.""" """Guarda (upsert) el estado y observaciones del alumno en (ano, mes)."""
sb = _sb() sb = _sb()
from datetime import datetime, timezone from datetime import datetime, timezone
payload = { payload = {
"matricula": str(matricula), "matricula": str(matricula),
"ano": int(ano),
"mes": int(mes),
"estado": estado or "EN CURSO", "estado": estado or "EN CURSO",
"observaciones": observaciones or [], "observaciones": observaciones or [],
"actualizado_en": datetime.now(timezone.utc).isoformat(), "actualizado_en": datetime.now(timezone.utc).isoformat(),
"actualizado_por": usuario or None, "actualizado_por": usuario or None,
} }
sb.table("cobranza_estado_alumno").upsert(payload).execute() sb.table("cobranza_estado_alumno").upsert(payload, on_conflict="matricula,ano,mes").execute()
# Invalidar la tabla de cobranza para recalcular la columna SALDO POR RETIRAR # Invalidar la tabla de cobranza para recalcular la columna SALDO POR RETIRAR
from cache_manager import cache_invalidate from cache_manager import cache_invalidate
cache_invalidate("cobranza") cache_invalidate("cobranza")
return {"status": "ok"} return {"status": "ok"}
def alumnos_por_retirar(): def alumnos_por_retirar(ano, mes):
"""Lista de matrículas marcadas como POR RETIRAR (para tachar la fila en la tabla).""" """Matrículas marcadas POR RETIRAR en (ano, mes)."""
sb = _sb() sb = _sb()
res = sb.table("cobranza_estado_alumno").select("matricula").eq("estado", "POR RETIRAR").execute() res = (sb.table("cobranza_estado_alumno").select("matricula")
.eq("estado", "POR RETIRAR").eq("ano", int(ano)).eq("mes", int(mes))
.execute())
return {"matriculas": [str(r["matricula"]) for r in (res.data or [])]} return {"matriculas": [str(r["matricula"]) for r in (res.data or [])]}
def usuarios_listar(): def usuarios_listar():