fix: bom valuation - handle lack of LPP (#30454)

diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py
index 15fa67b..4d7e459 100644
--- a/erpnext/manufacturing/doctype/bom/bom.py
+++ b/erpnext/manufacturing/doctype/bom/bom.py
@@ -780,8 +780,8 @@
 	if bom_doc.rm_cost_as_per == 'Valuation Rate':
 		rate = get_valuation_rate(args) * (args.get("conversion_factor") or 1)
 	elif bom_doc.rm_cost_as_per == 'Last Purchase Rate':
-		rate = ( flt(args.get('last_purchase_rate')) \
-			or frappe.db.get_value("Item", args['item_code'], "last_purchase_rate")) \
+		rate = (flt(args.get('last_purchase_rate'))
+			or flt(frappe.db.get_value("Item", args['item_code'], "last_purchase_rate"))) \
 				* (args.get("conversion_factor") or 1)
 	elif bom_doc.rm_cost_as_per == "Price List":
 		if not bom_doc.buying_price_list:
@@ -805,7 +805,7 @@
 		price_list_data = get_price_list_rate(bom_args, item_doc)
 		rate = price_list_data.price_list_rate
 
-	return rate
+	return flt(rate)
 
 def get_valuation_rate(args):
 	""" Get weighted average of valuation rate from all warehouses """
diff --git a/erpnext/manufacturing/doctype/bom/test_bom.py b/erpnext/manufacturing/doctype/bom/test_bom.py
index 2f9b9de..21e0006 100644
--- a/erpnext/manufacturing/doctype/bom/test_bom.py
+++ b/erpnext/manufacturing/doctype/bom/test_bom.py
@@ -509,6 +509,27 @@
 
 		self.assertEqual(bom.quality_inspection_template, None)
 
+	def test_bom_pricing_based_on_lpp(self):
+		from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt
+
+		parent = frappe.generate_hash(length=10)
+		child = frappe.generate_hash(length=10)
+		bom_tree = {parent: {child: {}}
+		}
+		bom = create_nested_bom(bom_tree, prefix="")
+
+		# add last purchase price
+		make_purchase_receipt(item_code=child, rate=42)
+
+		bom = frappe.copy_doc(bom)
+		bom.docstatus = 0
+		bom.amended_from = None
+		bom.rm_cost_as_per = "Last Purchase Rate"
+		bom.conversion_rate = 1
+		bom.save()
+		bom.submit()
+		self.assertEqual(bom.items[0].rate, 42)
+
 
 def get_default_bom(item_code="_Test FG Item 2"):
 	return frappe.db.get_value("BOM", {"item": item_code, "is_active": 1, "is_default": 1})
@@ -558,6 +579,7 @@
 			bom = frappe.get_doc(doctype="BOM", item=bom_item_code)
 			for child_item in child_items.keys():
 				bom.append("items", {"item_code": prefix + child_item})
+			bom.company = "_Test Company"
 			bom.currency = "INR"
 			bom.insert()
 			bom.submit()