fix(stock): preserve item UOM conversion factor (backport #58299) (#58304)

Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
This commit is contained in:
mergify[bot]
2026-08-19 12:01:42 +00:00
committed by GitHub
parent a3a6efbcea
commit 53b61e5ac6
3 changed files with 27 additions and 5 deletions

View File

@@ -7,6 +7,12 @@ const SALES_DOCTYPES = ["Quotation", "Sales Order", "Delivery Note", "Sales Invo
const PURCHASE_DOCTYPES = ["Purchase Order", "Purchase Receipt", "Purchase Invoice"];
frappe.ui.form.on("Item", {
stock_uom(frm) {
// Each factor is relative to Stock UOM and becomes invalid when it changes.
frm.clear_table("uoms");
frm.refresh_field("uoms");
},
valuation_method(frm) {
if (!frm.is_new() && frm.doc.valuation_method === "Moving Average") {
let stock_exists = frm.doc.__onload && frm.doc.__onload.stock_exists ? 1 : 0;

View File

@@ -1023,6 +1023,9 @@ class Item(Document):
def validate_uom_conversion_factor(self):
if self.uoms:
for d in self.uoms:
if d.conversion_factor:
continue
value = get_uom_conv_factor(d.uom, self.stock_uom)
if value:
d.conversion_factor = value

View File

@@ -749,15 +749,25 @@ class TestItem(ERPNextTestSuite):
"Test Item UOM", {"stock_uom": "Gram", "uoms": [dict(uom="Carat"), dict(uom="Kg")]}
)
for d in item_doc.uoms:
value = get_uom_conv_factor(d.uom, item_doc.stock_uom)
d.conversion_factor = value
self.assertEqual(item_doc.uoms[0].uom, "Carat")
self.assertEqual(item_doc.uoms[0].conversion_factor, 0.2)
self.assertEqual(item_doc.uoms[1].uom, "Kg")
self.assertEqual(item_doc.uoms[1].conversion_factor, 1000)
def test_item_uom_conversion_factor_overrides_global_factor(self):
custom_factor = 10.76
global_factor = get_uom_conv_factor("Square Meter", "Square Foot")
self.assertNotEqual(custom_factor, global_factor)
item = make_item(
properties={"stock_uom": "Square Foot"},
uoms=[{"uom": "Square Meter", "conversion_factor": custom_factor}],
)
item.reload()
conversion_factor = next(row.conversion_factor for row in item.uoms if row.uom == "Square Meter")
self.assertEqual(conversion_factor, custom_factor)
def test_uom_conv_intermediate(self):
factor = get_uom_conv_factor("Pound", "Gram")
self.assertAlmostEqual(factor, 453.592, 3)
@@ -930,7 +940,10 @@ class TestItem(ERPNextTestSuite):
item.reload()
item.stock_uom = "Nos"
item.save()
self.assertEqual(len(item.uoms), 1)
self.assertEqual(
[(row.uom, row.conversion_factor) for row in item.uoms],
[("Nos", 1)],
)
def test_validate_stock_item(self):
self.assertRaises(frappe.ValidationError, validate_is_stock_item, "_Test Non Stock Item")