Initial commit - dashboard leads
This commit is contained in:
61
backend/diag_campanias_cruce.py
Normal file
61
backend/diag_campanias_cruce.py
Normal file
@@ -0,0 +1,61 @@
|
||||
"""
|
||||
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)")
|
||||
Reference in New Issue
Block a user