Actualizar backend/services.py
This commit is contained in:
@@ -765,12 +765,18 @@ def retiros(ano="2026", mes=8):
|
|||||||
"""Apartado RETIROS: alumnos marcados POR RETIRAR en (ano, mes), con sus datos
|
"""Apartado RETIROS: alumnos marcados POR RETIRAR en (ano, mes), con sus datos
|
||||||
del cronograma de cobranza. El estado POR RETIRAR y la info manual son de ese mes."""
|
del cronograma de cobranza. El estado POR RETIRAR y la info manual son de ese mes."""
|
||||||
def _load():
|
def _load():
|
||||||
|
# ¿Hay SNAPSHOT guardado (GUARDAR TOTAL) de este mes? Si hay al menos una
|
||||||
|
# fila guardada, se muestra ese snapshot congelado (todas las columnas).
|
||||||
|
snap = retiros_snapshot_obtener(ano, mes)
|
||||||
|
if snap.get("filas"):
|
||||||
|
return {"filas": snap["filas"], "guardado": True,
|
||||||
|
"guardado_en": snap.get("guardado_en")}
|
||||||
try:
|
try:
|
||||||
mats_ret = set(alumnos_por_retirar(ano, mes).get("matriculas", []))
|
mats_ret = set(alumnos_por_retirar(ano, mes).get("matriculas", []))
|
||||||
except Exception:
|
except Exception:
|
||||||
mats_ret = set()
|
mats_ret = set()
|
||||||
if not mats_ret:
|
if not mats_ret:
|
||||||
return {"filas": []}
|
return {"filas": [], "guardado": False}
|
||||||
dm = get_dm()
|
dm = get_dm()
|
||||||
proc = CobranzaLogic(dm).processor # para clasificar SEDE por programa (REPLACE_META)
|
proc = CobranzaLogic(dm).processor # para clasificar SEDE por programa (REPLACE_META)
|
||||||
crono = dm.ejecutar_consulta_cronograma_cobranza(str(ano)) or []
|
crono = dm.ejecutar_consulta_cronograma_cobranza(str(ano)) or []
|
||||||
@@ -841,7 +847,7 @@ def retiros(ano="2026", mes=8):
|
|||||||
"detalle_retiro": inf.get("detalle_retiro") or "",
|
"detalle_retiro": inf.get("detalle_retiro") or "",
|
||||||
})
|
})
|
||||||
filas.sort(key=lambda x: x["fch_matricula"], reverse=True)
|
filas.sort(key=lambda x: x["fch_matricula"], reverse=True)
|
||||||
return {"filas": filas}
|
return {"filas": filas, "guardado": False}
|
||||||
return cache_get_or_set("retiros", (str(ano), str(mes)), _load)
|
return cache_get_or_set("retiros", (str(ano), str(mes)), _load)
|
||||||
|
|
||||||
|
|
||||||
@@ -886,6 +892,54 @@ def retiros_info_obtener(ano, mes):
|
|||||||
out[str(r.get("matricula", "")).strip()] = r
|
out[str(r.get("matricula", "")).strip()] = r
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
def retiros_snapshot_obtener(ano, mes):
|
||||||
|
"""Lee el SNAPSHOT completo guardado (GUARDAR TOTAL) de (ano, mes) y lo devuelve
|
||||||
|
con los MISMOS nombres de campo que usa la tabla principal de Retiros.
|
||||||
|
Solo cuenta como snapshot si la fila tiene datos completos (alumno/programa)."""
|
||||||
|
sb = _sb()
|
||||||
|
try:
|
||||||
|
res = (sb.table("retiros_info").select("*")
|
||||||
|
.eq("ano", int(ano)).eq("mes", int(mes)).execute())
|
||||||
|
except Exception:
|
||||||
|
return {"filas": []}
|
||||||
|
filas = []
|
||||||
|
guardado_en = None
|
||||||
|
for r in (res.data or []):
|
||||||
|
if not (r.get("alumno") or r.get("programa")):
|
||||||
|
continue
|
||||||
|
if not guardado_en and r.get("actualizado_en"):
|
||||||
|
guardado_en = str(r.get("actualizado_en"))[:16].replace("T", " ")
|
||||||
|
filas.append({
|
||||||
|
"matricula": str(r.get("matricula", "")).strip(),
|
||||||
|
"sede": r.get("sede") or "",
|
||||||
|
"fch_matricula": r.get("fch_matricula") or "",
|
||||||
|
"asesor": r.get("sectorista") or "",
|
||||||
|
"vendedor": r.get("asesor_comercial") or "",
|
||||||
|
"programa": r.get("programa") or "",
|
||||||
|
"cod_detalle": r.get("cod_detalle") or "",
|
||||||
|
"fch_inicio": r.get("fch_inicio") or "",
|
||||||
|
"fch_retiro": r.get("fch_retiro") or "",
|
||||||
|
"alumno": r.get("alumno") or "",
|
||||||
|
"num_cuotas_pagadas": r.get("num_cuotas_pagadas") or 0,
|
||||||
|
"num_cuotas_vencidas": r.get("num_cuotas_vencidas") or 0,
|
||||||
|
"fch_vencimiento": r.get("fch_vencimiento") or "",
|
||||||
|
"monto_venc_ant": r.get("monto_venc_ant") or 0,
|
||||||
|
"monto_venc_cur": r.get("monto_venc_cur") or 0,
|
||||||
|
"imp_total_pagado": r.get("imp_total_pagado") or 0,
|
||||||
|
"monto_dejo_pagar": r.get("monto_dejo_pagar") or 0,
|
||||||
|
"n_asistencia": r.get("n_asistencia"),
|
||||||
|
"n_faltas": r.get("n_faltas"),
|
||||||
|
"ultimo_dia_asist": r.get("ultimo_dia_asist") or "",
|
||||||
|
"hasta_sesion": r.get("hasta_sesion") or "",
|
||||||
|
"fch_ult_resp": r.get("fch_ult_resp") or "",
|
||||||
|
"fch_envio_correo": r.get("fch_envio_correo") or "",
|
||||||
|
"retiro_wsp_class": r.get("retiro_wsp_class") or "",
|
||||||
|
"motivo_retiro": r.get("motivo_retiro") or "",
|
||||||
|
"detalle_retiro": r.get("detalle_retiro") or "",
|
||||||
|
})
|
||||||
|
filas.sort(key=lambda x: x["fch_matricula"], reverse=True)
|
||||||
|
return {"filas": filas, "guardado_en": guardado_en}
|
||||||
|
|
||||||
def retiros_info_guardar(matricula, ano, mes, campos, usuario=None):
|
def retiros_info_guardar(matricula, ano, mes, campos, usuario=None):
|
||||||
"""INFO: guarda SOLO las 9 columnas manuales de un alumno en (matricula, ano, mes)."""
|
"""INFO: guarda SOLO las 9 columnas manuales de un alumno en (matricula, ano, mes)."""
|
||||||
sb = _sb()
|
sb = _sb()
|
||||||
@@ -929,6 +983,7 @@ def retiros_snapshot_guardar(ano, mes, filas, usuario=None):
|
|||||||
"fch_vencimiento": f.get("fch_vencimiento") or None,
|
"fch_vencimiento": f.get("fch_vencimiento") or None,
|
||||||
"monto_venc_ant": f.get("monto_venc_ant"),
|
"monto_venc_ant": f.get("monto_venc_ant"),
|
||||||
"monto_venc_cur": f.get("monto_venc_cur"),
|
"monto_venc_cur": f.get("monto_venc_cur"),
|
||||||
|
"imp_total_pagado": f.get("imp_total_pagado"),
|
||||||
"monto_dejo_pagar": f.get("monto_dejo_pagar"),
|
"monto_dejo_pagar": f.get("monto_dejo_pagar"),
|
||||||
**_ri_manual_payload(f),
|
**_ri_manual_payload(f),
|
||||||
"actualizado_en": now,
|
"actualizado_en": now,
|
||||||
|
|||||||
Reference in New Issue
Block a user