fix(assets): discard stale set_finance_book responses

Rapid successive edits to Net Purchase Amount could fire overlapping
set_finance_book calls; if an older request's response arrived after a
newer one, it could overwrite Finance Books with values computed from
a stale amount. Now the callback only applies a response if the fields
it was based on still match the form's current values.

(cherry picked from commit 5a8126412a)
This commit is contained in:
Henil
2026-09-11 13:02:04 +05:30
committed by Mergify
parent 1652f6ea42
commit dfde7d811c

View File

@@ -546,15 +546,25 @@ frappe.ui.form.on("Asset", {
}, },
set_finance_book: function (frm) { set_finance_book: function (frm) {
// Snapshot the fields this request is based on, so a stale response from an
// earlier, still-in-flight call (e.g. from rapid successive amount edits)
// can't overwrite Finance Books with values computed from an old amount.
let item_code = frm.doc.item_code;
let net_purchase_amount = frm.doc.net_purchase_amount;
frappe.call({ frappe.call({
method: "erpnext.assets.doctype.asset.asset.get_item_details", method: "erpnext.assets.doctype.asset.asset.get_item_details",
args: { args: {
item_code: frm.doc.item_code, item_code: item_code,
asset_category: frm.doc.asset_category, asset_category: frm.doc.asset_category,
net_purchase_amount: frm.doc.net_purchase_amount, net_purchase_amount: net_purchase_amount,
}, },
callback: function (r, rt) { callback: function (r, rt) {
if (r.message) { if (
r.message &&
frm.doc.item_code === item_code &&
frm.doc.net_purchase_amount === net_purchase_amount
) {
frm.set_value("finance_books", r.message); frm.set_value("finance_books", r.message);
} }
}, },