diff --git a/erpnext/crm/doctype/opportunity/opportunity.py b/erpnext/crm/doctype/opportunity/opportunity.py index 4251cae954..970fd570ff 100644 --- a/erpnext/crm/doctype/opportunity/opportunity.py +++ b/erpnext/crm/doctype/opportunity/opportunity.py @@ -42,10 +42,28 @@ class Opportunity(TransactionBase): if not self.with_items: self.items = [] - def make_new_lead_if_required(self): """Set lead against new opportunity""" if not (self.lead or self.customer) and self.contact_email: + # check if customer is already created agains the self.contact_email + customer = frappe.db.sql("""select + distinct `tabDynamic Link`.link_name as customer + from + `tabContact`, + `tabDynamic Link` + where `tabContact`.email_id='{0}' + and + `tabContact`.name=`tabDynamic Link`.parent + and + ifnull(`tabDynamic Link`.link_name, '')<>'' + and + `tabDynamic Link`.link_doctype='Customer' + """.format(self.contact_email), as_dict=True) + if customer and customer[0].customer: + self.customer = customer[0].customer + self.enquiry_from = "Customer" + return + lead_name = frappe.db.get_value("Lead", {"email_id": self.contact_email}) if not lead_name: sender_name = get_fullname(self.contact_email) diff --git a/erpnext/crm/doctype/opportunity/test_opportunity.py b/erpnext/crm/doctype/opportunity/test_opportunity.py index 4cd20ea72d..61b583ce3b 100644 --- a/erpnext/crm/doctype/opportunity/test_opportunity.py +++ b/erpnext/crm/doctype/opportunity/test_opportunity.py @@ -4,6 +4,7 @@ from __future__ import unicode_literals import frappe from frappe.utils import today +from erpnext.crm.doctype.lead.lead import make_customer from erpnext.crm.doctype.opportunity.opportunity import make_quotation import unittest @@ -25,12 +26,45 @@ class TestOpportunity(unittest.TestCase): doc = frappe.get_doc('Opportunity', doc.name) self.assertEquals(doc.status, "Quotation") + def test_make_new_lead_if_required(self): + args = { + "doctype": "Opportunity", + "contact_email":"new.opportunity@example.com", + "enquiry_type": "Sales", + "with_items": 0, + "transaction_date": today() + } + # new lead should be created against the new.opportunity@example.com + opp_doc = frappe.get_doc(args).insert(ignore_permissions=True) + + self.assertTrue(opp_doc.lead) + self.assertEquals(opp_doc.enquiry_from, "Lead") + self.assertEquals(frappe.db.get_value("Lead", opp_doc.lead, "email_id"), + 'new.opportunity@example.com') + + # create new customer and create new contact against 'new.opportunity@example.com' + customer = make_customer(opp_doc.lead).insert(ignore_permissions=True) + frappe.get_doc({ + "doctype": "Contact", + "email_id": "new.opportunity@example.com", + "first_name": "_Test Opportunity Customer", + "links": [{ + "link_doctype": "Customer", + "link_name": customer.name + }] + }).insert(ignore_permissions=True) + + opp_doc = frappe.get_doc(args).insert(ignore_permissions=True) + self.assertTrue(opp_doc.customer) + self.assertEquals(opp_doc.enquiry_from, "Customer") + self.assertEquals(opp_doc.customer, customer.name) + def make_opportunity(**args): args = frappe._dict(args) opp_doc = frappe.get_doc({ "doctype": "Opportunity", - "enquiry_from": "Customer" or args.enquiry_from, + "enquiry_from": args.enquiry_from or "Customer", "enquiry_type": "Sales", "with_items": args.with_items or 0, "transaction_date": today()