From d9ddad0f1f554f7e8cf14893d63336cd9ec3f9be Mon Sep 17 00:00:00 2001 From: Poorvi-R-Bhat Date: Mon, 10 Jun 2024 17:30:35 +0530 Subject: [PATCH] fix:Tasks with duration less than a day not displayed correctly#15554 (#41633) * fix: Tasks with duration less than a day not displayed correctly#15554 * fix: Tasks with duration less than a day not displayed correctly#15554 --- erpnext/projects/doctype/task/task.js | 1 - erpnext/projects/doctype/task/task.json | 8 ++++---- erpnext/projects/doctype/task/task.py | 15 ++++++++++----- erpnext/projects/doctype/task/test_task.py | 17 ++++++++++------- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/erpnext/projects/doctype/task/task.js b/erpnext/projects/doctype/task/task.js index c56c998a518..2f5fa6db6b0 100644 --- a/erpnext/projects/doctype/task/task.js +++ b/erpnext/projects/doctype/task/task.js @@ -13,7 +13,6 @@ frappe.ui.form.on("Task", { }), }; }, - onload: function (frm) { frm.set_query("task", "depends_on", function () { let filters = { diff --git a/erpnext/projects/doctype/task/task.json b/erpnext/projects/doctype/task/task.json index 84c121260c7..c1edd083a9c 100644 --- a/erpnext/projects/doctype/task/task.json +++ b/erpnext/projects/doctype/task/task.json @@ -147,7 +147,7 @@ }, { "collapsible": 1, - "collapsible_depends_on": "eval:doc.__islocal", + "collapsible_depends_on": "exp_start_date", "fieldname": "sb_timeline", "fieldtype": "Section Break", "label": "Timeline" @@ -155,7 +155,7 @@ { "bold": 1, "fieldname": "exp_start_date", - "fieldtype": "Date", + "fieldtype": "Datetime", "label": "Expected Start Date", "oldfieldname": "exp_start_date", "oldfieldtype": "Date" @@ -181,7 +181,7 @@ { "bold": 1, "fieldname": "exp_end_date", - "fieldtype": "Date", + "fieldtype": "Datetime", "label": "Expected End Date", "oldfieldname": "exp_end_date", "oldfieldtype": "Date", @@ -399,7 +399,7 @@ "is_tree": 1, "links": [], "max_attachments": 5, - "modified": "2024-03-27 13:10:51.476856", + "modified": "2024-05-24 12:36:12.214577", "modified_by": "Administrator", "module": "Projects", "name": "Task", diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py index d6e3b8c77f7..46423b52236 100755 --- a/erpnext/projects/doctype/task/task.py +++ b/erpnext/projects/doctype/task/task.py @@ -8,7 +8,7 @@ import frappe from frappe import _, throw from frappe.desk.form.assign_to import clear, close_all_assignments from frappe.model.mapper import get_mapped_doc -from frappe.utils import add_days, cstr, date_diff, flt, get_link_to_form, getdate, today +from frappe.utils import add_days, add_to_date, cstr, date_diff, flt, get_link_to_form, getdate, today from frappe.utils.data import format_date from frappe.utils.nestedset import NestedSet @@ -41,8 +41,8 @@ class Task(NestedSet): depends_on_tasks: DF.Code | None description: DF.TextEditor | None duration: DF.Int - exp_end_date: DF.Date | None - exp_start_date: DF.Date | None + exp_end_date: DF.Datetime | None + exp_start_date: DF.Datetime | None expected_time: DF.Float is_group: DF.Check is_milestone: DF.Check @@ -83,6 +83,7 @@ class Task(NestedSet): self.update_depends_on() self.validate_dependencies_for_template_task() self.validate_completed_on() + self.set_default_end_date_if_missing() def validate_dates(self): self.validate_from_to_dates("exp_start_date", "exp_end_date") @@ -90,6 +91,10 @@ class Task(NestedSet): self.validate_parent_expected_end_date() self.validate_parent_project_dates() + def set_default_end_date_if_missing(self): + if self.exp_start_date and self.expected_time: + self.exp_end_date = add_to_date(self.exp_start_date, hours=self.expected_time) + def validate_parent_expected_end_date(self): if not self.parent_task or not self.exp_end_date: return @@ -248,7 +253,7 @@ class Task(NestedSet): if ( task.exp_start_date and task.exp_end_date - and task.exp_start_date < getdate(end_date) + and task.exp_start_date < end_date and task.status == "Open" ): task_duration = date_diff(task.exp_end_date, task.exp_start_date) @@ -286,7 +291,7 @@ class Task(NestedSet): if self.status not in ("Cancelled", "Completed") and self.exp_end_date: from datetime import datetime - if self.exp_end_date < datetime.now().date(): + if self.exp_end_date < datetime.now(): self.db_set("status", "Overdue", update_modified=False) self.update_project() diff --git a/erpnext/projects/doctype/task/test_task.py b/erpnext/projects/doctype/task/test_task.py index b0194b08dfa..18dba7337f7 100644 --- a/erpnext/projects/doctype/task/test_task.py +++ b/erpnext/projects/doctype/task/test_task.py @@ -1,6 +1,5 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: GNU General Public License v3. See license.txt - import unittest import frappe @@ -44,17 +43,21 @@ class TestTask(unittest.TestCase): task1.save() self.assertEqual( - frappe.db.get_value("Task", task2.name, "exp_start_date"), getdate(add_days(nowdate(), 21)) - ) - self.assertEqual( - frappe.db.get_value("Task", task2.name, "exp_end_date"), getdate(add_days(nowdate(), 25)) + getdate(frappe.db.get_value("Task", task2.name, "exp_start_date")), + getdate(add_days(nowdate(), 21)), ) self.assertEqual( - frappe.db.get_value("Task", task3.name, "exp_start_date"), getdate(add_days(nowdate(), 26)) + getdate(frappe.db.get_value("Task", task2.name, "exp_end_date")), getdate(add_days(nowdate(), 25)) ) + self.assertEqual( - frappe.db.get_value("Task", task3.name, "exp_end_date"), getdate(add_days(nowdate(), 30)) + getdate(frappe.db.get_value("Task", task3.name, "exp_start_date")), + getdate(add_days(nowdate(), 26)), + ) + + self.assertEqual( + getdate(frappe.db.get_value("Task", task3.name, "exp_end_date")), getdate(add_days(nowdate(), 30)) ) def test_close_assignment(self):