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 3e4d5e6745)
This commit is contained in:
pandiyan
2026-07-10 15:36:32 +05:30
committed by Mergify
parent bdba4c8091
commit 6fe2599b9e

View File

@@ -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
)