From bd9e240ca5e72410dfa0eed140826607cdfca50f 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 5a9aeab1a49..b8817996bac 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -902,6 +902,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, @@ -914,6 +924,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, From 6db605c443205f2d22a98c21ea833835945d6a9d 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 f8c184c1d93..507534a16ac 100644 --- a/erpnext/stock/doctype/pick_list/pick_list.py +++ b/erpnext/stock/doctype/pick_list/pick_list.py @@ -1552,8 +1552,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 From 3f7a60d56cd7239efb1ed7d05da82ca4df8722df 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 afe1e8c4bac..0a6251f7794 100644 --- a/erpnext/stock/doctype/material_request/test_material_request.py +++ b/erpnext/stock/doctype/material_request/test_material_request.py @@ -13,6 +13,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, @@ -945,6 +946,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"):