mirror of
https://github.com/frappe/erpnext.git
synced 2026-03-20 15:32:14 +00:00
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:
@@ -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)
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user