From c375ac39392110e3e59c3c1e8fb255e8ab6b7514 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 22 Aug 2025 15:11:26 +0530 Subject: [PATCH] Merge pull request #49272 from frappe/mergify/bp/version-15-hotfix/pr-49050 fix: ensure variant conversion factor is returned before the template's (backport #49050) --- erpnext/stock/get_item_details.py | 32 +++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index e31ba966653..c912c529b22 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -1277,17 +1277,33 @@ def get_pos_profile(company, pos_profile=None, user=None): @frappe.whitelist() def get_conversion_factor(item_code, uom): - variant_of = frappe.db.get_value("Item", item_code, "variant_of", cache=True) - filters = {"parent": item_code, "uom": uom} + item = frappe.get_cached_value("Item", item_code, ["variant_of", "stock_uom"], as_dict=True) + if not item_code or not item or uom == item.stock_uom: + return {"conversion_factor": 1.0} + + item_codes = [item_code] + if item.variant_of: + item_codes.append(item.variant_of) + + parent = frappe.qb.DocType("Item") + child = frappe.qb.DocType("UOM Conversion Detail") + query = ( + frappe.qb.from_(parent) + .join(child) + .on(parent.name == child.parent) + .select(child.conversion_factor) + .where((parent.name.isin(item_codes)) & (child.uom == uom)) + .orderby(parent.has_variants) + .limit(1) + ) + conversion_factor = query.run(pluck="conversion_factor") - if variant_of: - filters["parent"] = ("in", (item_code, variant_of)) - conversion_factor = frappe.get_all("UOM Conversion Detail", filters, pluck="conversion_factor") if not conversion_factor: - stock_uom = frappe.db.get_value("Item", item_code, "stock_uom") - conversion_factor = [get_uom_conv_factor(uom, stock_uom) or 1] + conversion_factor = get_uom_conv_factor(uom, item.stock_uom) + else: + conversion_factor = conversion_factor[0] - return {"conversion_factor": conversion_factor[-1]} + return {"conversion_factor": conversion_factor or 1.0} @frappe.whitelist()