From ca3ab820b5165d4f1346764f015b0681bf389b9f Mon Sep 17 00:00:00 2001 From: Jeremy Rangel Date: Thu, 5 Jun 2025 00:31:55 -0700 Subject: [PATCH] Added override for ERPNext updating a Lead's mobile_no field even if that phone number isn't defined as primary_mobile in the linked Contact --- .../__pycache__/hooks.cpython-310.pyc | Bin 1506 -> 1632 bytes rangeldigital/hooks.py | 8 ++++++ rangeldigital/install.py | 26 ----------------- .../__pycache__/__init__.cpython-310.pyc | Bin 209 -> 209 bytes .../__pycache__/contact_hooks.cpython-310.pyc | Bin 0 -> 976 bytes .../utilities/contact/contact_hooks.py | 27 ++++++++++++++++++ rangeldigital/utilities/lead/lead_api.py | 2 +- 7 files changed, 36 insertions(+), 27 deletions(-) delete mode 100644 rangeldigital/install.py create mode 100644 rangeldigital/utilities/contact/__pycache__/contact_hooks.cpython-310.pyc create mode 100644 rangeldigital/utilities/contact/contact_hooks.py diff --git a/rangeldigital/__pycache__/hooks.cpython-310.pyc b/rangeldigital/__pycache__/hooks.cpython-310.pyc index 4438fd2edec7b9c2656385655753dd7af5a453ac..9811c158cb322f0fcc0b9aa290c150b837706e4b 100644 GIT binary patch delta 222 zcmaFF{eXurpO=@50SGu;9W%~pPUMqeOq!@|tChl^B9P9Q34~FcDS}a4DMC@)=?p2t zix{JLfV2pZ=1ma|X3!Md*wV-teT&^WKd&S)x#Si{Sz=CRN@7WBm3vWQUV3UyN@jXy zNn(y(X-Q^IW=Uphv0gGnDU6QK$j{F%)+;Rl>59)uO-zX|$jHx2jn6C1O-e1=%)(U3 z#Ki})t{u%n)a;NnrZMVF)?`!VV&P_C;b3K`=P3jL Dn|K*| diff --git a/rangeldigital/hooks.py b/rangeldigital/hooks.py index 5525498..d1b9a3a 100644 --- a/rangeldigital/hooks.py +++ b/rangeldigital/hooks.py @@ -27,6 +27,14 @@ scheduler_events = { } } +# Document Events + # Override Contact-> Validate to avoid setting non-mobile numbers as Lead mobile_no field +doc_events = { + "Contact": { + "validate": ["rangeldigital.utilities.contact.contact_hooks.update_lead_phone_numbers"] + } +} + # Disable default send_email_to_leads_or_contacts after_install = "rangeldigital.utilities.install.after_install" diff --git a/rangeldigital/install.py b/rangeldigital/install.py deleted file mode 100644 index ba4203b..0000000 --- a/rangeldigital/install.py +++ /dev/null @@ -1,26 +0,0 @@ -import frappe - -def after_install(): - stop_erpnext_scheduled_send_email_job() - -def stop_erpnext_scheduled_send_email_job(): - # Get list of Scheduled Job Type docs with that method - job_docs = frappe.get_all( - "Scheduled Job Type", - filters={"method": "erpnext.crm.doctype.email_campaign.email_campaign.send_email_to_leads_or_contacts"}, - limit_page_length=1 - ) - - if not job_docs: - frappe.msgprint("Scheduled Job Type not found.") - return - - job_name = job_docs[0].name - job_doc = frappe.get_doc("Scheduled Job Type", job_name) - - # Set stopped = 1 - job_doc.stopped = 1 - job_doc.save(ignore_permissions=True) - frappe.db.commit() - - frappe.msgprint(f"Scheduled Job Type '{job_doc.method}' stopped successfully.") diff --git a/rangeldigital/utilities/__pycache__/__init__.cpython-310.pyc b/rangeldigital/utilities/__pycache__/__init__.cpython-310.pyc index 46647435acbafe89092a3661e8ae1c7b0fc7be2d..72914b35adb4b78199c2b11e5d07f5a21520dfdb 100644 GIT binary patch delta 19 Zcmcb}c#)AipO=@50SNZHIZot01^_Q^1nU3* delta 19 Zcmcb}c#)AipO=@50SK}g9VT)g0{|=;1W^D0 diff --git a/rangeldigital/utilities/contact/__pycache__/contact_hooks.cpython-310.pyc b/rangeldigital/utilities/contact/__pycache__/contact_hooks.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..029ebda6a0b7e704d7d07a5f02438e4864634cc2 GIT binary patch literal 976 zcma)5&1&2*5SC=w`@^OUVJYpkH`6BWsg$rRDJ}F;a#?y=D8_3kYj0%BmAs(|-c$1e z?Gx-C`%1d@)JJHcKO=jcE`dM=8fkv?dFGq3+}rCTSWn)(OimnxzFB2=5l~KG>mdk+ z7#3)X7-7yenqr10$fw`IgHB@`*)9(*6!t6F`Xh)6Es%B@n!s%h?>2ZvDx&XMOM_-3 zUZYQVII|By{>WUDA!sm_X4ToimqMeF|;8VG6cMx?RQQM zeaj;jW5}XiHdQDV;vl_;Am#x4zPrK|ULZw4;?Lv*nV_%8CuW%Huuy3hsmm~vvsCaf zm&Pp;nR9THqi3d9DcCTYoaaHgW7;M?PH#`8D{z@mdD zily_kjKnQ%S*9W_Q+OWByo}|^DE*C)yjfWgH- zHdNPIdLzx794+hG_Td0sJ^i1|+J~lh(*xgYiO;1rgE=olk>=;&nN-GWcs3ntwSBRC z7>~_D0D^~|Es@5{c$r9M23teT&$NH@5pAetY&vZH4RsfhSaN;4zDIXfV#h*12H|0f z`_L8Wi9?C^n|21+Bm1O}_c8rJ9qOnD5C$CHhoiple5IbQn#%4dlWZyY*bcU~KU)_K F$X{}`_iF$E literal 0 HcmV?d00001 diff --git a/rangeldigital/utilities/contact/contact_hooks.py b/rangeldigital/utilities/contact/contact_hooks.py new file mode 100644 index 0000000..13eb69e --- /dev/null +++ b/rangeldigital/utilities/contact/contact_hooks.py @@ -0,0 +1,27 @@ +import frappe + +# Override ERPNext's hook that will set a Lead's mobile_no field based on a Contact's phone number even if it's not a mobile number +def update_lead_phone_numbers(contact, method): + if not contact.phone_nos: + return + + contact_lead = contact.get_link_for("Lead") + if not contact_lead: + return + + # Get list of phones explicitly marked as primary mobile numbers + mobile_nos = [ + phone_doc.phone + for phone_doc in contact.phone_nos + if phone_doc.is_primary_mobile_no + ] + + # If no mobile numbers were marked, clear Lead.mobile_no + if not mobile_nos: + lead = frappe.get_doc("Lead", contact_lead) + + if lead.mobile_no: + # Optional: only unset if the current value matches one of the Contact's phones + contact_phone_values = {p.phone for p in contact.phone_nos} + if lead.mobile_no in contact_phone_values: + lead.db_set("mobile_no", None) diff --git a/rangeldigital/utilities/lead/lead_api.py b/rangeldigital/utilities/lead/lead_api.py index b4ff908..828856c 100644 --- a/rangeldigital/utilities/lead/lead_api.py +++ b/rangeldigital/utilities/lead/lead_api.py @@ -15,7 +15,7 @@ def add_lead_to_campaign(lead_name, campaign_name, start_date=None): }) if existing: - frappe.throw("This Lead is already part of an Email Campaign with this name.") + frappe.throw("This Lead is already in this Email Campaign") doc = frappe.new_doc("Email Campaign") doc.update({