diff --git a/erpnext/projects/doctype/project/project.js b/erpnext/projects/doctype/project/project.js index 4d4c4ece745..96023492516 100644 --- a/erpnext/projects/doctype/project/project.js +++ b/erpnext/projects/doctype/project/project.js @@ -205,7 +205,7 @@ frappe.ui.form.on("Project", { collect_progress: function (frm) { if (frm.doc.collect_progress && !frm.doc.subject) { - frm.set_value("subject", __("For project {0}, update your status", [frm.doc.name])); + frm.set_value("subject", __("For project - {0}, update your status", [frm.doc.project_name])); } }, }); diff --git a/erpnext/projects/doctype/project/project.json b/erpnext/projects/doctype/project/project.json index 7094a5a7226..dca5c94b78d 100644 --- a/erpnext/projects/doctype/project/project.json +++ b/erpnext/projects/doctype/project/project.json @@ -12,29 +12,21 @@ "project_name", "status", "project_type", - "is_active", "percent_complete_method", - "percent_complete", "column_break_5", "project_template", - "expected_start_date", - "expected_end_date", "priority", "department", - "customer_details", - "customer", - "column_break_14", - "sales_order", - "users_section", - "users", - "copied_from", - "section_break0", - "notes", + "is_active", + "percent_complete", "section_break_18", + "expected_start_date", "actual_start_date", "actual_time", "column_break_20", + "expected_end_date", "actual_end_date", + "costing_tab", "project_details", "estimated_costing", "total_costing_amount", @@ -50,7 +42,7 @@ "gross_margin", "column_break_37", "per_gross_margin", - "monitor_progress", + "monitor_progress_tab", "collect_progress", "holiday_list", "frequency", @@ -63,7 +55,18 @@ "weekly_time_to_send", "column_break_45", "subject", - "message" + "message", + "more_info_tab", + "customer_details", + "customer", + "column_break_14", + "sales_order", + "users_section", + "users", + "copied_from", + "section_break0", + "notes", + "connections_tab" ], "fields": [ { @@ -231,7 +234,7 @@ "collapsible": 1, "fieldname": "section_break_18", "fieldtype": "Section Break", - "label": "Start and End Dates" + "label": "Timeline" }, { "fieldname": "actual_start_date", @@ -258,7 +261,6 @@ "read_only": 1 }, { - "collapsible": 1, "fieldname": "project_details", "fieldtype": "Section Break", "label": "Costing and Billing", @@ -329,7 +331,6 @@ "options": "Cost Center" }, { - "collapsible": 1, "fieldname": "margin", "fieldtype": "Section Break", "label": "Margin", @@ -357,12 +358,6 @@ "oldfieldtype": "Currency", "read_only": 1 }, - { - "collapsible": 1, - "fieldname": "monitor_progress", - "fieldtype": "Section Break", - "label": "Monitor Progress" - }, { "default": "0", "fieldname": "collect_progress", @@ -455,6 +450,27 @@ "fieldtype": "Data", "label": "Subject", "mandatory_depends_on": "collect_progress" + }, + { + "fieldname": "costing_tab", + "fieldtype": "Tab Break", + "label": "Costing" + }, + { + "fieldname": "monitor_progress_tab", + "fieldtype": "Tab Break", + "label": "Progress" + }, + { + "fieldname": "more_info_tab", + "fieldtype": "Tab Break", + "label": "More Info" + }, + { + "fieldname": "connections_tab", + "fieldtype": "Tab Break", + "label": "Connections", + "show_dashboard": 1 } ], "icon": "fa fa-puzzle-piece", @@ -462,7 +478,7 @@ "index_web_pages_for_search": 1, "links": [], "max_attachments": 4, - "modified": "2025-08-21 17:57:58.314809", + "modified": "2026-03-04 11:09:55.253367", "modified_by": "Administrator", "module": "Projects", "name": "Project", diff --git a/erpnext/projects/doctype/task/task.json b/erpnext/projects/doctype/task/task.json index 8673455dbfa..9335a196989 100644 --- a/erpnext/projects/doctype/task/task.json +++ b/erpnext/projects/doctype/task/task.json @@ -13,7 +13,6 @@ "type", "color", "is_group", - "is_template", "column_break0", "status", "priority", @@ -21,17 +20,21 @@ "parent_task", "completed_by", "completed_on", + "section_break_dafi", + "is_template", + "column_break_vvfp", + "start", + "duration", "sb_timeline", "exp_start_date", "expected_time", - "start", "column_break_11", "exp_end_date", "progress", - "duration", "is_milestone", "sb_details", "description", + "dependencies_tab", "sb_depends_on", "depends_on", "depends_on_tasks", @@ -44,12 +47,13 @@ "total_costing_amount", "column_break_20", "total_billing_amount", + "more_info_tab", "sb_more_info", + "company", "review_date", "closing_date", "column_break_22", "department", - "company", "lft", "rgt", "old_parent", @@ -78,7 +82,6 @@ "oldfieldname": "project", "oldfieldtype": "Link", "options": "Project", - "remember_last_selected_value": 1, "search_index": 1 }, { @@ -218,7 +221,6 @@ { "fieldname": "sb_depends_on", "fieldtype": "Section Break", - "label": "Dependencies", "oldfieldtype": "Section Break" }, { @@ -298,10 +300,9 @@ "read_only": 1 }, { - "collapsible": 1, "fieldname": "sb_more_info", "fieldtype": "Section Break", - "label": "More Info" + "label": "Additional Info" }, { "depends_on": "eval:doc.status == \"Closed\" || doc.status == \"Pending Review\"", @@ -334,8 +335,7 @@ "fieldname": "company", "fieldtype": "Link", "label": "Company", - "options": "Company", - "remember_last_selected_value": 1 + "options": "Company" }, { "fieldname": "lft", @@ -398,6 +398,24 @@ "fieldtype": "Data", "hidden": 1, "label": "Template Task" + }, + { + "fieldname": "dependencies_tab", + "fieldtype": "Tab Break", + "label": "Dependencies" + }, + { + "fieldname": "more_info_tab", + "fieldtype": "Tab Break", + "label": "More Info" + }, + { + "fieldname": "section_break_dafi", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_vvfp", + "fieldtype": "Column Break" } ], "icon": "fa fa-check", @@ -405,7 +423,7 @@ "is_tree": 1, "links": [], "max_attachments": 5, - "modified": "2026-02-05 09:58:38.052875", + "modified": "2026-03-04 11:47:10.454548", "modified_by": "Administrator", "module": "Projects", "name": "Task", diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py index c0a850043b9..786ae63643f 100755 --- a/erpnext/projects/doctype/task/task.py +++ b/erpnext/projects/doctype/task/task.py @@ -138,6 +138,8 @@ class Task(NestedSet): def validate_status(self): if self.is_template and self.status != "Template": self.status = "Template" + if self.status == "Template" and not self.is_template: + self.status = "Open" if self.status != self.get_db_value("status") and self.status == "Completed": for d in self.depends_on: if frappe.db.get_value("Task", d.task, "status") not in ("Completed", "Cancelled"): diff --git a/erpnext/projects/doctype/timesheet/timesheet.json b/erpnext/projects/doctype/timesheet/timesheet.json index 0022ef9193b..bd38d7c6414 100644 --- a/erpnext/projects/doctype/timesheet/timesheet.json +++ b/erpnext/projects/doctype/timesheet/timesheet.json @@ -18,28 +18,29 @@ "column_break_3", "status", "parent_project", - "employee_detail", - "employee", - "employee_name", - "department", - "column_break_9", "user", "start_date", "end_date", + "employee_detail", + "employee", + "department", + "column_break_9", + "employee_name", "section_break_5", "time_logs", "working_hours", "total_hours", + "billing_tab", "billing_details", "total_billable_hours", + "total_billable_amount", + "total_costing_amount", "base_total_billable_amount", - "base_total_billed_amount", "base_total_costing_amount", "column_break_10", "total_billed_hours", - "total_billable_amount", "total_billed_amount", - "total_costing_amount", + "base_total_billed_amount", "per_billed", "section_break_18", "note", @@ -176,7 +177,6 @@ "read_only": 1 }, { - "collapsible": 1, "fieldname": "billing_details", "fieldtype": "Section Break", "label": "Billing Details", @@ -304,13 +304,18 @@ "fieldname": "exchange_rate", "fieldtype": "Float", "label": "Exchange Rate" + }, + { + "fieldname": "billing_tab", + "fieldtype": "Tab Break", + "label": "Billing" } ], "icon": "fa fa-clock-o", "idx": 1, "is_submittable": 1, "links": [], - "modified": "2025-12-19 13:48:23.453636", + "modified": "2026-03-04 11:56:51.438298", "modified_by": "Administrator", "module": "Projects", "name": "Timesheet",