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 @@
-