fix: Create Sales Order from Quotation for Prospect

(cherry picked from commit 2f63fae31d)

# Conflicts:
#	erpnext/selling/doctype/quotation/quotation.py
This commit is contained in:
Nihantra Patel
2024-07-18 12:14:53 +05:30
committed by Mergify
parent a144059c7c
commit f547befeb9
4 changed files with 91 additions and 0 deletions

View File

@@ -27,6 +27,26 @@ class TestProspect(unittest.TestCase):
address_doc.reload() address_doc.reload()
self.assertEqual(address_doc.has_link("Prospect", prospect_doc.name), True) self.assertEqual(address_doc.has_link("Prospect", prospect_doc.name), True)
def test_make_customer_from_prospect(self):
from erpnext.crm.doctype.prospect.prospect import make_customer as make_customer_from_prospect
frappe.delete_doc_if_exists("Customer", "_Test Prospect")
prospect = frappe.get_doc({
"doctype": "Prospect",
"company_name": "_Test Prospect",
"customer_group": "_Test Customer Group",
})
prospect.insert()
customer = make_customer_from_prospect("_Test Prospect")
self.assertEqual(customer.doctype, "Customer")
self.assertEqual(customer.company_name, "_Test Prospect")
self.assertEqual(customer.customer_group, "_Test Customer Group")
customer.company = "_Test Company"
customer.insert()
def make_prospect(**args): def make_prospect(**args):
args = frappe._dict(args) args = frappe._dict(args)

View File

@@ -21,6 +21,7 @@
"gender", "gender",
"lead_name", "lead_name",
"opportunity_name", "opportunity_name",
"prospect_name",
"account_manager", "account_manager",
"image", "image",
"defaults_tab", "defaults_tab",
@@ -570,6 +571,14 @@
{ {
"fieldname": "column_break_nwor", "fieldname": "column_break_nwor",
"fieldtype": "Column Break" "fieldtype": "Column Break"
},
{
"fieldname": "prospect_name",
"fieldtype": "Link",
"label": "From Prospect",
"no_copy": 1,
"options": "Prospect",
"print_hide": 1
} }
], ],
"icon": "fa fa-user", "icon": "fa fa-user",

View File

@@ -77,6 +77,7 @@ class Customer(TransactionBase):
payment_terms: DF.Link | None payment_terms: DF.Link | None
portal_users: DF.Table[PortalUser] portal_users: DF.Table[PortalUser]
primary_address: DF.Text | None primary_address: DF.Text | None
prospect_name: DF.Link | None
represents_company: DF.Link | None represents_company: DF.Link | None
sales_team: DF.Table[SalesTeam] sales_team: DF.Table[SalesTeam]
salutation: DF.Link | None salutation: DF.Link | None

View File

@@ -516,6 +516,7 @@ def _make_customer(source_name, ignore_permissions=False, customer_group=None):
if not customer_name: if not customer_name:
from erpnext.crm.doctype.lead.lead import _make_customer from erpnext.crm.doctype.lead.lead import _make_customer
<<<<<<< HEAD
customer_doclist = _make_customer(lead_name, ignore_permissions=ignore_permissions) customer_doclist = _make_customer(lead_name, ignore_permissions=ignore_permissions)
customer = frappe.get_doc(customer_doclist) customer = frappe.get_doc(customer_doclist)
customer.flags.ignore_permissions = ignore_permissions customer.flags.ignore_permissions = ignore_permissions
@@ -535,6 +536,25 @@ def _make_customer(source_name, ignore_permissions=False, customer_group=None):
except frappe.MandatoryError as e: except frappe.MandatoryError as e:
mandatory_fields = e.args[0].split(":")[1].split(",") mandatory_fields = e.args[0].split(":")[1].split(",")
mandatory_fields = [customer.meta.get_label(field.strip()) for field in mandatory_fields] mandatory_fields = [customer.meta.get_label(field.strip()) for field in mandatory_fields]
=======
# Check if a Customer already exists for the Lead or Prospect.
existing_customer = None
if quotation.quotation_to == "Lead":
existing_customer = frappe.db.get_value("Customer", {"lead_name": quotation.party_name})
elif quotation.quotation_to == "Prospect":
existing_customer = frappe.db.get_value("Customer", {"prospect_name": quotation.party_name})
if existing_customer:
return frappe.get_doc("Customer", existing_customer)
# If no Customer exists, create a new Customer or Prospect.
if quotation.quotation_to == "Lead":
return create_customer_from_lead(quotation.party_name, ignore_permissions=ignore_permissions)
elif quotation.quotation_to == "Prospect":
return create_customer_from_prospect(quotation.party_name, ignore_permissions=ignore_permissions)
return None
>>>>>>> 2f63fae31d (fix: Create Sales Order from Quotation for Prospect)
frappe.local.message_log = [] frappe.local.message_log = []
lead_link = frappe.utils.get_link_to_form("Lead", lead_name) lead_link = frappe.utils.get_link_to_form("Lead", lead_name)
@@ -545,8 +565,49 @@ def _make_customer(source_name, ignore_permissions=False, customer_group=None):
message += "<br><ul><li>" + "</li><li>".join(mandatory_fields) + "</li></ul>" message += "<br><ul><li>" + "</li><li>".join(mandatory_fields) + "</li></ul>"
message += _("Please create Customer from Lead {0}.").format(lead_link) message += _("Please create Customer from Lead {0}.").format(lead_link)
<<<<<<< HEAD
frappe.throw(message, title=_("Mandatory Missing")) frappe.throw(message, title=_("Mandatory Missing"))
else: else:
return customer_name return customer_name
else: else:
return frappe.get_doc("Customer", quotation.get("party_name")) return frappe.get_doc("Customer", quotation.get("party_name"))
=======
def create_customer_from_lead(lead_name, ignore_permissions=False):
from erpnext.crm.doctype.lead.lead import _make_customer
customer = _make_customer(lead_name, ignore_permissions=ignore_permissions)
customer.flags.ignore_permissions = ignore_permissions
try:
customer.insert()
return customer
except frappe.MandatoryError as e:
handle_mandatory_error(e, customer, lead_name)
def create_customer_from_prospect(prospect_name, ignore_permissions=False):
from erpnext.crm.doctype.prospect.prospect import make_customer as make_customer_from_prospect
customer = make_customer_from_prospect(prospect_name)
customer.flags.ignore_permissions = ignore_permissions
try:
customer.insert()
return customer
except frappe.MandatoryError as e:
handle_mandatory_error(e, customer, prospect_name)
def handle_mandatory_error(e, customer, lead_name):
from frappe.utils import get_link_to_form
mandatory_fields = e.args[0].split(":")[1].split(",")
mandatory_fields = [customer.meta.get_label(field.strip()) for field in mandatory_fields]
frappe.local.message_log = []
message = _("Could not auto create Customer due to the following missing mandatory field(s):") + "<br>"
message += "<br><ul><li>" + "</li><li>".join(mandatory_fields) + "</li></ul>"
message += _("Please create Customer from Lead {0}.").format(get_link_to_form("Lead", lead_name))
frappe.throw(message, title=_("Mandatory Missing"))
>>>>>>> 2f63fae31d (fix: Create Sales Order from Quotation for Prospect)