From dd23d4c81b7d1eb6988128619b871a0a4cccdf19 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Thu, 17 Jul 2025 14:35:06 +0530 Subject: [PATCH 1/2] feat: option to recalculate costing and billing fields in project --- erpnext/projects/doctype/project/project.js | 12 ++++++------ erpnext/projects/doctype/project/project.py | 13 ++++--------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/erpnext/projects/doctype/project/project.js b/erpnext/projects/doctype/project/project.js index 449a9d87ff2..1012b093107 100644 --- a/erpnext/projects/doctype/project/project.js +++ b/erpnext/projects/doctype/project/project.js @@ -88,9 +88,9 @@ frappe.ui.form.on("Project", { ); frm.add_custom_button( - __("Update Total Purchase Cost"), + __("Recalculate Costing and Billing"), () => { - frm.events.update_total_purchase_cost(frm); + frm.events.recalculate_costing_and_billing(frm); }, __("Actions") ); @@ -129,15 +129,15 @@ frappe.ui.form.on("Project", { } }, - update_total_purchase_cost: function (frm) { + recalculate_costing_and_billing: function (frm) { frappe.call({ - method: "erpnext.projects.doctype.project.project.recalculate_project_total_purchase_cost", + method: "erpnext.projects.doctype.project.project.recalculate_costing_and_billing", args: { project: frm.doc.name }, freeze: true, - freeze_message: __("Recalculating Purchase Cost against this Project..."), + freeze_message: __("Recalculating Costing and Billing fields against this Project..."), callback: function (r) { if (r && !r.exc) { - frappe.msgprint(__("Total Purchase Cost has been updated")); + frappe.msgprint(__("Costing and Billing fields has been updated")); frm.refresh(); } }, diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py index eeed3b4331d..f8861abac4b 100644 --- a/erpnext/projects/doctype/project/project.py +++ b/erpnext/projects/doctype/project/project.py @@ -749,12 +749,7 @@ def calculate_total_purchase_cost(project: str | None = None): @frappe.whitelist() -def recalculate_project_total_purchase_cost(project: str | None = None): - if project: - total_purchase_cost = calculate_total_purchase_cost(project) - frappe.db.set_value( - "Project", - project, - "total_purchase_cost", - (total_purchase_cost and total_purchase_cost[0][0] or 0), - ) +def recalculate_costing_and_billing(project: str | None = None): + project = frappe.get_doc("Project", project) + project.update_costing() + project.db_update() From f6e16c118081955127bb7d7548e968f9d3d89145 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Fri, 18 Jul 2025 16:06:14 +0530 Subject: [PATCH 2/2] chore: rename recalculating to updating --- erpnext/projects/doctype/project/project.js | 10 +++++----- erpnext/projects/doctype/project/project.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/erpnext/projects/doctype/project/project.js b/erpnext/projects/doctype/project/project.js index 1012b093107..4d4c4ece745 100644 --- a/erpnext/projects/doctype/project/project.js +++ b/erpnext/projects/doctype/project/project.js @@ -88,9 +88,9 @@ frappe.ui.form.on("Project", { ); frm.add_custom_button( - __("Recalculate Costing and Billing"), + __("Update Costing and Billing"), () => { - frm.events.recalculate_costing_and_billing(frm); + frm.events.update_costing_and_billing(frm); }, __("Actions") ); @@ -129,12 +129,12 @@ frappe.ui.form.on("Project", { } }, - recalculate_costing_and_billing: function (frm) { + update_costing_and_billing: function (frm) { frappe.call({ - method: "erpnext.projects.doctype.project.project.recalculate_costing_and_billing", + method: "erpnext.projects.doctype.project.project.update_costing_and_billing", args: { project: frm.doc.name }, freeze: true, - freeze_message: __("Recalculating Costing and Billing fields against this Project..."), + freeze_message: __("Updating Costing and Billing fields against this Project..."), callback: function (r) { if (r && !r.exc) { frappe.msgprint(__("Costing and Billing fields has been updated")); diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py index f8861abac4b..d377281f0ba 100644 --- a/erpnext/projects/doctype/project/project.py +++ b/erpnext/projects/doctype/project/project.py @@ -749,7 +749,7 @@ def calculate_total_purchase_cost(project: str | None = None): @frappe.whitelist() -def recalculate_costing_and_billing(project: str | None = None): +def update_costing_and_billing(project: str | None = None): project = frappe.get_doc("Project", project) project.update_costing() project.db_update()