From 810b9ae28f818a130203ca82fe5439a05f8163fb Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Sat, 1 Aug 2026 08:57:04 +0530 Subject: [PATCH] fix: link the item and spell out the unit in the supplier dialog errors A bare item code left the buyer to find the item themselves, and a bare number gave no clue what the limit was counted in. Both messages now link the item and state the pending quantity in bold with its UOM. (cherry picked from commit 5a78e2290a15847e83ae0ddf81ff3ecdeaba53b5) --- erpnext/stock/doctype/material_request/mapper.py | 16 ++++++++++------ .../doctype/material_request/material_request.js | 10 +++++++--- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/erpnext/stock/doctype/material_request/mapper.py b/erpnext/stock/doctype/material_request/mapper.py index 7cc608bc1f0..850b2ab9552 100644 --- a/erpnext/stock/doctype/material_request/mapper.py +++ b/erpnext/stock/doctype/material_request/mapper.py @@ -207,20 +207,24 @@ def get_item_default_suppliers(source_name: str, filtered_children: str | list | def make_purchase_orders_by_supplier(source_name: str, item_suppliers: str | list) -> list[str]: """Create one draft Purchase Order per supplier for the given Material Request items.""" item_suppliers = frappe.parse_json(item_suppliers) - pending_qty = { - d["material_request_item"]: d["pending_qty"] for d in get_item_default_suppliers(source_name) + pending_items = { + d["material_request_item"]: frappe._dict(d) for d in get_item_default_suppliers(source_name) } items_by_supplier = {} for row in item_suppliers: row = frappe._dict(row) - if not row.supplier: - frappe.throw(_("Select a Supplier for Item {0}").format(frappe.bold(row.item_code))) + pending = pending_items.get(row.material_request_item) or frappe._dict() + item_link = get_link_to_form("Item", row.item_code) - if flt(row.qty) <= 0 or flt(row.qty) > flt(pending_qty.get(row.material_request_item)): + if not row.supplier: + frappe.throw(_("Select a Supplier for Item {0}").format(item_link)) + + if flt(row.qty) <= 0 or flt(row.qty) > flt(pending.pending_qty): + pending_qty = frappe.format_value(flt(pending.pending_qty), "Float") frappe.throw( _("Quantity for Item {0} must be greater than zero and cannot exceed {1}").format( - frappe.bold(row.item_code), flt(pending_qty.get(row.material_request_item)) + item_link, frappe.bold(f"{pending_qty} {pending.uom or ''}".strip()) ) ) diff --git a/erpnext/stock/doctype/material_request/material_request.js b/erpnext/stock/doctype/material_request/material_request.js index b3853c43218..345d5cfb846 100644 --- a/erpnext/stock/doctype/material_request/material_request.js +++ b/erpnext/stock/doctype/material_request/material_request.js @@ -523,7 +523,11 @@ frappe.ui.form.on("Material Request", { const missing_supplier = item_suppliers.find((row) => !row.supplier); if (missing_supplier) { - frappe.throw(__("Select a Supplier for Item {0}", [missing_supplier.item_code])); + frappe.throw( + __("Select a Supplier for Item {0}", [ + frappe.utils.get_form_link("Item", missing_supplier.item_code, true), + ]) + ); } const invalid_qty = item_suppliers.find( @@ -532,8 +536,8 @@ frappe.ui.form.on("Material Request", { if (invalid_qty) { frappe.throw( __("Quantity for Item {0} must be greater than zero and cannot exceed {1}", [ - invalid_qty.item_code, - format_number(invalid_qty.pending_qty), + frappe.utils.get_form_link("Item", invalid_qty.item_code, true), + `${format_number(invalid_qty.pending_qty)} ${invalid_qty.uom}`, ]) ); }