From 6ba845c0e99de68f05cdac7885977e202e08f05f Mon Sep 17 00:00:00 2001 From: Corentin Forler Date: Fri, 28 Mar 2025 13:40:18 +0100 Subject: [PATCH 1/3] fix: Fix variable name in crm_activities --- erpnext/public/js/templates/crm_activities.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/public/js/templates/crm_activities.html b/erpnext/public/js/templates/crm_activities.html index 6be64f1e1d..357c336e8a 100644 --- a/erpnext/public/js/templates/crm_activities.html +++ b/erpnext/public/js/templates/crm_activities.html @@ -65,7 +65,7 @@
{% if(events[i].allocated_to) { %} - {%= frappe.avatar(tasks[i].allocated_to) %} + {%= frappe.avatar(events[i].allocated_to) %} {% } %} {% if(events[i].participants.length) { %} / -- GitLab From aaabc0a6b0d704b67aed61688d2bae271a314f15 Mon Sep 17 00:00:00 2001 From: Corentin Forler Date: Fri, 28 Mar 2025 12:42:31 +0100 Subject: [PATCH 2/3] feat: Show past events and todos in crm_activities --- erpnext/crm/utils.py | 40 +++++++- .../public/js/templates/crm_activities.html | 94 +++++++++++++++++++ erpnext/public/js/utils/crm_activities.js | 4 +- 3 files changed, 132 insertions(+), 6 deletions(-) diff --git a/erpnext/crm/utils.py b/erpnext/crm/utils.py index c51a55d5c0..9184977fe6 100644 --- a/erpnext/crm/utils.py +++ b/erpnext/crm/utils.py @@ -133,14 +133,37 @@ def link_open_events(ref_doctype, ref_docname, doc): def get_open_activities(ref_doctype, ref_docname): tasks = get_open_todos(ref_doctype, ref_docname) events = get_open_events(ref_doctype, ref_docname) + tasks_history = get_closed_todos(ref_doctype, ref_docname) + events_history = get_closed_events(ref_doctype, ref_docname) - return {"tasks": tasks, "events": events} + return { + "tasks": tasks, + "events": events, + "tasks_history": tasks_history, + "events_history": events_history, + } + + +def get_closed_todos(ref_doctype, ref_docname): + return get_filtered_todos(ref_doctype, ref_docname, status=("!=", "Open")) def get_open_todos(ref_doctype, ref_docname): + return get_filtered_todos(ref_doctype, ref_docname, status="Open") + + +def get_open_events(ref_doctype, ref_docname): + return get_filtered_events(ref_doctype, ref_docname, open=True) + + +def get_closed_events(ref_doctype, ref_docname): + return get_filtered_events(ref_doctype, ref_docname, open=False) + + +def get_filtered_todos(ref_doctype, ref_docname, status: str | tuple[str, str]): return frappe.get_all( "ToDo", - filters={"reference_type": ref_doctype, "reference_name": ref_docname, "status": "Open"}, + filters={"reference_type": ref_doctype, "reference_name": ref_docname, "status": status}, fields=[ "name", "description", @@ -150,19 +173,26 @@ def get_open_todos(ref_doctype, ref_docname): ) -def get_open_events(ref_doctype, ref_docname): +def get_filtered_events(ref_doctype, ref_docname, open: bool): event = frappe.qb.DocType("Event") event_link = frappe.qb.DocType("Event Reference") todo = frappe.qb.DocType("ToDo") participants = frappe.qb.DocType("Event Participants") contact = frappe.qb.DocType("Contact") + if open: + todo_status_filter = todo.status == "Open" + event_status_filter = event.status.notin(("Closed", "Cancelled", "Completed")) + else: + todo_status_filter = todo.status != "Open" + event_status_filter = event.status.isin(("Closed", "Cancelled", "Completed")) + query = ( frappe.qb.from_(event) .join(event_link) .on(event_link.parent == event.name) .left_join(todo) - .on((todo.reference_type == "Event") & (todo.reference_name == event.name) & (todo.status == "Open")) + .on((todo.reference_type == "Event") & (todo.reference_name == event.name) & (todo_status_filter)) .left_join(participants) .on(event.name == participants.parent) .left_join(contact) @@ -180,7 +210,7 @@ def get_open_events(ref_doctype, ref_docname): .where( (event_link.reference_doctype == ref_doctype) & (event_link.reference_docname == ref_docname) - & (event.status.notin(("Closed", "Cancelled", "Completed"))) + & (event_status_filter) ) ) data = query.run(as_dict=True) diff --git a/erpnext/public/js/templates/crm_activities.html b/erpnext/public/js/templates/crm_activities.html index 357c336e8a..0fd56f196f 100644 --- a/erpnext/public/js/templates/crm_activities.html +++ b/erpnext/public/js/templates/crm_activities.html @@ -54,6 +54,47 @@ {{ __("No open task") }}
{% } %} + + {% if (typeof tasks_history == "object" && tasks_history?.length) { %} +
+
+ {{ __("Completed Tasks") }} +
+ {% for (const t of tasks_history) { %} +
+ {% if(t.date || t.allocated_to) { %} +
+
+ {% if(t.allocated_to) { %} + {%= frappe.avatar(t.allocated_to) %} + {% } %} +
+
+
+ {{ __("Done") }} +
+
+ {% if (t.date) { %} +
+ {%= frappe.datetime.global_date_format(t.date) %} +
+ {% } %} +
+ +
+
+ {% } %} + +
+ {% } %} +
+ {% } %}
@@ -110,6 +151,59 @@ {{ __("No open event") }}
{% } %} + + {% if (typeof events_history == "object" && events_history?.length) { %} +
+
+ {{ __("Past Events") }} +
+ {% let icon_set = {"Sent/Received Email": "mail", "Call": "call", "Meeting": "share-people"}; %} + {% for(const event of events_history) { %} +
+
+
+ {% if(event.allocated_to) { %} + {%= frappe.avatar(event.allocated_to) %} + {% } %} + {% if(event.participants.length) { %} + / + {%= frappe.avatar_group(event.participants)[0].outerHTML %} + {% } %} +
+
+ {%= frappe.datetime.global_date_format(event.starts_on) %} + + {% if (event.ends_on) { %} + {% if (frappe.datetime.obj_to_user(event.starts_on) != + frappe.datetime.obj_to_user(event.ends_on)) %} + - + {%= frappe.datetime.global_date_format(event.ends_on) %} + {% } else if (event.ends_on) { %} + - + {%= frappe.datetime.get_time(event.ends_on) %} + {% } %} + {% } %} +
+
+ +
+
+
+ +
+
+ {% } %} +
+ {% } %}
diff --git a/erpnext/public/js/utils/crm_activities.js b/erpnext/public/js/utils/crm_activities.js index 1ab0551cff..5fd29a615d 100644 --- a/erpnext/public/js/utils/crm_activities.js +++ b/erpnext/public/js/utils/crm_activities.js @@ -34,7 +34,9 @@ erpnext.utils.CRMActivities = class CRMActivities { if (!r.exc) { var activities_html = frappe.render_template('crm_activities', { tasks: r.message.tasks, - events: r.message.events + events: r.message.events, + tasks_history: r.message.tasks_history, + events_history: r.message.events_history, }); $(activities_html).appendTo(me.open_activities_wrapper); -- GitLab From 157ebefcf779f3e2ea7c6138cbad550179ac386c Mon Sep 17 00:00:00 2001 From: Corentin Forler Date: Fri, 28 Mar 2025 13:41:23 +0100 Subject: [PATCH 3/3] chore(fr): Fix missing accents in transation --- erpnext/locale/fr.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/locale/fr.po b/erpnext/locale/fr.po index 9aa1ee5139..065915c7e1 100644 --- a/erpnext/locale/fr.po +++ b/erpnext/locale/fr.po @@ -35433,11 +35433,11 @@ msgstr "Ouvrir le contact" #: public/js/templates/crm_activities.html:76 msgid "Open Event" -msgstr "Evénement ouvert" +msgstr "Événement ouvert" #: public/js/templates/crm_activities.html:63 msgid "Open Events" -msgstr "Evénements ouverts" +msgstr "Événements ouverts" #: selling/page/point_of_sale/pos_controller.js:174 msgid "Open Form View" -- GitLab