feat: barcode scanner promise to return scanned row. (#31018)

* feat: barcode scanner promise to return scanned row.

* fix: missing reject at alternate code path
diff --git a/erpnext/public/js/utils/barcode_scanner.js b/erpnext/public/js/utils/barcode_scanner.js
index 3ae1234..d378118 100644
--- a/erpnext/public/js/utils/barcode_scanner.js
+++ b/erpnext/public/js/utils/barcode_scanner.js
@@ -31,30 +31,39 @@
 	}
 
 	process_scan() {
-		let me = this;
+		return new Promise((resolve, reject) => {
+			let me = this;
 
-		const input = this.scan_barcode_field.value;
-		if (!input) {
-			return;
-		}
+			const input = this.scan_barcode_field.value;
+			if (!input) {
+				return;
+			}
 
-		frappe
-			.call({
-				method: this.scan_api,
-				args: {
-					search_value: input,
-				},
-			})
-			.then((r) => {
-				const data = r && r.message;
-				if (!data || Object.keys(data).length === 0) {
-					this.show_alert(__("Cannot find Item with this Barcode"), "red");
-					this.clean_up();
-					return;
-				}
+			frappe
+				.call({
+					method: this.scan_api,
+					args: {
+						search_value: input,
+					},
+				})
+				.then((r) => {
+					const data = r && r.message;
+					if (!data || Object.keys(data).length === 0) {
+						this.show_alert(__("Cannot find Item with this Barcode"), "red");
+						this.clean_up();
+						reject();
+						return;
+					}
 
-				me.update_table(data);
-			});
+					const row = me.update_table(data);
+					if (row) {
+						resolve(row);
+					}
+					else {
+						reject();
+					}
+				});
+		});
 	}
 
 	update_table(data) {
@@ -90,6 +99,7 @@
 		this.set_batch_no(row, batch_no);
 		this.set_barcode(row, barcode);
 		this.clean_up();
+		return row;
 	}
 
 	// batch and serial selector is reduandant when all info can be added by scan