From e422c4d2ab0191c787b3f4ecb9d2f8fefec24dab Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Mon, 22 Jun 2026 07:49:30 +0530 Subject: [PATCH] perf(subcontracting): hoist Work Order Item lookup out of transfer loop `validate_material_transfer` ran the `Work Order Item` query and rebuilt `wo_item_dict` inside the per-item loop, even though both depend only on `self.work_order`. For an entry with N customer-provided rows that meant N identical queries. Build the lookup once before the loop. `validate_manufacture` already builds the analogous dict once up front, so this also aligns the two methods. --- .../subcontracting_inward_controller.py | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/erpnext/controllers/subcontracting_inward_controller.py b/erpnext/controllers/subcontracting_inward_controller.py index 5c6ce75d8d3..ccc902b1d28 100644 --- a/erpnext/controllers/subcontracting_inward_controller.py +++ b/erpnext/controllers/subcontracting_inward_controller.py @@ -162,6 +162,23 @@ class SubcontractingInwardController: customer_warehouse = frappe.get_cached_value( "Subcontracting Inward Order", self.subcontracting_inward_order, "customer_warehouse" ) + work_order_items = frappe.get_all( + "Work Order Item", + {"parent": self.work_order, "docstatus": 1, "is_customer_provided_item": 1}, + ["item_code", "transferred_qty", "required_qty", "stock_reserved_qty"], + ) + wo_item_dict = frappe._dict( + { + wo_item.item_code: frappe._dict( + { + "transferred_qty": wo_item.transferred_qty, + "required_qty": wo_item.required_qty, + "stock_reserved_qty": wo_item.stock_reserved_qty, + } + ) + for wo_item in work_order_items + } + ) item_codes = [] for item in self.items: if not frappe.get_cached_value("Item", item.item_code, "is_customer_provided_item"): @@ -184,23 +201,6 @@ class SubcontractingInwardController: ) ) else: - work_order_items = frappe.get_all( - "Work Order Item", - {"parent": self.work_order, "docstatus": 1, "is_customer_provided_item": 1}, - ["item_code", "transferred_qty", "required_qty", "stock_reserved_qty"], - ) - wo_item_dict = frappe._dict( - { - wo_item.item_code: frappe._dict( - { - "transferred_qty": wo_item.transferred_qty, - "required_qty": wo_item.required_qty, - "stock_reserved_qty": wo_item.stock_reserved_qty, - } - ) - for wo_item in work_order_items - } - ) if wo_item := wo_item_dict.get(item.item_code): if wo_item.transferred_qty + item.transfer_qty > max( wo_item.required_qty, wo_item.stock_reserved_qty