Merge pull request #58676 from frappe/mergify/bp/version-15-hotfix/pr-58535

fix: filter fully ordered items when creating RFQ from Material Request (backport #58535)
This commit is contained in:
Shllokkk
2026-09-02 12:19:57 +05:30
committed by GitHub
2 changed files with 34 additions and 1 deletions

View File

@@ -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
@@ -554,7 +555,16 @@ def make_purchase_order(source_name, target_doc=None, args=None):
@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
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,
@@ -570,6 +580,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,

View File

@@ -15,6 +15,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,
@@ -47,6 +48,26 @@ class TestMaterialRequest(FrappeTestCase):
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(test_records[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.schedule_date = today()
po.items = [po.items[0]]
po.items[0].schedule_date = today()
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_supplier_quotation(self):
mr = frappe.copy_doc(test_records[0]).insert()