fix: recalculate wdv rate after asset repair [develop] (#34570)
fix: recalculate wdv rate after asset repair
This commit is contained in:
parent
87108be11a
commit
e6b0196493
@ -79,7 +79,6 @@ class Asset(AccountsController):
|
|||||||
def after_insert(self):
|
def after_insert(self):
|
||||||
if not self.split_from:
|
if not self.split_from:
|
||||||
make_draft_asset_depr_schedules(self)
|
make_draft_asset_depr_schedules(self)
|
||||||
self.validate_expected_value_after_useful_life()
|
|
||||||
|
|
||||||
def validate_asset_and_reference(self):
|
def validate_asset_and_reference(self):
|
||||||
if self.purchase_invoice or self.purchase_receipt:
|
if self.purchase_invoice or self.purchase_receipt:
|
||||||
@ -326,13 +325,13 @@ class Asset(AccountsController):
|
|||||||
|
|
||||||
def validate_expected_value_after_useful_life(self):
|
def validate_expected_value_after_useful_life(self):
|
||||||
for row in self.get("finance_books"):
|
for row in self.get("finance_books"):
|
||||||
asset_depr_schedule_doc = get_asset_depr_schedule_doc(self.name, "Draft", row.finance_book)
|
depr_schedule = get_depr_schedule(self.name, "Draft", row.finance_book)
|
||||||
|
|
||||||
if not asset_depr_schedule_doc:
|
if not depr_schedule:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
accumulated_depreciation_after_full_schedule = [
|
accumulated_depreciation_after_full_schedule = [
|
||||||
d.accumulated_depreciation_amount for d in asset_depr_schedule_doc.get("depreciation_schedule")
|
d.accumulated_depreciation_amount for d in depr_schedule
|
||||||
]
|
]
|
||||||
|
|
||||||
if accumulated_depreciation_after_full_schedule:
|
if accumulated_depreciation_after_full_schedule:
|
||||||
@ -356,9 +355,6 @@ class Asset(AccountsController):
|
|||||||
)
|
)
|
||||||
elif not row.expected_value_after_useful_life:
|
elif not row.expected_value_after_useful_life:
|
||||||
row.expected_value_after_useful_life = asset_value_after_full_schedule
|
row.expected_value_after_useful_life = asset_value_after_full_schedule
|
||||||
asset_depr_schedule_doc.db_set(
|
|
||||||
"expected_value_after_useful_life", asset_value_after_full_schedule
|
|
||||||
)
|
|
||||||
|
|
||||||
def validate_cancellation(self):
|
def validate_cancellation(self):
|
||||||
if self.status in ("In Maintenance", "Out of Order"):
|
if self.status in ("In Maintenance", "Out of Order"):
|
||||||
@ -625,11 +621,22 @@ class Asset(AccountsController):
|
|||||||
return 200.0 / args.get("total_number_of_depreciations")
|
return 200.0 / args.get("total_number_of_depreciations")
|
||||||
|
|
||||||
if args.get("depreciation_method") == "Written Down Value":
|
if args.get("depreciation_method") == "Written Down Value":
|
||||||
if args.get("rate_of_depreciation") and on_validate:
|
if (
|
||||||
|
args.get("rate_of_depreciation")
|
||||||
|
and on_validate
|
||||||
|
and not self.flags.increase_in_asset_value_due_to_repair
|
||||||
|
):
|
||||||
return args.get("rate_of_depreciation")
|
return args.get("rate_of_depreciation")
|
||||||
|
|
||||||
value = flt(args.get("expected_value_after_useful_life")) / flt(self.gross_purchase_amount)
|
if self.flags.increase_in_asset_value_due_to_repair:
|
||||||
|
value = flt(args.get("expected_value_after_useful_life")) / flt(
|
||||||
|
args.get("value_after_depreciation")
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
value = flt(args.get("expected_value_after_useful_life")) / flt(self.gross_purchase_amount)
|
||||||
|
|
||||||
depreciation_rate = math.pow(value, 1.0 / flt(args.get("total_number_of_depreciations"), 2))
|
depreciation_rate = math.pow(value, 1.0 / flt(args.get("total_number_of_depreciations"), 2))
|
||||||
|
|
||||||
return flt((100 * (1 - depreciation_rate)), float_precision)
|
return flt((100 * (1 - depreciation_rate)), float_precision)
|
||||||
|
|
||||||
def get_pro_rata_amt(self, row, depreciation_amount, from_date, to_date):
|
def get_pro_rata_amt(self, row, depreciation_amount, from_date, to_date):
|
||||||
|
|||||||
@ -283,19 +283,12 @@ class AssetDepreciationSchedule(Document):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Adjust depreciation amount in the last period based on the expected value after useful life
|
# Adjust depreciation amount in the last period based on the expected value after useful life
|
||||||
if (
|
if row.expected_value_after_useful_life and (
|
||||||
row.expected_value_after_useful_life
|
(
|
||||||
and (
|
n == cint(number_of_pending_depreciations) - 1
|
||||||
(
|
and value_after_depreciation != row.expected_value_after_useful_life
|
||||||
n == cint(number_of_pending_depreciations) - 1
|
|
||||||
and value_after_depreciation != row.expected_value_after_useful_life
|
|
||||||
)
|
|
||||||
or value_after_depreciation < row.expected_value_after_useful_life
|
|
||||||
)
|
|
||||||
and (
|
|
||||||
not asset_doc.flags.increase_in_asset_value_due_to_repair
|
|
||||||
or not row.depreciation_method in ("Written Down Value", "Double Declining Balance")
|
|
||||||
)
|
)
|
||||||
|
or value_after_depreciation < row.expected_value_after_useful_life
|
||||||
):
|
):
|
||||||
depreciation_amount += value_after_depreciation - row.expected_value_after_useful_life
|
depreciation_amount += value_after_depreciation - row.expected_value_after_useful_life
|
||||||
skip_row = True
|
skip_row = True
|
||||||
@ -467,6 +460,16 @@ def make_new_active_asset_depr_schedules_and_cancel_current_ones(
|
|||||||
|
|
||||||
new_asset_depr_schedule_doc = frappe.copy_doc(current_asset_depr_schedule_doc)
|
new_asset_depr_schedule_doc = frappe.copy_doc(current_asset_depr_schedule_doc)
|
||||||
|
|
||||||
|
if asset_doc.flags.increase_in_asset_value_due_to_repair and row.depreciation_method in (
|
||||||
|
"Written Down Value",
|
||||||
|
"Double Declining Balance",
|
||||||
|
):
|
||||||
|
new_rate_of_depreciation = flt(
|
||||||
|
asset_doc.get_depreciation_rate(row), row.precision("rate_of_depreciation")
|
||||||
|
)
|
||||||
|
row.rate_of_depreciation = new_rate_of_depreciation
|
||||||
|
new_asset_depr_schedule_doc.rate_of_depreciation = new_rate_of_depreciation
|
||||||
|
|
||||||
new_asset_depr_schedule_doc.make_depr_schedule(asset_doc, row, date_of_disposal)
|
new_asset_depr_schedule_doc.make_depr_schedule(asset_doc, row, date_of_disposal)
|
||||||
new_asset_depr_schedule_doc.set_accumulated_depreciation(row, date_of_disposal, date_of_return)
|
new_asset_depr_schedule_doc.set_accumulated_depreciation(row, date_of_disposal, date_of_return)
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,6 @@ import erpnext
|
|||||||
from erpnext.accounts.general_ledger import make_gl_entries
|
from erpnext.accounts.general_ledger import make_gl_entries
|
||||||
from erpnext.assets.doctype.asset.asset import get_asset_account
|
from erpnext.assets.doctype.asset.asset import get_asset_account
|
||||||
from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_schedule import (
|
from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_schedule import (
|
||||||
get_asset_depr_schedule_doc,
|
|
||||||
get_depr_schedule,
|
get_depr_schedule,
|
||||||
make_new_active_asset_depr_schedules_and_cancel_current_ones,
|
make_new_active_asset_depr_schedules_and_cancel_current_ones,
|
||||||
)
|
)
|
||||||
@ -67,8 +66,6 @@ class AssetRepair(AccountsController):
|
|||||||
)
|
)
|
||||||
self.asset_doc.flags.ignore_validate_update_after_submit = True
|
self.asset_doc.flags.ignore_validate_update_after_submit = True
|
||||||
make_new_active_asset_depr_schedules_and_cancel_current_ones(self.asset_doc, notes)
|
make_new_active_asset_depr_schedules_and_cancel_current_ones(self.asset_doc, notes)
|
||||||
if self.asset_doc.calculate_depreciation:
|
|
||||||
self.update_asset_expected_value_after_useful_life()
|
|
||||||
self.asset_doc.save()
|
self.asset_doc.save()
|
||||||
|
|
||||||
def before_cancel(self):
|
def before_cancel(self):
|
||||||
@ -96,8 +93,6 @@ class AssetRepair(AccountsController):
|
|||||||
)
|
)
|
||||||
self.asset_doc.flags.ignore_validate_update_after_submit = True
|
self.asset_doc.flags.ignore_validate_update_after_submit = True
|
||||||
make_new_active_asset_depr_schedules_and_cancel_current_ones(self.asset_doc, notes)
|
make_new_active_asset_depr_schedules_and_cancel_current_ones(self.asset_doc, notes)
|
||||||
if self.asset_doc.calculate_depreciation:
|
|
||||||
self.update_asset_expected_value_after_useful_life()
|
|
||||||
self.asset_doc.save()
|
self.asset_doc.save()
|
||||||
|
|
||||||
def after_delete(self):
|
def after_delete(self):
|
||||||
@ -118,32 +113,6 @@ class AssetRepair(AccountsController):
|
|||||||
title=_("Missing Warehouse"),
|
title=_("Missing Warehouse"),
|
||||||
)
|
)
|
||||||
|
|
||||||
def update_asset_expected_value_after_useful_life(self):
|
|
||||||
for row in self.asset_doc.get("finance_books"):
|
|
||||||
if row.depreciation_method in ("Written Down Value", "Double Declining Balance"):
|
|
||||||
asset_depr_schedule_doc = get_asset_depr_schedule_doc(
|
|
||||||
self.asset_doc.name, "Active", row.finance_book
|
|
||||||
)
|
|
||||||
|
|
||||||
accumulated_depreciation_after_full_schedule = [
|
|
||||||
d.accumulated_depreciation_amount
|
|
||||||
for d in asset_depr_schedule_doc.get("depreciation_schedule")
|
|
||||||
]
|
|
||||||
|
|
||||||
accumulated_depreciation_after_full_schedule = max(
|
|
||||||
accumulated_depreciation_after_full_schedule
|
|
||||||
)
|
|
||||||
|
|
||||||
asset_value_after_full_schedule = flt(
|
|
||||||
flt(row.value_after_depreciation) - flt(accumulated_depreciation_after_full_schedule),
|
|
||||||
row.precision("expected_value_after_useful_life"),
|
|
||||||
)
|
|
||||||
|
|
||||||
row.expected_value_after_useful_life = asset_value_after_full_schedule
|
|
||||||
asset_depr_schedule_doc.db_set(
|
|
||||||
"expected_value_after_useful_life", asset_value_after_full_schedule
|
|
||||||
)
|
|
||||||
|
|
||||||
def increase_asset_value(self):
|
def increase_asset_value(self):
|
||||||
total_value_of_stock_consumed = self.get_total_value_of_stock_consumed()
|
total_value_of_stock_consumed = self.get_total_value_of_stock_consumed()
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user