diff --git a/backfill_leads_mayo.py b/backfill_leads_mayo.py index b9a2e08..b627212 100644 --- a/backfill_leads_mayo.py +++ b/backfill_leads_mayo.py @@ -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]) diff --git a/migrate_leads_field.py b/migrate_leads_field.py new file mode 100644 index 0000000..e26412b --- /dev/null +++ b/migrate_leads_field.py @@ -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.") diff --git a/run.py b/run.py index 43f408e..e9affa7 100644 --- a/run.py +++ b/run.py @@ -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"],