diff --git a/backend/modules/ventas/logic.py b/backend/modules/ventas/logic.py index 80983e9..0a30bcb 100644 --- a/backend/modules/ventas/logic.py +++ b/backend/modules/ventas/logic.py @@ -163,6 +163,9 @@ class VentasLogic: set_vip_actual.add(val) lista_vip_str.append(str(val)) except: pass + # Lista PURA de BASE_PENDIENTES (sin overrides). Venta Pendientes usa SOLO esto. + set_lista_pendientes = set(set_vip_actual) + # Incluir matrículas con override de fecha (igual que ejecutar_consulta_ventas) # Incluir matrículas con override de fecha (igual que ejecutar_consulta_ventas) _fov_vip = getattr(self.data_manager, '_fecha_canc_overrides', None) or {} @@ -216,6 +219,21 @@ class VentasLogic: cursor.execute(sql_modificado, ano, mes_numero, ano, mes_numero) columns = [column[0] for column in cursor.description] datos_raw = [dict(zip(columns, row)) for row in cursor.fetchall()] + + # DEDUP por num_matricula: el LEFT JOIN con RP_programa puede duplicar filas + # (una con fch_cancelacion y otra sin). Nos quedamos con UNA sola por matrícula, + # priorizando la que TENGA fecha de cancelación (verdad del pago). + _dedup = {} + for _d in datos_raw: + _m = str(_d.get('num_matricula', '')).strip() + if _m.endswith('.0'): _m = _m[:-2] + _prev = _dedup.get(_m) + _tiene_f = bool(_d.get('fch_cancelacion_cuota1')) + if _prev is None: + _dedup[_m] = _d + elif _tiene_f and not bool(_prev.get('fch_cancelacion_cuota1')): + _dedup[_m] = _d + datos_raw = list(_dedup.values()) # 🔥 DESCARGA DEL CRONOGRAMA COMPLETO (SIN IMPORTAR EL MES) 🔥 lista_mats = list(set([str(d.get('num_matricula')).replace('.0','').strip() for d in datos_raw if d.get('num_matricula')])) @@ -322,6 +340,7 @@ class VentasLogic: saldo_mat = float(d.get('imp_saldo_matricula', 0.0)) saldo_c1 = float(d.get('imp_saldo_cuota1', 0.0)) fch_canc_raw = d.get('fch_cancelacion_cuota1') + fch_canc_real_sql = d.get('fch_cancelacion_cuota1') # SQL puro, sin override fch_mat = d.get('fch_matricula') # Override de fecha cancelación 1 (Supabase) → prioridad para clasificación + cuenta como pagado @@ -610,8 +629,20 @@ class VentasLogic: if saldos_ok and pago_en_fecha: agregar_a_lista("Venta P.C") - # MES PASADO: matrícula anterior + pagó 1° cuota en el mes del filtro - if matricula_mes_pasado and saldos_ok and pago_en_fecha: + # VENTA PENDIENTES: SOLO de tu lista BASE_PENDIENTES y que pagaron su 1ª + # cuota EN EL MES/AÑO DEL FILTRO. Usa la FECHA REAL DEL SQL (sin override). + _pago_mes_real = False + if fch_canc_real_sql and str(fch_canc_real_sql).strip() != "None": + try: + if isinstance(fch_canc_real_sql, str): + _fo = datetime.strptime(fch_canc_real_sql[:10], '%Y-%m-%d') + _fa, _fm = _fo.year, _fo.month + else: + _fa, _fm = fch_canc_real_sql.year, fch_canc_real_sql.month + if int(_fa) == int(ano) and int(_fm) == int(mes_numero): + _pago_mes_real = True + except: pass + if matricula_int in set_lista_pendientes and _pago_mes_real: agregar_a_lista("Venta Pendientes")