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.
This commit is contained in:
Mihir Kandoi
2026-06-22 07:49:30 +05:30
parent a342db38de
commit e422c4d2ab

View File

@@ -162,6 +162,23 @@ class SubcontractingInwardController:
customer_warehouse = frappe.get_cached_value( customer_warehouse = frappe.get_cached_value(
"Subcontracting Inward Order", self.subcontracting_inward_order, "customer_warehouse" "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 = [] item_codes = []
for item in self.items: for item in self.items:
if not frappe.get_cached_value("Item", item.item_code, "is_customer_provided_item"): if not frappe.get_cached_value("Item", item.item_code, "is_customer_provided_item"):
@@ -184,23 +201,6 @@ class SubcontractingInwardController:
) )
) )
else: 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 := wo_item_dict.get(item.item_code):
if wo_item.transferred_qty + item.transfer_qty > max( if wo_item.transferred_qty + item.transfer_qty > max(
wo_item.required_qty, wo_item.stock_reserved_qty wo_item.required_qty, wo_item.stock_reserved_qty