From 3ba549422e40282f6dd4408e55c8422e0a146cad Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Sun, 18 Feb 2024 16:55:45 +0530 Subject: [PATCH 1/3] fix: load calls from get_activities --- crm/api/activities.py | 35 ++++++- frontend/src/components/Activities.vue | 127 +++++++++---------------- 2 files changed, 78 insertions(+), 84 deletions(-) diff --git a/crm/api/activities.py b/crm/api/activities.py index 42611b24..b9c87bc7 100644 --- a/crm/api/activities.py +++ b/crm/api/activities.py @@ -32,10 +32,11 @@ def get_deal_activities(name): lead = doc[2] activities = [] + calls = [] creation_text = "created this deal" if lead: - activities = get_lead_activities(lead) + activities, calls = get_lead_activities(lead) creation_text = "converted the lead to this deal" activities.append({ @@ -125,10 +126,12 @@ def get_deal_activities(name): } activities.append(activity) + calls = calls + get_linked_calls(name) + activities.sort(key=lambda x: x["creation"], reverse=True) activities = handle_multiple_versions(activities) - return activities + return activities, calls def get_lead_activities(name): get_docinfo('', "CRM Lead", name) @@ -232,10 +235,12 @@ def get_lead_activities(name): } activities.append(activity) + calls = get_linked_calls(name) + activities.sort(key=lambda x: x["creation"], reverse=True) activities = handle_multiple_versions(activities) - return activities + return activities, calls @redis_cache() def get_attachments(name): @@ -276,4 +281,26 @@ def parse_grouped_versions(versions): return version other_versions = versions[1:] version["other_versions"] = other_versions - return version \ No newline at end of file + return version + +def get_linked_calls(name): + calls = frappe.db.get_all( + "CRM Call Log", + filters={"reference_docname": name}, + fields=[ + "name", + "caller", + "receiver", + "from", + "to", + "duration", + "start_time", + "end_time", + "status", + "type", + "recording_url", + "creation", + "note", + ], + ) + return calls or [] \ No newline at end of file diff --git a/frontend/src/components/Activities.vue b/frontend/src/components/Activities.vue index 2b8ee34c..2fb77ddf 100644 --- a/frontend/src/components/Activities.vue +++ b/frontend/src/components/Activities.vue @@ -799,82 +799,47 @@ const reload = defineModel('reload') const reload_email = ref(false) -const versions = createResource({ +const all_activities = createResource({ url: 'crm.api.activities.get_activities', params: { name: doc.value.data.name }, cache: ['activity', doc.value.data.name], -}) - -onMounted(() => { - if (versions.data == null) { - versions.fetch() - } - if (calls.data == null) { - calls.fetch() - } - if (notes.data == null) { - notes.fetch() - } - if (tasks.data == null) { - tasks.fetch() - } -}) - -const calls = createListResource({ - type: 'list', - doctype: 'CRM Call Log', - cache: ['Call Logs', doc.value.data.name], - fields: [ - 'name', - 'caller', - 'receiver', - 'from', - 'to', - 'duration', - 'start_time', - 'end_time', - 'status', - 'type', - 'recording_url', - 'creation', - 'note', - ], - filters: { reference_docname: doc.value.data.name }, - orderBy: 'creation desc', - pageLength: 999, - transform: (docs) => { - docs.forEach((doc) => { - doc.show_recording = false - doc.activity_type = - doc.type === 'Incoming' ? 'incoming_call' : 'outgoing_call' - doc.duration = secondsToDuration(doc.duration) - if (doc.type === 'Incoming') { - doc.caller = { - label: - getContact(doc.from)?.full_name || - getLeadContact(doc.from)?.full_name || - 'Unknown', - image: getContact(doc.from)?.image || getLeadContact(doc.from)?.image, + auto: true, + transform: ([versions, calls]) => { + if (calls?.length) { + calls.forEach((doc) => { + doc.show_recording = false + doc.activity_type = + doc.type === 'Incoming' ? 'incoming_call' : 'outgoing_call' + doc.duration = secondsToDuration(doc.duration) + if (doc.type === 'Incoming') { + doc.caller = { + label: + getContact(doc.from)?.full_name || + getLeadContact(doc.from)?.full_name || + 'Unknown', + image: + getContact(doc.from)?.image || getLeadContact(doc.from)?.image, + } + doc.receiver = { + label: getUser(doc.receiver).full_name, + image: getUser(doc.receiver).user_image, + } + } else { + doc.caller = { + label: getUser(doc.caller).full_name, + image: getUser(doc.caller).user_image, + } + doc.receiver = { + label: + getContact(doc.to)?.full_name || + getLeadContact(doc.to)?.full_name || + 'Unknown', + image: getContact(doc.to)?.image || getLeadContact(doc.to)?.image, + } } - doc.receiver = { - label: getUser(doc.receiver).full_name, - image: getUser(doc.receiver).user_image, - } - } else { - doc.caller = { - label: getUser(doc.caller).full_name, - image: getUser(doc.caller).user_image, - } - doc.receiver = { - label: - getContact(doc.to)?.full_name || - getLeadContact(doc.to)?.full_name || - 'Unknown', - image: getContact(doc.to)?.image || getLeadContact(doc.to)?.image, - } - } - }) - return docs + }) + } + return { versions, calls } }, }) @@ -908,10 +873,11 @@ const tasks = createListResource({ pageLength: 999, }) -function all_activities() { - if (!versions.data) return [] - if (!calls.data) return versions.data - return [...versions.data, ...calls.data].sort( +function get_activities() { + if (!all_activities.data?.versions) return [] + if (!all_activities.data?.calls.length) + return all_activities.data.versions || [] + return [...all_activities.data.versions, ...all_activities.data.calls].sort( (a, b) => new Date(a.creation) - new Date(b.creation) ) } @@ -919,14 +885,15 @@ function all_activities() { const activities = computed(() => { let activities = [] if (props.title == 'Activity') { - activities = all_activities() + activities = get_activities() } else if (props.title == 'Emails') { - if (!versions.data) return [] - activities = versions.data + if (!all_activities.data?.versions) return [] + activities = all_activities.data.versions .filter((activity) => activity.activity_type === 'communication') .sort((a, b) => new Date(a.creation) - new Date(b.creation)) } else if (props.title == 'Calls') { - return calls.data?.sort( + if (!all_activities.data?.calls) return [] + return all_activities.data.calls.sort( (a, b) => new Date(a.creation) - new Date(b.creation) ) } else if (props.title == 'Tasks') { From 792d9fb87120eb74b620998bd44f618d431fa666 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Sun, 18 Feb 2024 17:07:55 +0530 Subject: [PATCH 2/3] fix: load notes from get_activities --- crm/api/activities.py | 19 +++++++++++++++---- frontend/src/components/Activities.vue | 21 ++++++--------------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/crm/api/activities.py b/crm/api/activities.py index b9c87bc7..8f9df31e 100644 --- a/crm/api/activities.py +++ b/crm/api/activities.py @@ -33,10 +33,11 @@ def get_deal_activities(name): activities = [] calls = [] + notes = [] creation_text = "created this deal" if lead: - activities, calls = get_lead_activities(lead) + activities, calls, notes = get_lead_activities(lead) creation_text = "converted the lead to this deal" activities.append({ @@ -127,11 +128,12 @@ def get_deal_activities(name): activities.append(activity) calls = calls + get_linked_calls(name) + notes = notes + get_linked_notes(name) activities.sort(key=lambda x: x["creation"], reverse=True) activities = handle_multiple_versions(activities) - return activities, calls + return activities, calls, notes def get_lead_activities(name): get_docinfo('', "CRM Lead", name) @@ -236,11 +238,12 @@ def get_lead_activities(name): activities.append(activity) calls = get_linked_calls(name) + notes = get_linked_notes(name) activities.sort(key=lambda x: x["creation"], reverse=True) activities = handle_multiple_versions(activities) - return activities, calls + return activities, calls, notes @redis_cache() def get_attachments(name): @@ -303,4 +306,12 @@ def get_linked_calls(name): "note", ], ) - return calls or [] \ No newline at end of file + return calls or [] + +def get_linked_notes(name): + notes = frappe.db.get_all( + "CRM Note", + filters={"reference_docname": name}, + fields=['name', 'title', 'content', 'owner', 'modified'], + ) + return notes or [] diff --git a/frontend/src/components/Activities.vue b/frontend/src/components/Activities.vue index 2fb77ddf..6a93c285 100644 --- a/frontend/src/components/Activities.vue +++ b/frontend/src/components/Activities.vue @@ -717,7 +717,7 @@ /> { + transform: ([versions, calls, notes]) => { if (calls?.length) { calls.forEach((doc) => { doc.show_recording = false @@ -839,20 +839,10 @@ const all_activities = createResource({ } }) } - return { versions, calls } + return { versions, calls, notes } }, }) -const notes = createListResource({ - type: 'list', - doctype: 'CRM Note', - cache: ['Notes', doc.value.data.name], - fields: ['name', 'title', 'content', 'owner', 'modified'], - filters: { reference_docname: doc.value.data.name }, - orderBy: 'modified desc', - pageLength: 999, -}) - const tasks = createListResource({ type: 'list', doctype: 'CRM Task', @@ -901,7 +891,8 @@ const activities = computed(() => { (a, b) => new Date(a.creation) - new Date(b.creation) ) } else if (props.title == 'Notes') { - return notes.data?.sort( + if (!all_activities.data?.notes) return [] + return all_activities.data.notes.sort( (a, b) => new Date(a.creation) - new Date(b.creation) ) } @@ -1018,7 +1009,7 @@ async function deleteNote(name) { doctype: 'CRM Note', name, }) - notes.reload() + all_activities.reload() } // Tasks From d740d21c82abf5645231e180f6d55ad256b8b24f Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Sun, 18 Feb 2024 17:14:40 +0530 Subject: [PATCH 3/3] fix: load tasks from get_activities --- crm/api/activities.py | 27 ++++++++++++++++++--- frontend/src/components/Activities.vue | 33 ++++++-------------------- 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/crm/api/activities.py b/crm/api/activities.py index 8f9df31e..c458a383 100644 --- a/crm/api/activities.py +++ b/crm/api/activities.py @@ -34,10 +34,11 @@ def get_deal_activities(name): activities = [] calls = [] notes = [] + tasks = [] creation_text = "created this deal" if lead: - activities, calls, notes = get_lead_activities(lead) + activities, calls, notes, tasks = get_lead_activities(lead) creation_text = "converted the lead to this deal" activities.append({ @@ -129,11 +130,12 @@ def get_deal_activities(name): calls = calls + get_linked_calls(name) notes = notes + get_linked_notes(name) + tasks = tasks + get_linked_tasks(name) activities.sort(key=lambda x: x["creation"], reverse=True) activities = handle_multiple_versions(activities) - return activities, calls, notes + return activities, calls, notes, tasks def get_lead_activities(name): get_docinfo('', "CRM Lead", name) @@ -239,11 +241,12 @@ def get_lead_activities(name): calls = get_linked_calls(name) notes = get_linked_notes(name) + tasks = get_linked_tasks(name) activities.sort(key=lambda x: x["creation"], reverse=True) activities = handle_multiple_versions(activities) - return activities, calls, notes + return activities, calls, notes, tasks @redis_cache() def get_attachments(name): @@ -315,3 +318,21 @@ def get_linked_notes(name): fields=['name', 'title', 'content', 'owner', 'modified'], ) return notes or [] + +def get_linked_tasks(name): + tasks = frappe.db.get_all( + "CRM Task", + filters={"reference_docname": name}, + fields=[ + "name", + "title", + "description", + "assigned_to", + "assigned_to", + "due_date", + "priority", + "status", + "modified", + ], + ) + return tasks or [] diff --git a/frontend/src/components/Activities.vue b/frontend/src/components/Activities.vue index 6a93c285..7eb43032 100644 --- a/frontend/src/components/Activities.vue +++ b/frontend/src/components/Activities.vue @@ -724,7 +724,7 @@ /> { + transform: ([versions, calls, notes, tasks]) => { if (calls?.length) { calls.forEach((doc) => { doc.show_recording = false @@ -839,30 +839,10 @@ const all_activities = createResource({ } }) } - return { versions, calls, notes } + return { versions, calls, notes, tasks } }, }) -const tasks = createListResource({ - type: 'list', - doctype: 'CRM Task', - cache: ['Tasks', doc.value.data.name], - fields: [ - 'name', - 'title', - 'description', - 'assigned_to', - 'assigned_to', - 'due_date', - 'priority', - 'status', - 'modified', - ], - filters: { reference_docname: doc.value.data.name }, - orderBy: 'modified desc', - pageLength: 999, -}) - function get_activities() { if (!all_activities.data?.versions) return [] if (!all_activities.data?.calls.length) @@ -887,7 +867,8 @@ const activities = computed(() => { (a, b) => new Date(a.creation) - new Date(b.creation) ) } else if (props.title == 'Tasks') { - return tasks.data?.sort( + if (!all_activities.data?.tasks) return [] + return all_activities.data.tasks.sort( (a, b) => new Date(a.creation) - new Date(b.creation) ) } else if (props.title == 'Notes') { @@ -1033,7 +1014,7 @@ async function deleteTask(name) { doctype: 'CRM Task', name, }) - tasks.reload() + all_activities.reload() } function updateTaskStatus(status, task) { @@ -1043,7 +1024,7 @@ function updateTaskStatus(status, task) { fieldname: 'status', value: status, }).then(() => { - tasks.reload() + all_activities.reload() }) }