mirror of
https://github.com/frappe/erpnext.git
synced 2026-09-03 08:32:24 +00:00
Merge pull request #58535 from Shllokkk/mr-rfq-filter-pending-qty-v16
fix: filter fully ordered items when creating RFQ from Material Request
This commit is contained in:
@@ -10,6 +10,7 @@ import json
|
|||||||
import frappe
|
import frappe
|
||||||
import frappe.defaults
|
import frappe.defaults
|
||||||
from frappe import _, msgprint
|
from frappe import _, msgprint
|
||||||
|
from frappe.model.document import Document
|
||||||
from frappe.model.mapper import get_mapped_doc
|
from frappe.model.mapper import get_mapped_doc
|
||||||
from frappe.query_builder import Order
|
from frappe.query_builder import Order
|
||||||
from frappe.query_builder.functions import Sum
|
from frappe.query_builder.functions import Sum
|
||||||
@@ -766,7 +767,16 @@ def make_purchase_orders_by_supplier(source_name: str, item_suppliers: str | lis
|
|||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@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(
|
doclist = get_mapped_doc(
|
||||||
"Material Request",
|
"Material Request",
|
||||||
source_name,
|
source_name,
|
||||||
@@ -782,6 +792,8 @@ def make_request_for_quotation(source_name, target_doc=None):
|
|||||||
["parent", "material_request"],
|
["parent", "material_request"],
|
||||||
["project", "project_name"],
|
["project", "project_name"],
|
||||||
],
|
],
|
||||||
|
"postprocess": update_item,
|
||||||
|
"condition": select_item,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
target_doc,
|
target_doc,
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ from erpnext.stock.doctype.material_request.material_request import (
|
|||||||
create_pick_list,
|
create_pick_list,
|
||||||
make_in_transit_stock_entry,
|
make_in_transit_stock_entry,
|
||||||
make_purchase_order,
|
make_purchase_order,
|
||||||
|
make_request_for_quotation,
|
||||||
make_stock_entry,
|
make_stock_entry,
|
||||||
make_supplier_quotation,
|
make_supplier_quotation,
|
||||||
raise_work_orders,
|
raise_work_orders,
|
||||||
@@ -50,6 +51,26 @@ class TestMaterialRequest(ERPNextTestSuite):
|
|||||||
self.assertEqual(po.doctype, "Purchase Order")
|
self.assertEqual(po.doctype, "Purchase Order")
|
||||||
self.assertEqual(len(po.get("items")), len(mr.get("items")))
|
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.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_subcontracted_purchase_order(self):
|
def test_make_subcontracted_purchase_order(self):
|
||||||
from erpnext.manufacturing.doctype.production_plan.test_production_plan import make_bom
|
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 erpnext.stock.doctype.item.test_item import create_item, make_item
|
||||||
|
|||||||
Reference in New Issue
Block a user