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 53a8f1120ab..42d672df36b 100644 --- a/erpnext/stock/doctype/material_request/material_request.js +++ b/erpnext/stock/doctype/material_request/material_request.js @@ -517,7 +517,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( @@ -526,8 +530,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}`, ]) ); }