Skip to content

Commit

Permalink
feat: daily asset depreciation method (#36587)
Browse files Browse the repository at this point in the history
* feat: daily asset depreciation method

* chore: hide depr schedule if no schedules
  • Loading branch information
anandbaburajan authored Aug 10, 2023
1 parent 2800ad3 commit 2918127
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 14 deletions.
3 changes: 2 additions & 1 deletion erpnext/assets/doctype/asset/asset.json
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,7 @@
"label": "Depreciation Schedule"
},
{
"depends_on": "schedules",
"fieldname": "schedules",
"fieldtype": "Table",
"label": "Depreciation Schedule",
Expand Down Expand Up @@ -537,7 +538,7 @@
"table_fieldname": "accounts"
}
],
"modified": "2023-07-28 15:47:01.137996",
"modified": "2023-08-10 20:25:09.913073",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset",
Expand Down
52 changes: 40 additions & 12 deletions erpnext/assets/doctype/asset/asset.py
Original file line number Diff line number Diff line change
Expand Up @@ -1289,29 +1289,38 @@ def get_total_days(date, frequency):
return date_diff(date, period_start_date)


@erpnext.allow_regional
def get_depreciation_amount(
asset,
depreciable_value,
row,
fb_row,
schedule_idx=0,
prev_depreciation_amount=0,
has_wdv_or_dd_non_yearly_pro_rata=False,
):
if row.depreciation_method in ("Straight Line", "Manual"):
return get_straight_line_or_manual_depr_amount(asset, row)
frappe.flags.company = asset.company

if fb_row.depreciation_method in ("Straight Line", "Manual"):
return get_straight_line_or_manual_depr_amount(asset, fb_row, schedule_idx)
else:
rate_of_depreciation = get_updated_rate_of_depreciation_for_wdv_and_dd(
asset, depreciable_value, fb_row
)
return get_wdv_or_dd_depr_amount(
depreciable_value,
row.rate_of_depreciation,
row.frequency_of_depreciation,
rate_of_depreciation,
fb_row.frequency_of_depreciation,
schedule_idx,
prev_depreciation_amount,
has_wdv_or_dd_non_yearly_pro_rata,
)


def get_straight_line_or_manual_depr_amount(asset, row):
@erpnext.allow_regional
def get_updated_rate_of_depreciation_for_wdv_and_dd(asset, depreciable_value, fb_row):
return fb_row.rate_of_depreciation


def get_straight_line_or_manual_depr_amount(asset, row, schedule_idx):
# if the Depreciation Schedule is being modified after Asset Repair due to increase in asset life and value
if asset.flags.increase_in_asset_life:
return (flt(row.value_after_depreciation) - flt(row.expected_value_after_useful_life)) / (
Expand All @@ -1324,11 +1333,30 @@ def get_straight_line_or_manual_depr_amount(asset, row):
)
# if the Depreciation Schedule is being prepared for the first time
else:
return (
flt(asset.gross_purchase_amount)
- flt(asset.opening_accumulated_depreciation)
- flt(row.expected_value_after_useful_life)
) / flt(row.total_number_of_depreciations - asset.number_of_depreciations_booked)
if row.daily_depreciation:
daily_depr_amount = (
flt(asset.gross_purchase_amount)
- flt(asset.opening_accumulated_depreciation)
- flt(row.expected_value_after_useful_life)
) / date_diff(
add_months(
row.depreciation_start_date,
flt(row.total_number_of_depreciations - asset.number_of_depreciations_booked)
* row.frequency_of_depreciation,
),
row.depreciation_start_date,
)
to_date = add_months(row.depreciation_start_date, schedule_idx * row.frequency_of_depreciation)
from_date = add_months(
row.depreciation_start_date, (schedule_idx - 1) * row.frequency_of_depreciation
)
return daily_depr_amount * date_diff(to_date, from_date)
else:
return (
flt(asset.gross_purchase_amount)
- flt(asset.opening_accumulated_depreciation)
- flt(row.expected_value_after_useful_life)
) / flt(row.total_number_of_depreciations - asset.number_of_depreciations_booked)


def get_wdv_or_dd_depr_amount(
Expand Down
35 changes: 35 additions & 0 deletions erpnext/assets/doctype/asset/test_asset.py
Original file line number Diff line number Diff line change
Expand Up @@ -730,6 +730,40 @@ def test_schedule_for_straight_line_method_for_existing_asset(self):

self.assertEqual(schedules, expected_schedules)

def test_schedule_for_straight_line_method_with_daily_depreciation(self):
asset = create_asset(
calculate_depreciation=1,
available_for_use_date="2023-01-01",
purchase_date="2023-01-01",
gross_purchase_amount=12000,
depreciation_start_date="2023-01-31",
total_number_of_depreciations=12,
frequency_of_depreciation=1,
daily_depreciation=1,
)

expected_schedules = [
["2023-01-31", 1019.18, 1019.18],
["2023-02-28", 920.55, 1939.73],
["2023-03-31", 1019.18, 2958.91],
["2023-04-30", 986.3, 3945.21],
["2023-05-31", 1019.18, 4964.39],
["2023-06-30", 986.3, 5950.69],
["2023-07-31", 1019.18, 6969.87],
["2023-08-31", 1019.18, 7989.05],
["2023-09-30", 986.3, 8975.35],
["2023-10-31", 1019.18, 9994.53],
["2023-11-30", 986.3, 10980.83],
["2023-12-31", 1019.17, 12000.0],
]

schedules = [
[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
for d in asset.get("schedules")
]

self.assertEqual(schedules, expected_schedules)

def test_schedule_for_double_declining_method(self):
asset = create_asset(
calculate_depreciation=1,
Expand Down Expand Up @@ -1653,6 +1687,7 @@ def create_asset(**args):
"total_number_of_depreciations": args.total_number_of_depreciations or 5,
"expected_value_after_useful_life": args.expected_value_after_useful_life or 0,
"depreciation_start_date": args.depreciation_start_date,
"daily_depreciation": args.daily_depreciation or 0,
},
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
"finance_book",
"depreciation_method",
"total_number_of_depreciations",
"daily_depreciation",
"column_break_5",
"frequency_of_depreciation",
"depreciation_start_date",
Expand Down Expand Up @@ -79,12 +80,19 @@
"fieldname": "rate_of_depreciation",
"fieldtype": "Percent",
"label": "Rate of Depreciation"
},
{
"default": "0",
"depends_on": "eval:doc.depreciation_method == \"Straight Line\" || doc.depreciation_method == \"Manual\"",
"fieldname": "daily_depreciation",
"fieldtype": "Check",
"label": "Daily Depreciation"
}
],
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
"modified": "2021-06-17 12:59:05.743683",
"modified": "2023-08-10 18:56:09.022246",
"modified_by": "Administrator",
"module": "Assets",
"name": "Asset Finance Book",
Expand All @@ -93,5 +101,6 @@
"quick_entry": 1,
"sort_field": "modified",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

0 comments on commit 2918127

Please sign in to comment.