diff --git a/erpnext/crm/doctype/email_campaign/email_campaign.py b/erpnext/crm/doctype/email_campaign/email_campaign.py index 72ebdaa6090..bfd35647b8c 100644 --- a/erpnext/crm/doctype/email_campaign/email_campaign.py +++ b/erpnext/crm/doctype/email_campaign/email_campaign.py @@ -29,12 +29,19 @@ class EmailCampaign(Document): def validate(self): self.set_date() - # checking if email is set for lead. Not checking for contact as email is a mandatory field for contact. - if self.email_campaign_for == "Lead": - self.validate_lead() + self.validate_recipient_email() self.validate_email_campaign_already_exists() self.update_status() + def validate_recipient_email(self): + if not self.recipient: + return + + if self.email_campaign_for == "Lead": + self.validate_lead() + elif self.email_campaign_for == "Contact": + self.validate_contact() + def set_date(self): if getdate(self.start_date) < getdate(today()): frappe.throw(_("Start Date cannot be before the current date")) @@ -56,6 +63,13 @@ class EmailCampaign(Document): lead_name = frappe.db.get_value("Lead", self.recipient, "lead_name") frappe.throw(_("Please set an email id for the Lead {0}").format(lead_name)) + def validate_contact(self): + contact = frappe.db.get_value("Contact", self.recipient, ["email_id", "full_name"], as_dict=True) + if contact and not contact.email_id: + frappe.throw( + _("Please set a primary email ID for the Contact {0}").format(frappe.bold(contact.full_name)) + ) + def validate_email_campaign_already_exists(self): email_campaign_exists = frappe.db.exists( "Email Campaign", diff --git a/erpnext/crm/doctype/email_campaign/test_email_campaign.py b/erpnext/crm/doctype/email_campaign/test_email_campaign.py index 31b7c597cdb..11585f6b47f 100644 --- a/erpnext/crm/doctype/email_campaign/test_email_campaign.py +++ b/erpnext/crm/doctype/email_campaign/test_email_campaign.py @@ -59,3 +59,26 @@ class TestEmailCampaign(ERPNextTestSuite): doc.email_campaign_for = "Lead" doc.recipient = lead.name self.assertRaises(frappe.ValidationError, doc.validate_lead) + + def test_contact_without_an_email_is_rejected(self): + contact = frappe.get_doc({"doctype": "Contact", "first_name": "_Test Contact No Email"}).insert() + campaign = self.make_campaign(schedules=[0]) + doc = self.make_email_campaign(campaign.name) + doc.email_campaign_for = "Contact" + doc.recipient = contact.name + self.assertRaisesRegex(frappe.ValidationError, "primary email ID", doc.insert) + + def test_contact_with_an_email_is_accepted(self): + contact = frappe.get_doc( + { + "doctype": "Contact", + "first_name": "_Test Contact With Email", + "email_ids": [{"email_id": "_test_email_campaign@example.com", "is_primary": 1}], + } + ).insert() + campaign = self.make_campaign(schedules=[0]) + doc = self.make_email_campaign(campaign.name) + doc.email_campaign_for = "Contact" + doc.recipient = contact.name + doc.insert() + self.assertEqual(doc.status, "In Progress")