From 6569acd401575b6a0cfdc77d6650dbd6274edde9 Mon Sep 17 00:00:00 2001 From: Kavin <78342682+kavin0411@users.noreply.github.com> Date: Tue, 21 Oct 2025 20:15:52 +0530 Subject: [PATCH 1/3] fix: Update pick list locations quantity --- .../doctype/material_request/material_request.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py index 96d19c0c85..11ffdc902a 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -901,6 +901,16 @@ def raise_work_orders(material_request): @frappe.whitelist() def create_pick_list(source_name, target_doc=None): + def update_item(obj, target, source_parent): + qty = ( + flt(flt(obj.stock_qty) - flt(obj.ordered_qty)) / target.conversion_factor + if flt(obj.stock_qty) > flt(obj.ordered_qty) + else 0 + ) + target.qty = qty + target.stock_qty = qty * obj.conversion_factor + target.conversion_factor = obj.conversion_factor + doc = get_mapped_doc( "Material Request", source_name, @@ -913,6 +923,11 @@ def create_pick_list(source_name, target_doc=None): "Material Request Item": { "doctype": "Pick List Item", "field_map": {"name": "material_request_item", "stock_qty": "stock_qty"}, + "postprocess": update_item, + "condition": lambda doc: ( + flt(doc.ordered_qty, doc.precision("ordered_qty")) + < flt(doc.stock_qty, doc.precision("ordered_qty")) + ), }, }, target_doc, -- GitLab From 7b990c87bdabe0c201313d4fa8a72aa35d03ef9f Mon Sep 17 00:00:00 2001 From: Kavin <78342682+kavin0411@users.noreply.github.com> Date: Tue, 21 Oct 2025 20:16:43 +0530 Subject: [PATCH 2/3] fix: Pass stock_qty and picked_qty in transfer entry --- erpnext/stock/doctype/pick_list/pick_list.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/pick_list/pick_list.py b/erpnext/stock/doctype/pick_list/pick_list.py index da8e3eecf1..4c260a2e95 100644 --- a/erpnext/stock/doctype/pick_list/pick_list.py +++ b/erpnext/stock/doctype/pick_list/pick_list.py @@ -1557,8 +1557,8 @@ def update_stock_entry_items_with_no_reference(pick_list, stock_entry): def update_common_item_properties(item, location): item.item_code = location.item_code item.s_warehouse = location.warehouse - item.qty = location.picked_qty * location.conversion_factor item.transfer_qty = location.picked_qty + item.qty = location.qty item.uom = location.uom item.conversion_factor = location.conversion_factor item.stock_uom = location.stock_uom -- GitLab From fa5fb108fe8f673c433b99cd81a0bb3826f0cd72 Mon Sep 17 00:00:00 2001 From: Kavin <78342682+kavin0411@users.noreply.github.com> Date: Sun, 9 Nov 2025 00:48:27 +0530 Subject: [PATCH 3/3] test: add test for pending qty calculation in Pick List --- .../material_request/test_material_request.py | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/erpnext/stock/doctype/material_request/test_material_request.py b/erpnext/stock/doctype/material_request/test_material_request.py index 46191bb389..f72f0f802f 100644 --- a/erpnext/stock/doctype/material_request/test_material_request.py +++ b/erpnext/stock/doctype/material_request/test_material_request.py @@ -11,6 +11,7 @@ from frappe.utils import flt, today from erpnext.controllers.accounts_controller import InvalidQtyError from erpnext.stock.doctype.item.test_item import create_item from erpnext.stock.doctype.material_request.material_request import ( + create_pick_list, make_in_transit_stock_entry, make_purchase_order, make_stock_entry, @@ -943,6 +944,36 @@ class TestMaterialRequest(IntegrationTestCase): self.assertRaises(OverAllowanceError, mr.submit) + def test_pending_qty_in_pick_list(self): + """Test for pick list mapped doc qty from partially received Material Request Transfer""" + import json + + from erpnext.stock.doctype.pick_list.pick_list import create_stock_entry + + mr = make_material_request(material_request_type="Material Transfer") + pl = create_pick_list(mr.name) + pl.save() + pl.locations[0].qty = 5 + pl.locations[0].stock_qty = 5 + pl.submit() + + to_warehouse = create_warehouse("Test To Warehouse") + + se_data = create_stock_entry(json.dumps(pl.as_dict())) + se = frappe.get_doc(se_data) + se.items[0].t_warehouse = to_warehouse + se.save() + se.submit() + + pl.load_from_db() + self.assertEqual(pl.locations[0].picked_qty, se.items[0].qty) + + mr.load_from_db() + self.assertEqual(mr.status, "Partially Received") + + pl_for_pending = create_pick_list(mr.name) + self.assertEqual(pl_for_pending.locations[0].qty, 5) + def get_in_transit_warehouse(company): if not frappe.db.exists("Warehouse Type", "Transit"): -- GitLab