diff --git a/airtable_client.py b/airtable_client.py index 0a7449f..99efe21 100644 --- a/airtable_client.py +++ b/airtable_client.py @@ -339,24 +339,45 @@ class AirtableClient: def get_leads_this_month_gads(self, campaign_id: str, campaign_name: str = "") -> tuple[int, list[str]]: """ Leads del mes actual para una campaña de Google Ads. - Cubre tres vías de atribución: + Cubre cuatro vías de atribución: 1. GACampaignID / GoogleCampaignID (leads web normales) 2. gad_campaignid en attr_referer (UTM web) 3. attr_referer = campaign_name con UserAgent Google-Ads-Notifications (Lead Form) + 4. attr_cursoid = course_num AND attr_utm_source = 'pmx'|'google' (atribución por curso) """ now = datetime.now() mes_inicio = f"{now.year}-{now.month:02d}-01" + leadform_clause = ( f"AND({{attr_referer}}='{campaign_name}',{{UserAgent del visitante}}='Google-Ads-Notifications')" if campaign_name else "FALSE()" ) + + # Extraer número de curso y tipo de fuente del nombre de campaña + curso_clause = "FALSE()" + m = re.search(r'fco_(?:search|pmx)_(\d+)', campaign_name, re.IGNORECASE) + if m: + course_num = m.group(1) + if "pmx" in campaign_name.lower() and "_leadform" not in campaign_name.lower(): + utm_source = "pmx" + elif "search" in campaign_name.lower(): + utm_source = "google" + else: + utm_source = None + if utm_source: + curso_clause = ( + f"AND({{attr_cursoid}}='{course_num}'," + f"{{attr_utm_source}}='{utm_source}')" + ) + formula = ( f"AND(" f"OR(" f"{{GACampaignID}}='{campaign_id}'," f"FIND(',{campaign_id},',',' & {{GoogleCampaignID}} & ',')," f"FIND('gad_campaignid={campaign_id}',{{attr_referer}})," - f"{leadform_clause}" + f"{leadform_clause}," + f"{curso_clause}" f")," f"{{creado}}>='{mes_inicio}'" f")"