From 9b1d907b6a59101070810b670be45ab6ae0aa242 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Fri, 28 Aug 2026 16:08:51 +0530 Subject: [PATCH 1/4] fix: filter fully ordered items when creating RFQ from Material Request --- .../doctype/material_request/material_request.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py index 81e185dfaf7..3472ee34ea5 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -764,6 +764,15 @@ def make_purchase_orders_by_supplier(source_name: str, item_suppliers: str | lis @frappe.whitelist() def make_request_for_quotation(source_name, target_doc=None): + def update_item(obj, target, source_parent): + qty = obj.ordered_qty or obj.received_qty + target.qty = flt(flt(obj.stock_qty) - flt(qty)) / target.conversion_factor + target.stock_qty = target.qty * target.conversion_factor + + def select_item(d): + qty = d.ordered_qty or d.received_qty + return qty < d.stock_qty + doclist = get_mapped_doc( "Material Request", source_name, @@ -779,6 +788,8 @@ def make_request_for_quotation(source_name, target_doc=None): ["parent", "material_request"], ["project", "project_name"], ], + "postprocess": update_item, + "condition": select_item, }, }, target_doc, From 5adcb28b3ce12e327c902644f12bf1e30c698ff3 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Fri, 28 Aug 2026 16:32:53 +0530 Subject: [PATCH 2/4] test: RFQ from Material Request skips fully ordered items --- .../material_request/test_material_request.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/erpnext/stock/doctype/material_request/test_material_request.py b/erpnext/stock/doctype/material_request/test_material_request.py index 0dada9746a2..b66ab2372be 100644 --- a/erpnext/stock/doctype/material_request/test_material_request.py +++ b/erpnext/stock/doctype/material_request/test_material_request.py @@ -14,6 +14,7 @@ from erpnext.stock.doctype.material_request.material_request import ( create_pick_list, make_in_transit_stock_entry, make_purchase_order, + make_request_for_quotation, make_stock_entry, make_supplier_quotation, raise_work_orders, @@ -50,6 +51,24 @@ class TestMaterialRequest(ERPNextTestSuite): self.assertEqual(po.doctype, "Purchase Order") self.assertEqual(len(po.get("items")), len(mr.get("items"))) + def test_make_request_for_quotation_skips_ordered_items(self): + mr = frappe.copy_doc(self.globalTestRecords["Material Request"][0]).insert() + mr = frappe.get_doc("Material Request", mr.name) + mr.submit() + + # fully order the first item, leave the second pending + po = make_purchase_order(mr.name) + po.supplier = "_Test Supplier" + po.items = [po.items[0]] + po.insert() + po.submit() + + rfq = make_request_for_quotation(mr.name) + + self.assertEqual(len(rfq.get("items")), 1) + self.assertEqual(rfq.items[0].material_request_item, mr.items[1].name) + self.assertEqual(rfq.items[0].qty, mr.items[1].qty) + def test_make_subcontracted_purchase_order(self): from erpnext.manufacturing.doctype.production_plan.test_production_plan import make_bom from erpnext.stock.doctype.item.test_item import create_item, make_item From 4435f166ea982add6cab56f5b6e2a9424f708d78 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Fri, 28 Aug 2026 20:02:59 +0530 Subject: [PATCH 3/4] fix: add type hints to make_request_for_quotation --- erpnext/stock/doctype/material_request/material_request.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py index 3472ee34ea5..ab678b4c268 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -10,6 +10,7 @@ import json import frappe import frappe.defaults from frappe import _, msgprint +from frappe.model.document import Document from frappe.model.mapper import get_mapped_doc from frappe.query_builder import Order from frappe.query_builder.functions import Sum @@ -763,7 +764,7 @@ def make_purchase_orders_by_supplier(source_name: str, item_suppliers: str | lis @frappe.whitelist() -def make_request_for_quotation(source_name, target_doc=None): +def make_request_for_quotation(source_name: str, target_doc: str | dict | Document | None = None): def update_item(obj, target, source_parent): qty = obj.ordered_qty or obj.received_qty target.qty = flt(flt(obj.stock_qty) - flt(qty)) / target.conversion_factor From 5af60cf2e399657781bf4e27e8976da4aa74c7fd Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Fri, 28 Aug 2026 20:02:59 +0530 Subject: [PATCH 4/4] test: set schedule date on PO before insert --- erpnext/stock/doctype/material_request/test_material_request.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/erpnext/stock/doctype/material_request/test_material_request.py b/erpnext/stock/doctype/material_request/test_material_request.py index b66ab2372be..1253f8fcdb0 100644 --- a/erpnext/stock/doctype/material_request/test_material_request.py +++ b/erpnext/stock/doctype/material_request/test_material_request.py @@ -59,7 +59,9 @@ class TestMaterialRequest(ERPNextTestSuite): # fully order the first item, leave the second pending po = make_purchase_order(mr.name) po.supplier = "_Test Supplier" + po.schedule_date = today() po.items = [po.items[0]] + po.items[0].schedule_date = today() po.insert() po.submit()