mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-31 10:49:09 +00:00
refactor: Straight line depreciation after asset repair
This commit is contained in:
@@ -175,12 +175,6 @@ class AssetDepreciationSchedule(Document):
|
|||||||
update_asset_finance_book_row=True,
|
update_asset_finance_book_row=True,
|
||||||
value_after_depreciation=None,
|
value_after_depreciation=None,
|
||||||
):
|
):
|
||||||
# if not self.get("depreciation_schedule"):
|
|
||||||
# self.depreciation_schedule = []
|
|
||||||
|
|
||||||
# if not asset_doc.available_for_use_date:
|
|
||||||
# return
|
|
||||||
|
|
||||||
start = self.clear_depr_schedule()
|
start = self.clear_depr_schedule()
|
||||||
|
|
||||||
self._make_depr_schedule(
|
self._make_depr_schedule(
|
||||||
@@ -230,7 +224,7 @@ class AssetDepreciationSchedule(Document):
|
|||||||
prev_per_day_depr = True
|
prev_per_day_depr = True
|
||||||
self.current_fiscal_year_end_date = None
|
self.current_fiscal_year_end_date = None
|
||||||
yearly_opening_wdv = value_after_depreciation
|
yearly_opening_wdv = value_after_depreciation
|
||||||
number_of_pending_depreciations = final_number_of_depreciations - start
|
pending_months = self.get_number_of_pending_months(asset_doc, row, start)
|
||||||
|
|
||||||
for n in range(start, final_number_of_depreciations):
|
for n in range(start, final_number_of_depreciations):
|
||||||
# If depreciation is already completed (for double declining balance)
|
# If depreciation is already completed (for double declining balance)
|
||||||
@@ -251,7 +245,7 @@ class AssetDepreciationSchedule(Document):
|
|||||||
n,
|
n,
|
||||||
prev_depreciation_amount,
|
prev_depreciation_amount,
|
||||||
has_wdv_or_dd_non_yearly_pro_rata,
|
has_wdv_or_dd_non_yearly_pro_rata,
|
||||||
number_of_pending_depreciations,
|
pending_months,
|
||||||
prev_per_day_depr,
|
prev_per_day_depr,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -314,8 +308,38 @@ class AssetDepreciationSchedule(Document):
|
|||||||
if has_pro_rata:
|
if has_pro_rata:
|
||||||
final_number_of_depreciations += 1
|
final_number_of_depreciations += 1
|
||||||
|
|
||||||
|
if row.increase_in_asset_life:
|
||||||
|
final_number_of_depreciations = (
|
||||||
|
self.get_final_number_of_depreciations_considering_increase_in_asset_life(
|
||||||
|
asset_doc, row, final_number_of_depreciations
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
return final_number_of_depreciations, has_pro_rata
|
return final_number_of_depreciations, has_pro_rata
|
||||||
|
|
||||||
|
def get_final_number_of_depreciations_considering_increase_in_asset_life(
|
||||||
|
self, asset_doc, row, final_number_of_depreciations
|
||||||
|
):
|
||||||
|
# final schedule date after increasing asset life
|
||||||
|
self.final_schedule_date = add_months(
|
||||||
|
asset_doc.available_for_use_date,
|
||||||
|
(row.total_number_of_depreciations * cint(row.frequency_of_depreciation))
|
||||||
|
+ row.increase_in_asset_life,
|
||||||
|
)
|
||||||
|
|
||||||
|
number_of_pending_depreciations = cint(row.total_number_of_depreciations) - cint(
|
||||||
|
asset_doc.opening_number_of_booked_depreciations
|
||||||
|
)
|
||||||
|
schedule_date = add_months(
|
||||||
|
row.depreciation_start_date,
|
||||||
|
number_of_pending_depreciations * cint(row.frequency_of_depreciation),
|
||||||
|
)
|
||||||
|
|
||||||
|
if self.final_schedule_date > schedule_date:
|
||||||
|
final_number_of_depreciations += 1
|
||||||
|
|
||||||
|
return final_number_of_depreciations
|
||||||
|
|
||||||
def is_wdv_or_dd_non_yearly_pro_rata(self, asset_doc, row):
|
def is_wdv_or_dd_non_yearly_pro_rata(self, asset_doc, row):
|
||||||
has_wdv_or_dd_non_yearly_pro_rata = False
|
has_wdv_or_dd_non_yearly_pro_rata = False
|
||||||
if (
|
if (
|
||||||
@@ -326,6 +350,22 @@ class AssetDepreciationSchedule(Document):
|
|||||||
|
|
||||||
return has_wdv_or_dd_non_yearly_pro_rata
|
return has_wdv_or_dd_non_yearly_pro_rata
|
||||||
|
|
||||||
|
def get_number_of_pending_months(self, asset_doc, row, start):
|
||||||
|
print(row.total_number_of_depreciations)
|
||||||
|
total_months = cint(row.total_number_of_depreciations) * cint(row.frequency_of_depreciation) + cint(
|
||||||
|
row.increase_in_asset_life
|
||||||
|
)
|
||||||
|
depr_booked_for_months = 0
|
||||||
|
if start > 0:
|
||||||
|
last_depr_date = self.depreciation_schedule[start - 1].schedule_date
|
||||||
|
elif asset_doc.opening_number_of_booked_depreciations > 0:
|
||||||
|
last_depr_date = add_months(row.depreciation_start_date, -1 * row.frequency_of_depreciation)
|
||||||
|
|
||||||
|
if last_depr_date:
|
||||||
|
depr_booked_for_months = date_diff(last_depr_date, asset_doc.available_for_use_date) / (365 / 12)
|
||||||
|
print(total_months, depr_booked_for_months)
|
||||||
|
return total_months - depr_booked_for_months
|
||||||
|
|
||||||
def has_fiscal_year_changed(self, row, row_no):
|
def has_fiscal_year_changed(self, row, row_no):
|
||||||
fiscal_year_changed = False
|
fiscal_year_changed = False
|
||||||
|
|
||||||
@@ -352,13 +392,9 @@ class AssetDepreciationSchedule(Document):
|
|||||||
def get_next_schedule_date(
|
def get_next_schedule_date(
|
||||||
self, row, n, has_pro_rata, should_get_last_day, final_number_of_depreciations=None
|
self, row, n, has_pro_rata, should_get_last_day, final_number_of_depreciations=None
|
||||||
):
|
):
|
||||||
if not has_pro_rata or (
|
schedule_date = add_months(row.depreciation_start_date, n * cint(row.frequency_of_depreciation))
|
||||||
n < (cint(final_number_of_depreciations) - 1) or final_number_of_depreciations == 2
|
if should_get_last_day:
|
||||||
):
|
schedule_date = get_last_day(schedule_date)
|
||||||
schedule_date = add_months(row.depreciation_start_date, n * cint(row.frequency_of_depreciation))
|
|
||||||
|
|
||||||
if should_get_last_day:
|
|
||||||
schedule_date = get_last_day(schedule_date)
|
|
||||||
|
|
||||||
return schedule_date
|
return schedule_date
|
||||||
|
|
||||||
@@ -435,27 +471,28 @@ class AssetDepreciationSchedule(Document):
|
|||||||
def get_depreciation_amount_for_last_row(
|
def get_depreciation_amount_for_last_row(
|
||||||
self, asset_doc, row, n, depreciation_amount, schedule_date, has_wdv_or_dd_non_yearly_pro_rata
|
self, asset_doc, row, n, depreciation_amount, schedule_date, has_wdv_or_dd_non_yearly_pro_rata
|
||||||
):
|
):
|
||||||
if not asset_doc.flags.increase_in_asset_life:
|
if not row.increase_in_asset_life:
|
||||||
# In case of increase_in_asset_life, the asset.to_date is already set on asset_repair submission
|
# In case of increase_in_asset_life, the asset.to_date is already set on asset_repair submission
|
||||||
asset_doc.to_date = add_months(
|
self.final_schedule_date = add_months(
|
||||||
asset_doc.available_for_use_date,
|
asset_doc.available_for_use_date,
|
||||||
(n + self.opening_number_of_booked_depreciations) * cint(row.frequency_of_depreciation),
|
(n + self.opening_number_of_booked_depreciations) * cint(row.frequency_of_depreciation),
|
||||||
)
|
)
|
||||||
if is_last_day_of_the_month(getdate(asset_doc.available_for_use_date)):
|
if is_last_day_of_the_month(getdate(asset_doc.available_for_use_date)):
|
||||||
asset_doc.to_date = get_last_day(asset_doc.to_date)
|
self.final_schedule_date = get_last_day(self.final_schedule_date)
|
||||||
|
|
||||||
if self.opening_accumulated_depreciation:
|
if self.opening_accumulated_depreciation:
|
||||||
depreciation_amount, days, months = _get_pro_rata_amt(
|
depreciation_amount, days, months = _get_pro_rata_amt(
|
||||||
row,
|
row,
|
||||||
depreciation_amount,
|
depreciation_amount,
|
||||||
schedule_date,
|
schedule_date,
|
||||||
asset_doc.to_date,
|
self.final_schedule_date,
|
||||||
has_wdv_or_dd_non_yearly_pro_rata,
|
has_wdv_or_dd_non_yearly_pro_rata,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
# if not existing asset, remaining amount of first row is depreciated in the last row
|
# if not existing asset, remaining amount of first row is depreciated in the last row
|
||||||
depreciation_amount -= self.get("depreciation_schedule")[0].depreciation_amount
|
if not row.increase_in_asset_life:
|
||||||
days = date_diff(asset_doc.to_date, schedule_date) + 1
|
depreciation_amount -= self.get("depreciation_schedule")[0].depreciation_amount
|
||||||
|
days = date_diff(self.final_schedule_date, schedule_date) + 1
|
||||||
|
|
||||||
schedule_date = add_days(schedule_date, days - 1)
|
schedule_date = add_days(schedule_date, days - 1)
|
||||||
return depreciation_amount, schedule_date
|
return depreciation_amount, schedule_date
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ from frappe.utils import (
|
|||||||
add_months,
|
add_months,
|
||||||
add_years,
|
add_years,
|
||||||
cint,
|
cint,
|
||||||
|
cstr,
|
||||||
date_diff,
|
date_diff,
|
||||||
flt,
|
flt,
|
||||||
get_last_day,
|
get_last_day,
|
||||||
@@ -16,7 +17,7 @@ import erpnext
|
|||||||
def get_depreciation_amount(
|
def get_depreciation_amount(
|
||||||
asset_depr_schedule,
|
asset_depr_schedule,
|
||||||
asset,
|
asset,
|
||||||
depreciable_value,
|
value_after_depreciation,
|
||||||
yearly_opening_wdv,
|
yearly_opening_wdv,
|
||||||
fb_row,
|
fb_row,
|
||||||
schedule_idx=0,
|
schedule_idx=0,
|
||||||
@@ -27,13 +28,18 @@ def get_depreciation_amount(
|
|||||||
):
|
):
|
||||||
if fb_row.depreciation_method in ("Straight Line", "Manual"):
|
if fb_row.depreciation_method in ("Straight Line", "Manual"):
|
||||||
return get_straight_line_or_manual_depr_amount(
|
return get_straight_line_or_manual_depr_amount(
|
||||||
asset_depr_schedule, asset, fb_row, schedule_idx, number_of_pending_depreciations
|
asset_depr_schedule,
|
||||||
|
asset,
|
||||||
|
fb_row,
|
||||||
|
schedule_idx,
|
||||||
|
value_after_depreciation,
|
||||||
|
number_of_pending_depreciations,
|
||||||
), None
|
), None
|
||||||
else:
|
else:
|
||||||
return get_wdv_or_dd_depr_amount(
|
return get_wdv_or_dd_depr_amount(
|
||||||
asset,
|
asset,
|
||||||
fb_row,
|
fb_row,
|
||||||
depreciable_value,
|
value_after_depreciation,
|
||||||
yearly_opening_wdv,
|
yearly_opening_wdv,
|
||||||
schedule_idx,
|
schedule_idx,
|
||||||
prev_depreciation_amount,
|
prev_depreciation_amount,
|
||||||
@@ -44,83 +50,59 @@ def get_depreciation_amount(
|
|||||||
|
|
||||||
|
|
||||||
def get_straight_line_or_manual_depr_amount(
|
def get_straight_line_or_manual_depr_amount(
|
||||||
asset_depr_schedule, asset, row, schedule_idx, number_of_pending_depreciations
|
asset_depr_schedule,
|
||||||
|
asset,
|
||||||
|
fb_row,
|
||||||
|
schedule_idx,
|
||||||
|
value_after_depreciation,
|
||||||
|
number_of_pending_depreciations,
|
||||||
):
|
):
|
||||||
if row.shift_based:
|
if fb_row.shift_based:
|
||||||
return get_shift_depr_amount(asset_depr_schedule, asset, row, schedule_idx)
|
return get_shift_depr_amount(asset_depr_schedule, asset, fb_row, schedule_idx)
|
||||||
|
|
||||||
# if the Depreciation Schedule is being modified after Asset Repair due to increase in asset life and value
|
if fb_row.daily_prorata_based:
|
||||||
if asset.flags.increase_in_asset_life:
|
amount = flt(asset.gross_purchase_amount) - flt(fb_row.expected_value_after_useful_life)
|
||||||
return (flt(row.value_after_depreciation) - flt(row.expected_value_after_useful_life)) / (
|
return get_daily_prorata_based_straight_line_depr(
|
||||||
date_diff(asset.to_date, asset.available_for_use_date) / 365
|
asset, fb_row, schedule_idx, number_of_pending_depreciations, amount
|
||||||
)
|
)
|
||||||
# if the Depreciation Schedule is being modified after Asset Repair due to increase in asset value
|
|
||||||
elif asset.flags.increase_in_asset_value_due_to_repair:
|
|
||||||
return (flt(row.value_after_depreciation) - flt(row.expected_value_after_useful_life)) / flt(
|
|
||||||
number_of_pending_depreciations
|
|
||||||
)
|
|
||||||
# if the Depreciation Schedule is being modified after Asset Value Adjustment due to decrease in asset value
|
|
||||||
elif asset.flags.decrease_in_asset_value_due_to_value_adjustment:
|
|
||||||
if row.daily_prorata_based:
|
|
||||||
amount = flt(row.value_after_depreciation) - flt(row.expected_value_after_useful_life)
|
|
||||||
|
|
||||||
return get_daily_prorata_based_straight_line_depr(
|
|
||||||
asset,
|
|
||||||
row,
|
|
||||||
schedule_idx,
|
|
||||||
number_of_pending_depreciations,
|
|
||||||
amount,
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
return (
|
|
||||||
flt(row.value_after_depreciation) - flt(row.expected_value_after_useful_life)
|
|
||||||
) / number_of_pending_depreciations
|
|
||||||
# if the Depreciation Schedule is being prepared for the first time
|
|
||||||
else:
|
else:
|
||||||
if row.daily_prorata_based:
|
return (flt(fb_row.value_after_depreciation) - flt(fb_row.expected_value_after_useful_life)) / (
|
||||||
amount = flt(asset.gross_purchase_amount) - flt(row.expected_value_after_useful_life)
|
flt(number_of_pending_depreciations) / flt(fb_row.frequency_of_depreciation)
|
||||||
return get_daily_prorata_based_straight_line_depr(
|
)
|
||||||
asset, row, schedule_idx, number_of_pending_depreciations, amount
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
depreciation_amount = (
|
|
||||||
flt(asset.gross_purchase_amount) - flt(row.expected_value_after_useful_life)
|
|
||||||
) / flt(row.total_number_of_depreciations)
|
|
||||||
return depreciation_amount
|
|
||||||
|
|
||||||
|
|
||||||
def get_daily_prorata_based_straight_line_depr(
|
def get_daily_prorata_based_straight_line_depr(
|
||||||
asset, row, schedule_idx, number_of_pending_depreciations, amount
|
asset, fb_row, schedule_idx, number_of_pending_depreciations, amount
|
||||||
):
|
):
|
||||||
daily_depr_amount = get_daily_depr_amount(asset, row, schedule_idx, amount)
|
daily_depr_amount = get_daily_depr_amount(asset, fb_row, schedule_idx, amount)
|
||||||
|
|
||||||
from_date, total_depreciable_days = _get_total_days(
|
from_date, total_depreciable_days = _get_total_days(
|
||||||
row.depreciation_start_date, schedule_idx, row.frequency_of_depreciation
|
fb_row.depreciation_start_date, schedule_idx, fb_row.frequency_of_depreciation
|
||||||
)
|
)
|
||||||
return daily_depr_amount * total_depreciable_days
|
return daily_depr_amount * total_depreciable_days
|
||||||
|
|
||||||
|
|
||||||
def get_daily_depr_amount(asset, row, schedule_idx, amount):
|
def get_daily_depr_amount(asset, fb_row, schedule_idx, amount):
|
||||||
if cint(frappe.db.get_single_value("Accounts Settings", "calculate_depr_using_total_days")):
|
if cint(frappe.db.get_single_value("Accounts Settings", "calculate_depr_using_total_days")):
|
||||||
total_days = (
|
total_days = (
|
||||||
date_diff(
|
date_diff(
|
||||||
get_last_day(
|
get_last_day(
|
||||||
add_months(
|
add_months(
|
||||||
row.depreciation_start_date,
|
fb_row.depreciation_start_date,
|
||||||
flt(
|
flt(
|
||||||
row.total_number_of_depreciations
|
fb_row.total_number_of_depreciations
|
||||||
- asset.opening_number_of_booked_depreciations
|
- asset.opening_number_of_booked_depreciations
|
||||||
- 1
|
- 1
|
||||||
)
|
)
|
||||||
* row.frequency_of_depreciation,
|
* fb_row.frequency_of_depreciation,
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
add_days(
|
add_days(
|
||||||
get_last_day(
|
get_last_day(
|
||||||
add_months(
|
add_months(
|
||||||
row.depreciation_start_date,
|
fb_row.depreciation_start_date,
|
||||||
(
|
(
|
||||||
row.frequency_of_depreciation
|
fb_row.frequency_of_depreciation
|
||||||
* (asset.opening_number_of_booked_depreciations + 1)
|
* (asset.opening_number_of_booked_depreciations + 1)
|
||||||
)
|
)
|
||||||
* -1,
|
* -1,
|
||||||
@@ -136,8 +118,8 @@ def get_daily_depr_amount(asset, row, schedule_idx, amount):
|
|||||||
else:
|
else:
|
||||||
total_years = (
|
total_years = (
|
||||||
flt(
|
flt(
|
||||||
(row.total_number_of_depreciations - row.total_number_of_booked_depreciations)
|
(fb_row.total_number_of_depreciations - fb_row.total_number_of_booked_depreciations)
|
||||||
* row.frequency_of_depreciation
|
* fb_row.frequency_of_depreciation
|
||||||
)
|
)
|
||||||
/ 12
|
/ 12
|
||||||
)
|
)
|
||||||
@@ -145,24 +127,24 @@ def get_daily_depr_amount(asset, row, schedule_idx, amount):
|
|||||||
every_year_depr = amount / total_years
|
every_year_depr = amount / total_years
|
||||||
|
|
||||||
depr_period_start_date = add_days(
|
depr_period_start_date = add_days(
|
||||||
get_last_day(add_months(row.depreciation_start_date, row.frequency_of_depreciation * -1)), 1
|
get_last_day(add_months(fb_row.depreciation_start_date, fb_row.frequency_of_depreciation * -1)), 1
|
||||||
)
|
)
|
||||||
|
|
||||||
year_start_date = add_years(
|
year_start_date = add_years(
|
||||||
depr_period_start_date, ((row.frequency_of_depreciation * schedule_idx) // 12)
|
depr_period_start_date, ((fb_row.frequency_of_depreciation * schedule_idx) // 12)
|
||||||
)
|
)
|
||||||
year_end_date = add_days(add_years(year_start_date, 1), -1)
|
year_end_date = add_days(add_years(year_start_date, 1), -1)
|
||||||
|
|
||||||
return every_year_depr / (date_diff(year_end_date, year_start_date) + 1)
|
return every_year_depr / (date_diff(year_end_date, year_start_date) + 1)
|
||||||
|
|
||||||
|
|
||||||
def get_shift_depr_amount(asset_depr_schedule, asset, row, schedule_idx):
|
def get_shift_depr_amount(asset_depr_schedule, asset, fb_row, schedule_idx):
|
||||||
if asset_depr_schedule.get("__islocal") and not asset.flags.shift_allocation:
|
if asset_depr_schedule.get("__islocal") and not asset.flags.shift_allocation:
|
||||||
return (
|
return (
|
||||||
flt(asset.gross_purchase_amount)
|
flt(asset.gross_purchase_amount)
|
||||||
- flt(asset.opening_accumulated_depreciation)
|
- flt(asset.opening_accumulated_depreciation)
|
||||||
- flt(row.expected_value_after_useful_life)
|
- flt(fb_row.expected_value_after_useful_life)
|
||||||
) / flt(row.total_number_of_depreciations - asset.opening_number_of_booked_depreciations)
|
) / flt(fb_row.total_number_of_depreciations - asset.opening_number_of_booked_depreciations)
|
||||||
|
|
||||||
asset_shift_factors_map = get_asset_shift_factors_map()
|
asset_shift_factors_map = get_asset_shift_factors_map()
|
||||||
shift = (
|
shift = (
|
||||||
@@ -181,7 +163,7 @@ def get_shift_depr_amount(asset_depr_schedule, asset, row, schedule_idx):
|
|||||||
(
|
(
|
||||||
flt(asset.gross_purchase_amount)
|
flt(asset.gross_purchase_amount)
|
||||||
- flt(asset.opening_accumulated_depreciation)
|
- flt(asset.opening_accumulated_depreciation)
|
||||||
- flt(row.expected_value_after_useful_life)
|
- flt(fb_row.expected_value_after_useful_life)
|
||||||
)
|
)
|
||||||
/ flt(shift_factors_sum)
|
/ flt(shift_factors_sum)
|
||||||
) * shift_factor
|
) * shift_factor
|
||||||
@@ -195,7 +177,7 @@ def get_asset_shift_factors_map():
|
|||||||
def get_wdv_or_dd_depr_amount(
|
def get_wdv_or_dd_depr_amount(
|
||||||
asset,
|
asset,
|
||||||
fb_row,
|
fb_row,
|
||||||
depreciable_value,
|
value_after_depreciation,
|
||||||
yearly_opening_wdv,
|
yearly_opening_wdv,
|
||||||
schedule_idx,
|
schedule_idx,
|
||||||
prev_depreciation_amount,
|
prev_depreciation_amount,
|
||||||
@@ -206,7 +188,7 @@ def get_wdv_or_dd_depr_amount(
|
|||||||
return get_default_wdv_or_dd_depr_amount(
|
return get_default_wdv_or_dd_depr_amount(
|
||||||
asset,
|
asset,
|
||||||
fb_row,
|
fb_row,
|
||||||
depreciable_value,
|
value_after_depreciation,
|
||||||
schedule_idx,
|
schedule_idx,
|
||||||
prev_depreciation_amount,
|
prev_depreciation_amount,
|
||||||
has_wdv_or_dd_non_yearly_pro_rata,
|
has_wdv_or_dd_non_yearly_pro_rata,
|
||||||
@@ -218,7 +200,7 @@ def get_wdv_or_dd_depr_amount(
|
|||||||
def get_default_wdv_or_dd_depr_amount(
|
def get_default_wdv_or_dd_depr_amount(
|
||||||
asset,
|
asset,
|
||||||
fb_row,
|
fb_row,
|
||||||
depreciable_value,
|
value_after_depreciation,
|
||||||
schedule_idx,
|
schedule_idx,
|
||||||
prev_depreciation_amount,
|
prev_depreciation_amount,
|
||||||
has_wdv_or_dd_non_yearly_pro_rata,
|
has_wdv_or_dd_non_yearly_pro_rata,
|
||||||
@@ -229,7 +211,7 @@ def get_default_wdv_or_dd_depr_amount(
|
|||||||
return _get_default_wdv_or_dd_depr_amount(
|
return _get_default_wdv_or_dd_depr_amount(
|
||||||
asset,
|
asset,
|
||||||
fb_row,
|
fb_row,
|
||||||
depreciable_value,
|
value_after_depreciation,
|
||||||
schedule_idx,
|
schedule_idx,
|
||||||
prev_depreciation_amount,
|
prev_depreciation_amount,
|
||||||
has_wdv_or_dd_non_yearly_pro_rata,
|
has_wdv_or_dd_non_yearly_pro_rata,
|
||||||
@@ -239,7 +221,7 @@ def get_default_wdv_or_dd_depr_amount(
|
|||||||
return _get_daily_prorata_based_default_wdv_or_dd_depr_amount(
|
return _get_daily_prorata_based_default_wdv_or_dd_depr_amount(
|
||||||
asset,
|
asset,
|
||||||
fb_row,
|
fb_row,
|
||||||
depreciable_value,
|
value_after_depreciation,
|
||||||
schedule_idx,
|
schedule_idx,
|
||||||
prev_depreciation_amount,
|
prev_depreciation_amount,
|
||||||
has_wdv_or_dd_non_yearly_pro_rata,
|
has_wdv_or_dd_non_yearly_pro_rata,
|
||||||
@@ -251,21 +233,21 @@ def get_default_wdv_or_dd_depr_amount(
|
|||||||
def _get_default_wdv_or_dd_depr_amount(
|
def _get_default_wdv_or_dd_depr_amount(
|
||||||
asset,
|
asset,
|
||||||
fb_row,
|
fb_row,
|
||||||
depreciable_value,
|
value_after_depreciation,
|
||||||
schedule_idx,
|
schedule_idx,
|
||||||
prev_depreciation_amount,
|
prev_depreciation_amount,
|
||||||
has_wdv_or_dd_non_yearly_pro_rata,
|
has_wdv_or_dd_non_yearly_pro_rata,
|
||||||
asset_depr_schedule,
|
asset_depr_schedule,
|
||||||
):
|
):
|
||||||
if cint(fb_row.frequency_of_depreciation) == 12:
|
if cint(fb_row.frequency_of_depreciation) == 12:
|
||||||
return flt(depreciable_value) * (flt(fb_row.rate_of_depreciation) / 100)
|
return flt(value_after_depreciation) * (flt(fb_row.rate_of_depreciation) / 100)
|
||||||
else:
|
else:
|
||||||
if has_wdv_or_dd_non_yearly_pro_rata:
|
if has_wdv_or_dd_non_yearly_pro_rata:
|
||||||
if schedule_idx == 0:
|
if schedule_idx == 0:
|
||||||
return flt(depreciable_value) * (flt(fb_row.rate_of_depreciation) / 100)
|
return flt(value_after_depreciation) * (flt(fb_row.rate_of_depreciation) / 100)
|
||||||
elif schedule_idx % (12 / cint(fb_row.frequency_of_depreciation)) == 1:
|
elif schedule_idx % (12 / cint(fb_row.frequency_of_depreciation)) == 1:
|
||||||
return (
|
return (
|
||||||
flt(depreciable_value)
|
flt(value_after_depreciation)
|
||||||
* flt(fb_row.frequency_of_depreciation)
|
* flt(fb_row.frequency_of_depreciation)
|
||||||
* (flt(fb_row.rate_of_depreciation) / 1200)
|
* (flt(fb_row.rate_of_depreciation) / 1200)
|
||||||
)
|
)
|
||||||
@@ -274,7 +256,7 @@ def _get_default_wdv_or_dd_depr_amount(
|
|||||||
else:
|
else:
|
||||||
if schedule_idx % (12 / cint(fb_row.frequency_of_depreciation)) == 0:
|
if schedule_idx % (12 / cint(fb_row.frequency_of_depreciation)) == 0:
|
||||||
return (
|
return (
|
||||||
flt(depreciable_value)
|
flt(value_after_depreciation)
|
||||||
* flt(fb_row.frequency_of_depreciation)
|
* flt(fb_row.frequency_of_depreciation)
|
||||||
* (flt(fb_row.rate_of_depreciation) / 1200)
|
* (flt(fb_row.rate_of_depreciation) / 1200)
|
||||||
)
|
)
|
||||||
@@ -285,7 +267,7 @@ def _get_default_wdv_or_dd_depr_amount(
|
|||||||
def _get_daily_prorata_based_default_wdv_or_dd_depr_amount(
|
def _get_daily_prorata_based_default_wdv_or_dd_depr_amount(
|
||||||
asset,
|
asset,
|
||||||
fb_row,
|
fb_row,
|
||||||
depreciable_value,
|
value_after_depreciation,
|
||||||
schedule_idx,
|
schedule_idx,
|
||||||
prev_depreciation_amount,
|
prev_depreciation_amount,
|
||||||
has_wdv_or_dd_non_yearly_pro_rata,
|
has_wdv_or_dd_non_yearly_pro_rata,
|
||||||
@@ -294,20 +276,20 @@ def _get_daily_prorata_based_default_wdv_or_dd_depr_amount(
|
|||||||
):
|
):
|
||||||
if has_wdv_or_dd_non_yearly_pro_rata: # If applicable days for ther first month is less than full month
|
if has_wdv_or_dd_non_yearly_pro_rata: # If applicable days for ther first month is less than full month
|
||||||
if schedule_idx == 0:
|
if schedule_idx == 0:
|
||||||
return flt(depreciable_value) * (flt(fb_row.rate_of_depreciation) / 100), None
|
return flt(value_after_depreciation) * (flt(fb_row.rate_of_depreciation) / 100), None
|
||||||
|
|
||||||
elif schedule_idx % (12 / cint(fb_row.frequency_of_depreciation)) == 1: # Year changes
|
elif schedule_idx % (12 / cint(fb_row.frequency_of_depreciation)) == 1: # Year changes
|
||||||
return get_monthly_depr_amount(fb_row, schedule_idx, depreciable_value)
|
return get_monthly_depr_amount(fb_row, schedule_idx, value_after_depreciation)
|
||||||
else:
|
else:
|
||||||
return get_monthly_depr_amount_based_on_prev_per_day_depr(fb_row, schedule_idx, prev_per_day_depr)
|
return get_monthly_depr_amount_based_on_prev_per_day_depr(fb_row, schedule_idx, prev_per_day_depr)
|
||||||
else:
|
else:
|
||||||
if schedule_idx % (12 / cint(fb_row.frequency_of_depreciation)) == 0: # year changes
|
if schedule_idx % (12 / cint(fb_row.frequency_of_depreciation)) == 0: # year changes
|
||||||
return get_monthly_depr_amount(fb_row, schedule_idx, depreciable_value)
|
return get_monthly_depr_amount(fb_row, schedule_idx, value_after_depreciation)
|
||||||
else:
|
else:
|
||||||
return get_monthly_depr_amount_based_on_prev_per_day_depr(fb_row, schedule_idx, prev_per_day_depr)
|
return get_monthly_depr_amount_based_on_prev_per_day_depr(fb_row, schedule_idx, prev_per_day_depr)
|
||||||
|
|
||||||
|
|
||||||
def get_monthly_depr_amount(fb_row, schedule_idx, depreciable_value):
|
def get_monthly_depr_amount(fb_row, schedule_idx, value_after_depreciation):
|
||||||
"""
|
"""
|
||||||
Returns monthly depreciation amount when year changes
|
Returns monthly depreciation amount when year changes
|
||||||
1. Calculate per day depr based on new year
|
1. Calculate per day depr based on new year
|
||||||
@@ -316,7 +298,7 @@ def get_monthly_depr_amount(fb_row, schedule_idx, depreciable_value):
|
|||||||
from_date, days_in_month = _get_total_days(
|
from_date, days_in_month = _get_total_days(
|
||||||
fb_row.depreciation_start_date, schedule_idx, cint(fb_row.frequency_of_depreciation)
|
fb_row.depreciation_start_date, schedule_idx, cint(fb_row.frequency_of_depreciation)
|
||||||
)
|
)
|
||||||
per_day_depr = get_per_day_depr(fb_row, depreciable_value, from_date)
|
per_day_depr = get_per_day_depr(fb_row, value_after_depreciation, from_date)
|
||||||
return (per_day_depr * days_in_month), per_day_depr
|
return (per_day_depr * days_in_month), per_day_depr
|
||||||
|
|
||||||
|
|
||||||
@@ -333,12 +315,12 @@ def get_monthly_depr_amount_based_on_prev_per_day_depr(fb_row, schedule_idx, pre
|
|||||||
|
|
||||||
def get_per_day_depr(
|
def get_per_day_depr(
|
||||||
fb_row,
|
fb_row,
|
||||||
depreciable_value,
|
value_after_depreciation,
|
||||||
from_date,
|
from_date,
|
||||||
):
|
):
|
||||||
to_date = add_days(add_years(from_date, 1), -1)
|
to_date = add_days(add_years(from_date, 1), -1)
|
||||||
total_days = date_diff(to_date, from_date) + 1
|
total_days = date_diff(to_date, from_date) + 1
|
||||||
per_day_depr = (flt(depreciable_value) * (flt(fb_row.rate_of_depreciation) / 100)) / total_days
|
per_day_depr = (flt(value_after_depreciation) * (flt(fb_row.rate_of_depreciation) / 100)) / total_days
|
||||||
return per_day_depr
|
return per_day_depr
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
"depreciation_method",
|
"depreciation_method",
|
||||||
"frequency_of_depreciation",
|
"frequency_of_depreciation",
|
||||||
"total_number_of_depreciations",
|
"total_number_of_depreciations",
|
||||||
|
"increase_in_asset_life",
|
||||||
"depreciation_start_date",
|
"depreciation_start_date",
|
||||||
"column_break_5",
|
"column_break_5",
|
||||||
"salvage_value_percentage",
|
"salvage_value_percentage",
|
||||||
@@ -61,7 +62,6 @@
|
|||||||
{
|
{
|
||||||
"fieldname": "depreciation_start_date",
|
"fieldname": "depreciation_start_date",
|
||||||
"fieldtype": "Date",
|
"fieldtype": "Date",
|
||||||
"hidden": 1,
|
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"label": "Depreciation Posting Date",
|
"label": "Depreciation Posting Date",
|
||||||
"mandatory_depends_on": "eval:parent.doctype == 'Asset'"
|
"mandatory_depends_on": "eval:parent.doctype == 'Asset'"
|
||||||
@@ -101,7 +101,7 @@
|
|||||||
"default": "0",
|
"default": "0",
|
||||||
"fieldname": "daily_prorata_based",
|
"fieldname": "daily_prorata_based",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Depreciate based on days per period"
|
"label": "Depreciate based on daily pro-rata"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"default": "0",
|
"default": "0",
|
||||||
@@ -125,12 +125,20 @@
|
|||||||
{
|
{
|
||||||
"fieldname": "column_break_sigk",
|
"fieldname": "column_break_sigk",
|
||||||
"fieldtype": "Column Break"
|
"fieldtype": "Column Break"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "via Asset Repair",
|
||||||
|
"fieldname": "increase_in_asset_life",
|
||||||
|
"fieldtype": "Int",
|
||||||
|
"label": "Increase In Asset Life (Months)",
|
||||||
|
"no_copy": 1,
|
||||||
|
"read_only": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2024-12-13 12:11:03.743209",
|
"modified": "2024-12-19 17:50:24.012434",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Assets",
|
"module": "Assets",
|
||||||
"name": "Asset Finance Book",
|
"name": "Asset Finance Book",
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ class AssetFinanceBook(Document):
|
|||||||
expected_value_after_useful_life: DF.Currency
|
expected_value_after_useful_life: DF.Currency
|
||||||
finance_book: DF.Link | None
|
finance_book: DF.Link | None
|
||||||
frequency_of_depreciation: DF.Int
|
frequency_of_depreciation: DF.Int
|
||||||
|
increase_in_asset_life: DF.Int
|
||||||
parent: DF.Data
|
parent: DF.Data
|
||||||
parentfield: DF.Data
|
parentfield: DF.Data
|
||||||
parenttype: DF.Data
|
parenttype: DF.Data
|
||||||
|
|||||||
@@ -419,5 +419,6 @@ def get_expense_accounts(doctype, txt, searchfield, start, page_len, filters):
|
|||||||
return (
|
return (
|
||||||
frappe.qb.from_(PurchaseInvoiceItem)
|
frappe.qb.from_(PurchaseInvoiceItem)
|
||||||
.select(PurchaseInvoiceItem.expense_account)
|
.select(PurchaseInvoiceItem.expense_account)
|
||||||
|
.distinct()
|
||||||
.where(PurchaseInvoiceItem.parent == filters.get("purchase_invoice"))
|
.where(PurchaseInvoiceItem.parent == filters.get("purchase_invoice"))
|
||||||
).run(as_list=1)
|
).run(as_list=1)
|
||||||
|
|||||||
@@ -45,6 +45,9 @@ frappe.ui.form.on("Asset Value Adjustment", {
|
|||||||
|
|
||||||
asset: function (frm) {
|
asset: function (frm) {
|
||||||
frm.trigger("set_acc_dimension");
|
frm.trigger("set_acc_dimension");
|
||||||
|
if (frm.doc.asset) {
|
||||||
|
frm.trigger("set_current_asset_value");
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
finance_book: function (frm) {
|
finance_book: function (frm) {
|
||||||
|
|||||||
@@ -54,8 +54,8 @@
|
|||||||
"fieldname": "journal_entry",
|
"fieldname": "journal_entry",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Journal Entry",
|
"label": "Journal Entry",
|
||||||
"options": "Journal Entry",
|
|
||||||
"no_copy": 1,
|
"no_copy": 1,
|
||||||
|
"options": "Journal Entry",
|
||||||
"read_only": 1
|
"read_only": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -125,18 +125,18 @@
|
|||||||
"fieldtype": "Column Break"
|
"fieldtype": "Column Break"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "difference_account",
|
"fieldname": "difference_account",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Difference Account",
|
"label": "Difference Account",
|
||||||
"no_copy": 1,
|
"no_copy": 1,
|
||||||
"options": "Account",
|
"options": "Account",
|
||||||
"reqd": 1
|
"reqd": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"is_submittable": 1,
|
"is_submittable": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2024-08-13 16:21:18.639208",
|
"modified": "2024-12-18 15:04:18.726505",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Assets",
|
"module": "Assets",
|
||||||
"name": "Asset Value Adjustment",
|
"name": "Asset Value Adjustment",
|
||||||
@@ -188,7 +188,6 @@
|
|||||||
"write": 1
|
"write": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"quick_entry": 1,
|
|
||||||
"sort_field": "creation",
|
"sort_field": "creation",
|
||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
"states": [],
|
"states": [],
|
||||||
|
|||||||
Reference in New Issue
Block a user