mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-20 13:39:18 +00:00
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
This commit is contained in:
@@ -13,7 +13,6 @@ frappe.ui.form.on("Task", {
|
|||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
onload: function (frm) {
|
onload: function (frm) {
|
||||||
frm.set_query("task", "depends_on", function () {
|
frm.set_query("task", "depends_on", function () {
|
||||||
let filters = {
|
let filters = {
|
||||||
|
|||||||
@@ -147,7 +147,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"collapsible": 1,
|
"collapsible": 1,
|
||||||
"collapsible_depends_on": "eval:doc.__islocal",
|
"collapsible_depends_on": "exp_start_date",
|
||||||
"fieldname": "sb_timeline",
|
"fieldname": "sb_timeline",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"label": "Timeline"
|
"label": "Timeline"
|
||||||
@@ -155,7 +155,7 @@
|
|||||||
{
|
{
|
||||||
"bold": 1,
|
"bold": 1,
|
||||||
"fieldname": "exp_start_date",
|
"fieldname": "exp_start_date",
|
||||||
"fieldtype": "Date",
|
"fieldtype": "Datetime",
|
||||||
"label": "Expected Start Date",
|
"label": "Expected Start Date",
|
||||||
"oldfieldname": "exp_start_date",
|
"oldfieldname": "exp_start_date",
|
||||||
"oldfieldtype": "Date"
|
"oldfieldtype": "Date"
|
||||||
@@ -181,7 +181,7 @@
|
|||||||
{
|
{
|
||||||
"bold": 1,
|
"bold": 1,
|
||||||
"fieldname": "exp_end_date",
|
"fieldname": "exp_end_date",
|
||||||
"fieldtype": "Date",
|
"fieldtype": "Datetime",
|
||||||
"label": "Expected End Date",
|
"label": "Expected End Date",
|
||||||
"oldfieldname": "exp_end_date",
|
"oldfieldname": "exp_end_date",
|
||||||
"oldfieldtype": "Date",
|
"oldfieldtype": "Date",
|
||||||
@@ -399,7 +399,7 @@
|
|||||||
"is_tree": 1,
|
"is_tree": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"max_attachments": 5,
|
"max_attachments": 5,
|
||||||
"modified": "2024-03-27 13:10:51.476856",
|
"modified": "2024-05-24 12:36:12.214577",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Projects",
|
"module": "Projects",
|
||||||
"name": "Task",
|
"name": "Task",
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import frappe
|
|||||||
from frappe import _, throw
|
from frappe import _, throw
|
||||||
from frappe.desk.form.assign_to import clear, close_all_assignments
|
from frappe.desk.form.assign_to import clear, close_all_assignments
|
||||||
from frappe.model.mapper import get_mapped_doc
|
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.data import format_date
|
||||||
from frappe.utils.nestedset import NestedSet
|
from frappe.utils.nestedset import NestedSet
|
||||||
|
|
||||||
@@ -41,8 +41,8 @@ class Task(NestedSet):
|
|||||||
depends_on_tasks: DF.Code | None
|
depends_on_tasks: DF.Code | None
|
||||||
description: DF.TextEditor | None
|
description: DF.TextEditor | None
|
||||||
duration: DF.Int
|
duration: DF.Int
|
||||||
exp_end_date: DF.Date | None
|
exp_end_date: DF.Datetime | None
|
||||||
exp_start_date: DF.Date | None
|
exp_start_date: DF.Datetime | None
|
||||||
expected_time: DF.Float
|
expected_time: DF.Float
|
||||||
is_group: DF.Check
|
is_group: DF.Check
|
||||||
is_milestone: DF.Check
|
is_milestone: DF.Check
|
||||||
@@ -83,6 +83,7 @@ class Task(NestedSet):
|
|||||||
self.update_depends_on()
|
self.update_depends_on()
|
||||||
self.validate_dependencies_for_template_task()
|
self.validate_dependencies_for_template_task()
|
||||||
self.validate_completed_on()
|
self.validate_completed_on()
|
||||||
|
self.set_default_end_date_if_missing()
|
||||||
|
|
||||||
def validate_dates(self):
|
def validate_dates(self):
|
||||||
self.validate_from_to_dates("exp_start_date", "exp_end_date")
|
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_expected_end_date()
|
||||||
self.validate_parent_project_dates()
|
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):
|
def validate_parent_expected_end_date(self):
|
||||||
if not self.parent_task or not self.exp_end_date:
|
if not self.parent_task or not self.exp_end_date:
|
||||||
return
|
return
|
||||||
@@ -248,7 +253,7 @@ class Task(NestedSet):
|
|||||||
if (
|
if (
|
||||||
task.exp_start_date
|
task.exp_start_date
|
||||||
and task.exp_end_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"
|
and task.status == "Open"
|
||||||
):
|
):
|
||||||
task_duration = date_diff(task.exp_end_date, task.exp_start_date)
|
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:
|
if self.status not in ("Cancelled", "Completed") and self.exp_end_date:
|
||||||
from datetime import datetime
|
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.db_set("status", "Overdue", update_modified=False)
|
||||||
self.update_project()
|
self.update_project()
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
||||||
# License: GNU General Public License v3. See license.txt
|
# License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
@@ -44,17 +43,21 @@ class TestTask(unittest.TestCase):
|
|||||||
task1.save()
|
task1.save()
|
||||||
|
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
frappe.db.get_value("Task", task2.name, "exp_start_date"), getdate(add_days(nowdate(), 21))
|
getdate(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))
|
|
||||||
)
|
)
|
||||||
|
|
||||||
self.assertEqual(
|
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(
|
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):
|
def test_close_assignment(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user