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)