From 6fe2599b9e0849fdc8cd992f409326920da92a42 Mon Sep 17 00:00:00 2001 From: pandiyan Date: Fri, 10 Jul 2026 15:36:32 +0530 Subject: [PATCH] perf(stock): avoid n+1 queries for work order item source warehouse hoist the invariant work order lookup and batch-fetch work order item source warehouses once instead of querying per raw material row in get_bom_raw_materials (cherry picked from commit 3e4d5e674582aa33b6a64e56bbfef1c6a8862623) --- .../stock/doctype/stock_entry/stock_entry.py | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index bc2d255a041..79e66ff94a3 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -3279,6 +3279,23 @@ class StockEntry(StockController, SubcontractingInwardController): used_alternative_items = get_used_alternative_items( subcontract_order_field=self.subcontract_data.order_field, work_order=self.work_order ) + + skip_transfer, from_wip_warehouse = ( + frappe.get_value("Work Order", self.work_order, ["skip_transfer", "from_wip_warehouse"]) + if self.work_order + else [None, None] + ) + wo_item_source_warehouses = {} + if skip_transfer and not from_wip_warehouse: + for d in frappe.get_all( + "Work Order Item", + filters={"parent": self.work_order}, + fields=["item_code", "source_warehouse"], + ): + # default ordering is creation desc; keep the first (most recent) row per + # item_code to match the limit-1 behaviour of the get_value call this replaces + wo_item_source_warehouses.setdefault(d.item_code, d.source_warehouse) + for item in item_dict.values(): # if source warehouse presents in BOM set from_warehouse as bom source_warehouse if item["allow_alternative_item"]: @@ -3286,18 +3303,8 @@ class StockEntry(StockController, SubcontractingInwardController): "Work Order", self.work_order, "allow_alternative_item" ) - skip_transfer, from_wip_warehouse = ( - frappe.get_value("Work Order", self.work_order, ["skip_transfer", "from_wip_warehouse"]) - if self.work_order - else [None, None] - ) - item.from_warehouse = ( - frappe.get_value( - "Work Order Item", - {"parent": self.work_order, "item_code": item.item_code}, - "source_warehouse", - ) + wo_item_source_warehouses.get(item.item_code) if skip_transfer and not from_wip_warehouse else self.from_warehouse or item.source_warehouse or item.default_warehouse )