Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

perf: improve asset depr schedule creation patch #35867

Merged
merged 1 commit into from
Jun 26, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,14 @@ def execute():

assets = get_details_of_draft_or_submitted_depreciable_assets()

asset_finance_books_map = get_asset_finance_books_map()

asset_depreciation_schedules_map = get_asset_depreciation_schedules_map()

for asset in assets:
finance_book_rows = get_details_of_asset_finance_books_rows(asset.name)
depreciation_schedules = asset_depreciation_schedules_map[asset.name]

for fb_row in finance_book_rows:
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)
Expand All @@ -19,7 +23,11 @@ def execute():
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():
Expand All @@ -41,12 +49,33 @@ def get_details_of_draft_or_submitted_depreciable_assets():
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,
Expand All @@ -55,23 +84,44 @@ def get_details_of_asset_finance_books_rows(asset_name):
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)
Expand Down
Loading