Actualizar backend/services.py

This commit is contained in:
2026-09-23 10:37:20 -05:00
parent 22c419ad01
commit 7f624a6428

View File

@@ -152,23 +152,23 @@ def ventas_detalle(vendedor, ano, mes, tipo_lista, sede="TODOS", programa="TODOS
resultado = logic.obtener_detalle_vendedor(vendedor, str(ano), str(mes), excluir_ret)
filas = resultado.get(tipo_lista, []) if isinstance(resultado, dict) else []
filas = _aplicar_overrides_comisiones(filas)
# Filtro por SEDE [14] y PROGRAMA (clasificado desde el nombre [16]),
# mismas reglas que la tabla principal. Omite la fila TOTAL GENERAL.
_sede = str(sede or "TODOS").upper()
_prog = str(programa or "TODOS").upper()
if _sede != "TODOS" or _prog != "TODOS":
# Filtro por SEDE [14] y PROGRAMA (clasificado desde el nombre [16]).
# Acepta varios valores separados por coma (multi). Vacío/TODOS = todo.
_sede_set = {s.strip().upper() for s in str(sede or "TODOS").split(",") if s.strip()}
_prog_set = {p.strip().upper() for p in str(programa or "TODOS").split(",") if p.strip()}
_sede_all = (not _sede_set) or ("TODOS" in _sede_set)
_prog_all = (not _prog_set) or ("TODOS" in _prog_set)
if not _sede_all or not _prog_all:
out = []
for f in filas:
if str(f[0]).strip().upper() == "TOTAL GENERAL":
continue # el TOTAL se recalcula en el frontend
if len(f) < 15:
out.append(f); continue
if _sede != "TODOS" and str(f[14]).strip().upper() != _sede:
if not _sede_all and str(f[14]).strip().upper() not in _sede_set:
continue
# Clasificar programa por el nombre de CLASIFICACIÓN [16] (prioriza dsc_programa);
# si no existe, usar el mostrado [8].
_prog_nombre = f[16] if len(f) > 16 else f[8]
if _prog != "TODOS" and _clasif_filtro_programa(dm, _prog_nombre) != _prog:
if not _prog_all and _clasif_filtro_programa(dm, _prog_nombre) not in _prog_set:
continue
out.append(f)
filas = out
@@ -302,18 +302,21 @@ def cobranza_detalle(grupo, ano, mes, sectorista, agrupacion="PROGRAMA", prog_fi
dm = get_dm()
logic = CobranzaLogic(dm)
proc = logic.processor
pf = str(prog_filtro).upper()
sf = str(sede_filtro).upper()
# Sede/Programa multi (coma). Vacío/TODOS = todos.
_pf_set = {p.strip().upper() for p in str(prog_filtro or "TODOS").split(",") if p.strip()}
_pf_all = (not _pf_set) or ("TODOS" in _pf_set)
_sf_set = {s.strip().upper() for s in str(sede_filtro or "TODOS").split(",") if s.strip()}
_sf_all = (not _sf_set) or ("TODOS" in _sf_set)
vh = venc_hasta
# Mapa MATRICULA -> programa, para filtrar por tipo de programa y/o sede (REPLACE_META)
mats_prog = None
if pf not in ("TODOS", "", "NONE") or sf not in ("TODOS", "", "NONE"):
if not _pf_all or not _sf_all:
crudos_pf = proc.obtener_detalle_programa(str(ano), str(mes), sectorista, "TODOS")
mats_prog = set()
for d in (crudos_pf or []):
prog = d.get("PROGRAMA", "") or d.get("dsc_programa", "")
ok_prog = pf in ("TODOS", "", "NONE") or str(proc.clasificar_filtro_programa(prog)).upper() == pf
ok_sede = sf in ("TODOS", "", "NONE") or str(proc.clasificar_sede_meta(prog)).upper() == sf
ok_prog = _pf_all or str(proc.clasificar_filtro_programa(prog)).upper() in _pf_set
ok_sede = _sf_all or str(proc.clasificar_sede_meta(prog)).upper() in _sf_set
if ok_prog and ok_sede:
mats_prog.add(str(d.get("MATRICULA", "")))
if agrupacion == "ASESOR":