diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py index 81680af6806..5a9aeab1a49 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -83,6 +83,21 @@ class MaterialRequest(BuyingController): work_order: DF.Link | None # end: auto-generated types + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.status_updater = [ + { + "source_dt": "Material Request Item", + "target_dt": "Sales Order Item", + "target_field": "ordered_qty", + "target_parent_dt": "Sales Order", + "target_parent_field": "", + "join_field": "sales_order_item", + "target_ref_field": "stock_qty", + "source_field": "stock_qty", + } + ] + def check_if_already_pulled(self): pass @@ -206,10 +221,10 @@ class MaterialRequest(BuyingController): def on_submit(self): self.update_requested_qty_in_production_plan() self.update_requested_qty() - if self.material_request_type == "Purchase" and frappe.db.exists( - "Budget", {"applicable_on_material_request": 1, "docstatus": 1} - ): - self.validate_budget() + if self.material_request_type == "Purchase": + self.update_prevdoc_status() + if frappe.db.exists("Budget", {"applicable_on_material_request": 1, "docstatus": 1}): + self.validate_budget() def before_save(self): self.set_status(update=True) diff --git a/erpnext/stock/doctype/material_request/test_material_request.py b/erpnext/stock/doctype/material_request/test_material_request.py index bb1f9c637a2..afe1e8c4bac 100644 --- a/erpnext/stock/doctype/material_request/test_material_request.py +++ b/erpnext/stock/doctype/material_request/test_material_request.py @@ -933,6 +933,18 @@ class TestMaterialRequest(IntegrationTestCase): self.assertEqual(mr.per_ordered, 100) self.assertEqual(mr.status, "Ordered") + def test_material_request_qty_over_sales_order_limit(self): + from erpnext.controllers.status_updater import OverAllowanceError + from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order + + so = make_sales_order() + mr = make_material_request(qty=100, do_not_submit=True) + mr.items[0].sales_order = so.name + mr.items[0].sales_order_item = so.items[0].name + mr.save() + + self.assertRaises(OverAllowanceError, mr.submit) + def get_in_transit_warehouse(company): if not frappe.db.exists("Warehouse Type", "Transit"):