fix: POS Runtime Effect completed
diff --git a/erpnext/accounts/doctype/pos_invoice/pos_invoice.py b/erpnext/accounts/doctype/pos_invoice/pos_invoice.py
index 0c481fa..ac39877 100644
--- a/erpnext/accounts/doctype/pos_invoice/pos_invoice.py
+++ b/erpnext/accounts/doctype/pos_invoice/pos_invoice.py
@@ -542,6 +542,7 @@
 		is_stock_item = True
 		bin_qty = get_bin_qty(item_code, warehouse)
 		pos_sales_qty = get_pos_reserved_qty(item_code, warehouse)
+
 		return bin_qty - pos_sales_qty, is_stock_item
 	else:
 		is_stock_item = True
diff --git a/erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py b/erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py
index 9978912..c8f1422 100644
--- a/erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py
+++ b/erpnext/accounts/doctype/pos_invoice_merge_log/pos_invoice_merge_log.py
@@ -83,30 +83,19 @@
 		pos_invoice_docs = [
 			frappe.get_cached_doc("POS Invoice", d.pos_invoice) for d in self.pos_invoices
 		]
-		batched_invoices = self.get_batched_invoices(pos_invoice_docs)
 
-		for invoice in batched_invoices:
-			sales_invoice, credit_note = "", ""
-			if not invoice[0].get("is_return"):
-				sales_invoice = self.process_merging_into_sales_invoice(invoice)
-			else:
-				credit_note = self.process_merging_into_credit_note(invoice)
+		returns = [d for d in pos_invoice_docs if d.get("is_return") == 1]
+		sales = [d for d in pos_invoice_docs if d.get("is_return") == 0]
 
-			self.save()  # save consolidated_sales_invoice & consolidated_credit_note ref in merge log
-			self.update_pos_invoices(pos_invoice_docs, sales_invoice, credit_note)
+		sales_invoice, credit_note = "", ""
+		if returns:
+			credit_note = self.process_merging_into_credit_note(returns)
 
-		# returns = [d for d in pos_invoice_docs if d.get("is_return") == 1]
-		# sales = [d for d in pos_invoice_docs if d.get("is_return") == 0]
+		if sales:
+			sales_invoice = self.process_merging_into_sales_invoice(sales)
 
-		# sales_invoice, credit_note = "", ""
-		# if returns:
-		# 	credit_note = self.process_merging_into_credit_note(returns)
-
-		# if sales:
-		# 	sales_invoice = self.process_merging_into_sales_invoice(sales)
-
-		# self.save()  # save consolidated_sales_invoice & consolidated_credit_note ref in merge log
-		# self.update_pos_invoices(pos_invoice_docs, sales_invoice, credit_note)
+		self.save()  # save consolidated_sales_invoice & consolidated_credit_note ref in merge log
+		self.update_pos_invoices(pos_invoice_docs, sales_invoice, credit_note)
 
 	def on_cancel(self):
 		pos_invoice_docs = [
@@ -171,23 +160,20 @@
 
 			for item in doc.get("items"):
 				found = False
-				if not item.serial_and_batch_bundle:
-					for i in items:
-
-						if (
-							i.item_code == item.item_code
-							and not i.serial_no
-							and not i.batch_no
-							and i.uom == item.uom
-							and i.net_rate == item.net_rate
-							and i.warehouse == item.warehouse
-						):
-							found = True
-							i.qty = i.qty + item.qty
-							i.amount = i.amount + item.net_amount
-							i.net_amount = i.amount
-							i.base_amount = i.base_amount + item.base_net_amount
-							i.base_net_amount = i.base_amount
+				for i in items:
+					if (
+						i.item_code == item.item_code
+						and not i.serial_and_batch_bundle
+						and i.uom == item.uom
+						and i.net_rate == item.net_rate
+						and i.warehouse == item.warehouse
+					):
+						found = True
+						i.qty = i.qty + item.qty
+						i.amount = i.amount + item.net_amount
+						i.net_amount = i.amount
+						i.base_amount = i.base_amount + item.base_net_amount
+						i.base_net_amount = i.base_amount
 
 				if not found:
 					item.rate = item.net_rate
@@ -287,21 +273,6 @@
 			si.flags.ignore_validate = True
 			si.cancel()
 
-	def get_batched_invoices(self, pos_invoice_docs):
-		grouped_batch = []
-		current_batch = []
-		for item in pos_invoice_docs:
-			if not current_batch:
-				current_batch.append(item)
-			elif current_batch[-1].get("is_return") != item.get("is_return"):
-				grouped_batch.append(current_batch)
-				current_batch = [item]
-			else:
-				current_batch.append(item)
-
-		grouped_batch.append(current_batch)
-		return grouped_batch
-
 
 def update_item_wise_tax_detail(consolidate_tax_row, tax_row):
 	consolidated_tax_detail = json.loads(consolidate_tax_row.item_wise_tax_detail)
diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py
index 43bd7ac..fcf2bce 100644
--- a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py
+++ b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py
@@ -3,7 +3,7 @@
 
 import collections
 import csv
-from collections import defaultdict
+from collections import Counter, defaultdict
 from typing import Dict, List
 
 import frappe
@@ -1197,6 +1197,7 @@
 		filters=[
 			["POS Invoice", "consolidated_invoice", "is", "not set"],
 			["POS Invoice", "docstatus", "=", 1],
+			["POS Invoice", "is_return", "=", 0],
 			["POS Invoice Item", "item_code", "=", kwargs.item_code],
 			["POS Invoice", "name", "!=", kwargs.ignore_voucher_no],
 		],
@@ -1242,8 +1243,14 @@
 				child_doc, parent_doc, ignore_voucher_detail_no=kwargs.get("ignore_voucher_detail_no")
 			)
 		)
+	# Counter is used to create a hashmap of serial nos, which contains count of each serial no
+	# ignore serial nos inlcudes serial nos which are sold and returned
+	# so we need to subtract returned serial nos from ignore serial nos after creating a counter of each
 
-	return list(set(ignore_serial_nos) - set(returned_serial_nos))
+	ignore_serial_nos_counter = Counter(ignore_serial_nos)
+	returned_serial_nos_counter = Counter(returned_serial_nos)
+
+	return list(ignore_serial_nos_counter - returned_serial_nos_counter)
 
 
 def get_reserved_batches_for_pos(kwargs):