From bf2ab32abf991b07ca6a45e1c9be840445181f7d Mon Sep 17 00:00:00 2001 From: Navin-S-R Date: Sat, 10 Jan 2026 20:13:17 +0530 Subject: [PATCH] test: validate transferred quantity for material transfer entry --- .../doctype/stock_entry/test_stock_entry.py | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/erpnext/stock/doctype/stock_entry/test_stock_entry.py b/erpnext/stock/doctype/stock_entry/test_stock_entry.py index a3e0aea07be..935e86dcdc6 100644 --- a/erpnext/stock/doctype/stock_entry/test_stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/test_stock_entry.py @@ -14,6 +14,13 @@ from erpnext.stock.doctype.item.test_item import ( make_item_variant, set_item_variant_settings, ) +from erpnext.stock.doctype.material_request.material_request import ( + make_in_transit_stock_entry, +) +from erpnext.stock.doctype.material_request.test_material_request import ( + get_in_transit_warehouse, + make_material_request, +) from erpnext.stock.doctype.serial_and_batch_bundle.test_serial_and_batch_bundle import ( get_batch_from_bundle, get_serial_nos_from_bundle, @@ -2190,6 +2197,59 @@ class TestStockEntry(IntegrationTestCase): self.assertEqual(se.purpose, "Repack") self.assertRaises(frappe.ValidationError, se.submit) + def test_transferred_qty_in_material_transfer(self): + item_code = "_Test Item" + source_warehouse = "_Test Warehouse - _TC" + target_warehouse = "_Test Warehouse 1 - _TC" + + if not frappe.db.get_value("UOM Conversion Detail", {"parent": item_code, "uom": "Box"}): + item_doc = frappe.get_doc("Item", item_code) + item_doc.append("uoms", {"uom": "Box", "conversion_factor": 12}) + item_doc.save(ignore_permissions=True) + + make_stock_entry(item_code=item_code, target=source_warehouse, qty=12, rate=100) + + # Create a Material Request for Material Transfer + material_request = make_material_request( + material_request_type="Material Transfer", + qty=1, + item_code=item_code, + uom="Box", + conversion_factor=12, + from_warehouse=source_warehouse, + warehouse=target_warehouse, + ) + in_transit_wh = get_in_transit_warehouse(material_request.company) + + # Create first Stock Entry (Source -> In-Transit) + stock_entry_1 = make_in_transit_stock_entry(material_request.name, in_transit_wh) + stock_entry_1.items[0].update( + { + "qty": 1, + "s_warehouse": source_warehouse, + } + ) + stock_entry_1.save().submit() + + # Validate transfer status after first transfer + material_request.reload() + self.assertEqual(material_request.transfer_status, "In Transit") + + # Create final Stock Entry (In-Transit -> Target) + end_transit_1 = make_stock_in_entry(stock_entry_1.name) + end_transit_1.save().submit() + end_transit_1.reload() + + # Validate quantities + stock_entry_1.reload() + self.assertEqual(stock_entry_1.items[0].qty, 1) + self.assertEqual(stock_entry_1.items[0].transfer_qty, 12) + self.assertEqual(stock_entry_1.items[0].transferred_qty, 12) + + # Validate transfer status after final transfer + material_request.reload() + self.assertEqual(material_request.transfer_status, "Completed") + def make_serialized_item(self, **args): args = frappe._dict(args)