From ea770f6a8ebf7eac468814c8b3c049a88f7cfa17 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Sat, 1 Aug 2026 09:11:37 +0530 Subject: [PATCH] fix: reject the same Material Request item twice in one supplier selection Each row was checked against the pending quantity on its own, so a payload that listed one item under two suppliers passed both checks and ordered the pending quantity twice. The dialog cannot produce that, a direct call to the endpoint can. (cherry picked from commit 99d56cc850c4095cd8cbbfdc3a7fc6e1691053ba) --- erpnext/stock/doctype/material_request/mapper.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/erpnext/stock/doctype/material_request/mapper.py b/erpnext/stock/doctype/material_request/mapper.py index da617f4d8a9..26569f58cec 100644 --- a/erpnext/stock/doctype/material_request/mapper.py +++ b/erpnext/stock/doctype/material_request/mapper.py @@ -215,11 +215,17 @@ def make_purchase_orders_by_supplier(source_name: str, item_suppliers: str | lis } items_by_supplier = {} + requested_items = set() for row in item_suppliers: row = frappe._dict(row) pending = pending_items.get(row.material_request_item) or frappe._dict() item_link = get_link_to_form("Item", row.item_code) + if row.material_request_item in requested_items: + frappe.throw(_("Item {0} cannot be ordered more than once").format(item_link)) + + requested_items.add(row.material_request_item) + if not row.supplier: frappe.throw(_("Select a Supplier for Item {0}").format(item_link))