-
Notifications
You must be signed in to change notification settings - Fork 7.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #43223 from frappe/mergify/bp/version-15-hotfix/pr…
…-43198 feat: API for crm integration (backport #43198)
- Loading branch information
Showing
3 changed files
with
140 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters