Merge pull request #45898 from nabinhait/asset-depr-schedule-patch

fix: patch for creating asset depreciation schedule records
This commit is contained in:
Khushi Rawat
2025-02-19 15:37:27 +05:30
committed by GitHub

View File

@@ -1,73 +1,29 @@
import frappe
from frappe.utils import cstr
def execute():
frappe.reload_doc("assets", "doctype", "Asset Depreciation Schedule")
frappe.reload_doc("assets", "doctype", "Asset Finance Book")
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:
if not asset_depreciation_schedules_map.get(asset.name):
for key, fb_row in asset_finance_books_map.items():
depreciation_schedules = asset_depreciation_schedules_map.get(key)
if not depreciation_schedules:
continue
depreciation_schedules = asset_depreciation_schedules_map[asset.name]
asset_depr_schedule_doc = frappe.new_doc("Asset Depreciation Schedule")
asset_depr_schedule_doc.set_draft_asset_depr_schedule_details(fb_row, fb_row)
asset_depr_schedule_doc.flags.ignore_validate = True
asset_depr_schedule_doc.insert()
for fb_row in asset_finance_books_map[asset.name]:
asset_depr_schedule_doc = frappe.new_doc("Asset Depreciation Schedule")
if fb_row.docstatus == 1:
frappe.db.set_value(
"Asset Depreciation Schedule",
asset_depr_schedule_doc.name,
{"docstatus": 1, "status": "Active"},
)
asset_depr_schedule_doc.set_draft_asset_depr_schedule_details(asset, fb_row)
asset_depr_schedule_doc.insert()
if asset.docstatus == 1:
asset_depr_schedule_doc.submit()
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():
asset = frappe.qb.DocType("Asset")
records = (
frappe.qb.from_(asset)
.select(
asset.name,
asset.opening_accumulated_depreciation,
asset.gross_purchase_amount,
asset.opening_number_of_booked_depreciations,
asset.docstatus,
)
.where(asset.calculate_depreciation == 1)
.where(asset.docstatus < 2)
).run(as_dict=True)
return records
def group_records_by_asset_name(records):
grouped_dict = {}
for item in records:
key = next(iter(item.keys()))
value = item[key]
if value not in grouped_dict:
grouped_dict[value] = []
del item["asset_name"]
grouped_dict[value].append(item)
return grouped_dict
update_depreciation_schedules(depreciation_schedules, asset_depr_schedule_doc.name)
def get_asset_finance_books_map():
@@ -89,12 +45,20 @@ def get_asset_finance_books_map():
afb.expected_value_after_useful_life,
afb.daily_prorata_based,
afb.shift_based,
asset.docstatus,
asset.name,
asset.opening_accumulated_depreciation,
asset.gross_purchase_amount,
asset.opening_number_of_booked_depreciations,
)
.where(asset.docstatus < 2)
.where(asset.calculate_depreciation == 1)
.orderby(afb.idx)
).run(as_dict=True)
asset_finance_books_map = group_records_by_asset_name(records)
asset_finance_books_map = frappe._dict()
for d in records:
asset_finance_books_map.setdefault((d.asset_name, cstr(d.finance_book)), d)
return asset_finance_books_map
@@ -110,13 +74,17 @@ def get_asset_depreciation_schedules_map():
.select(
asset.name.as_("asset_name"),
ds.name,
ds.finance_book,
ds.finance_book_id,
)
.where(asset.docstatus < 2)
.where(asset.calculate_depreciation == 1)
.orderby(ds.idx)
).run(as_dict=True)
asset_depreciation_schedules_map = group_records_by_asset_name(records)
asset_depreciation_schedules_map = frappe._dict()
for d in records:
asset_depreciation_schedules_map.setdefault((d.asset_name, cstr(d.finance_book)), []).append(d)
return asset_depreciation_schedules_map