diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py index 2738f4d849811d5cbe45b2b737837c7da00abf58..96d19c0c85c50a90e69a3b6edcc5acf08e108931 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -81,6 +81,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 @@ -204,10 +219,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 0ee49ecf0f4188ed5478e5ea9e2f09e7d30884d6..46191bb38966e1f683ac4ba3dfacbd8853452dd0 100644 --- a/erpnext/stock/doctype/material_request/test_material_request.py +++ b/erpnext/stock/doctype/material_request/test_material_request.py @@ -931,6 +931,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"):