mirror of
https://github.com/frappe/erpnext.git
synced 2026-08-13 14:41:53 +00:00
fix: resolve version-15 backport conflicts
Keep validate_warehouses() and add validate_over_delivery_receipt_allowance(); validate_serial_and_batch_no_settings() does not exist on this branch. Keep this branch's field labels and add only the non_negative flag the backported commit introduced. Drop test_over_order_allowance_against_material_request and test_blanket_order_over_order_aggregated_across_rows: both are develop-only context the cherry-pick swallowed into the conflicts, and Buying Settings has no over_order_allowance field here. Use frappe.tests.utils.change_settings instead of ERPNextTestSuite, which this branch does not have. Revert the valuation_method literal to the three options this branch offers - Standard Cost rode along from a regenerated develop type block.
This commit is contained in:
committed by
Sudharsanan11
parent
21c3e07f48
commit
b25a2f2cdf
@@ -126,62 +126,6 @@ class TestPurchaseOrder(FrappeTestCase):
|
|||||||
frappe.db.set_value("Item", "_Test Item", "over_billing_allowance", 0)
|
frappe.db.set_value("Item", "_Test Item", "over_billing_allowance", 0)
|
||||||
frappe.db.set_single_value("Accounts Settings", "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):
|
def test_update_remove_child_linked_to_mr(self):
|
||||||
"""Test impact on linked PO and MR on deleting/updating row."""
|
"""Test impact on linked PO and MR on deleting/updating row."""
|
||||||
mr = make_material_request(qty=10)
|
mr = make_material_request(qty=10)
|
||||||
@@ -1004,8 +948,8 @@ class TestPurchaseOrder(FrappeTestCase):
|
|||||||
# self.assertEqual(po.payment_terms_template, pi.payment_terms_template)
|
# self.assertEqual(po.payment_terms_template, pi.payment_terms_template)
|
||||||
compare_payment_schedules(self, po, pi)
|
compare_payment_schedules(self, po, pi)
|
||||||
|
|
||||||
@ERPNextTestSuite.change_settings("Selling Settings", {"maintain_same_sales_rate": 1})
|
@change_settings("Selling Settings", {"maintain_same_sales_rate": 1})
|
||||||
@ERPNextTestSuite.change_settings("Buying Settings", {"maintain_same_rate": 1})
|
@change_settings("Buying Settings", {"maintain_same_rate": 1})
|
||||||
def test_internal_transfer_flow(self):
|
def test_internal_transfer_flow(self):
|
||||||
from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center
|
from erpnext.accounts.doctype.cost_center.test_cost_center import create_cost_center
|
||||||
from erpnext.accounts.doctype.sales_invoice.sales_invoice import (
|
from erpnext.accounts.doctype.sales_invoice.sales_invoice import (
|
||||||
@@ -1425,11 +1369,7 @@ class TestPurchaseOrder(FrappeTestCase):
|
|||||||
self.assertEqual(pi_2.status, "Paid")
|
self.assertEqual(pi_2.status, "Paid")
|
||||||
self.assertEqual(po.status, "Completed")
|
self.assertEqual(po.status, "Completed")
|
||||||
|
|
||||||
<<<<<<< HEAD
|
|
||||||
@change_settings("Buying Settings", {"maintain_same_rate": 0})
|
@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):
|
def test_purchase_order_over_billing_missing_item(self):
|
||||||
item1 = make_item(
|
item1 = make_item(
|
||||||
"_Test Item for Overbilling",
|
"_Test Item for Overbilling",
|
||||||
|
|||||||
@@ -312,22 +312,12 @@ class StatusUpdater(Document):
|
|||||||
qty_or_amount,
|
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
|
role = None
|
||||||
if qty_or_amount == "qty":
|
if qty_or_amount == "qty":
|
||||||
if args.get("overflow_type") in ("delivery", "receipt"):
|
if args.get("overflow_type") in ("delivery", "receipt"):
|
||||||
role = frappe.get_single_value("Stock Settings", "role_allowed_to_over_deliver_receive")
|
role = frappe.get_single_value("Stock Settings", "role_allowed_to_over_deliver_receive")
|
||||||
else:
|
else:
|
||||||
role = frappe.get_single_value("Accounts Settings", "role_allowed_to_over_bill")
|
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 = (
|
overflow_percent = (
|
||||||
(item[args["target_field"]] - item[args["target_ref_field"]]) / item[args["target_ref_field"]]
|
(item[args["target_field"]] - item[args["target_ref_field"]]) / item[args["target_ref_field"]]
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
|
# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
|
||||||
# See license.txt
|
# See license.txt
|
||||||
import frappe
|
import frappe
|
||||||
from frappe.tests.utils import FrappeTestCase
|
from frappe.tests.utils import FrappeTestCase, change_settings
|
||||||
from frappe.utils import add_months, today
|
from frappe.utils import add_months, today
|
||||||
|
|
||||||
from erpnext import get_company_currency
|
from erpnext import get_company_currency
|
||||||
@@ -91,11 +91,9 @@ class TestBlanketOrder(FrappeTestCase):
|
|||||||
frappe.db.set_single_value("Buying Settings", "blanket_order_allowance", 10)
|
frappe.db.set_single_value("Buying Settings", "blanket_order_allowance", 10)
|
||||||
po.submit()
|
po.submit()
|
||||||
|
|
||||||
<<<<<<< HEAD
|
@change_settings("Selling Settings", {"blanket_order_allowance": 0})
|
||||||
=======
|
@change_settings("Buying Settings", {"blanket_order_allowance": 0})
|
||||||
@ERPNextTestSuite.change_settings("Selling Settings", {"blanket_order_allowance": 0})
|
@change_settings(
|
||||||
@ERPNextTestSuite.change_settings("Buying Settings", {"blanket_order_allowance": 0})
|
|
||||||
@ERPNextTestSuite.change_settings(
|
|
||||||
"Stock Settings",
|
"Stock Settings",
|
||||||
{"over_delivery_receipt_allowance": 10, "role_allowed_to_over_deliver_receive": "Stock Manager"},
|
{"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
|
order.flags.ignore_permissions = True
|
||||||
self.assertRaises(frappe.ValidationError, order.submit)
|
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):
|
def test_party_item_code(self):
|
||||||
item_doc = make_item("_Test Item 1 for Blanket Order")
|
item_doc = make_item("_Test Item 1 for Blanket Order")
|
||||||
item_code = item_doc.name
|
item_code = item_doc.name
|
||||||
|
|||||||
@@ -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.",
|
"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",
|
"fieldname": "mr_qty_allowance",
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
<<<<<<< HEAD
|
"label": "Over Transfer Allowance",
|
||||||
"label": "Over Transfer Allowance"
|
|
||||||
=======
|
|
||||||
"label": "Over Transfer Allowance (%)",
|
|
||||||
"non_negative": 1
|
"non_negative": 1
|
||||||
>>>>>>> 446ec6030a (fix(stock): validate over delivery/receipt allowance in stock settings)
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"default": "0",
|
"default": "0",
|
||||||
@@ -452,12 +448,8 @@
|
|||||||
"description": "The percentage you are allowed to pick more items in the pick list than the ordered quantity.",
|
"description": "The percentage you are allowed to pick more items in the pick list than the ordered quantity.",
|
||||||
"fieldname": "over_picking_allowance",
|
"fieldname": "over_picking_allowance",
|
||||||
"fieldtype": "Percent",
|
"fieldtype": "Percent",
|
||||||
<<<<<<< HEAD
|
"label": "Over Picking Allowance",
|
||||||
"label": "Over Picking Allowance"
|
|
||||||
=======
|
|
||||||
"label": "Over Picking Allowance (%)",
|
|
||||||
"non_negative": 1
|
"non_negative": 1
|
||||||
>>>>>>> 446ec6030a (fix(stock): validate over delivery/receipt allowance in stock settings)
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"default": "1",
|
"default": "1",
|
||||||
@@ -539,11 +531,7 @@
|
|||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"issingle": 1,
|
"issingle": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
<<<<<<< HEAD
|
|
||||||
"modified": "2026-03-27 22:39:16.812184",
|
|
||||||
=======
|
|
||||||
"modified": "2026-08-01 23:35:02.896836",
|
"modified": "2026-08-01 23:35:02.896836",
|
||||||
>>>>>>> 446ec6030a (fix(stock): validate over delivery/receipt allowance in stock settings)
|
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Stock",
|
"module": "Stock",
|
||||||
"name": "Stock Settings",
|
"name": "Stock Settings",
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ class StockSettings(Document):
|
|||||||
use_naming_series: DF.Check
|
use_naming_series: DF.Check
|
||||||
use_serial_batch_fields: DF.Check
|
use_serial_batch_fields: DF.Check
|
||||||
validate_material_transfer_warehouses: 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
|
# end: auto-generated types
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
@@ -100,12 +100,8 @@ class StockSettings(Document):
|
|||||||
validate_fields_for_doctype=False,
|
validate_fields_for_doctype=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
<<<<<<< HEAD
|
|
||||||
self.validate_warehouses()
|
self.validate_warehouses()
|
||||||
=======
|
|
||||||
self.validate_over_delivery_receipt_allowance()
|
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.cant_change_valuation_method()
|
||||||
self.validate_clean_description_html()
|
self.validate_clean_description_html()
|
||||||
self.validate_pending_reposts()
|
self.validate_pending_reposts()
|
||||||
|
|||||||
Reference in New Issue
Block a user