diff --git a/erpnext/crm/utils.py b/erpnext/crm/utils.py index c51a55d5c013e0ec46876ab0e3d1550bac13fc94..9184977fe69166bcf1e36042f399799ef5afebeb 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/locale/fr.po b/erpnext/locale/fr.po index 9aa1ee51398c1bcf84011274a397b8f887b86663..065915c7e1856f54903d2d889b00986a3264982f 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" diff --git a/erpnext/public/js/templates/crm_activities.html b/erpnext/public/js/templates/crm_activities.html index 6be64f1e1d59b12b70e782c2a59acf0435ef7a51..0fd56f196f7cc135401efc63795e7516c26ed442 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) { %} +