Rename leads field: Google Ads as 'leads', Airtable as 'leads_lake'

- MetricasDiarias now stores both: leads (Google conv) and leads_lake (Airtable count)
- Update backfill and migration scripts accordingly
- migrate_leads_field.py executed: 49 May records updated

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Jose Manuel 2026-05-04 10:36:20 +02:00
parent f1dec1c887
commit f65f793c95
3 changed files with 50 additions and 7 deletions

View File

@ -40,11 +40,11 @@ for r in records:
days_needed: set[str] = set()
for _, (_, md) in gid_to_gcm.items():
for day_str, vals in md.items():
if "leads" not in vals:
if "leads_lake" not in vals:
days_needed.add(day_str)
if not days_needed:
print("Todos los días ya tienen 'leads'. Nada que hacer.")
print("Todos los días ya tienen 'leads_lake'. Nada que hacer.")
exit(0)
print(f"Días a rellenar: {sorted(days_needed)}")
@ -61,8 +61,8 @@ for day_str in sorted(days_needed):
leads_by_cid = at.get_leads_by_campaign_on_date(date_iso)
updated = 0
for gid, (gcm_id, md) in gid_to_gcm.items():
if day_str in md and "leads" not in md[day_str]:
md[day_str]["leads"] = leads_by_cid.get(gid, 0)
if day_str in md and "leads_lake" not in md[day_str]:
md[day_str]["leads_lake"] = leads_by_cid.get(gid, 0)
updated += 1
print(f"{updated} campañas actualizadas")
@ -71,7 +71,7 @@ print("\nGuardando en Airtable...")
batch = [
{"id": gcm_id, "fields": {"MetricasDiarias": json.dumps(md, ensure_ascii=False)}}
for _, (gcm_id, md) in gid_to_gcm.items()
if any("leads" in v for v in md.values())
if any("leads_lake" in v for v in md.values())
]
for i in range(0, len(batch), 10):
at.gacampaignmes.batch_update(batch[i:i+10])

43
migrate_leads_field.py Normal file
View File

@ -0,0 +1,43 @@
"""
Migración one-off: renombra el campo 'leads' a 'leads_lake' en MetricasDiarias
de todos los registros GACampaignMes de mayo 2026.
"""
import json
from airtable_client import AirtableClient
at = AirtableClient()
print("Cargando registros GACampaignMes de mayo...")
records = at.gacampaignmes.all(
formula="AND({Mes}='5',{Año}='2026')",
fields=["MetricasDiarias"],
)
batch = []
for r in records:
raw = r["fields"].get("MetricasDiarias") or "{}"
try:
md = json.loads(raw)
except (json.JSONDecodeError, TypeError):
md = {}
changed = False
for day_vals in md.values():
if "leads" in day_vals and "leads_lake" not in day_vals:
day_vals["leads_lake"] = day_vals.pop("leads")
changed = True
if changed:
batch.append({
"id": r["id"],
"fields": {"MetricasDiarias": json.dumps(md, ensure_ascii=False)},
})
print(f"Registros a migrar: {len(batch)}")
if not batch:
print("Nada que migrar.")
else:
for i in range(0, len(batch), 10):
at.gacampaignmes.batch_update(batch[i:i+10])
print(f" > {min(i+10, len(batch))}/{len(batch)} guardados")
print(f"OK Migracion completada: {len(batch)} registros actualizados.")

4
run.py
View File

@ -303,8 +303,8 @@ def run():
md = json.loads(campaign["metricas_diarias"])
except (json.JSONDecodeError, TypeError):
md = {}
leads_hoy = leads_yesterday.get(cid, 0)
md[dia_hoy] = {"coste": coste_hoy, "ingreso": ingreso_hoy, "margen": margen_hoy, "leads": leads_hoy}
leads_lake_hoy = leads_yesterday.get(cid, 0)
md[dia_hoy] = {"coste": coste_hoy, "ingreso": ingreso_hoy, "margen": margen_hoy, "leads": int(conv_hoy), "leads_lake": leads_lake_hoy}
campaign["metricas_diarias"] = json.dumps(md, ensure_ascii=False)
metricas_updates.append({
"airtable_id": campaign["airtable_id"],