From abf94bc72de7d8b08ba212586b04328bc5117070 Mon Sep 17 00:00:00 2001 From: Vishnu Priya Baskaran <145791817+ervishnucs@users.noreply.github.com> Date: Mon, 24 Aug 2026 15:34:43 +0530 Subject: [PATCH] Fix/return qty validation different uom (#58298) Co-authored-by: Afsal Syed --- .../controllers/sales_and_purchase_return.py | 2 +- .../tests/test_sales_and_purchase_return.py | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/erpnext/controllers/sales_and_purchase_return.py b/erpnext/controllers/sales_and_purchase_return.py index abaa081d4fe..61148a11c6b 100644 --- a/erpnext/controllers/sales_and_purchase_return.py +++ b/erpnext/controllers/sales_and_purchase_return.py @@ -217,7 +217,7 @@ def validate_quantity(doc, key, args, ref, valid_items, already_returned_items): else 0 ) - if column == "stock_qty" and not args.get("return_qty_from_rejected_warehouse"): + if column in ("stock_qty", "qty") and not args.get("return_qty_from_rejected_warehouse"): reference_qty = ref.get(column) current_stock_qty = args.get(column) elif args.get("return_qty_from_rejected_warehouse"): diff --git a/erpnext/controllers/tests/test_sales_and_purchase_return.py b/erpnext/controllers/tests/test_sales_and_purchase_return.py index 1063b0d6f8d..55124e319ab 100644 --- a/erpnext/controllers/tests/test_sales_and_purchase_return.py +++ b/erpnext/controllers/tests/test_sales_and_purchase_return.py @@ -110,3 +110,35 @@ class TestSalesAndPurchaseReturn(ERPNextTestSuite): return_si.items[0].qty = 0 self.assertRaises(frappe.ValidationError, return_si.save) + + def test_sales_invoice_partial_return_with_different_stock_uom(self): + from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice + from erpnext.controllers.sales_and_purchase_return import make_return_doc + from erpnext.stock.doctype.item.test_item import make_item + + item_properties = {"is_stock_item": 1, "stock_uom": "Kg"} + if frappe.get_meta("Item").has_field("gst_hsn_code") and frappe.db.exists("GST HSN Code", "010121"): + item_properties["gst_hsn_code"] = "010121" + + item = make_item( + "_Test SI Return Different Stock UOM", + item_properties, + uoms=[{"uom": "Nos", "conversion_factor": 0.013888889}], + ) + + si = create_sales_invoice(item_code=item.name, qty=48, do_not_save=True) + si.items[0].uom = "Nos" + si.items[0].stock_uom = "Kg" + si.items[0].conversion_factor = 0.013888889 + si.save().submit() + self.addCleanup(self._cancel_and_delete, "Sales Invoice", si.name) + + first_return = make_return_doc(si.doctype, si.name) + first_return.items[0].qty = -24 + first_return.save().submit() + self.addCleanup(self._cancel_and_delete, "Sales Invoice", first_return.name) + + second_return = make_return_doc(si.doctype, si.name) + self.assertEqual(second_return.items[0].qty, -24) + second_return.save().submit() + self.addCleanup(self._cancel_and_delete, "Sales Invoice", second_return.name)