mirror of
https://github.com/frappe/erpnext.git
synced 2026-08-21 18:29:57 +00:00
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:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user