diff --git a/erpnext/projects/doctype/service_template/service_template.py b/erpnext/projects/doctype/service_template/service_template.py
index 2fd17fa13641..56ac5c7c0692 100644
--- a/erpnext/projects/doctype/service_template/service_template.py
+++ b/erpnext/projects/doctype/service_template/service_template.py
@@ -228,6 +228,7 @@ def get_service_template_tasks(
task_details.service_template = service_template_detail.service_template
task_details.service_template_detail = service_template_detail.name
task_details.determine_time = template_task_row.determine_time
+ task_details.prevent_duplicate_task = template_task_row.prevent_duplicate_task
if template_task_row.use_template_name:
task_details.subject = service_template_detail.service_template_name
diff --git a/erpnext/projects/doctype/service_template_task/service_template_task.json b/erpnext/projects/doctype/service_template_task/service_template_task.json
index 7d3963dd19a7..8310493dabb5 100644
--- a/erpnext/projects/doctype/service_template_task/service_template_task.json
+++ b/erpnext/projects/doctype/service_template_task/service_template_task.json
@@ -7,6 +7,7 @@
"field_order": [
"subject",
"task_type",
+ "prevent_duplicate_task",
"column_break_l9vb",
"expected_time",
"determine_time",
@@ -69,11 +70,17 @@
"fieldname": "use_template_description",
"fieldtype": "Check",
"label": "Use Template Description"
+ },
+ {
+ "default": "0",
+ "fieldname": "prevent_duplicate_task",
+ "fieldtype": "Check",
+ "label": "Prevent Duplicate Task Creation"
}
],
"istable": 1,
"links": [],
- "modified": "2025-02-01 13:22:34.628230",
+ "modified": "2025-08-05 18:06:02.089683",
"modified_by": "Administrator",
"module": "Projects",
"name": "Service Template Task",
diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py
index c7ff153d49d6..c007db6fa6d7 100755
--- a/erpnext/projects/doctype/task/task.py
+++ b/erpnext/projects/doctype/task/task.py
@@ -518,7 +518,27 @@ def create_service_template_tasks(project):
tasks_created = []
tasks_exists = False
+
+ existing_task_types = {
+ d.task_type for d in frappe.get_all("Task", filters={"project": project_doc.name}, fields=["task_type"])
+ if d.task_type
+ }
+
+ prevent_types = set()
+ service_template_task_map = {}
+
for service_template_row in project_doc.service_templates:
+ template_tasks = get_service_template_tasks(
+ service_template_row.service_template,
+ service_template_detail=service_template_row
+ )
+ service_template_task_map[service_template_row.name] = (service_template_row, template_tasks)
+
+ for task in template_tasks:
+ if task.get("prevent_duplicate_task") and task.get("task_type"):
+ prevent_types.add(task.get("task_type"))
+
+ for service_template_row, template_tasks in service_template_task_map.values():
filters = {
"project": project_doc.name,
"service_template": service_template_row.service_template,
@@ -529,8 +549,13 @@ def create_service_template_tasks(project):
continue
template_doc = frappe.get_cached_doc("Service Template", service_template_row.service_template)
- template_tasks = get_service_template_tasks(service_template_row.service_template, service_template_detail=service_template_row)
+
for template_task_details in template_tasks:
+ task_type = template_task_details.get("task_type")
+
+ if task_type in prevent_types and task_type in existing_task_types:
+ continue
+
task_doc = frappe.new_doc("Task")
for k, v in template_task_details.items():
if task_doc.meta.has_field(k):
@@ -549,6 +574,9 @@ def create_service_template_tasks(project):
task_doc.save()
tasks_created.append(task_doc)
+ if task_type:
+ existing_task_types.add(task_type)
+
if tasks_created:
message = _("{0} Service Template tasks created against {1}