From 7c6da80f9883ee2f6291631c3e1ce8e4086df4d1 Mon Sep 17 00:00:00 2001 From: nishkagosalia Date: Fri, 14 Aug 2026 15:52:30 +0530 Subject: [PATCH] fix: validation for task end date check --- erpnext/projects/doctype/task/task.py | 42 ++++++++++++++++++--------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py index fd575427706..f8750bf2613 100755 --- a/erpnext/projects/doctype/task/task.py +++ b/erpnext/projects/doctype/task/task.py @@ -122,19 +122,35 @@ class Task(NestedSet): if not self.project or frappe.in_test: return - if project_end_date := frappe.db.get_value("Project", self.project, "expected_end_date"): - project_end_date = getdate(project_end_date) - for fieldname in ("exp_start_date", "exp_end_date", "act_start_date", "act_end_date"): - task_date = self.get(fieldname) - if task_date and date_diff(project_end_date, getdate(task_date)) < 0: - frappe.throw( - _("{0}'s {1} cannot be after {2}'s Expected End Date.").format( - frappe.bold(frappe.get_desk_link("Task", self.name)), - _(self.meta.get_label(fieldname)), - frappe.bold(frappe.get_desk_link("Project", self.project)), - ), - frappe.exceptions.InvalidDates, - ) + project_start_date, project_end_date = frappe.db.get_value( + "Project", self.project, ["expected_start_date", "expected_end_date"] + ) + + for fieldname in ("exp_start_date", "exp_end_date", "act_start_date", "act_end_date"): + task_date = self.get(fieldname) + if not task_date: + continue + task_date = getdate(task_date) + + if project_end_date and date_diff(getdate(project_end_date), task_date) < 0: + frappe.throw( + _("{0}'s {1} cannot be after {2}'s Expected End Date.").format( + get_link_to_form("Task", self.name), + _(self.meta.get_label(fieldname)), + get_link_to_form("Project", self.project), + ), + frappe.exceptions.InvalidDates, + ) + + if project_start_date and date_diff(task_date, getdate(project_start_date)) < 0: + frappe.throw( + _("{0}'s {1} cannot be before {2}'s Expected Start Date.").format( + get_link_to_form("Task", self.name), + _(self.meta.get_label(fieldname)), + get_link_to_form("Project", self.project), + ), + frappe.exceptions.InvalidDates, + ) def validate_status(self): if self.is_template and self.status != "Template":