g.due_date = item.get("due_date") phone = item.get("phone", "") unsub = f"{cfg.UNSUBSCRIBE_BASE or cfg.BASE_URL}/unsubscribe/{rec.unsub_token}" if c.unsubscribe_enabled else "" extra = {"unsubscribe_link": unsub, "company_phone": phone} body_html = "" subject = "" warn_list = list(item.get("warnings") or []) if isinstance(item.get("warnings"), list) else ([item["warnings"]] if item.get("warnings") else []) if tpl: res = engine.substitute(tpl.body_html, rec, g, custom_fields=rec.custom_fields or {}, extra=extra) body_html = res.text subject = subj.subject if subj else (tpl.subject_hint or tpl.name) for u in res.unknown: warn_list.append(f"Unknown variable in body: {u}") for m_ in res.missing: warn_list.append(f"Missing data for: {m_}") if subj: res_s = engine.substitute(subj.subject, rec, g, custom_fields=rec.custom_fields or {}, extra=extra) subject = res_s.text for u in res_s.unknown: warn_list.append(f"Unknown variable in subject: {u}") for m_ in res_s.missing: warn_list.append(f"Missing data in subject: {m_}") out.append({ "recipient": {"id": rec.id, "email": rec.email, "first_name": rec.first_name, "last_name": rec.last_name}, "from_account": item.get("account", ""), "subject": subject, "body_html": sanitize_preview(body_html), "raw_variables": {"invoice_number": g.invoice_number, "amount": g.amount, "shipping": g.shipping, "phone": phone}, "warnings": warn_list, }) return {"campaign_id": c.id, "sample_size": len(out), "messages": out, "plan_summary": result.get("summary", {})} # ---------------------------------------------------------------------------