From 268962c25f0571ded4c46c381906c870df6aab91 Mon Sep 17 00:00:00 2001 From: "lukas.brandhoff" Date: Wed, 28 Aug 2024 09:17:28 +0000 Subject: [PATCH 1/2] fix: A project without tasks should be able to complete --- erpnext/projects/doctype/project/project.py | 7 +++++ .../projects/doctype/project/test_project.py | 28 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py index 700b3adbdff..448a59e98ff 100644 --- a/erpnext/projects/doctype/project/project.py +++ b/erpnext/projects/doctype/project/project.py @@ -213,6 +213,13 @@ class Project(Document): frappe.db.set_value("Sales Order", {"project": self.name}, "project", "") def update_percent_complete(self): + if self.status == "Completed": + if ( + len(frappe.get_all("Task", dict(project=self.name))) == 0 + ): # A project without tasks should be able to complete + self.percent_complete_method = "Manual" + self.percent_complete = 100 + if self.percent_complete_method == "Manual": if self.status == "Completed": self.percent_complete = 100 diff --git a/erpnext/projects/doctype/project/test_project.py b/erpnext/projects/doctype/project/test_project.py index 1b7460f7a2a..f7140c211e0 100644 --- a/erpnext/projects/doctype/project/test_project.py +++ b/erpnext/projects/doctype/project/test_project.py @@ -199,6 +199,34 @@ class TestProject(FrappeTestCase): if not pt.is_group: self.assertIsNotNone(pt.parent_task) + def test_project_having_no_tasks_complete(self): + project_name = "Test Project - No Tasks Completion" + frappe.db.sql(""" delete from tabTask where project = %s """, project_name) + frappe.delete_doc("Project", project_name) + + project = frappe.get_doc( + dict( + doctype="Project", + project_name=project_name, + status="Open", + expected_start_date=nowdate(), + company="_Test Company", + ) + ).insert() + + tasks = frappe.get_all( + "Task", + ["subject", "exp_end_date", "depends_on_tasks", "name", "parent_task"], + dict(project=project.name), + order_by="creation asc", + ) + + self.assertEqual(project.status, "Open") + self.assertEqual(len(tasks), 0) + project.status = "Completed" + project.save() + self.assertEqual(project.status, "Completed") + def get_project(name, template): project = frappe.get_doc( From 4eeae8011ea51dc5621cef302255c2b54da1537a Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 16 Sep 2024 11:14:54 +0530 Subject: [PATCH 2/2] refactor(test): fix linter --- erpnext/projects/doctype/project/test_project.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/erpnext/projects/doctype/project/test_project.py b/erpnext/projects/doctype/project/test_project.py index f7140c211e0..e5996c2da9d 100644 --- a/erpnext/projects/doctype/project/test_project.py +++ b/erpnext/projects/doctype/project/test_project.py @@ -205,13 +205,13 @@ class TestProject(FrappeTestCase): frappe.delete_doc("Project", project_name) project = frappe.get_doc( - dict( - doctype="Project", - project_name=project_name, - status="Open", - expected_start_date=nowdate(), - company="_Test Company", - ) + { + "doctype": "Project", + "project_name": project_name, + "status": "Open", + "expected_start_date": nowdate(), + "company": "_Test Company", + } ).insert() tasks = frappe.get_all(