feat: dont trigger selector if all info is scanned
diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js
index f948c60..a4492e8 100644
--- a/erpnext/public/js/controllers/transaction.js
+++ b/erpnext/public/js/controllers/transaction.js
@@ -526,6 +526,12 @@
 											if(!d[k]) d[k] = v;
 										});
 
+										if (d.__disable_batch_serial_selector) {
+											// reset for future use.
+											d.__disable_batch_serial_selector = false;
+											return;
+										}
+
 										if (d.has_batch_no && d.has_serial_no) {
 											d.batch_no = undefined;
 										}
diff --git a/erpnext/public/js/utils/barcode_scanner.js b/erpnext/public/js/utils/barcode_scanner.js
index 0868a6b..80a463f 100644
--- a/erpnext/public/js/utils/barcode_scanner.js
+++ b/erpnext/public/js/utils/barcode_scanner.js
@@ -50,14 +50,16 @@
 					return;
 				}
 
-				me.update_table(data.item_code, data.barcode, data.batch_no, data.serial_no);
+				me.update_table(data);
 			});
 	}
 
-	update_table(item_code, barcode, batch_no, serial_no) {
+	update_table(data) {
 		let cur_grid = this.frm.fields_dict[this.items_table_name].grid;
 		let row = null;
 
+		const {item_code, barcode, batch_no, serial_no} = data;
+
 		// Check if batch is scanned and table has batch no field
 		let batch_no_scan =
 			Boolean(batch_no) && frappe.meta.has_field(cur_grid.doctype, this.batch_no_field);
@@ -82,6 +84,7 @@
 		}
 
 		this.show_scan_message(row.idx, row.item_code);
+		this.set_selector_trigger_flag(row, data);
 		this.set_item(row, item_code);
 		this.set_serial_no(row, serial_no);
 		this.set_batch_no(row, batch_no);
@@ -89,6 +92,19 @@
 		this.clean_up();
 	}
 
+	// batch and serial selector is reduandant when all info can be added by scan
+	// this flag on item row is used by transaction.js to avoid triggering selector
+	set_selector_trigger_flag(row, data) {
+		const {batch_no, serial_no, has_batch_no, has_serial_no} = data;
+
+		const require_selecting_batch = has_batch_no && !batch_no;
+		const require_selecting_serial = has_serial_no && !serial_no;
+
+		if (!(require_selecting_batch || require_selecting_serial)) {
+			row.__disable_batch_serial_selector = true;
+		}
+	}
+
 	set_item(row, item_code) {
 		const item_data = { item_code: item_code };
 		item_data[this.qty_field] = (row[this.qty_field] || 0) + 1;