From 99e2538b259344608e0bc8f425443cdb4d03265e Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Thu, 13 Aug 2026 12:05:04 +0530 Subject: [PATCH] test(manufacturing): cover rounding-loss snapping --- .../doctype/work_order/test_work_order.py | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/erpnext/manufacturing/doctype/work_order/test_work_order.py b/erpnext/manufacturing/doctype/work_order/test_work_order.py index 5317237ec6b..4e7f84596cf 100644 --- a/erpnext/manufacturing/doctype/work_order/test_work_order.py +++ b/erpnext/manufacturing/doctype/work_order/test_work_order.py @@ -1696,6 +1696,32 @@ class TestWorkOrder(ERPNextTestSuite): work_order.reload() self.assertEqual(work_order.material_transferred_for_manufacturing, 1.0) + def test_material_transferred_snaps_conversion_rounding_losses(self): + """A full transfer whose rows come out marginally short from UOM-conversion rounding + must count as fully transferred instead of storing values like 172.4789 for 172.5.""" + work_order = make_wo_order_test_record(planned_start_date=now(), qty=2000) + test_stock_entry.make_stock_entry( + item_code="_Test Item", target="_Test Warehouse - _TC", qty=5000, basic_rate=5000.0 + ) + test_stock_entry.make_stock_entry( + item_code="_Test Item Home Desktop 100", + target="_Test Warehouse - _TC", + qty=5000, + basic_rate=1000.0, + ) + + required_qty = {row.item_code: flt(row.required_qty) for row in work_order.required_items} + transfer_entry = frappe.get_doc( + make_stock_entry(work_order.name, "Material Transfer for Manufacture", 0) + ) + for item in transfer_entry.items: + item.qty = required_qty[item.item_code] * 0.9995 + item.transfer_qty = item.qty + transfer_entry.submit() + + work_order.reload() + self.assertEqual(work_order.material_transferred_for_manufacturing, 2000.0) + def test_status_in_process_when_only_one_required_item_transferred(self): """Stock Entry created from a Pick List that picked only one of the required items: min-fraction keeps material_transferred_for_manufacturing at 0, but the work order must