From 803d02f7962ca1afbda8babbcff8f45b4bb26e7e Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Thu, 18 Apr 2024 20:38:25 +0530 Subject: [PATCH] fix: send and receive whatsapp message from/on lead/deal --- crm/api/activities.py | 22 ---------- crm/api/whatsapp.py | 54 +++++++++++++++++++++++++ crm/hooks.py | 5 ++- frontend/src/components/Activities.vue | 31 +++++++++++--- frontend/src/components/WhatsAppBox.vue | 11 ++++- frontend/src/pages/Deal.vue | 1 + frontend/src/pages/Lead.vue | 1 + 7 files changed, 95 insertions(+), 30 deletions(-) create mode 100644 crm/api/whatsapp.py diff --git a/crm/api/activities.py b/crm/api/activities.py index 93d8d1e6..d04678d2 100644 --- a/crm/api/activities.py +++ b/crm/api/activities.py @@ -336,25 +336,3 @@ def get_linked_tasks(name): ], ) return tasks or [] - -@frappe.whitelist() -def get_whatsapp_messages(doctype, name): - whatsapp_messages = frappe.db.get_all( - "WhatsApp Message", - filters={"reference_doctype": doctype, "reference_name": name, "status": ("not in", ["failed"])}, - fields=["name", "type", "to", "from", "content_type", "creation", "message", "status"], - ) - return whatsapp_messages or [] - -@frappe.whitelist() -def create_whatsapp_message(reference_doctype, reference_name, to, message, content_type="text"): - doc = frappe.new_doc("WhatsApp Message") - doc.update({ - "reference_doctype": reference_doctype, - "reference_name": reference_name, - "to": to, - "message": message, - "content_type": content_type, - }) - doc.insert(ignore_permissions=True) - return doc.name \ No newline at end of file diff --git a/crm/api/whatsapp.py b/crm/api/whatsapp.py new file mode 100644 index 00000000..1f7fd657 --- /dev/null +++ b/crm/api/whatsapp.py @@ -0,0 +1,54 @@ +import frappe + +def validate(doc, method): + if doc.type == "Incoming" and doc.get("from"): + name, doctype = get_lead_or_deal_from_number(doc.get("from")) + doc.reference_doctype = doctype + doc.reference_name = name + +def get_lead_or_deal_from_number(number): + """Get lead/deal from the given number. + """ + + def find_record(doctype, mobile_no, where=''): + mobile_no = parse_mobile_no(mobile_no) + + query = f""" + SELECT name, mobile_no + FROM `tab{doctype}` + WHERE CONCAT('+', REGEXP_REPLACE(mobile_no, '[^0-9]', '')) = {mobile_no} + """ + + data = frappe.db.sql(query + where, as_dict=True) + return data[0].name if data else None + + doctype = "CRM Deal" + + doc = find_record(doctype, number) or None + if not doc: + doctype = "CRM Lead" + doc = find_record(doctype, number, 'AND converted is not True') + if not doc: + doc = find_record(doctype, number) + + return doc, doctype + +def parse_mobile_no(mobile_no: str): + """Parse mobile number to remove spaces, brackets, etc. + >>> parse_mobile_no('+91 (766) 667 6666') + ... '+917666676666' + """ + return ''.join([c for c in mobile_no if c.isdigit() or c == '+']) + +@frappe.whitelist() +def create_whatsapp_message(reference_doctype, reference_name, to, message, content_type="text"): + doc = frappe.new_doc("WhatsApp Message") + doc.update({ + "reference_doctype": reference_doctype, + "reference_name": reference_name, + "to": to, + "message": message, + "content_type": content_type, + }) + doc.insert(ignore_permissions=True) + return doc.name \ No newline at end of file diff --git a/crm/hooks.py b/crm/hooks.py index b25039c3..b95f5960 100644 --- a/crm/hooks.py +++ b/crm/hooks.py @@ -135,7 +135,10 @@ doc_events = { }, "Comment": { "on_update": ["crm.api.comment.on_update"], - } + }, + "WhatsApp Message": { + "validate": ["crm.api.whatsapp.validate"], + }, } # Scheduled Tasks diff --git a/frontend/src/components/Activities.vue b/frontend/src/components/Activities.vue index 16f33924..3645f561 100644 --- a/frontend/src/components/Activities.vue +++ b/frontend/src/components/Activities.vue @@ -45,7 +45,7 @@ -