fix: fetch project-related info in Timesheet (#22423)
Co-authored-by: Marica <maricadsouza221197@gmail.com>
diff --git a/erpnext/projects/doctype/task/task.js b/erpnext/projects/doctype/task/task.js
index 5719276..a044e1d 100644
--- a/erpnext/projects/doctype/task/task.js
+++ b/erpnext/projects/doctype/task/task.js
@@ -3,55 +3,36 @@
frappe.provide("erpnext.projects");
-cur_frm.add_fetch("project", "company", "company");
-
frappe.ui.form.on("Task", {
- onload: function(frm) {
- frm.set_query("task", "depends_on", function() {
- var filters = {
+ setup: function (frm) {
+ frm.set_query("project", function () {
+ return {
+ query: "erpnext.projects.doctype.task.task.get_project"
+ }
+ });
+
+ frm.make_methods = {
+ 'Timesheet': () => frappe.model.open_mapped_doc({
+ method: 'erpnext.projects.doctype.task.task.make_timesheet',
+ frm: frm
+ })
+ }
+ },
+
+ onload: function (frm) {
+ frm.set_query("task", "depends_on", function () {
+ let filters = {
name: ["!=", frm.doc.name]
};
- if(frm.doc.project) filters["project"] = frm.doc.project;
+ if (frm.doc.project) filters["project"] = frm.doc.project;
return {
filters: filters
};
})
},
- refresh: function(frm) {
- frm.fields_dict['parent_task'].get_query = function () {
- return {
- filters: {
- "is_group": 1,
- }
- }
- }
-
- if (!frm.doc.is_group) {
- if (!frm.is_new()) {
- if (frappe.model.can_read("Timesheet")) {
- frm.add_custom_button(__("Timesheet"), () => {
- frappe.route_options = { "project": frm.doc.project, "task": frm.doc.name }
- frappe.set_route("List", "Timesheet");
- }, __("View"), true);
- }
-
- if (frappe.model.can_read("Expense Claim")) {
- frm.add_custom_button(__("Expense Claims"), () => {
- frappe.route_options = { "project": frm.doc.project, "task": frm.doc.name };
- frappe.set_route("List", "Expense Claim");
- }, __("View"), true);
- }
- }
- }
- },
-
- setup: function(frm) {
- frm.fields_dict.project.get_query = function() {
- return {
- query: "erpnext.projects.doctype.task.task.get_project"
- }
- };
+ refresh: function (frm) {
+ frm.set_query("parent_task", { "is_group": 1 });
},
is_group: function (frm) {
@@ -69,12 +50,8 @@
})
},
- validate: function(frm) {
+ validate: function (frm) {
frm.doc.project && frappe.model.remove_from_locals("Project",
frm.doc.project);
- },
-
+ }
});
-
-cur_frm.add_fetch('task', 'subject', 'subject');
-cur_frm.add_fetch('task', 'project', 'project');
diff --git a/erpnext/projects/doctype/task/task.json b/erpnext/projects/doctype/task/task.json
index 4db1f19..27f1a71 100644
--- a/erpnext/projects/doctype/task/task.json
+++ b/erpnext/projects/doctype/task/task.json
@@ -325,6 +325,7 @@
"options": "Department"
},
{
+ "fetch_from": "project.company",
"fieldname": "company",
"fieldtype": "Link",
"label": "Company",
diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py
index 845cdba..3b75cf4 100755
--- a/erpnext/projects/doctype/task/task.py
+++ b/erpnext/projects/doctype/task/task.py
@@ -7,10 +7,11 @@
import frappe
from frappe import _, throw
+from frappe.desk.form.assign_to import clear, close_all_assignments
+from frappe.model.mapper import get_mapped_doc
from frappe.utils import add_days, cstr, date_diff, get_link_to_form, getdate, today
from frappe.utils.nestedset import NestedSet
-from frappe.desk.form.assign_to import close_all_assignments, clear
-from frappe.utils import date_diff
+
class CircularReferenceError(frappe.ValidationError): pass
class EndDateCannotBeGreaterThanProjectEndDateError(frappe.ValidationError): pass
@@ -220,6 +221,26 @@
continue
frappe.get_doc("Task", task.name).update_status()
+
+@frappe.whitelist()
+def make_timesheet(source_name, target_doc=None, ignore_permissions=False):
+ def set_missing_values(source, target):
+ target.append("time_logs", {
+ "hours": source.actual_time,
+ "completed": source.status == "Completed",
+ "project": source.project,
+ "task": source.name
+ })
+
+ doclist = get_mapped_doc("Task", source_name, {
+ "Task": {
+ "doctype": "Timesheet"
+ }
+ }, target_doc, postprocess=set_missing_values, ignore_permissions=ignore_permissions)
+
+ return doclist
+
+
@frappe.whitelist()
def get_children(doctype, parent, task=None, project=None, is_root=False):