From 2328e6da94d3787180251a339384e4ecfebdbef5 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Thu, 20 Aug 2026 12:35:04 +0530 Subject: [PATCH] =?UTF-8?q?fix:=20changing=20product=20bundle=20warehouse?= =?UTF-8?q?=20should=20change=20packed=20items=20war=E2=80=A6=20(#58316)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- erpnext/public/js/utils/sales_common.js | 17 ++++++++++++++ .../stock/doctype/packed_item/packed_item.py | 23 ++++++++++++------- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/erpnext/public/js/utils/sales_common.js b/erpnext/public/js/utils/sales_common.js index 14834067e74..bbce4b2024f 100644 --- a/erpnext/public/js/utils/sales_common.js +++ b/erpnext/public/js/utils/sales_common.js @@ -286,6 +286,23 @@ erpnext.sales_common = { } this.set_actual_qty(doc, cdt, cdn); + + if (cdt !== "Packed Item" && doc.packed_items) { + doc.packed_items + .filter( + (item) => + item.parent_detail_docname === cdn || + parseInt(item.parent_detail_docname) === locals[cdt][cdn].idx + ) + .forEach((item) => { + frappe.model.set_value( + item.doctype, + item.name, + "warehouse", + locals[cdt][cdn].warehouse + ); + }); + } } set_actual_qty(doc, cdt, cdn) { diff --git a/erpnext/stock/doctype/packed_item/packed_item.py b/erpnext/stock/doctype/packed_item/packed_item.py index ea09440f669..f9a17bba1a7 100644 --- a/erpnext/stock/doctype/packed_item/packed_item.py +++ b/erpnext/stock/doctype/packed_item/packed_item.py @@ -279,16 +279,23 @@ def update_packed_item_basic_data(main_item_row, pi_row, packing_item, item_data def update_packed_item_stock_data(main_item_row, pi_row, packing_item, item_data, doc): # TODO batch_no, actual_batch_qty, incoming_rate if main_item_row.get("so_detail"): - pi_row.warehouse = frappe.get_value( - "Packed Item", - { - "parent_detail_docname": main_item_row.so_detail, - "parent_item": main_item_row.item_code, - "item_code": packing_item.item_code, - }, - "warehouse", + warehouse, reserve_stock = ( + frappe.get_value( + "Packed Item", + { + "parent_detail_docname": main_item_row.so_detail, + "parent_item": main_item_row.item_code, + "item_code": packing_item.item_code, + }, + ["warehouse", "reserve_stock"], + ) + or None, + None, ) + if reserve_stock: + pi_row.warehouse = warehouse + if not pi_row.warehouse and not doc.amended_from: fetch_warehouse = doc.get("is_pos") or item_data.is_stock_item or not item_data.default_warehouse pi_row.warehouse = (