From 7f624a642814cd98abb48eeb50756d595155ca10 Mon Sep 17 00:00:00 2001 From: Administrator Date: Wed, 23 Sep 2026 10:37:20 -0500 Subject: [PATCH] Actualizar backend/services.py --- backend/services.py | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/backend/services.py b/backend/services.py index 6bf4e9d..cfee5fa 100644 --- a/backend/services.py +++ b/backend/services.py @@ -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":