63b9795d41
Because `db_update` is performed `_assign` property is not updated and hence lead -> opportunity conversion makes it disappear from list view. Steps to reproduce: 1. Create lead 2. Assign anyone 3. Create opportunity from lead. 4. Form view shows assigned user, list view wont.
224 lines
6.0 KiB
Python
224 lines
6.0 KiB
Python
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()
|