From 2374cf8bfdb68b9faed3c0e18845e46fca7a3a11 Mon Sep 17 00:00:00 2001 From: Assem Bahnasy Date: Tue, 11 Nov 2025 07:23:25 +0300 Subject: [PATCH] Fix: Product Bundle Purchase Order Creation Logic (#49831) Co-authored-by: Mihir Kandoi (cherry picked from commit 5b643433e51954d0030b9d2a4ed8fef9d63fcd1c) --- erpnext/selling/doctype/sales_order/sales_order.js | 8 +++++--- erpnext/selling/doctype/sales_order/sales_order.py | 6 ++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js index 360f68768fe..af811a98f11 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.js +++ b/erpnext/selling/doctype/sales_order/sales_order.js @@ -1559,7 +1559,7 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex make_purchase_order() { let pending_items = this.frm.doc.items.some((item) => { - let pending_qty = flt(item.stock_qty) - flt(item.ordered_qty); + const pending_qty = flt(item.stock_qty) - this.get_ordered_qty(item, this.frm.doc); return pending_qty > 0; }); if (!pending_items) { @@ -1713,8 +1713,10 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex // calculate ordered qty based on packed items in case of product bundle let packed_items = so.packed_items.filter((pi) => pi.parent_detail_docname == item.name); if (packed_items && packed_items.length) { - ordered_qty = packed_items.reduce((sum, pi) => sum + flt(pi.ordered_qty), 0); - ordered_qty = ordered_qty / packed_items.length; + const all_packed_items_ordered = packed_items.every( + (pi) => flt(pi.ordered_qty) >= flt(pi.qty) + ); + ordered_qty = all_packed_items_ordered ? item.stock_qty : 0; } } return ordered_qty; diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index f7c4fef5ebb..efdc689e972 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -1675,7 +1675,8 @@ def make_purchase_order_for_default_supplier(source_name, selected_items=None, t "pricing_rules", ], "postprocess": update_item_for_packed_item, - "condition": lambda doc: doc.parent_item in items_to_map, + "condition": lambda doc: doc.parent_item in items_to_map + and flt(doc.ordered_qty) < flt(doc.qty), }, }, target_doc, @@ -1813,7 +1814,8 @@ def make_purchase_order(source_name, selected_items=None, target_doc=None): "pricing_rules", ], "postprocess": update_item_for_packed_item, - "condition": lambda doc: doc.parent_item in items_to_map, + "condition": lambda doc: doc.parent_item in items_to_map + and flt(doc.ordered_qty) < flt(doc.qty), }, }, target_doc,