feat: API for crm integration
This commit is contained in:
135
erpnext/crm/frappe_crm_api.py
Normal file
135
erpnext/crm/frappe_crm_api.py
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
import json
|
||||||
|
|
||||||
|
import frappe
|
||||||
|
from frappe import _
|
||||||
|
from frappe.custom.doctype.custom_field.custom_field import create_custom_fields
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def create_custom_fields_for_frappe_crm():
|
||||||
|
frappe.only_for("System Manager")
|
||||||
|
custom_fields = {
|
||||||
|
"Quotation": [
|
||||||
|
{
|
||||||
|
"fieldname": "crm_deal",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Frappe CRM Deal",
|
||||||
|
"insert_after": "party_name",
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Customer": [
|
||||||
|
{
|
||||||
|
"fieldname": "crm_deal",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"label": "Frappe CRM Deal",
|
||||||
|
"insert_after": "prospect_name",
|
||||||
|
}
|
||||||
|
],
|
||||||
|
}
|
||||||
|
create_custom_fields(custom_fields, ignore_validate=True)
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def create_prospect_against_crm_deal():
|
||||||
|
frappe.only_for("System Manager")
|
||||||
|
doc = frappe.form_dict
|
||||||
|
prospect = frappe.get_doc(
|
||||||
|
{
|
||||||
|
"doctype": "Prospect",
|
||||||
|
"company_name": doc.organization or doc.lead_name,
|
||||||
|
"no_of_employees": doc.no_of_employees,
|
||||||
|
"prospect_owner": doc.deal_owner,
|
||||||
|
"company": doc.erpnext_company,
|
||||||
|
"crm_deal": doc.crm_deal,
|
||||||
|
"territory": doc.territory,
|
||||||
|
"industry": doc.industry,
|
||||||
|
"website": doc.website,
|
||||||
|
"annual_revenue": doc.annual_revenue,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
prospect_name = frappe.db.get_value("Prospect", {"company_name": prospect.company_name})
|
||||||
|
if not prospect_name:
|
||||||
|
prospect.insert()
|
||||||
|
prospect_name = prospect.name
|
||||||
|
except Exception:
|
||||||
|
frappe.log_error(
|
||||||
|
frappe.get_traceback(),
|
||||||
|
f"Error while creating prospect against CRM Deal: {frappe.form_dict.get('crm_deal_id')}",
|
||||||
|
)
|
||||||
|
pass
|
||||||
|
|
||||||
|
create_contacts(json.loads(doc.contacts), prospect.company_name, "Prospect", prospect_name)
|
||||||
|
frappe.response["message"] = prospect_name
|
||||||
|
|
||||||
|
|
||||||
|
def create_contacts(contacts, organization=None, link_doctype=None, link_docname=None):
|
||||||
|
for c in contacts:
|
||||||
|
c = frappe._dict(c)
|
||||||
|
existing_contact = contact_exists(c.email, c.mobile_no)
|
||||||
|
if existing_contact:
|
||||||
|
contact = frappe.get_doc("Contact", existing_contact)
|
||||||
|
else:
|
||||||
|
contact = frappe.get_doc(
|
||||||
|
{
|
||||||
|
"doctype": "Contact",
|
||||||
|
"first_name": c.get("full_name"),
|
||||||
|
"gender": c.get("gender"),
|
||||||
|
"company_name": organization,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if c.get("email"):
|
||||||
|
contact.append("email_ids", {"email_id": c.get("email"), "is_primary": 1})
|
||||||
|
|
||||||
|
if c.get("mobile_no"):
|
||||||
|
contact.append("phone_nos", {"phone": c.get("mobile_no"), "is_primary_mobile_no": 1})
|
||||||
|
|
||||||
|
link_contact_to_prospect(contact, link_doctype, link_docname)
|
||||||
|
|
||||||
|
contact.save(ignore_permissions=True)
|
||||||
|
|
||||||
|
|
||||||
|
def link_contact_to_prospect(contact, link_doctype, link_docname):
|
||||||
|
already_linked = any(
|
||||||
|
[(link.link_doctype == link_doctype and link.link_name == link_docname) for link in contact.links]
|
||||||
|
)
|
||||||
|
if not already_linked:
|
||||||
|
contact.append(
|
||||||
|
"links", {"link_doctype": link_doctype, "link_name": link_docname, "link_title": link_docname}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def contact_exists(email, mobile_no):
|
||||||
|
email_exist = frappe.db.exists("Contact Email", {"email_id": email})
|
||||||
|
mobile_exist = frappe.db.exists("Contact Phone", {"phone": mobile_no})
|
||||||
|
|
||||||
|
doctype = "Contact Email" if email_exist else "Contact Phone"
|
||||||
|
name = email_exist or mobile_exist
|
||||||
|
|
||||||
|
if name:
|
||||||
|
return frappe.db.get_value(doctype, name, "parent")
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def create_customer(customer_data=None):
|
||||||
|
frappe.only_for("System Manager")
|
||||||
|
if not customer_data:
|
||||||
|
customer_data = frappe.form_dict
|
||||||
|
|
||||||
|
try:
|
||||||
|
customer_name = frappe.db.exists("Customer", {"customer_name": customer_data.get("customer_name")})
|
||||||
|
if not customer_name:
|
||||||
|
customer = frappe.get_doc({"doctype": "Customer", **customer_data}).insert(
|
||||||
|
ignore_permissions=True
|
||||||
|
)
|
||||||
|
customer_name = customer.name
|
||||||
|
|
||||||
|
contacts = json.loads(customer_data.get("contacts"))
|
||||||
|
create_contacts(contacts, customer_name, "Customer", customer_name)
|
||||||
|
except Exception:
|
||||||
|
frappe.log_error(frappe.get_traceback(), "Error while creating customer against Frappe CRM Deal")
|
||||||
|
pass
|
||||||
@@ -71,7 +71,7 @@ frappe.ui.form.on("Quotation", {
|
|||||||
frm.trigger("set_label");
|
frm.trigger("set_label");
|
||||||
frm.trigger("toggle_reqd_lead_customer");
|
frm.trigger("toggle_reqd_lead_customer");
|
||||||
frm.trigger("set_dynamic_field_label");
|
frm.trigger("set_dynamic_field_label");
|
||||||
frm.set_value("party_name", "");
|
// frm.set_value("party_name", ""); // removed to set party_name from url for crm integration
|
||||||
frm.set_value("customer_name", "");
|
frm.set_value("customer_name", "");
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -220,6 +220,10 @@ class Quotation(SellingController):
|
|||||||
"Lead", self.party_name, ["lead_name", "company_name"]
|
"Lead", self.party_name, ["lead_name", "company_name"]
|
||||||
)
|
)
|
||||||
self.customer_name = company_name or lead_name
|
self.customer_name = company_name or lead_name
|
||||||
|
elif self.party_name and self.quotation_to == "Prospect":
|
||||||
|
self.customer_name = self.party_name
|
||||||
|
elif self.party_name and self.quotation_to == "CRM Deal":
|
||||||
|
self.customer_name = frappe.db.get_value("CRM Deal", self.party_name, "organization")
|
||||||
|
|
||||||
def update_opportunity(self, status):
|
def update_opportunity(self, status):
|
||||||
for opportunity in set(d.prevdoc_docname for d in self.get("items")):
|
for opportunity in set(d.prevdoc_docname for d in self.get("items")):
|
||||||
|
|||||||
Reference in New Issue
Block a user