perf: improve asset depr schedule creation patch (#35867)

diff --git a/erpnext/patches/v15_0/create_asset_depreciation_schedules_from_assets.py b/erpnext/patches/v15_0/create_asset_depreciation_schedules_from_assets.py
index 5c46bf3..a53adf1 100644
--- a/erpnext/patches/v15_0/create_asset_depreciation_schedules_from_assets.py
+++ b/erpnext/patches/v15_0/create_asset_depreciation_schedules_from_assets.py
@@ -6,10 +6,14 @@
 
 	assets = get_details_of_draft_or_submitted_depreciable_assets()
 
-	for asset in assets:
-		finance_book_rows = get_details_of_asset_finance_books_rows(asset.name)
+	asset_finance_books_map = get_asset_finance_books_map()
 
-		for fb_row in finance_book_rows:
+	asset_depreciation_schedules_map = get_asset_depreciation_schedules_map()
+
+	for asset in assets:
+		depreciation_schedules = asset_depreciation_schedules_map[asset.name]
+
+		for fb_row in asset_finance_books_map[asset.name]:
 			asset_depr_schedule_doc = frappe.new_doc("Asset Depreciation Schedule")
 
 			asset_depr_schedule_doc.set_draft_asset_depr_schedule_details(asset, fb_row)
@@ -19,7 +23,11 @@
 			if asset.docstatus == 1:
 				asset_depr_schedule_doc.submit()
 
-			update_depreciation_schedules(asset.name, asset_depr_schedule_doc.name, fb_row.idx)
+			depreciation_schedules_of_fb_row = [
+				ds for ds in depreciation_schedules if ds["finance_book_id"] == str(fb_row.idx)
+			]
+
+			update_depreciation_schedules(depreciation_schedules_of_fb_row, asset_depr_schedule_doc.name)
 
 
 def get_details_of_draft_or_submitted_depreciable_assets():
@@ -41,12 +49,33 @@
 	return records
 
 
-def get_details_of_asset_finance_books_rows(asset_name):
+def group_records_by_asset_name(records):
+	grouped_dict = {}
+
+	for item in records:
+		key = list(item.keys())[0]
+		value = item[key]
+
+		if value not in grouped_dict:
+			grouped_dict[value] = []
+
+		del item["asset_name"]
+
+		grouped_dict[value].append(item)
+
+	return grouped_dict
+
+
+def get_asset_finance_books_map():
 	afb = frappe.qb.DocType("Asset Finance Book")
+	asset = frappe.qb.DocType("Asset")
 
 	records = (
 		frappe.qb.from_(afb)
+		.join(asset)
+		.on(afb.parent == asset.name)
 		.select(
+			asset.name.as_("asset_name"),
 			afb.finance_book,
 			afb.idx,
 			afb.depreciation_method,
@@ -55,23 +84,44 @@
 			afb.rate_of_depreciation,
 			afb.expected_value_after_useful_life,
 		)
-		.where(afb.parent == asset_name)
+		.where(asset.docstatus < 2)
+		.orderby(afb.idx)
 	).run(as_dict=True)
 
-	return records
+	asset_finance_books_map = group_records_by_asset_name(records)
+
+	return asset_finance_books_map
 
 
-def update_depreciation_schedules(asset_name, asset_depr_schedule_name, fb_row_idx):
+def get_asset_depreciation_schedules_map():
 	ds = frappe.qb.DocType("Depreciation Schedule")
+	asset = frappe.qb.DocType("Asset")
 
-	depr_schedules = (
+	records = (
 		frappe.qb.from_(ds)
-		.select(ds.name)
-		.where((ds.parent == asset_name) & (ds.finance_book_id == str(fb_row_idx)))
+		.join(asset)
+		.on(ds.parent == asset.name)
+		.select(
+			asset.name.as_("asset_name"),
+			ds.name,
+			ds.finance_book_id,
+		)
+		.where(asset.docstatus < 2)
 		.orderby(ds.idx)
 	).run(as_dict=True)
 
-	for idx, depr_schedule in enumerate(depr_schedules, start=1):
+	asset_depreciation_schedules_map = group_records_by_asset_name(records)
+
+	return asset_depreciation_schedules_map
+
+
+def update_depreciation_schedules(
+	depreciation_schedules,
+	asset_depr_schedule_name,
+):
+	ds = frappe.qb.DocType("Depreciation Schedule")
+
+	for idx, depr_schedule in enumerate(depreciation_schedules, start=1):
 		(
 			frappe.qb.update(ds)
 			.set(ds.idx, idx)