Merge pull request #58502 from Shllokkk/work-order-transferred-qty-sum-alternate-items-v16

fix: sum item and its alternate transferred qty on work order
This commit is contained in:
Shllokkk
2026-08-27 18:27:56 +05:30
committed by GitHub
2 changed files with 43 additions and 2 deletions

View File

@@ -3492,6 +3492,42 @@ class TestWorkOrder(ERPNextTestSuite):
frappe.db.set_single_value("Manufacturing Settings", "validate_components_quantities_per_bom", 0)
def test_transferred_qty_sums_item_and_its_alternate(self):
# Base item + its alternate transfers must sum onto the required row, not overwrite.
fg_item = "Test FG Item For Alternate Transferred Qty"
source_warehouse = "Stores - _TC"
raw_material = "Test RM For Alternate Transferred Qty"
alternate_item = "Alternate Test RM For Alternate Transferred Qty"
make_item(fg_item, {"is_stock_item": 1})
for item in [raw_material, alternate_item]:
make_item(item, {"is_stock_item": 1, "allow_alternative_item": 1})
test_stock_entry.make_stock_entry(item_code=item, target=source_warehouse, qty=10, basic_rate=100)
frappe.get_doc(
{
"doctype": "Item Alternative",
"item_code": raw_material,
"alternative_item_code": alternate_item,
"two_way": 1,
}
).insert()
make_bom(item=fg_item, source_warehouse=source_warehouse, raw_materials=[raw_material])
wo = make_wo_order_test_record(item=fg_item, qty=10, source_warehouse=source_warehouse)
# 6 as the base item
frappe.get_doc(make_stock_entry(wo.name, "Material Transfer for Manufacture", 6)).submit()
# 4 as the alternate item, linked back to the base
alt_transfer = frappe.get_doc(make_stock_entry(wo.name, "Material Transfer for Manufacture", 4))
alt_transfer.items[0].item_code = alternate_item
alt_transfer.items[0].original_item = raw_material
alt_transfer.submit()
wo.reload()
self.assertEqual(wo.required_items[0].transferred_qty, 10)
self.assertEqual(wo.material_transferred_for_manufacturing, 10)
def test_components_qty_for_bom_based_manufacture_entry(self):
frappe.db.set_single_value("Manufacturing Settings", "backflush_raw_materials_based_on", "BOM")
frappe.db.set_single_value("Manufacturing Settings", "validate_components_quantities_per_bom", 1)

View File

@@ -1796,11 +1796,16 @@ class WorkOrder(Document):
& (ste.purpose == "Material Transfer for Manufacture")
& (ste.is_return == is_return)
)
.groupby(ste_child.item_code)
.groupby(ste_child.item_code, ste_child.original_item)
)
data = query.run(as_dict=1) or []
return frappe._dict({d.original_item or d.item_code: d.qty for d in data})
# An item's own transfer and its substitutes both key to the original item, so sum them.
transferred_items = frappe._dict()
for d in data:
key = d.original_item or d.item_code
transferred_items[key] = flt(transferred_items.get(key)) + flt(d.qty)
return transferred_items
def recompute_material_transferred_for_manufacturing(self, transferred_items):
"""Set transferred quantity from the raw materials that have actually moved."""