diff --git a/slack_notifier.py b/slack_notifier.py index 2ff970f..3be0067 100644 --- a/slack_notifier.py +++ b/slack_notifier.py @@ -354,18 +354,28 @@ def send_daily_report( "text": f"⛔ {total_ad_pauses} {noun} recomendados para pausar — ver detalle por vertical"}], }) - # "Todo en orden" summary + # "Todo en orden" summary — grouped by vertical if camps_ok: blocks.append({"type": "divider"}) - ok_lines = [] - for name, (_, detail) in sorted(camps_ok.items(), key=lambda x: x[1][1]["vertical"]): - v = detail["vertical"] - leads_1d = detail.get("leads_1d", 0) - spend_1d = detail.get("spend_1d", 0.0) - ok_lines.append(f"✅ *{name}* · {spend_1d:.0f}€ / {leads_1d} leads ayer") + ok_by_v: dict = {} + for name, (_, detail) in camps_ok.items(): + ok_by_v.setdefault(detail["vertical"], []).append((name, detail)) + ok_lines = ["*Todo en orden*"] + for vert in sorted(ok_by_v.keys()): + v_data = (verticals or {}).get(vert, {}) + v_spend = v_data.get("spend", 0) + v_leads = v_data.get("leads", 0) + v_cpl = round(v_spend / v_leads, 2) if v_leads > 0 else 0.0 + v_obj = v_data.get("target_cpl", 0) + ok_lines.append(f"\n✅ *{vert.upper()}* · CPL {v_cpl:.2f}€ obj {v_obj:.2f}€") + for name, detail in sorted(ok_by_v[vert], key=lambda x: -x[1].get("spend_1d", 0)): + ok_lines.append( + f" • {name} · " + f"{detail.get('spend_1d', 0):.0f}€ / {detail.get('leads_1d', 0)} leads ayer" + ) blocks.append({ "type": "section", - "text": {"type": "mrkdwn", "text": "*Todo en orden*\n" + "\n".join(ok_lines)}, + "text": {"type": "mrkdwn", "text": "\n".join(ok_lines)}, }) blocks.append({ @@ -392,18 +402,28 @@ def send_daily_report( m_str = f"+{v_margin:.0f}€" if v_margin >= 0 else f"{v_margin:.0f}€" obj_str = f" · obj {v_obj:.2f}€" if v_obj else "" - v_blocks: list = [{ - "type": "section", - "text": { - "type": "mrkdwn", - "text": ( - f"📊 *{v.upper()}* · {v_spend:.0f}€ · {v_leads} leads · " - f"CPL {v_cpl:.2f}€{obj_str} · Margen {m_str}" - ), + v_blocks: list = [ + { + "type": "header", + "text": {"type": "plain_text", "text": f"📊 {v.upper()}"}, }, - }] + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": ( + f"{v_spend:.0f}€ · {v_leads} leads · " + f"CPL {v_cpl:.2f}€{obj_str} · Margen {m_str}" + ), + }, + }, + ] - for cid, detail, act in sorted(camp_list, key=lambda x: -x[1].get("spend_1d", 0)): + for i, (cid, detail, act) in enumerate( + sorted(camp_list, key=lambda x: -x[1].get("spend_1d", 0)) + ): + if i > 0: + v_blocks.append({"type": "divider"}) name = detail["name"] spend_1d = detail.get("spend_1d", 0.0) leads_1d = detail.get("leads_1d", 0)