diff --git a/erpnext/crm/utils.py b/erpnext/crm/utils.py index eb784c28ca7..8a6ce8311b1 100644 --- a/erpnext/crm/utils.py +++ b/erpnext/crm/utils.py @@ -147,14 +147,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", @@ -164,10 +187,15 @@ 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 Participants") + if open: + event_status_filter = event.status == "Open" + else: + event_status_filter = event.status != "Open" + query = ( frappe.qb.from_(event) .join(event_link) @@ -183,7 +211,7 @@ def get_open_events(ref_doctype, ref_docname): .where( (event_link.reference_doctype == ref_doctype) & (event_link.reference_docname == ref_docname) - & (event.status == "Open") + & (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 42603196087..5d0bc16ce32 100644 --- a/erpnext/public/js/templates/crm_activities.html +++ b/erpnext/public/js/templates/crm_activities.html @@ -57,6 +57,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) %} +
+ {% } %} +
+ +
+
+ {% } %} + +
+ {% } %} +
+ {% } %}
@@ -104,6 +145,49 @@ {{ __("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) { %} +
+
+ +
+ +
+
+
+ {%= 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(frappe.datetime.obj_to_user(event.ends_on)) %} + {%= frappe.datetime.get_time(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 a5a225458c0..b84d3e73792 100644 --- a/erpnext/public/js/utils/crm_activities.js +++ b/erpnext/public/js/utils/crm_activities.js @@ -35,6 +35,8 @@ erpnext.utils.CRMActivities = class CRMActivities { var activities_html = frappe.render_template("crm_activities", { tasks: r.message.tasks, events: r.message.events, + tasks_history: r.message.tasks_history, + events_history: r.message.events_history, }); $(activities_html).appendTo(me.open_activities_wrapper);