diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py index 5c685ccdc71..8431d5f1184 100644 --- a/erpnext/assets/doctype/asset/test_asset.py +++ b/erpnext/assets/doctype/asset/test_asset.py @@ -829,6 +829,85 @@ class TestAsset(AssetSetup): asset.save().submit() self.assertEqual(asset.status, "Fully Depreciated") + def test_depreciation_accounts_is_set_for_depreciable_assets(self): + company_depreciation_accounts = frappe.db.get_value( + "Company", + "_Test Company", + [ + "accumulated_depreciation_account", + "depreciation_expense_account", + ], + as_dict=True, + ) + frappe.db.set_value( + "Company", + "_Test Company", + { + "accumulated_depreciation_account": "", + "depreciation_expense_account": "", + }, + ) + asset_category_name = "Computers" + asset_category_account = None + if frappe.db.exists("Asset Category", asset_category_name): + filters = { + "parent": asset_category_name, + "company_name": "_Test Company", + } + fieldname = [ + "name", + "accumulated_depreciation_account", + "depreciation_expense_account", + ] + asset_category_account = frappe.db.get_value( + "Asset Category Account", + filters=filters, + fieldname=fieldname, + as_dict=True, + ) + if asset_category_account and ( + asset_category_account.accumulated_depreciation_account + or asset_category_account.depreciation_expense_account + ): + frappe.db.set_value( + "Asset Category Account", + asset_category_account.name, + { + "accumulated_depreciation_account": "", + "depreciation_expense_account": "", + }, + ) + else: + asset_category = frappe.new_doc("Asset Category") + asset_category.asset_category_name = asset_category_name + asset_category.append( + "accounts", + { + "company_name": "_Test Company", + "fixed_asset_account": "_Test Fixed Asset - _TC", + }, + ) + asset_category.insert() + asset = create_asset(asset_category=asset_category_name, calculate_depreciation=1, do_not_save=1) + with self.assertRaises(frappe.ValidationError) as err: + asset.save() + + self.assertTrue( + "Please set Depreciation related Accounts in Asset Category Computers or Company" + in str(err.exception) + ) + + frappe.db.set_value("Company", "_Test Company", company_depreciation_accounts) + if asset_category_account: + frappe.db.set_value( + "Asset Category Account", + asset_category_account.name, + { + "accumulated_depreciation_account": asset_category_account.accumulated_depreciation_account, + "depreciation_expense_account": asset_category_account.depreciation_expense_account, + }, + ) + class TestDepreciationMethods(AssetSetup): @classmethod diff --git a/erpnext/assets/doctype/asset_category/test_asset_category.py b/erpnext/assets/doctype/asset_category/test_asset_category.py index ea68875a552..ae7aafe8716 100644 --- a/erpnext/assets/doctype/asset_category/test_asset_category.py +++ b/erpnext/assets/doctype/asset_category/test_asset_category.py @@ -4,6 +4,8 @@ import frappe from frappe.tests import IntegrationTestCase +from erpnext.assets.doctype.asset.test_asset import create_asset + class TestAssetCategory(IntegrationTestCase): def test_mandatory_fields(self): @@ -50,3 +52,65 @@ class TestAssetCategory(IntegrationTestCase): ) self.assertRaises(frappe.ValidationError, asset_category.insert) + + def test_duplicate_company_accounts(self): + asset_category = frappe.get_doc( + { + "doctype": "Asset Category", + "asset_category_name": "Computers", + "accounts": [ + { + "company_name": "_Test Company", + "fixed_asset_account": "_Test Fixed Asset - _TC", + }, + { + "company_name": "_Test Company", + "fixed_asset_account": "_Test Fixed Asset - _TC", + }, + ], + } + ) + with self.assertRaises(frappe.ValidationError) as err: + asset_category.save() + self.assertTrue("Cannot set multiple account rows for the same company" in str(err.exception)) + + def test_depreciation_accounts_required_for_existing_depreciable_assets(self): + asset = create_asset( + asset_category="Computers", + calculate_depreciation=1, + company="_Test Company", + submit=1, + ) + company_acccount_depreciation = frappe.db.get_value( + "Company", + asset.company, + [ + "accumulated_depreciation_account", + "depreciation_expense_account", + ], + as_dict=True, + ) + frappe.db.set_value( + "Company", + asset.company, + { + "accumulated_depreciation_account": "", + "depreciation_expense_account": "", + }, + ) + asset_category = frappe.get_doc("Asset Category", asset.asset_category) + asset_category.enable_cwip_accounting = 0 + for row in asset_category.accounts: + if row.company_name == asset.company and ( + row.accumulated_depreciation_account or row.depreciation_expense_account + ): + row.accumulated_depreciation_account = None + row.depreciation_expense_account = None + with self.assertRaises(frappe.ValidationError) as err: + asset_category.save() + + self.assertTrue( + "Since there are active depreciable assets under this category, the following accounts are required." + in str(err.exception) + ) + frappe.db.set_value("Company", asset.company, company_acccount_depreciation)