refactor: replaced db.sql with qb
diff --git a/erpnext/stock/utils.py b/erpnext/stock/utils.py
index b131125..518bdf1 100644
--- a/erpnext/stock/utils.py
+++ b/erpnext/stock/utils.py
@@ -115,14 +115,25 @@
 		return last_entry.qty_after_transaction if last_entry else 0.0
 
 def get_serial_nos_data_after_transactions(args):
+	from pypika import CustomFunction
+
 	serial_nos = []
-	data = frappe.db.sql(""" SELECT serial_no, actual_qty
-		FROM `tabStock Ledger Entry`
-		WHERE
-			item_code = %(item_code)s and warehouse = %(warehouse)s
-			and timestamp(posting_date, posting_time) < timestamp(%(posting_date)s, %(posting_time)s)
-			and is_cancelled = 0
-			order by posting_date, posting_time asc """, args, as_dict=1)
+	args = frappe._dict(args)
+	sle = frappe.qb.DocType('Stock Ledger Entry')
+	Timestamp = CustomFunction('timestamp', ['date', 'time'])
+
+	data = frappe.qb.from_(
+		sle
+	).select(
+		'serial_no','actual_qty'
+	).where(
+		(sle.item_code == args.item_code)
+		& (sle.warehouse == args.warehouse)
+		& (Timestamp(sle.posting_date, sle.posting_time) < Timestamp(args.posting_date, args.posting_time))
+		& (sle.is_cancelled == 0)
+	).orderby(
+		sle.posting_date, sle.posting_time
+	).run(as_dict=1)
 
 	for d in data:
 		if d.actual_qty > 0: