diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py index 6a248b0f8f..e3e8a132c7 100644 --- a/erpnext/assets/doctype/asset/asset.py +++ b/erpnext/assets/doctype/asset/asset.py @@ -29,6 +29,7 @@ from erpnext.assets.doctype.asset.depreciation import ( ) from erpnext.assets.doctype.asset_category.asset_category import get_asset_category_account from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_schedule import ( + cancel_asset_depreciation_schedules, convert_draft_asset_depreciation_schedules_into_active, get_asset_depreciation_schedule, make_draft_asset_depreciation_schedules, @@ -64,6 +65,7 @@ class Asset(AccountsController): self.validate_cancellation() self.cancel_movement_entries() self.delete_depreciation_entries() + cancel_asset_depreciation_schedules(self) self.set_status() self.ignore_linked_doctypes = ("GL Entry", "Stock Ledger Entry") make_reverse_gl_entries(voucher_type="Asset", voucher_no=self.name) @@ -244,14 +246,14 @@ class Asset(AccountsController): return value_after_depreciation def get_from_date(self, finance_book): - asset_depr_schedule_name = get_asset_depreciation_schedule(self.name, finance_book) + asset_depr_schedule = get_asset_depreciation_schedule(self.name, finance_book) - if not asset_depr_schedule_name: + if not asset_depr_schedule: return self.available_for_use_date - asset_depr_schedule = frappe.get_doc("Asset Depreciation Schedule", asset_depr_schedule_name) + asset_depr_schedule_doc = frappe.get_doc("Asset Depreciation Schedule", asset_depr_schedule) - return asset_depr_schedule.get("depreciation_schedule")[-1].schedule_date + return asset_depr_schedule_doc.get("depreciation_schedule")[-1].schedule_date # if it returns True, depreciation_amount will not be equal for the first and last rows def check_is_pro_rata(self, row): @@ -355,26 +357,26 @@ class Asset(AccountsController): return depreciation_amount_for_last_row def get_depreciation_amount_for_first_row(self, finance_book): - asset_depr_schedule_name = get_asset_depreciation_schedule(self.name, finance_book) + asset_depr_schedule = get_asset_depreciation_schedule(self.name, finance_book) - asset_depr_schedule = frappe.get_doc("Asset Depreciation Schedule", asset_depr_schedule_name) + asset_depr_schedule_doc = frappe.get_doc("Asset Depreciation Schedule", asset_depr_schedule) - return asset_depr_schedule.get("depreciation_schedule")[0].depreciation_amount + return asset_depr_schedule_doc.get("depreciation_schedule")[0].depreciation_amount def get_value_after_depreciation(self, idx): return flt(self.get("finance_books")[cint(idx) - 1].value_after_depreciation) def validate_expected_value_after_useful_life(self): for row in self.get("finance_books"): - asset_depr_schedule_name = get_asset_depreciation_schedule(self.name, row.finance_book) + asset_depr_schedule = get_asset_depreciation_schedule(self.name, row.finance_book) - if not asset_depr_schedule_name: + if not asset_depr_schedule: return - asset_depr_schedule = frappe.get_doc("Asset Depreciation Schedule", asset_depr_schedule_name) + asset_depr_schedule_doc = frappe.get_doc("Asset Depreciation Schedule", asset_depr_schedule) accumulated_depreciation_after_full_schedule = [ - d.accumulated_depreciation_amount for d in asset_depr_schedule.get("depreciation_schedule") + d.accumulated_depreciation_amount for d in asset_depr_schedule_doc.get("depreciation_schedule") ] if accumulated_depreciation_after_full_schedule: @@ -424,14 +426,14 @@ class Asset(AccountsController): def delete_depreciation_entries(self): for row in self.get("finance_books"): - asset_depr_schedule_name = get_asset_depreciation_schedule(self.name, row.finance_book) + asset_depr_schedule = get_asset_depreciation_schedule(self.name, row.finance_book) - if not asset_depr_schedule_name: + if not asset_depr_schedule: return - asset_depr_schedule = frappe.get_doc("Asset Depreciation Schedule", asset_depr_schedule_name) + asset_depr_schedule_doc = frappe.get_doc("Asset Depreciation Schedule", asset_depr_schedule) - for d in asset_depr_schedule.get("depreciation_schedule"): + for d in asset_depr_schedule_doc.get("depreciation_schedule"): if d.journal_entry: frappe.get_doc("Journal Entry", d.journal_entry).cancel() d.db_set("journal_entry", None) diff --git a/erpnext/assets/doctype/asset/depreciation.py b/erpnext/assets/doctype/asset/depreciation.py index 49f167ef1c..664838dee6 100644 --- a/erpnext/assets/doctype/asset/depreciation.py +++ b/erpnext/assets/doctype/asset/depreciation.py @@ -11,7 +11,7 @@ from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import ( ) from erpnext.accounts.doctype.journal_entry.journal_entry import make_reverse_journal_entry from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_schedule import ( - make_temp_asset_depreciation_schedule, + get_temp_asset_depreciation_schedule_doc, ) @@ -514,7 +514,7 @@ def get_value_after_depreciation_on_disposal_date(asset, disposal_date, finance_ row = asset_doc.finance_books[idx - 1] - temp_asset_depreciation_schedule = make_temp_asset_depreciation_schedule( + temp_asset_depreciation_schedule = get_temp_asset_depreciation_schedule_doc( asset_doc, row, getdate(disposal_date) ) diff --git a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py index 9df4241b57..144b94dfbc 100644 --- a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py +++ b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py @@ -22,52 +22,52 @@ class AssetDepreciationSchedule(Document): def make_draft_asset_depreciation_schedules(asset_doc, date_of_disposal=None, date_of_return=None): for row in asset_doc.get("finance_books"): - asset_depr_schedule = frappe.new_doc("Asset Depreciation Schedule") + asset_depr_schedule_doc = frappe.new_doc("Asset Depreciation Schedule") prepare_draft_asset_depreciation_schedule_data( - asset_depr_schedule, asset_doc, row, date_of_disposal, date_of_return + asset_depr_schedule_doc, asset_doc, row, date_of_disposal, date_of_return ) - asset_depr_schedule.insert() + asset_depr_schedule_doc.insert() def update_draft_asset_depreciation_schedules( asset_doc, date_of_disposal=None, date_of_return=None ): for row in asset_doc.get("finance_books"): - asset_depr_schedule_name = get_asset_depreciation_schedule(asset_doc.name, row.finance_book) + asset_depr_schedule = get_asset_depreciation_schedule(asset_doc.name, row.finance_book) - if not asset_depr_schedule_name: + if not asset_depr_schedule: return - asset_depr_schedule = frappe.get_doc("Asset Depreciation Schedule", asset_depr_schedule_name) + asset_depr_schedule_doc = frappe.get_doc("Asset Depreciation Schedule", asset_depr_schedule) prepare_draft_asset_depreciation_schedule_data( - asset_depr_schedule, asset_doc, row, date_of_disposal, date_of_return + asset_depr_schedule_doc, asset_doc, row, date_of_disposal, date_of_return ) - asset_depr_schedule.save() + asset_depr_schedule_doc.save() def prepare_draft_asset_depreciation_schedule_data( - asset_depr_schedule, asset_doc, row, date_of_disposal, date_of_return + asset_depr_schedule_doc, asset_doc, row, date_of_disposal, date_of_return ): - set_draft_asset_depreciation_schedule_details(asset_depr_schedule, asset_doc.name, row) - make_depreciation_schedule(asset_depr_schedule, asset_doc, row, date_of_disposal) + set_draft_asset_depreciation_schedule_details(asset_depr_schedule_doc, asset_doc.name, row) + make_depreciation_schedule(asset_depr_schedule_doc, asset_doc, row, date_of_disposal) set_accumulated_depreciation( - asset_depr_schedule, asset_doc, row, date_of_disposal, date_of_return + asset_depr_schedule_doc, asset_doc, row, date_of_disposal, date_of_return ) -def set_draft_asset_depreciation_schedule_details(asset_depr_schedule, asset, row): - asset_depr_schedule.asset = asset - asset_depr_schedule.finance_book = row.finance_book - asset_depr_schedule.depreciation_method = row.depreciation_method - asset_depr_schedule.total_number_of_depreciations = row.total_number_of_depreciations - asset_depr_schedule.frequency_of_depreciation = row.frequency_of_depreciation - asset_depr_schedule.rate_of_depreciation = row.rate_of_depreciation - asset_depr_schedule.expected_value_after_useful_life = row.expected_value_after_useful_life - asset_depr_schedule.status = "Draft" +def set_draft_asset_depreciation_schedule_details(asset_depr_schedule_doc, asset, row): + asset_depr_schedule_doc.asset = asset + asset_depr_schedule_doc.finance_book = row.finance_book + asset_depr_schedule_doc.depreciation_method = row.depreciation_method + asset_depr_schedule_doc.total_number_of_depreciations = row.total_number_of_depreciations + asset_depr_schedule_doc.frequency_of_depreciation = row.frequency_of_depreciation + asset_depr_schedule_doc.rate_of_depreciation = row.rate_of_depreciation + asset_depr_schedule_doc.expected_value_after_useful_life = row.expected_value_after_useful_life + asset_depr_schedule_doc.status = "Draft" def convert_draft_asset_depreciation_schedules_into_active(asset_doc): @@ -84,41 +84,55 @@ def convert_draft_asset_depreciation_schedules_into_active(asset_doc): asset_depr_schedule.submit() -def make_new_active_asset_depreciation_schedules_from_existing( +def make_new_active_asset_depreciation_schedules_and_cancel_old_ones( asset_doc, date_of_disposal=None, date_of_return=None, notes=None ): for row in asset_doc.get("finance_books"): - old_asset_depr_schedule_name = get_asset_depreciation_schedule(asset_doc.name, row.finance_book) + old_asset_depr_schedule = get_asset_depreciation_schedule(asset_doc.name, row.finance_book) - if not old_asset_depr_schedule_name: + if not old_asset_depr_schedule: return - old_asset_depr_schedule = frappe.get_doc( - "Asset Depreciation Schedule", old_asset_depr_schedule_name + old_asset_depr_schedule_doc = frappe.get_doc( + "Asset Depreciation Schedule", old_asset_depr_schedule ) - asset_depr_schedule = frappe.copy_doc(old_asset_depr_schedule, ignore_no_copy=False) + asset_depr_schedule_doc = frappe.copy_doc(old_asset_depr_schedule_doc, ignore_no_copy=False) - make_depreciation_schedule(asset_depr_schedule, asset_doc, row, date_of_disposal) + old_asset_depr_schedule.cancel() + + make_depreciation_schedule(asset_depr_schedule_doc, asset_doc, row, date_of_disposal) set_accumulated_depreciation( - asset_depr_schedule, asset_doc, row, date_of_disposal, date_of_return + asset_depr_schedule_doc, asset_doc, row, date_of_disposal, date_of_return ) - asset_depr_schedule.notes = notes + asset_depr_schedule_doc.notes = notes - asset_depr_schedule.submit() + asset_depr_schedule_doc.submit() -def make_temp_asset_depreciation_schedule( +def get_temp_asset_depreciation_schedule_doc( asset_doc, row, date_of_disposal=None, date_of_return=None ): - asset_depr_schedule = frappe.new_doc("Asset Depreciation Schedule") + asset_depr_schedule_doc = frappe.new_doc("Asset Depreciation Schedule") prepare_draft_asset_depreciation_schedule_data( - asset_depr_schedule, asset_doc, row, date_of_disposal, date_of_return + asset_depr_schedule_doc, asset_doc, row, date_of_disposal, date_of_return ) - return asset_depr_schedule + return asset_depr_schedule_doc + + +def cancel_asset_depreciation_schedules(asset_doc): + for row in asset_doc.get("finance_books"): + asset_depr_schedule = get_asset_depreciation_schedule(asset_doc.name, row.finance_book) + + if not asset_depr_schedule: + return + + asset_depr_schedule_doc = frappe.get_doc("Asset Depreciation Schedule", asset_depr_schedule) + + asset_depr_schedule_doc.cancel() def get_asset_depreciation_schedule(asset, finance_book): @@ -132,24 +146,26 @@ def get_asset_depreciation_schedule(asset, finance_book): ) -def make_depreciation_schedule(asset_depr_schedule, asset_doc, row, date_of_disposal): - if row.depreciation_method != "Manual" and not asset_depr_schedule.get("depreciation_schedule"): - asset_depr_schedule.depreciation_schedule = [] +def make_depreciation_schedule(asset_depr_schedule_doc, asset_doc, row, date_of_disposal): + if row.depreciation_method != "Manual" and not asset_depr_schedule_doc.get( + "depreciation_schedule" + ): + asset_depr_schedule_doc.depreciation_schedule = [] if not asset_doc.available_for_use_date: return - start = clear_depreciation_schedule(asset_depr_schedule) + start = clear_depreciation_schedule(asset_depr_schedule_doc) - _make_depreciation_schedule(asset_depr_schedule, asset_doc, row, start, date_of_disposal) + _make_depreciation_schedule(asset_depr_schedule_doc, asset_doc, row, start, date_of_disposal) -def clear_depreciation_schedule(asset_depr_schedule): +def clear_depreciation_schedule(asset_depr_schedule_doc): start = [] num_of_depreciations_completed = 0 depr_schedule = [] - for schedule in asset_depr_schedule.get("depreciation_schedule"): + for schedule in asset_depr_schedule_doc.get("depreciation_schedule"): if len(start) != 0: break @@ -168,12 +184,12 @@ def clear_depreciation_schedule(asset_depr_schedule): if start == []: start = [0] else: - asset_depr_schedule.depreciation_schedule = depr_schedule + asset_depr_schedule_doc.depreciation_schedule = depr_schedule return start -def _make_depreciation_schedule(asset_depr_schedule, asset_doc, row, start, date_of_disposal): +def _make_depreciation_schedule(asset_depr_schedule_doc, asset_doc, row, start, date_of_disposal): asset_doc.validate_asset_finance_books(row) value_after_depreciation = asset_doc._get_value_after_depreciation(row) @@ -216,7 +232,7 @@ def _make_depreciation_schedule(asset_depr_schedule, asset_doc, row, start, date if depreciation_amount > 0: add_depr_schedule_row( - asset_depr_schedule, + asset_depr_schedule_doc, date_of_disposal, depreciation_amount, row.depreciation_method, @@ -282,7 +298,7 @@ def _make_depreciation_schedule(asset_depr_schedule, asset_doc, row, start, date if depreciation_amount > 0: add_depr_schedule_row( - asset_depr_schedule, + asset_depr_schedule_doc, schedule_date, depreciation_amount, row.depreciation_method, @@ -312,14 +328,14 @@ def get_depreciation_amount(asset_doc, depreciable_value, row): def add_depr_schedule_row( - asset_depr_schedule, + asset_depr_schedule_doc, schedule_date, depreciation_amount, depreciation_method, finance_book, finance_book_id, ): - asset_depr_schedule.append( + asset_depr_schedule_doc.append( "depreciation_schedule", { "schedule_date": schedule_date, @@ -332,7 +348,7 @@ def add_depr_schedule_row( def set_accumulated_depreciation( - asset_depr_schedule, + asset_depr_schedule_doc, asset_doc, row, date_of_disposal=None, @@ -341,12 +357,12 @@ def set_accumulated_depreciation( ): straight_line_idx = [ d.idx - for d in asset_depr_schedule.get("depreciation_schedule") + for d in asset_depr_schedule_doc.get("depreciation_schedule") if d.depreciation_method == "Straight Line" ] finance_books = [] - for i, d in enumerate(asset_depr_schedule.get("depreciation_schedule")): + for i, d in enumerate(asset_depr_schedule_doc.get("depreciation_schedule")): if ignore_booked_entry and d.journal_entry: continue diff --git a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py index ae6e2b426e..e61c8f7e83 100644 --- a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py +++ b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py @@ -10,10 +10,11 @@ from frappe.utils import cint, date_diff, flt, formatdate, getdate from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import ( get_checks_for_pl_and_bs_accounts, ) -from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_schedule import ( - get_depreciation_amount -) from erpnext.assets.doctype.asset.depreciation import get_depreciation_accounts +from erpnext.assets.doctype.asset_depreciation_schedule.asset_depreciation_schedule import ( + get_asset_depreciation_schedule, + get_depreciation_amount, +) class AssetValueAdjustment(Document): @@ -114,20 +115,19 @@ class AssetValueAdjustment(Document): for d in asset.finance_books: d.value_after_depreciation = asset_value + asset_depr_schedule = get_asset_depreciation_schedule(asset.name, d.finance_book) + depr_schedule = asset_depr_schedule.get("depreciation_schedule") + if d.depreciation_method in ("Straight Line", "Manual"): - end_date = max(s.schedule_date for s in asset.schedules if cint(s.finance_book_id) == d.idx) + end_date = max(s.schedule_date for s in depr_schedule) total_days = date_diff(end_date, self.date) rate_per_day = flt(d.value_after_depreciation) / flt(total_days) from_date = self.date else: - no_of_depreciations = len( - [ - s.name for s in asset.schedules if (cint(s.finance_book_id) == d.idx and not s.journal_entry) - ] - ) + no_of_depreciations = len([s.name for s in depr_schedule if not s.journal_entry]) value_after_depreciation = d.value_after_depreciation - for data in asset.schedules: + for data in depr_schedule: if cint(data.finance_book_id) == d.idx and not data.journal_entry: if d.depreciation_method in ("Straight Line", "Manual"): days = date_diff(data.schedule_date, from_date)