diff --git a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.js b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.js index c28b2b3b6a..3d2dff179a 100644 --- a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.js +++ b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.js @@ -43,9 +43,9 @@ erpnext.asset.set_accumulated_depreciation = function(frm) { if(frm.doc.depreciation_method != "Manual") return; var accumulated_depreciation = flt(frm.doc.opening_accumulated_depreciation); - $.each(frm.doc.schedules || [], function(i, row) { + + $.each(frm.doc.depreciation_schedule || [], function(i, row) { accumulated_depreciation += flt(row.depreciation_amount); - frappe.model.set_value(row.doctype, row.name, - "accumulated_depreciation_amount", accumulated_depreciation); + frappe.model.set_value(row.doctype, row.name, "accumulated_depreciation_amount", accumulated_depreciation); }) }; diff --git a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.json b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.json index 898c482079..d38508d0c4 100644 --- a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.json +++ b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.json @@ -10,7 +10,9 @@ "asset", "naming_series", "column_break_2", + "gross_purchase_amount", "opening_accumulated_depreciation", + "number_of_depreciations_booked", "finance_book", "finance_book_id", "depreciation_details_section", @@ -148,18 +150,36 @@ "read_only": 1 }, { - "depends_on": "opening_accumulated_depreciation", "fieldname": "opening_accumulated_depreciation", "fieldtype": "Currency", + "hidden": 1, "label": "Opening Accumulated Depreciation", "options": "Company:company:default_currency", + "print_hide": 1, + "read_only": 1 + }, + { + "fieldname": "gross_purchase_amount", + "fieldtype": "Currency", + "hidden": 1, + "label": "Gross Purchase Amount", + "options": "Company:company:default_currency", + "print_hide": 1, + "read_only": 1 + }, + { + "fieldname": "number_of_depreciations_booked", + "fieldtype": "Int", + "hidden": 1, + "label": "Number of Depreciations Booked", + "print_hide": 1, "read_only": 1 } ], "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2023-01-16 21:08:21.421260", + "modified": "2023-02-26 16:37:23.734806", "modified_by": "Administrator", "module": "Assets", "name": "Asset Depreciation Schedule", 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 6f02662544..b75fbcbeb3 100644 --- a/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py +++ b/erpnext/assets/doctype/asset_depreciation_schedule/asset_depreciation_schedule.py @@ -4,7 +4,15 @@ import frappe from frappe import _ from frappe.model.document import Document -from frappe.utils import add_days, add_months, cint, flt, get_last_day, is_last_day_of_the_month +from frappe.utils import ( + add_days, + add_months, + cint, + flt, + get_last_day, + getdate, + is_last_day_of_the_month, +) class AssetDepreciationSchedule(Document): @@ -83,15 +91,58 @@ class AssetDepreciationSchedule(Document): date_of_return=None, update_asset_finance_book_row=True, ): + have_asset_details_been_modified = self.have_asset_details_been_modified(asset_doc) + not_manual_depr_or_have_manual_depr_details_been_modified = ( + self.not_manual_depr_or_have_manual_depr_details_been_modified(row) + ) + self.set_draft_asset_depr_schedule_details(asset_doc, row) - self.make_depr_schedule(asset_doc, row, date_of_disposal, update_asset_finance_book_row) - self.set_accumulated_depreciation(row, date_of_disposal, date_of_return) + + if self.should_prepare_depreciation_schedule( + have_asset_details_been_modified, not_manual_depr_or_have_manual_depr_details_been_modified + ): + self.make_depr_schedule(asset_doc, row, date_of_disposal, update_asset_finance_book_row) + self.set_accumulated_depreciation(row, date_of_disposal, date_of_return) + + def have_asset_details_been_modified(self, asset_doc): + return ( + asset_doc.gross_purchase_amount != self.gross_purchase_amount + or asset_doc.opening_accumulated_depreciation != self.opening_accumulated_depreciation + or asset_doc.number_of_depreciations_booked != self.number_of_depreciations_booked + ) + + def not_manual_depr_or_have_manual_depr_details_been_modified(self, row): + return ( + self.depreciation_method != "Manual" + or row.total_number_of_depreciations != self.total_number_of_depreciations + or row.frequency_of_depreciation != self.frequency_of_depreciation + or getdate(row.depreciation_start_date) != self.get("depreciation_schedule")[0].schedule_date + or row.expected_value_after_useful_life != self.expected_value_after_useful_life + ) + + def should_prepare_depreciation_schedule( + self, have_asset_details_been_modified, not_manual_depr_or_have_manual_depr_details_been_modified + ): + if not self.get("depreciation_schedule"): + return True + + old_asset_depr_schedule_doc = self.get_doc_before_save() + + if self.docstatus != 0 and not old_asset_depr_schedule_doc: + return True + + if have_asset_details_been_modified or not_manual_depr_or_have_manual_depr_details_been_modified: + return True + + return False def set_draft_asset_depr_schedule_details(self, asset_doc, row): self.asset = asset_doc.name self.finance_book = row.finance_book self.finance_book_id = row.idx self.opening_accumulated_depreciation = asset_doc.opening_accumulated_depreciation + self.number_of_depreciations_booked = asset_doc.number_of_depreciations_booked + self.gross_purchase_amount = asset_doc.gross_purchase_amount self.depreciation_method = row.depreciation_method self.total_number_of_depreciations = row.total_number_of_depreciations self.frequency_of_depreciation = row.frequency_of_depreciation @@ -102,7 +153,7 @@ class AssetDepreciationSchedule(Document): def make_depr_schedule( self, asset_doc, row, date_of_disposal, update_asset_finance_book_row=True ): - if row.depreciation_method != "Manual" and not self.get("depreciation_schedule"): + if not self.get("depreciation_schedule"): self.depreciation_schedule = [] if not asset_doc.available_for_use_date: @@ -293,7 +344,9 @@ class AssetDepreciationSchedule(Document): ignore_booked_entry=False, ): straight_line_idx = [ - d.idx for d in self.get("depreciation_schedule") if d.depreciation_method == "Straight Line" + d.idx + for d in self.get("depreciation_schedule") + if d.depreciation_method == "Straight Line" or d.depreciation_method == "Manual" ] accumulated_depreciation = flt(self.opening_accumulated_depreciation) diff --git a/erpnext/patches/v15_0/create_asset_depreciation_schedules_from_assets.py b/erpnext/patches/v15_0/create_asset_depreciation_schedules_from_assets.py index 371ecbc8c1..5c46bf3280 100644 --- a/erpnext/patches/v15_0/create_asset_depreciation_schedules_from_assets.py +++ b/erpnext/patches/v15_0/create_asset_depreciation_schedules_from_assets.py @@ -27,7 +27,13 @@ def get_details_of_draft_or_submitted_depreciable_assets(): records = ( frappe.qb.from_(asset) - .select(asset.name, asset.opening_accumulated_depreciation, asset.docstatus) + .select( + asset.name, + asset.opening_accumulated_depreciation, + asset.gross_purchase_amount, + asset.number_of_depreciations_booked, + asset.docstatus, + ) .where(asset.calculate_depreciation == 1) .where(asset.docstatus < 2) ).run(as_dict=True)