diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index 194f5a7457c..ac5ec434b76 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -126,62 +126,6 @@ class TestPurchaseOrder(FrappeTestCase): frappe.db.set_value("Item", "_Test Item", "over_billing_allowance", 0) frappe.db.set_single_value("Accounts Settings", "over_billing_allowance", 0) -<<<<<<< HEAD -======= - def test_over_order_allowance_against_material_request(self) -> None: - """Over Order Allowance in Buying Settings must govern PO qty vs MR qty independently - from Over Delivery/Receipt Allowance which governs receipt/delivery against a PO.""" - mr = make_material_request(qty=100) - po = make_purchase_order(mr.name) - po.supplier = "_Test Supplier" - po.items[0].qty = 110 # 10% over the MR qty - - # Without any allowance, submitting should raise an OverAllowanceError - from erpnext.controllers.status_updater import OverAllowanceError - - frappe.db.set_single_value("Buying Settings", "over_order_allowance", 0) - frappe.db.set_single_value("Stock Settings", "over_delivery_receipt_allowance", 0) - self.assertRaises(OverAllowanceError, po.submit) - - # Granting 10% in Over Order Allowance (Buying Settings) must allow the submit - frappe.db.set_single_value("Buying Settings", "over_order_allowance", 10) - po.reload() - po.items[0].qty = 110 - po.submit() - self.assertEqual(po.docstatus, 1) - po.cancel() - - # Over Delivery/Receipt Allowance must remain independent — changing it must not - # affect the MR → PO validation when Over Order Allowance is 0. - frappe.db.set_single_value("Buying Settings", "over_order_allowance", 0) - frappe.db.set_single_value("Stock Settings", "over_delivery_receipt_allowance", 50) - - mr2 = make_material_request(qty=100) - po2 = make_purchase_order(mr2.name) - po2.supplier = "_Test Supplier" - 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) - ->>>>>>> 0b271e24b6 (test(stock): add test cases verifying stock over delivery role does not bypass order allowance) def test_update_remove_child_linked_to_mr(self): """Test impact on linked PO and MR on deleting/updating row.""" mr = make_material_request(qty=10) @@ -1004,8 +948,8 @@ class TestPurchaseOrder(FrappeTestCase): # self.assertEqual(po.payment_terms_template, pi.payment_terms_template) compare_payment_schedules(self, po, pi) - @ERPNextTestSuite.change_settings("Selling Settings", {"maintain_same_sales_rate": 1}) - @ERPNextTestSuite.change_settings("Buying Settings", {"maintain_same_rate": 1}) + @change_settings("Selling Settings", {"maintain_same_sales_rate": 1}) + @change_settings("Buying Settings", {"maintain_same_rate": 1}) def test_internal_transfer_flow(self): from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center from erpnext.accounts.doctype.sales_invoice.sales_invoice import ( @@ -1425,11 +1369,7 @@ class TestPurchaseOrder(FrappeTestCase): self.assertEqual(pi_2.status, "Paid") self.assertEqual(po.status, "Completed") -<<<<<<< HEAD @change_settings("Buying Settings", {"maintain_same_rate": 0}) -======= - @ERPNextTestSuite.change_settings("Buying Settings", {"maintain_same_rate": 0}) ->>>>>>> 99630f40eb (test(stock): prevent settings leakage in purchase order tests) def test_purchase_order_over_billing_missing_item(self): item1 = make_item( "_Test Item for Overbilling", diff --git a/erpnext/controllers/status_updater.py b/erpnext/controllers/status_updater.py index 6513ecf7080..34ff799a83c 100644 --- a/erpnext/controllers/status_updater.py +++ b/erpnext/controllers/status_updater.py @@ -312,22 +312,12 @@ class StatusUpdater(Document): qty_or_amount, ) -<<<<<<< HEAD - role_allowed_to_over_deliver_receive = frappe.db.get_single_value( - "Stock Settings", "role_allowed_to_over_deliver_receive" - ) - role_allowed_to_over_bill = frappe.db.get_single_value( - "Accounts Settings", "role_allowed_to_over_bill" - ) - role = role_allowed_to_over_deliver_receive if qty_or_amount == "qty" else role_allowed_to_over_bill -======= role = None if qty_or_amount == "qty": if args.get("overflow_type") in ("delivery", "receipt"): role = frappe.get_single_value("Stock Settings", "role_allowed_to_over_deliver_receive") else: role = frappe.get_single_value("Accounts Settings", "role_allowed_to_over_bill") ->>>>>>> 248873034d (fix(stock): scope over deliver/receive role check to delivery and receipt overflow) overflow_percent = ( (item[args["target_field"]] - item[args["target_ref_field"]]) / item[args["target_ref_field"]] diff --git a/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py b/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py index ce7ef6b614a..787b3576bc7 100644 --- a/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py +++ b/erpnext/manufacturing/doctype/blanket_order/test_blanket_order.py @@ -1,7 +1,7 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests.utils import FrappeTestCase, change_settings from frappe.utils import add_months, today from erpnext import get_company_currency @@ -91,11 +91,9 @@ class TestBlanketOrder(FrappeTestCase): frappe.db.set_single_value("Buying Settings", "blanket_order_allowance", 10) po.submit() -<<<<<<< HEAD -======= - @ERPNextTestSuite.change_settings("Selling Settings", {"blanket_order_allowance": 0}) - @ERPNextTestSuite.change_settings("Buying Settings", {"blanket_order_allowance": 0}) - @ERPNextTestSuite.change_settings( + @change_settings("Selling Settings", {"blanket_order_allowance": 0}) + @change_settings("Buying Settings", {"blanket_order_allowance": 0}) + @change_settings( "Stock Settings", {"over_delivery_receipt_allowance": 10, "role_allowed_to_over_deliver_receive": "Stock Manager"}, ) @@ -119,30 +117,6 @@ class TestBlanketOrder(FrappeTestCase): 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) - bo = make_blanket_order(blanket_order_type="Selling", quantity=100) - - frappe.flags.args.doctype = "Sales Order" - so = make_order(bo.name) - so.currency = get_company_currency(so.company) - so.delivery_date = today() - so.items[0].qty = 60 - so.append( - "items", - { - "item_code": so.items[0].item_code, - "qty": 50, # 60 + 50 = 110 > 100 blanket qty - "rate": so.items[0].rate, - "delivery_date": today(), - "against_blanket_order": 1, - "blanket_order": bo.name, - }, - ) - self.assertRaises(frappe.ValidationError, so.submit) - ->>>>>>> 0b271e24b6 (test(stock): add test cases verifying stock over delivery role does not bypass order allowance) def test_party_item_code(self): item_doc = make_item("_Test Item 1 for Blanket Order") item_code = item_doc.name diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.json b/erpnext/stock/doctype/stock_settings/stock_settings.json index 03303d247bf..488eefeefc7 100644 --- a/erpnext/stock/doctype/stock_settings/stock_settings.json +++ b/erpnext/stock/doctype/stock_settings/stock_settings.json @@ -283,12 +283,8 @@ "description": "The percentage you are allowed to transfer more against the quantity ordered. For example, if you have ordered 100 units, and your Allowance is 10%, then you are allowed transfer 110 units.", "fieldname": "mr_qty_allowance", "fieldtype": "Float", -<<<<<<< HEAD - "label": "Over Transfer Allowance" -======= - "label": "Over Transfer Allowance (%)", + "label": "Over Transfer Allowance", "non_negative": 1 ->>>>>>> 446ec6030a (fix(stock): validate over delivery/receipt allowance in stock settings) }, { "default": "0", @@ -452,12 +448,8 @@ "description": "The percentage you are allowed to pick more items in the pick list than the ordered quantity.", "fieldname": "over_picking_allowance", "fieldtype": "Percent", -<<<<<<< HEAD - "label": "Over Picking Allowance" -======= - "label": "Over Picking Allowance (%)", + "label": "Over Picking Allowance", "non_negative": 1 ->>>>>>> 446ec6030a (fix(stock): validate over delivery/receipt allowance in stock settings) }, { "default": "1", @@ -539,11 +531,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], -<<<<<<< HEAD - "modified": "2026-03-27 22:39:16.812184", -======= "modified": "2026-08-01 23:35:02.896836", ->>>>>>> 446ec6030a (fix(stock): validate over delivery/receipt allowance in stock settings) "modified_by": "Administrator", "module": "Stock", "name": "Stock Settings", diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.py b/erpnext/stock/doctype/stock_settings/stock_settings.py index 1c9611d733e..2924e8c70f9 100644 --- a/erpnext/stock/doctype/stock_settings/stock_settings.py +++ b/erpnext/stock/doctype/stock_settings/stock_settings.py @@ -67,7 +67,7 @@ class StockSettings(Document): use_naming_series: DF.Check use_serial_batch_fields: DF.Check validate_material_transfer_warehouses: DF.Check - valuation_method: DF.Literal["FIFO", "Moving Average", "LIFO", "Standard Cost"] + valuation_method: DF.Literal["FIFO", "Moving Average", "LIFO"] # end: auto-generated types def validate(self): @@ -100,12 +100,8 @@ class StockSettings(Document): validate_fields_for_doctype=False, ) -<<<<<<< HEAD self.validate_warehouses() -======= self.validate_over_delivery_receipt_allowance() - self.validate_serial_and_batch_no_settings() ->>>>>>> 446ec6030a (fix(stock): validate over delivery/receipt allowance in stock settings) self.cant_change_valuation_method() self.validate_clean_description_html() self.validate_pending_reposts()