|
- import frappe
- from frappe.desk.notifications import notify_mentions
- from frappe.model.document import Document
- from frappe.utils import cstr, now, today
- from pypika import functions
-
-
- def update_lead_phone_numbers(contact, method):
- if contact.phone_nos:
- contact_lead = contact.get_link_for("Lead")
- if contact_lead:
- phone = mobile_no = contact.phone_nos[0].phone
-
- if len(contact.phone_nos) > 1:
- # get the default phone number
- primary_phones = [
- phone_doc.phone for phone_doc in contact.phone_nos if phone_doc.is_primary_phone
- ]
- if primary_phones:
- phone = primary_phones[0]
-
- # get the default mobile number
- primary_mobile_nos = [
- phone_doc.phone for phone_doc in contact.phone_nos if phone_doc.is_primary_mobile_no
- ]
- if primary_mobile_nos:
- mobile_no = primary_mobile_nos[0]
-
- lead = frappe.get_doc("Lead", contact_lead)
- lead.db_set("phone", phone)
- lead.db_set("mobile_no", mobile_no)
-
-
- def copy_comments(doctype, docname, doc):
- comments = frappe.db.get_values(
- "Comment",
- filters={"reference_doctype": doctype, "reference_name": docname, "comment_type": "Comment"},
- fieldname="*",
- )
- for comment in comments:
- comment = frappe.get_doc(comment.update({"doctype": "Comment"}))
- comment.name = None
- comment.reference_doctype = doc.doctype
- comment.reference_name = doc.name
- comment.insert()
-
-
- def link_communications(doctype, docname, doc):
- communication_list = get_linked_communication_list(doctype, docname)
-
- for communication in communication_list:
- communication_doc = frappe.get_doc("Communication", communication)
- communication_doc.add_link(doc.doctype, doc.name, autosave=True)
-
-
- def get_linked_communication_list(doctype, docname):
- communications = frappe.get_all(
- "Communication", filters={"reference_doctype": doctype, "reference_name": docname}, pluck="name"
- )
- communication_links = frappe.get_all(
- "Communication Link",
- {"link_doctype": doctype, "link_name": docname, "parent": ("not in", communications)},
- pluck="parent",
- )
-
- return communications + communication_links
-
-
- def link_communications_with_prospect(communication, method):
- prospect = get_linked_prospect(communication.reference_doctype, communication.reference_name)
-
- if prospect:
- already_linked = any(
- [
- d.name
- for d in communication.get("timeline_links")
- if d.link_doctype == "Prospect" and d.link_name == prospect
- ]
- )
- if not already_linked:
- row = communication.append("timeline_links")
- row.link_doctype = "Prospect"
- row.link_name = prospect
- row.db_update()
-
-
- def get_linked_prospect(reference_doctype, reference_name):
- prospect = None
- if reference_doctype == "Lead":
- prospect = frappe.db.get_value("Prospect Lead", {"lead": reference_name}, "parent")
-
- elif reference_doctype == "Opportunity":
- opportunity_from, party_name = frappe.db.get_value(
- "Opportunity", reference_name, ["opportunity_from", "party_name"]
- )
- if opportunity_from == "Lead":
- prospect = frappe.db.get_value(
- "Prospect Opportunity", {"opportunity": reference_name}, "parent"
- )
- if opportunity_from == "Prospect":
- prospect = party_name
-
- return prospect
-
-
- def link_events_with_prospect(event, method):
- if event.event_participants:
- ref_doctype = event.event_participants[0].reference_doctype
- ref_docname = event.event_participants[0].reference_docname
- prospect = get_linked_prospect(ref_doctype, ref_docname)
- if prospect:
- event.add_participant("Prospect", prospect)
- event.save()
-
-
- def link_open_tasks(ref_doctype, ref_docname, doc):
- todos = get_open_todos(ref_doctype, ref_docname)
-
- for todo in todos:
- todo_doc = frappe.get_doc("ToDo", todo.name)
- todo_doc.reference_type = doc.doctype
- todo_doc.reference_name = doc.name
- todo_doc.save()
-
-
- def link_open_events(ref_doctype, ref_docname, doc):
- events = get_open_events(ref_doctype, ref_docname)
- for event in events:
- event_doc = frappe.get_doc("Event", event.name)
- event_doc.add_participant(doc.doctype, doc.name)
- event_doc.save()
-
-
- @frappe.whitelist()
- def get_open_activities(ref_doctype, ref_docname):
- tasks = get_open_todos(ref_doctype, ref_docname)
- events = get_open_events(ref_doctype, ref_docname)
-
- return {"tasks": tasks, "events": events}
-
-
- def get_open_todos(ref_doctype, ref_docname):
- return frappe.get_all(
- "ToDo",
- filters={"reference_type": ref_doctype, "reference_name": ref_docname, "status": "Open"},
- fields=[
- "name",
- "description",
- "allocated_to",
- "date",
- ],
- )
-
-
- def get_open_events(ref_doctype, ref_docname):
- event = frappe.qb.DocType("Event")
- event_link = frappe.qb.DocType("Event Participants")
-
- query = (
- frappe.qb.from_(event)
- .join(event_link)
- .on(event_link.parent == event.name)
- .select(
- event.name,
- event.subject,
- event.event_category,
- event.starts_on,
- event.ends_on,
- event.description,
- )
- .where(
- (event_link.reference_doctype == ref_doctype)
- & (event_link.reference_docname == ref_docname)
- & (event.status == "Open")
- )
- )
- data = query.run(as_dict=True)
-
- return data
-
-
- def open_leads_opportunities_based_on_todays_event():
- event = frappe.qb.DocType("Event")
- event_link = frappe.qb.DocType("Event Participants")
-
- query = (
- frappe.qb.from_(event)
- .join(event_link)
- .on(event_link.parent == event.name)
- .select(event_link.reference_doctype, event_link.reference_docname)
- .where(
- (event_link.reference_doctype.isin(["Lead", "Opportunity"]))
- & (event.status == "Open")
- & (functions.Date(event.starts_on) == today())
- )
- )
- data = query.run(as_dict=True)
-
- for d in data:
- frappe.db.set_value(d.reference_doctype, d.reference_docname, "status", "Open")
-
-
- class CRMNote(Document):
- @frappe.whitelist()
- def add_note(self, note):
- self.append("notes", {"note": note, "added_by": frappe.session.user, "added_on": now()})
- self.save()
- notify_mentions(self.doctype, self.name, note)
-
- @frappe.whitelist()
- def edit_note(self, note, row_id):
- for d in self.notes:
- if cstr(d.name) == row_id:
- d.note = note
- d.db_update()
-
- @frappe.whitelist()
- def delete_note(self, row_id):
- for d in self.notes:
- if cstr(d.name) == row_id:
- self.remove(d)
- break
- self.save()
|