From 0b271e24b60ed4f3a2f9e57bfd5f39f195a6b683 Mon Sep 17 00:00:00 2001 From: Afsal Syed Date: Sun, 2 Aug 2026 02:32:59 +0530 Subject: [PATCH] test(stock): add test cases verifying stock over delivery role does not bypass order allowance --- .../purchase_order/test_purchase_order.py | 15 +++++++++++ .../blanket_order/test_blanket_order.py | 26 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index 37ccf275cdc..b84ca5ca9dd 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -216,6 +216,21 @@ class TestPurchaseOrder(ERPNextTestSuite): po2.items[0].qty = 110 self.assertRaises(OverAllowanceError, po2.submit) + # Stock over-delivery role must not bypass over-ordering against Material Request. + with self.change_settings( + "Stock Settings", {"role_allowed_to_over_deliver_receive": "Stock Manager"} + ): + test_user = frappe.get_doc("User", "test@example.com") + test_user.add_roles("Stock Manager") + + mr3 = make_material_request(qty=100) + po3 = make_purchase_order(mr3.name) + po3.supplier = "_Test Supplier" + po3.items[0].qty = 110 + with self.set_user("test@example.com"): + po3.flags.ignore_permissions = True + self.assertRaises(OverAllowanceError, po3.submit) + # cleanup frappe.db.set_single_value("Buying Settings", "over_order_allowance", 0) frappe.db.set_single_value("Stock Settings", "over_delivery_receipt_allowance", 0) diff --git a/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py b/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py index d6b94ca7bae..a2babf8d845 100644 --- a/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py +++ b/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py @@ -91,6 +91,32 @@ class TestBlanketOrder(ERPNextTestSuite): frappe.db.set_single_value("Buying Settings", "blanket_order_allowance", 10) po.submit() + @ERPNextTestSuite.change_settings("Selling Settings", {"blanket_order_allowance": 0}) + @ERPNextTestSuite.change_settings("Buying Settings", {"blanket_order_allowance": 0}) + @ERPNextTestSuite.change_settings( + "Stock Settings", + {"over_delivery_receipt_allowance": 10, "role_allowed_to_over_deliver_receive": "Stock Manager"}, + ) + def test_stock_over_delivery_role_does_not_bypass_blanket_order_allowance(self): + test_user = frappe.get_doc("User", "test@example.com") + test_user.add_roles("Stock Manager") + + frappe.clear_cache() + for blanket_order_type, doctype, date_field in ( + ("Selling", "Sales Order", "delivery_date"), + ("Purchasing", "Purchase Order", "schedule_date"), + ): + bo = make_blanket_order(blanket_order_type=blanket_order_type, quantity=100) + frappe.flags.args.doctype = doctype + order = make_order(bo.name) + order.currency = get_company_currency(order.company) + setattr(order, date_field, today()) + order.items[0].qty = 110 + + with self.set_user("test@example.com"): + order.flags.ignore_permissions = True + self.assertRaises(frappe.ValidationError, order.submit) + def test_blanket_order_over_order_aggregated_across_rows(self): # the over-order check should sum the same item across multiple order rows frappe.db.set_single_value("Selling Settings", "blanket_order_allowance", 0)