diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py index db2dc537ddd..928313576f1 100644 --- a/erpnext/stock/doctype/serial_no/serial_no.py +++ b/erpnext/stock/doctype/serial_no/serial_no.py @@ -149,10 +149,15 @@ def get_serial_nos(serial_no): return [s.strip() for s in cstr(serial_no).strip().replace(",", "\n").split("\n") if s.strip()] -def get_serial_nos_from_serial_and_batch_bundle(serial_and_batch_bundle): +def get_serial_nos_from_sle_list(bundles): table = frappe.qb.DocType("Serial and Batch Entry") - query = frappe.qb.from_(table).select(table.serial_no).where(table.parent == serial_and_batch_bundle) - return query.run(pluck=True) + query = frappe.qb.from_(table).select(table.parent, table.serial_no).where(table.parent.isin(bundles)) + data = query.run(as_dict=True) + + result = {} + for d in data: + result.setdefault(d.parent, []).append(d.serial_no) + return result def clean_serial_no_string(serial_no: str) -> str: diff --git a/erpnext/stock/report/available_serial_no/available_serial_no.py b/erpnext/stock/report/available_serial_no/available_serial_no.py index d3a1c0c0ed2..9a42efd1148 100644 --- a/erpnext/stock/report/available_serial_no/available_serial_no.py +++ b/erpnext/stock/report/available_serial_no/available_serial_no.py @@ -7,10 +7,7 @@ from frappe.query_builder.functions import Sum from frappe.utils import cint, flt from erpnext.stock.doctype.inventory_dimension.inventory_dimension import get_inventory_dimensions -from erpnext.stock.doctype.serial_no.serial_no import ( - get_serial_nos, - get_serial_nos_from_serial_and_batch_bundle, -) +from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos, get_serial_nos_from_sle_list from erpnext.stock.doctype.stock_reconciliation.stock_reconciliation import get_stock_balance_for from erpnext.stock.report.stock_ledger.stock_ledger import ( check_inventory_dimension_filters_applied, @@ -51,13 +48,16 @@ def execute(filters=None): actual_qty = opening_row.get("qty_after_transaction") stock_value = opening_row.get("stock_value") - available_serial_nos = {} inventory_dimension_filters_applied = check_inventory_dimension_filters_applied(filters) batch_balance_dict = frappe._dict({}) if actual_qty and filters.get("batch_no"): batch_balance_dict[filters.batch_no] = [actual_qty, stock_value] + available_serial_nos = get_serial_nos_from_sle_list( + [sle.serial_and_batch_bundle for sle in sl_entries if sle.serial_and_batch_bundle] + ) + for sle in sl_entries: item_detail = item_details[sle.item_code] @@ -101,7 +101,7 @@ def update_available_serial_nos(available_serial_nos, sle): serial_nos = ( get_serial_nos(sle.serial_no) if sle.serial_no - else get_serial_nos_from_serial_and_batch_bundle(sle.serial_and_batch_bundle) + else available_serial_nos.get(sle.serial_and_batch_bundle) ) key = (sle.item_code, sle.warehouse) if key not in available_serial_nos: