From 2a3642b55a7844e737bcf50cba6fdbaa620b211a Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 2 Feb 2026 19:54:27 +0530 Subject: [PATCH] fix: batch selector not working if Use Legacy (Client side) Reactivity disabled (cherry picked from commit d1cba1073faa2f071cb11a06c6f0c5de87e7acf4) --- erpnext/public/js/controllers/transaction.js | 157 +++++++++---------- 1 file changed, 75 insertions(+), 82 deletions(-) diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 4ae844c6116..d4a4577d8a0 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -625,6 +625,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe callback: function (r) { if (!r.exc) { me.frm.refresh_fields(); + me.show_batch_dialog_if_required(item); } }, }); @@ -635,26 +636,13 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe process_item_selection(doc, cdt, cdn) { var item = frappe.get_doc(cdt, cdn); + let update_stock = 0; var me = this; - var update_stock = 0, - show_batch_dialog = 0; item.weight_per_unit = 0; item.weight_uom = ""; item.uom = null; // make UOM blank to update the existing UOM when item changes item.conversion_factor = 0; - - if (["Sales Invoice", "Purchase Invoice"].includes(this.frm.doc.doctype)) { - update_stock = cint(me.frm.doc.update_stock); - show_batch_dialog = update_stock; - } else if (this.frm.doc.doctype === "Purchase Receipt" || this.frm.doc.doctype === "Delivery Note") { - show_batch_dialog = 1; - } - - if (show_batch_dialog && item.use_serial_batch_fields === 1) { - show_batch_dialog = 0; - } - item.barcode = null; if (item.item_code || item.serial_no) { @@ -765,74 +753,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe } }, () => me.toggle_conversion_factor(item), - () => { - if (show_batch_dialog && !frappe.flags.trigger_from_barcode_scanner) - return frappe.db - .get_value("Item", item.item_code, [ - "has_batch_no", - "has_serial_no", - ]) - .then((r) => { - if ( - r.message && - (r.message.has_batch_no || r.message.has_serial_no) - ) { - frappe.flags.hide_serial_batch_dialog = false; - } else { - show_batch_dialog = false; - } - }); - }, - () => { - // check if batch serial selector is disabled or not - if (show_batch_dialog && !frappe.flags.hide_serial_batch_dialog) - return frappe.db - .get_single_value( - "Stock Settings", - "disable_serial_no_and_batch_selector" - ) - .then((value) => { - if (value) { - frappe.flags.hide_serial_batch_dialog = true; - } - }); - }, - () => { - if ( - show_batch_dialog && - !frappe.flags.hide_serial_batch_dialog && - !frappe.flags.dialog_set - ) { - var d = locals[cdt][cdn]; - $.each(r.message, function (k, v) { - if (!d[k]) d[k] = v; - }); - - if (d.has_batch_no && d.has_serial_no) { - d.batch_no = undefined; - } - - frappe.flags.dialog_set = true; - erpnext.show_serial_batch_selector( - me.frm, - d, - (item) => { - me.frm.script_manager.trigger("qty", item.doctype, item.name); - if (!me.frm.doc.set_warehouse) - me.frm.script_manager.trigger( - "warehouse", - item.doctype, - item.name - ); - me.apply_price_list(item, true); - }, - undefined, - !frappe.flags.hide_serial_batch_dialog - ); - } else { - frappe.flags.dialog_set = false; - } - }, + () => me.show_batch_dialog_if_required(item), () => me.conversion_factor(doc, cdt, cdn, true), () => me.remove_pricing_rule(item), () => { @@ -853,6 +774,78 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe } } + show_batch_dialog_if_required(item) { + let show_batch_dialog = 0; + let update_stock = 0; + let me = this; + + if (!item.item_code) { + return; + } + + if (["Sales Invoice", "Purchase Invoice"].includes(this.frm.doc.doctype)) { + update_stock = cint(me.frm.doc.update_stock); + show_batch_dialog = update_stock; + } else if (this.frm.doc.doctype === "Purchase Receipt" || this.frm.doc.doctype === "Delivery Note") { + show_batch_dialog = 1; + } + + if (show_batch_dialog && item.use_serial_batch_fields === 1) { + show_batch_dialog = 0; + } + + frappe.run_serially([ + () => { + if (show_batch_dialog && !frappe.flags.trigger_from_barcode_scanner) + return frappe.db + .get_value("Item", item.item_code, ["has_batch_no", "has_serial_no"]) + .then((r) => { + if (r.message && (r.message.has_batch_no || r.message.has_serial_no)) { + item.has_serial_no = r.message.has_serial_no; + item.has_batch_no = r.message.has_batch_no; + frappe.flags.hide_serial_batch_dialog = false; + } else { + show_batch_dialog = false; + } + }); + }, + () => { + // check if batch serial selector is disabled or not + if (show_batch_dialog && !frappe.flags.hide_serial_batch_dialog) + return frappe.db + .get_single_value("Stock Settings", "disable_serial_no_and_batch_selector") + .then((value) => { + if (value) { + frappe.flags.hide_serial_batch_dialog = true; + } + }); + }, + () => { + if (show_batch_dialog && !frappe.flags.hide_serial_batch_dialog && !frappe.flags.dialog_set) { + if (item.has_batch_no && item.has_serial_no) { + item.batch_no = undefined; + } + + frappe.flags.dialog_set = true; + erpnext.show_serial_batch_selector( + me.frm, + item, + (item) => { + me.frm.script_manager.trigger("qty", item.doctype, item.name); + if (!me.frm.doc.set_warehouse) + me.frm.script_manager.trigger("warehouse", item.doctype, item.name); + me.apply_price_list(item, true); + }, + undefined, + !frappe.flags.hide_serial_batch_dialog + ); + } else { + frappe.flags.dialog_set = false; + } + }, + ]); + } + price_list_rate(doc, cdt, cdn) { var item = frappe.get_doc(cdt, cdn); frappe.model.round_floats_in(item, ["price_list_rate", "discount_percentage"]);