From 206ed2892446d6505126768a786dc2d0d75cbc43 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Fri, 7 Aug 2026 17:47:50 +0530 Subject: [PATCH] fix: round computed conversion factors to field precision The inverse (1 / value) and intermediate-UOM branches of get_uom_conv_factor returned raw float quotients like 0.4535922921968971, bypassing the precision the docfields now declare. Same for the client-side back-calculation from an edited stock qty. Round both to the UOM Conversion Factor value precision. (cherry picked from commit ca5a6734096b3e106a41be3d23eecaba38384c51) --- erpnext/public/js/controllers/transaction.js | 5 ++++- erpnext/stock/doctype/item/item.py | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 8f62a139005..9d64ef09dd0 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -1771,7 +1771,10 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe let item = frappe.get_doc(cdt, cdn); item.conversion_factor = 1.0; if (item.stock_qty) { - item.conversion_factor = flt(item.stock_qty) / flt(item.qty); + item.conversion_factor = flt( + flt(item.stock_qty) / flt(item.qty), + precision("conversion_factor", item) + ); } refresh_field("conversion_factor", item.name, item.parentfield); diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py index 13842784f9a..b9f35a46770 100644 --- a/erpnext/stock/doctype/item/item.py +++ b/erpnext/stock/doctype/item/item.py @@ -1472,7 +1472,7 @@ def get_uom_conv_factor(uom, stock_uom): "UOM Conversion Factor", {"to_uom": from_uom, "from_uom": to_uom}, ["value"], as_dict=1 ) if inverse_match: - return 1 / inverse_match.value + return flt(1 / inverse_match.value, frappe.get_precision("UOM Conversion Factor", "value")) # This attempts to try and get conversion from intermediate UOM. # case: @@ -1495,7 +1495,7 @@ def get_uom_conv_factor(uom, stock_uom): ) if intermediate_match: - return intermediate_match[0].value + return flt(intermediate_match[0].value, frappe.get_precision("UOM Conversion Factor", "value")) @frappe.whitelist()