From 34e335ba3419ab663042cefc8f5abd1bcd05a593 Mon Sep 17 00:00:00 2001 From: Charles-Henri Decultot Date: Fri, 5 Jan 2018 17:49:06 +0000 Subject: [PATCH 1/3] Prorated Asset Depreciation --- erpnext/assets/doctype/asset/asset.js | 26 ++- erpnext/assets/doctype/asset/asset.json | 34 +++- erpnext/assets/doctype/asset/asset.py | 66 +++++-- erpnext/assets/doctype/asset/test_asset.py | 73 ++++++-- .../doctype/asset_category/asset_category.py | 2 +- .../assets/doctype/asset_settings/__init__.py | 0 .../doctype/asset_settings/asset_settings.js | 8 + .../asset_settings/asset_settings.json | 175 ++++++++++++++++++ .../doctype/asset_settings/asset_settings.py | 10 + .../asset_settings/test_asset_settings.js | 23 +++ .../asset_settings/test_asset_settings.py | 10 + erpnext/config/assets.py | 6 +- .../img/asset/asset_prorated_depreciation.png | Bin 0 -> 48604 bytes erpnext/docs/user/manual/en/asset/assets.md | 7 + 14 files changed, 398 insertions(+), 42 deletions(-) create mode 100644 erpnext/assets/doctype/asset_settings/__init__.py create mode 100644 erpnext/assets/doctype/asset_settings/asset_settings.js create mode 100644 erpnext/assets/doctype/asset_settings/asset_settings.json create mode 100644 erpnext/assets/doctype/asset_settings/asset_settings.py create mode 100644 erpnext/assets/doctype/asset_settings/test_asset_settings.js create mode 100644 erpnext/assets/doctype/asset_settings/test_asset_settings.py create mode 100644 erpnext/docs/assets/img/asset/asset_prorated_depreciation.png diff --git a/erpnext/assets/doctype/asset/asset.js b/erpnext/assets/doctype/asset/asset.js index 8287401105..485c8a8e5a 100644 --- a/erpnext/assets/doctype/asset/asset.js +++ b/erpnext/assets/doctype/asset/asset.js @@ -185,20 +185,26 @@ frappe.ui.form.on('Asset', { create_asset_maintenance: function(frm) { frappe.call({ - args: { - "asset": frm.doc.name, - "item_code": frm.doc.item_code, - "item_name": frm.doc.item_name, - "asset_category": frm.doc.asset_category, - "company": frm.doc.company - }, - method: "erpnext.assets.doctype.asset.asset.create_asset_maintenance", + method: "GET", callback: function(r) { var doclist = frappe.model.sync(r.message); frappe.set_route("Form", doclist[0].doctype, doclist[0].name); } }) - } + }, + + calculate_depreciation: function(frm) { + frappe.db.get_value("Asset Settings", {'name':"Asset Settings"}, 'schedule_based_on_fiscal_year', (data) => { + if (data.schedule_based_on_fiscal_year == 1) { + frm.set_df_property("depreciation_method", "options", "\nStraight Line\nManual") + frm.toggle_reqd("available_for_use_date", true); + frm.toggle_display("frequency_of_depreciation", false); + frappe.db.get_value("Fiscal Year", {'name': frappe.sys_defaults.fiscal_year}, "year_end_date", (data) => { + frm.set_value("next_depreciation_date", data.year_end_date); + }) + } + }) + } }); frappe.ui.form.on('Depreciation Schedule', { @@ -316,4 +322,4 @@ erpnext.asset.transfer_asset = function(frm) { }) }); dialog.show(); -}; \ No newline at end of file +}; diff --git a/erpnext/assets/doctype/asset/asset.json b/erpnext/assets/doctype/asset/asset.json index 45c9a65c37..49b574d3b0 100644 --- a/erpnext/assets/doctype/asset/asset.json +++ b/erpnext/assets/doctype/asset/asset.json @@ -507,6 +507,36 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "available_for_use_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Available-for-use Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_on_submit": 0, @@ -1221,7 +1251,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-12-19 12:58:44.137460", + "modified": "2018-01-05 09:53:05.945328", "modified_by": "Administrator", "module": "Assets", "name": "Asset", @@ -1277,4 +1307,4 @@ "sort_order": "DESC", "track_changes": 0, "track_seen": 0 -} \ No newline at end of file +} diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py index 857aadef61..96790ce7e4 100644 --- a/erpnext/assets/doctype/asset/asset.py +++ b/erpnext/assets/doctype/asset/asset.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals import frappe from frappe import _ -from frappe.utils import flt, add_months, cint, nowdate, getdate, today +from frappe.utils import flt, add_months, cint, nowdate, getdate, today, date_diff, nowdate from frappe.model.document import Document from erpnext.accounts.doctype.purchase_invoice.purchase_invoice import get_fixed_asset_account from erpnext.assets.doctype.asset.depreciation \ @@ -87,11 +87,15 @@ class Asset(Document): if self.next_depreciation_date and getdate(self.next_depreciation_date) < getdate(self.purchase_date): frappe.throw(_("Next Depreciation Date cannot be before Purchase Date")) + if self.next_depreciation_date and getdate(self.next_depreciation_date) < getdate(self.available_for_use_date): + frappe.throw(_("Next Depreciation Date cannot be before Available-for-use Date")) + if (flt(self.value_after_depreciation) > flt(self.expected_value_after_useful_life) and not self.next_depreciation_date and self.calculate_depreciation): frappe.throw(_("Please set Next Depreciation Date")) def make_depreciation_schedule(self): + if self.depreciation_method != 'Manual': self.schedules = [] @@ -101,17 +105,42 @@ class Asset(Document): number_of_pending_depreciations = cint(self.total_number_of_depreciations) - \ cint(self.number_of_depreciations_booked) if number_of_pending_depreciations: - for n in xrange(number_of_pending_depreciations): - schedule_date = add_months(self.next_depreciation_date, - n * cint(self.frequency_of_depreciation)) + if (cint(frappe.db.get_value("Asset Settings", None, "schedule_based_on_fiscal_year")) == 1) and getdate(self.next_depreciation_date) < getdate(add_months(self.available_for_use_date, number_of_pending_depreciations * 12)): + number_of_pending_depreciations += 1 - depreciation_amount = self.get_depreciation_amount(value_after_depreciation) - value_after_depreciation -= flt(depreciation_amount) + for n in xrange(number_of_pending_depreciations): + if n == xrange(number_of_pending_depreciations)[-1]: + schedule_date = add_months(self.available_for_use_date, n * 12) + previous_scheduled_date = add_months(self.next_depreciation_date, (n-1) * 12) + depreciation_amount = self.get_depreciation_amount_prorata_temporis(value_after_depreciation, previous_scheduled_date, schedule_date) - self.append("schedules", { - "schedule_date": schedule_date, - "depreciation_amount": depreciation_amount - }) + elif n == xrange(number_of_pending_depreciations)[0]: + schedule_date = self.next_depreciation_date + depreciation_amount = self.get_depreciation_amount_prorata_temporis(value_after_depreciation, self.available_for_use_date, schedule_date) + + else: + schedule_date = add_months(self.next_depreciation_date, n * 12) + depreciation_amount = self.get_depreciation_amount_prorata_temporis(value_after_depreciation) + + if value_after_depreciation != 0: + value_after_depreciation -= flt(depreciation_amount) + + self.append("schedules", { + "schedule_date": schedule_date, + "depreciation_amount": depreciation_amount + }) + else: + for n in xrange(number_of_pending_depreciations): + schedule_date = add_months(self.next_depreciation_date, + n * cint(self.frequency_of_depreciation)) + + depreciation_amount = self.get_depreciation_amount(value_after_depreciation) + value_after_depreciation -= flt(depreciation_amount) + + self.append("schedules", { + "schedule_date": schedule_date, + "depreciation_amount": depreciation_amount + }) def set_accumulated_depreciation(self): accumulated_depreciation = flt(self.opening_accumulated_depreciation) @@ -143,6 +172,21 @@ class Asset(Document): return depreciation_amount + def get_depreciation_amount_prorata_temporis(self, depreciable_value, start_date=None, end_date=None): + if start_date and end_date: + prorata_temporis = min(abs(flt(date_diff(str(end_date), str(start_date)))) / flt(frappe.db.get_value("Asset Settings", None, "number_of_days_in_fiscal_year")), 1) + else: + prorata_temporis = 1 + + if self.depreciation_method in ("Straight Line", "Manual"): + depreciation_amount = (flt(self.value_after_depreciation) - + flt(self.expected_value_after_useful_life)) / (cint(self.total_number_of_depreciations) - + cint(self.number_of_depreciations_booked)) * prorata_temporis + + return depreciation_amount + else: + self.get_depreciation_amount(depreciable_value) + def validate_expected_value_after_useful_life(self): accumulated_depreciation_after_full_schedule = \ max([d.accumulated_depreciation_amount for d in self.get("schedules")]) @@ -174,7 +218,7 @@ class Asset(Document): def set_status(self, status=None): '''Get and update status''' if not status: - status = self.get_status() + status = self.get_status() self.db_set("status", status) def get_status(self): diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py index 107ffec038..3438a76b18 100644 --- a/erpnext/assets/doctype/asset/test_asset.py +++ b/erpnext/assets/doctype/asset/test_asset.py @@ -12,24 +12,25 @@ from erpnext.assets.doctype.asset.asset import make_sales_invoice, make_purchase class TestAsset(unittest.TestCase): def setUp(self): set_depreciation_settings_in_company() + remove_prorated_depreciation_schedule() create_asset() frappe.db.sql("delete from `tabTax Rule`") def test_purchase_asset(self): asset = frappe.get_doc("Asset", "Macbook Pro 1") asset.submit() - + pi = make_purchase_invoice(asset.name, asset.item_code, asset.gross_purchase_amount, asset.company, asset.purchase_date) pi.supplier = "_Test Supplier" pi.insert() pi.submit() - + asset.load_from_db() self.assertEqual(asset.supplier, "_Test Supplier") self.assertEqual(asset.purchase_date, getdate("2015-01-01")) self.assertEqual(asset.purchase_invoice, pi.name) - + expected_gle = ( ("_Test Fixed Asset - _TC", 100000.0, 0.0), ("Creditors - _TC", 0.0, 100000.0) @@ -46,10 +47,10 @@ class TestAsset(unittest.TestCase): asset.load_from_db() self.assertEqual(asset.supplier, None) self.assertEqual(asset.purchase_invoice, None) - + self.assertFalse(frappe.db.get_value("GL Entry", {"voucher_type": "Purchase Invoice", "voucher_no": pi.name})) - + def test_schedule_for_straight_line_method(self): asset = frappe.get_doc("Asset", "Macbook Pro 1") @@ -66,14 +67,14 @@ class TestAsset(unittest.TestCase): for d in asset.get("schedules")] self.assertEqual(schedules, expected_schedules) - + def test_schedule_for_straight_line_method_for_existing_asset(self): asset = frappe.get_doc("Asset", "Macbook Pro 1") asset.is_existing_asset = 1 asset.number_of_depreciations_booked = 1 asset.opening_accumulated_depreciation = 40000 asset.save() - + self.assertEqual(asset.status, "Draft") expected_schedules = [ @@ -102,7 +103,7 @@ class TestAsset(unittest.TestCase): for d in asset.get("schedules")] self.assertEqual(schedules, expected_schedules) - + def test_schedule_for_double_declining_method_for_existing_asset(self): asset = frappe.get_doc("Asset", "Macbook Pro 1") asset.depreciation_method = "Double Declining Balance" @@ -120,7 +121,7 @@ class TestAsset(unittest.TestCase): for d in asset.get("schedules")] self.assertEqual(schedules, expected_schedules) - + def test_schedule_for_manual_method(self): asset = frappe.get_doc("Asset", "Macbook Pro 1") asset.depreciation_method = "Manual" @@ -145,6 +146,29 @@ class TestAsset(unittest.TestCase): self.assertEqual(schedules, expected_schedules) + def test_schedule_for_prorated_straight_line_method(self): + set_prorated_depreciation_schedule() + asset = frappe.get_doc("Asset", "Macbook Pro 1") + asset.is_existing_asset = 0 + asset.available_for_use_date = "2020-01-30" + asset.next_depreciation_date = "2020-12-31" + asset.depreciation_method = "Straight Line" + asset.save() + + expected_schedules = [ + ["2020-12-31", 28000, 28000], + ["2021-12-31", 30000, 58000], + ["2022-12-31", 30000, 88000], + ["2023-01-30", 2000, 90000] + ] + + schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount] + for d in asset.get("schedules")] + + self.assertEqual(schedules, expected_schedules) + + remove_prorated_depreciation_schedule() + def test_depreciation(self): asset = frappe.get_doc("Asset", "Macbook Pro 1") asset.submit() @@ -172,23 +196,23 @@ class TestAsset(unittest.TestCase): self.assertEqual(gle, expected_gle) self.assertEqual(asset.get("value_after_depreciation"), 70000) - + def test_depreciation_entry_cancellation(self): asset = frappe.get_doc("Asset", "Macbook Pro 1") asset.submit() post_depreciation_entries(date="2021-01-01") - + asset.load_from_db() - + # cancel depreciation entry depr_entry = asset.get("schedules")[0].journal_entry self.assertTrue(depr_entry) frappe.get_doc("Journal Entry", depr_entry).cancel() - + asset.load_from_db() depr_entry = asset.get("schedules")[0].journal_entry self.assertFalse(depr_entry) - + def test_scrap_asset(self): asset = frappe.get_doc("Asset", "Macbook Pro 1") @@ -284,7 +308,7 @@ def create_asset(): if not frappe.db.exists("Item", "Macbook Pro"): create_fixed_asset_item() - + asset = frappe.get_doc({ "doctype": "Asset", "asset_name": "Macbook Pro 1", @@ -342,6 +366,21 @@ def set_depreciation_settings_in_company(): company.disposal_account = "_Test Gain/Loss on Asset Disposal - _TC" company.depreciation_cost_center = "_Test Cost Center - _TC" company.save() - + # Enable booking asset depreciation entry automatically - frappe.db.set_value("Accounts Settings", None, "book_asset_depreciation_entry_automatically", 1) \ No newline at end of file + frappe.db.set_value("Accounts Settings", None, "book_asset_depreciation_entry_automatically", 1) + +def remove_prorated_depreciation_schedule(): + asset_settings = frappe.get_doc("Asset Settings", "Asset Settings") + asset_settings.schedule_based_on_fiscal_year = 0 + asset_settings.save() + + frappe.db.commit() + +def set_prorated_depreciation_schedule(): + asset_settings = frappe.get_doc("Asset Settings", "Asset Settings") + asset_settings.schedule_based_on_fiscal_year = 1 + asset_settings.number_of_days_in_fiscal_year = 360 + asset_settings.save() + + frappe.db.commit() diff --git a/erpnext/assets/doctype/asset_category/asset_category.py b/erpnext/assets/doctype/asset_category/asset_category.py index 5279c37ea8..542bd12861 100644 --- a/erpnext/assets/doctype/asset_category/asset_category.py +++ b/erpnext/assets/doctype/asset_category/asset_category.py @@ -12,4 +12,4 @@ class AssetCategory(Document): def validate(self): for field in ("total_number_of_depreciations", "frequency_of_depreciation"): if cint(self.get(field))<1: - frappe.throw(_("{0} must be greater than 0").format(self.meta.get_label(field)), frappe.MandatoryError) \ No newline at end of file + frappe.throw(_("{0} must be greater than 0").format(self.meta.get_label(field)), frappe.MandatoryError) diff --git a/erpnext/assets/doctype/asset_settings/__init__.py b/erpnext/assets/doctype/asset_settings/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/assets/doctype/asset_settings/asset_settings.js b/erpnext/assets/doctype/asset_settings/asset_settings.js new file mode 100644 index 0000000000..813278f7e1 --- /dev/null +++ b/erpnext/assets/doctype/asset_settings/asset_settings.js @@ -0,0 +1,8 @@ +// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Asset Settings', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/assets/doctype/asset_settings/asset_settings.json b/erpnext/assets/doctype/asset_settings/asset_settings.json new file mode 100644 index 0000000000..d6ddd33c30 --- /dev/null +++ b/erpnext/assets/doctype/asset_settings/asset_settings.json @@ -0,0 +1,175 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-01-03 10:30:32.983381", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "depreciation_options", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Depreciation Options", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "schedule_based_on_fiscal_year", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Calculate Prorated Depreciation Schedule Based on Fiscal Year", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "360", + "depends_on": "eval:doc.schedule_based_on_fiscal_year", + "description": "This value is used for pro-rata temporis calculation", + "fieldname": "number_of_days_in_fiscal_year", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Number of Days in Fiscal Year", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 1, + "istable": 0, + "max_attachments": 0, + "modified": "2018-01-05 10:10:39.803255", + "modified_by": "Administrator", + "module": "Assets", + "name": "Asset Settings", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 0, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + }, + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 0, + "role": "Accounts Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/assets/doctype/asset_settings/asset_settings.py b/erpnext/assets/doctype/asset_settings/asset_settings.py new file mode 100644 index 0000000000..ce0bf58ed0 --- /dev/null +++ b/erpnext/assets/doctype/asset_settings/asset_settings.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class AssetSettings(Document): + pass diff --git a/erpnext/assets/doctype/asset_settings/test_asset_settings.js b/erpnext/assets/doctype/asset_settings/test_asset_settings.js new file mode 100644 index 0000000000..eac2c928f3 --- /dev/null +++ b/erpnext/assets/doctype/asset_settings/test_asset_settings.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Asset Settings", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Asset Settings + () => frappe.tests.make('Asset Settings', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/assets/doctype/asset_settings/test_asset_settings.py b/erpnext/assets/doctype/asset_settings/test_asset_settings.py new file mode 100644 index 0000000000..0d22ff18da --- /dev/null +++ b/erpnext/assets/doctype/asset_settings/test_asset_settings.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestAssetSettings(unittest.TestCase): + pass diff --git a/erpnext/config/assets.py b/erpnext/config/assets.py index 1001e948ec..73c1aee87a 100644 --- a/erpnext/config/assets.py +++ b/erpnext/config/assets.py @@ -13,6 +13,10 @@ def get_data(): { "type": "doctype", "name": "Asset Category", + }, + { + "type": "doctype", + "name": "Asset Settings", } ] }, @@ -74,4 +78,4 @@ def get_data(): }, ] } - ] \ No newline at end of file + ] diff --git a/erpnext/docs/assets/img/asset/asset_prorated_depreciation.png b/erpnext/docs/assets/img/asset/asset_prorated_depreciation.png new file mode 100644 index 0000000000000000000000000000000000000000..d81699beaf76f170bf930220e9ad07ff8cb913d0 GIT binary patch literal 48604 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 a0lBxvW`ss9Mg$3QD85paD}QMk@;?CB)SAfv literal 0 HcmV?d00001 diff --git a/erpnext/docs/user/manual/en/asset/assets.md b/erpnext/docs/user/manual/en/asset/assets.md index 6932c59dcc..1a5ce860c4 100644 --- a/erpnext/docs/user/manual/en/asset/assets.md +++ b/erpnext/docs/user/manual/en/asset/assets.md @@ -50,6 +50,13 @@ On the scheduled date, system creates depreciation entry by creating a Journal E In the depreciation entry, the "Accumulated Depreciation Account" is credited and "Depreciation Expense Account" is debited. The related accounts can be set in the Asset Category or Company. +If you are required to calculate the depreciation based on your Fiscal Year and prorated by the number of days left, select the corresponding option in "Account Settings". + +The system will automatically set the fiscal year end date as the next depreciation date and calculate the depreciation amount prorata temporis based on the Available-for-use Date (IFRS16) + +Asset + + For better visibility, net value of the asset on different depreciation dates are shown in a line graph. Asset From 356839a54b70e8e49e133bf687a147ed85e4f868 Mon Sep 17 00:00:00 2001 From: Charles-Henri Decultot Date: Sat, 6 Jan 2018 15:22:40 +0000 Subject: [PATCH 2/3] Codacy erro fixes --- erpnext/assets/doctype/asset/asset.js | 22 +++++++++---------- erpnext/assets/doctype/asset/asset.py | 2 +- .../doctype/asset_settings/asset_settings.js | 3 --- .../doctype/asset_settings/asset_settings.py | 1 - .../asset_settings/test_asset_settings.py | 1 - 5 files changed, 12 insertions(+), 17 deletions(-) diff --git a/erpnext/assets/doctype/asset/asset.js b/erpnext/assets/doctype/asset/asset.js index 485c8a8e5a..0a8e3d2c9e 100644 --- a/erpnext/assets/doctype/asset/asset.js +++ b/erpnext/assets/doctype/asset/asset.js @@ -183,7 +183,7 @@ frappe.ui.form.on('Asset', { }) }, - create_asset_maintenance: function(frm) { + create_asset_maintenance: function() { frappe.call({ method: "GET", callback: function(r) { @@ -195,16 +195,16 @@ frappe.ui.form.on('Asset', { calculate_depreciation: function(frm) { frappe.db.get_value("Asset Settings", {'name':"Asset Settings"}, 'schedule_based_on_fiscal_year', (data) => { - if (data.schedule_based_on_fiscal_year == 1) { - frm.set_df_property("depreciation_method", "options", "\nStraight Line\nManual") - frm.toggle_reqd("available_for_use_date", true); - frm.toggle_display("frequency_of_depreciation", false); - frappe.db.get_value("Fiscal Year", {'name': frappe.sys_defaults.fiscal_year}, "year_end_date", (data) => { - frm.set_value("next_depreciation_date", data.year_end_date); - }) - } - }) - } + if (data.schedule_based_on_fiscal_year == 1) { + frm.set_df_property("depreciation_method", "options", "\nStraight Line\nManual") + frm.toggle_reqd("available_for_use_date", true); + frm.toggle_display("frequency_of_depreciation", false); + frappe.db.get_value("Fiscal Year", {'name': frappe.sys_defaults.fiscal_year}, "year_end_date", (data) => { + frm.set_value("next_depreciation_date", data.year_end_date); + }) + } + }) + } }); frappe.ui.form.on('Depreciation Schedule', { diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py index 96790ce7e4..519b2f9ece 100644 --- a/erpnext/assets/doctype/asset/asset.py +++ b/erpnext/assets/doctype/asset/asset.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals import frappe from frappe import _ -from frappe.utils import flt, add_months, cint, nowdate, getdate, today, date_diff, nowdate +from frappe.utils import flt, add_months, cint, nowdate, getdate, today, date_diff from frappe.model.document import Document from erpnext.accounts.doctype.purchase_invoice.purchase_invoice import get_fixed_asset_account from erpnext.assets.doctype.asset.depreciation \ diff --git a/erpnext/assets/doctype/asset_settings/asset_settings.js b/erpnext/assets/doctype/asset_settings/asset_settings.js index 813278f7e1..3b421486c3 100644 --- a/erpnext/assets/doctype/asset_settings/asset_settings.js +++ b/erpnext/assets/doctype/asset_settings/asset_settings.js @@ -2,7 +2,4 @@ // For license information, please see license.txt frappe.ui.form.on('Asset Settings', { - refresh: function(frm) { - - } }); diff --git a/erpnext/assets/doctype/asset_settings/asset_settings.py b/erpnext/assets/doctype/asset_settings/asset_settings.py index ce0bf58ed0..e303ebd23f 100644 --- a/erpnext/assets/doctype/asset_settings/asset_settings.py +++ b/erpnext/assets/doctype/asset_settings/asset_settings.py @@ -3,7 +3,6 @@ # For license information, please see license.txt from __future__ import unicode_literals -import frappe from frappe.model.document import Document class AssetSettings(Document): diff --git a/erpnext/assets/doctype/asset_settings/test_asset_settings.py b/erpnext/assets/doctype/asset_settings/test_asset_settings.py index 0d22ff18da..75f146a27e 100644 --- a/erpnext/assets/doctype/asset_settings/test_asset_settings.py +++ b/erpnext/assets/doctype/asset_settings/test_asset_settings.py @@ -3,7 +3,6 @@ # See license.txt from __future__ import unicode_literals -import frappe import unittest class TestAssetSettings(unittest.TestCase): From 57187860f84c040b7f8c2391ea32c8631fb58332 Mon Sep 17 00:00:00 2001 From: Charles-Henri Decultot Date: Sat, 6 Jan 2018 15:32:01 +0000 Subject: [PATCH 3/3] Codacy error fixes --- erpnext/assets/doctype/asset/asset.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/assets/doctype/asset/asset.js b/erpnext/assets/doctype/asset/asset.js index 0a8e3d2c9e..34862a855f 100644 --- a/erpnext/assets/doctype/asset/asset.js +++ b/erpnext/assets/doctype/asset/asset.js @@ -196,7 +196,7 @@ frappe.ui.form.on('Asset', { calculate_depreciation: function(frm) { frappe.db.get_value("Asset Settings", {'name':"Asset Settings"}, 'schedule_based_on_fiscal_year', (data) => { if (data.schedule_based_on_fiscal_year == 1) { - frm.set_df_property("depreciation_method", "options", "\nStraight Line\nManual") + frm.set_df_property("depreciation_method", "options", "\nStraight Line\nManual"); frm.toggle_reqd("available_for_use_date", true); frm.toggle_display("frequency_of_depreciation", false); frappe.db.get_value("Fiscal Year", {'name': frappe.sys_defaults.fiscal_year}, "year_end_date", (data) => {