Merge pull request #41053 from rohitwaghchaure/fixed-duplicate-serial-batch-in-stock-entry

fix: duplicate serial and batch bundle in stock entry and stock reco
diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js
index 8478e20..980a4d2 100755
--- a/erpnext/public/js/utils.js
+++ b/erpnext/public/js/utils.js
@@ -51,38 +51,7 @@
 	},
 
 	setup_serial_or_batch_no: function () {
-		let grid_row = cur_frm.open_grid_row();
-		if (
-			!grid_row ||
-			!grid_row.grid_form.fields_dict.serial_no ||
-			grid_row.grid_form.fields_dict.serial_no.get_status() !== "Write"
-		)
-			return;
-
-		frappe.model.get_value(
-			"Item",
-			{ name: grid_row.doc.item_code },
-			["has_serial_no", "has_batch_no"],
-			({ has_serial_no, has_batch_no }) => {
-				Object.assign(grid_row.doc, { has_serial_no, has_batch_no });
-
-				if (has_serial_no) {
-					attach_selector_button(
-						__("Add Serial No"),
-						grid_row.grid_form.fields_dict.serial_no.$wrapper,
-						this,
-						grid_row
-					);
-				} else if (has_batch_no) {
-					attach_selector_button(
-						__("Pick Batch No"),
-						grid_row.grid_form.fields_dict.batch_no.$wrapper,
-						this,
-						grid_row
-					);
-				}
-			}
-		);
+		// Deprecated in v15
 	},
 
 	route_to_adjustment_jv: (args) => {
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index feb0f64..9b66fb2 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -194,6 +194,7 @@
 		if self.work_order:
 			self.pro_doc = frappe.get_doc("Work Order", self.work_order)
 
+		self.validate_duplicate_serial_and_batch_bundle("items")
 		self.validate_posting_time()
 		self.validate_purpose()
 		self.validate_item()
diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
index ccd7f64..64a6b65 100644
--- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
+++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
@@ -70,6 +70,7 @@
 		self.validate_posting_time()
 		self.set_current_serial_and_batch_bundle()
 		self.set_new_serial_and_batch_bundle()
+		self.validate_duplicate_serial_and_batch_bundle("items")
 		self.remove_items_with_no_change()
 		self.validate_data()
 		self.validate_expense_account()