Skip to content

Commit 38c2633

Browse files
authored
Merge pull request #50454 from frappe/mergify/bp/version-15-hotfix/pr-50399
fix: mr item quantity validation against so over-receipt allowance (backport #50399)
2 parents 1b1e4e4 + 249d14b commit 38c2633

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

erpnext/stock/doctype/material_request/material_request.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,21 @@ class MaterialRequest(BuyingController):
7575
work_order: DF.Link | None
7676
# end: auto-generated types
7777

78+
def __init__(self, *args, **kwargs):
79+
super().__init__(*args, **kwargs)
80+
self.status_updater = [
81+
{
82+
"source_dt": "Material Request Item",
83+
"target_dt": "Sales Order Item",
84+
"target_field": "ordered_qty",
85+
"target_parent_dt": "Sales Order",
86+
"target_parent_field": "",
87+
"join_field": "sales_order_item",
88+
"target_ref_field": "stock_qty",
89+
"source_field": "stock_qty",
90+
}
91+
]
92+
7893
def check_if_already_pulled(self):
7994
pass
8095

@@ -175,10 +190,10 @@ def set_title(self):
175190
def on_submit(self):
176191
self.update_requested_qty_in_production_plan()
177192
self.update_requested_qty()
178-
if self.material_request_type == "Purchase" and frappe.db.exists(
179-
"Budget", {"applicable_on_material_request": 1, "docstatus": 1}
180-
):
181-
self.validate_budget()
193+
if self.material_request_type == "Purchase":
194+
self.update_prevdoc_status()
195+
if frappe.db.exists("Budget", {"applicable_on_material_request": 1, "docstatus": 1}):
196+
self.validate_budget()
182197

183198
def before_save(self):
184199
self.set_status(update=True)

erpnext/stock/doctype/material_request/test_material_request.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -883,6 +883,18 @@ def test_manufacture_type_status_over_wo(self):
883883
self.assertEqual(mr.per_ordered, 100)
884884
self.assertEqual(mr.status, "Ordered")
885885

886+
def test_material_request_qty_over_sales_order_limit(self):
887+
from erpnext.controllers.status_updater import OverAllowanceError
888+
from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
889+
890+
so = make_sales_order()
891+
mr = make_material_request(qty=100, do_not_submit=True)
892+
mr.items[0].sales_order = so.name
893+
mr.items[0].sales_order_item = so.items[0].name
894+
mr.save()
895+
896+
self.assertRaises(OverAllowanceError, mr.submit)
897+
886898

887899
def get_in_transit_warehouse(company):
888900
if not frappe.db.exists("Warehouse Type", "Transit"):

0 commit comments

Comments
 (0)