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

This commit is contained in:
Mihir Kandoi
2026-08-19 17:15:43 +05:30
committed by GitHub
parent f4ef7fdbcc
commit cfca71782e
3 changed files with 27 additions and 5 deletions

View File

@@ -27,6 +27,12 @@ const virtual_field_map = {
};
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

@@ -1030,6 +1030,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

@@ -784,15 +784,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)
@@ -974,7 +984,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")