""" Diagnostico: revisa la tabla 'campanias' y detecta cruces = misma frase_busqueda (mismo emoji/texto) con rangos de fecha [fecha_inicio, fecha_fin] que se SOLAPAN. Un mensaje que caiga en el solape haria match con 2 campanias a la vez. """ import data_manager_v2 as dm import leads_logic as L # _campanias_supabase() trae tuplas (frase, cargo, codigo, sede, dia, origen, fi, ff) crudas = dm._campanias_supabase() campanias = [{"frase_busqueda": t[0], "cargo": t[1], "codigo": t[2], "sede": t[3], "dia": t[4], "origen": t[5], "fecha_inicio": t[6], "fecha_fin": t[7]} for t in crudas] print(f"Total campanias: {len(campanias)}\n") # agrupar por frase_busqueda por_frase = {} for c in campanias: frase = " ".join(str(c.get("frase_busqueda") or "").split()) por_frase.setdefault(frase, []).append(c) def _rango(c): fi = L._to_date(str(c.get("fecha_inicio") or "")[:10]) ff = L._to_date(str(c.get("fecha_fin") or "")[:10]) return fi, ff cruces = 0 print("=== CRUCES (misma frase + fechas solapadas) ===\n") for frase, lista in por_frase.items(): if len(lista) < 2: continue # comparar cada par for i in range(len(lista)): for j in range(i + 1, len(lista)): a, b = lista[i], lista[j] fia, ffa = _rango(a) fib, ffb = _rango(b) if not (fia and ffa and fib and ffb): continue # solapan si a.inicio <= b.fin y b.inicio <= a.fin if fia <= ffb and fib <= ffa: cruces += 1 print(f"FRASE: {frase!r}") print(f" A) cod={a.get('codigo')} sede={a.get('sede')} cargo={a.get('cargo')} " f"[{fia} -> {ffa}]") print(f" B) cod={b.get('codigo')} sede={b.get('sede')} cargo={b.get('cargo')} " f"[{fib} -> {ffb}]") print(f" SOLAPE: {max(fia,fib)} -> {min(ffa,ffb)}\n") if cruces == 0: print("No se encontraron cruces (ninguna frase repetida con fechas solapadas).") else: print(f"TOTAL de cruces detectados: {cruces}") # tambien listar frases repetidas (aunque no solapen) por si acaso print("\n=== Frases que se repiten en varias campanias ===") rep = {f: l for f, l in por_frase.items() if len(l) > 1} for f, l in rep.items(): print(f" {len(l)}x {f!r}") if not rep: print(" (ninguna frase repetida)")