From 6adc8a09c0adfc57b8a80a991867956c97a93b5e Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Thu, 17 Jul 2025 14:35:06 +0530 Subject: [PATCH] feat: option to recalculate costing and billing fields in project (cherry picked from commit dd23d4c81b7d1eb6988128619b871a0a4cccdf19) --- 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 ebfff79531f..992617d52fb 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()