From fbbfd6531b70b3babf23e003b4481c95652cf07f Mon Sep 17 00:00:00 2001 From: Khushi Rawat <142375893+khushi8112@users.noreply.github.com> Date: Tue, 13 May 2025 16:40:59 +0530 Subject: [PATCH 1/3] feat: add non depreciable category checkbox in asset category --- .../doctype/asset_category/asset_category.json | 12 ++++++++++-- .../assets/doctype/asset_category/asset_category.py | 5 ++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/erpnext/assets/doctype/asset_category/asset_category.json b/erpnext/assets/doctype/asset_category/asset_category.json index 888da4865a9..d9f5d8de1e9 100644 --- a/erpnext/assets/doctype/asset_category/asset_category.json +++ b/erpnext/assets/doctype/asset_category/asset_category.json @@ -12,6 +12,7 @@ "column_break_3", "depreciation_options", "enable_cwip_accounting", + "non_depreciable_category", "finance_book_detail", "finance_books", "section_break_2", @@ -63,10 +64,16 @@ "fieldname": "enable_cwip_accounting", "fieldtype": "Check", "label": "Enable Capital Work in Progress Accounting" + }, + { + "default": "0", + "fieldname": "non_depreciable_category", + "fieldtype": "Check", + "label": "Non Depreciable Category" } ], "links": [], - "modified": "2024-03-27 13:06:33.840414", + "modified": "2025-05-13 15:33:03.791814", "modified_by": "Administrator", "module": "Assets", "name": "Asset Category", @@ -111,9 +118,10 @@ "write": 1 } ], + "row_format": "Dynamic", "show_name_in_global_search": 1, "sort_field": "creation", "sort_order": "DESC", "states": [], "track_changes": 1 -} \ No newline at end of file +} diff --git a/erpnext/assets/doctype/asset_category/asset_category.py b/erpnext/assets/doctype/asset_category/asset_category.py index 8c2d301a895..16e564ad1bd 100644 --- a/erpnext/assets/doctype/asset_category/asset_category.py +++ b/erpnext/assets/doctype/asset_category/asset_category.py @@ -17,15 +17,14 @@ class AssetCategory(Document): if TYPE_CHECKING: from frappe.types import DF - from erpnext.assets.doctype.asset_category_account.asset_category_account import ( - AssetCategoryAccount, - ) + from erpnext.assets.doctype.asset_category_account.asset_category_account import AssetCategoryAccount from erpnext.assets.doctype.asset_finance_book.asset_finance_book import AssetFinanceBook accounts: DF.Table[AssetCategoryAccount] asset_category_name: DF.Data enable_cwip_accounting: DF.Check finance_books: DF.Table[AssetFinanceBook] + non_depreciable_category: DF.Check # end: auto-generated types def validate(self): From 32cb7d6388f02e6748483640938b6206926667c4 Mon Sep 17 00:00:00 2001 From: Khushi Rawat <142375893+khushi8112@users.noreply.github.com> Date: Tue, 13 May 2025 16:43:03 +0530 Subject: [PATCH 2/3] fix: do not mandate depreciation accounts for non depreciable asset category --- erpnext/assets/doctype/asset/depreciation.py | 51 +++----------------- 1 file changed, 8 insertions(+), 43 deletions(-) diff --git a/erpnext/assets/doctype/asset/depreciation.py b/erpnext/assets/doctype/asset/depreciation.py index 6eded8c9a4e..3942118023b 100644 --- a/erpnext/assets/doctype/asset/depreciation.py +++ b/erpnext/assets/doctype/asset/depreciation.py @@ -286,45 +286,6 @@ def get_credit_and_debit_entry( return credit_entry, debit_entry -def get_depreciation_accounts(asset_category, company): - fixed_asset_account = accumulated_depreciation_account = depreciation_expense_account = None - - accounts = frappe.db.get_value( - "Asset Category Account", - filters={"parent": asset_category, "company_name": company}, - fieldname=[ - "fixed_asset_account", - "accumulated_depreciation_account", - "depreciation_expense_account", - ], - as_dict=1, - ) - - if accounts: - fixed_asset_account = accounts.fixed_asset_account - accumulated_depreciation_account = accounts.accumulated_depreciation_account - depreciation_expense_account = accounts.depreciation_expense_account - - if not accumulated_depreciation_account or not depreciation_expense_account: - accounts = frappe.get_cached_value( - "Company", company, ["accumulated_depreciation_account", "depreciation_expense_account"] - ) - - if not accumulated_depreciation_account: - accumulated_depreciation_account = accounts[0] - if not depreciation_expense_account: - depreciation_expense_account = accounts[1] - - if not fixed_asset_account or not accumulated_depreciation_account or not depreciation_expense_account: - frappe.throw( - _("Please set Depreciation related Accounts in Asset Category {0} or Company {1}").format( - asset_category, company - ) - ) - - return fixed_asset_account, accumulated_depreciation_account, depreciation_expense_account - - def get_credit_and_debit_accounts(accumulated_depreciation_account, depreciation_expense_account): root_type = frappe.get_value("Account", depreciation_expense_account, "root_type") @@ -722,8 +683,8 @@ def get_asset_details(asset, finance_book=None): value_after_depreciation = asset.get_value_after_depreciation(finance_book) accumulated_depr_amount = flt(asset.gross_purchase_amount) - flt(value_after_depreciation) - fixed_asset_account, accumulated_depr_account, _ = get_asset_accounts( - asset.asset_category, asset.company, accumulated_depr_amount + fixed_asset_account, accumulated_depr_account, _ = get_depreciation_accounts( + asset.asset_category, asset.company ) disposal_account, depreciation_cost_center = get_disposal_account_and_cost_center(asset.company) depreciation_cost_center = asset.cost_center or depreciation_cost_center @@ -739,9 +700,13 @@ def get_asset_details(asset, finance_book=None): ) -def get_asset_accounts(asset_category, company, accumulated_depr_amount): +def get_depreciation_accounts(asset_category, company): fixed_asset_account = accumulated_depreciation_account = depreciation_expense_account = None + non_depreciable_category = frappe.db.get_value( + "Asset Category", asset_category, "non_depreciable_category" + ) + accounts = frappe.db.get_value( "Asset Category Account", filters={"parent": asset_category, "company_name": company}, @@ -761,7 +726,7 @@ def get_asset_accounts(asset_category, company, accumulated_depr_amount): if not fixed_asset_account: frappe.throw(_("Please set Fixed Asset Account in Asset Category {0}").format(asset_category)) - if accumulated_depr_amount: + if not non_depreciable_category: accounts = frappe.get_cached_value( "Company", company, ["accumulated_depreciation_account", "depreciation_expense_account"] ) From d715db1226d83f49644ab5716002cd228d234e16 Mon Sep 17 00:00:00 2001 From: Khushi Rawat <142375893+khushi8112@users.noreply.github.com> Date: Tue, 13 May 2025 16:44:13 +0530 Subject: [PATCH 3/3] fix: only depreciable category assets are allowed for depreciation --- erpnext/assets/doctype/asset/asset.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py index 9f57e4165fb..da7d70f9102 100644 --- a/erpnext/assets/doctype/asset/asset.py +++ b/erpnext/assets/doctype/asset/asset.py @@ -119,6 +119,7 @@ class Asset(AccountsController): # end: auto-generated types def validate(self): + self.validate_category() self.validate_precision() self.set_purchase_doc_row_item() self.validate_asset_values() @@ -352,6 +353,17 @@ class Asset(AccountsController): title=_("Missing Finance Book"), ) + def validate_category(self): + non_depreciable_category = frappe.db.get_value( + "Asset Category", self.asset_category, "non_depreciable_category" + ) + if self.calculate_depreciation and non_depreciable_category: + frappe.throw( + _( + "This asset category is marked as non-depreciable. Please disable depreciation calculation or choose a different category." + ) + ) + def validate_precision(self): if self.gross_purchase_amount: self.gross_purchase_amount = flt(