fix: don't allow negative rates (#36027)
* fix: don't allow negative rate
* test: don't allow negative rate
* fix: only check for -rate on items child table
diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
index 41e5554..e8445aa 100644
--- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
@@ -3371,6 +3371,13 @@
set_advance_flag(company="_Test Company", flag=0, default_account="")
+ def test_sales_return_negative_rate(self):
+ si = create_sales_invoice(is_return=1, qty=-2, rate=-10, do_not_save=True)
+ self.assertRaises(frappe.ValidationError, si.save)
+
+ si.items[0].rate = 10
+ si.save()
+
def set_advance_flag(company, flag, default_account):
frappe.db.set_value(
diff --git a/erpnext/controllers/status_updater.py b/erpnext/controllers/status_updater.py
index 58cab14..a4bc4a9 100644
--- a/erpnext/controllers/status_updater.py
+++ b/erpnext/controllers/status_updater.py
@@ -233,6 +233,9 @@
if hasattr(d, "qty") and d.qty > 0 and self.get("is_return"):
frappe.throw(_("For an item {0}, quantity must be negative number").format(d.item_code))
+ if hasattr(d, "item_code") and hasattr(d, "rate") and d.rate < 0:
+ frappe.throw(_("For an item {0}, rate must be a positive number").format(d.item_code))
+
if d.doctype == args["source_dt"] and d.get(args["join_field"]):
args["name"] = d.get(args["join_field"])