fix: test cases
diff --git a/erpnext/assets/doctype/asset/asset.js b/erpnext/assets/doctype/asset/asset.js
index 5d15cab..18ba8f9 100644
--- a/erpnext/assets/doctype/asset/asset.js
+++ b/erpnext/assets/doctype/asset/asset.js
@@ -299,13 +299,9 @@
 	set_depreciation_rate: function(frm, row) {
 		if (row.total_number_of_depreciations && row.frequency_of_depreciation) {
 			frappe.call({
-				method: "erpnext.assets.doctype.asset.asset.get_depreciation_rate",
-				args: {
-					args: row,
-					asset_cost: frm.doc.gross_purchase_amount,
-					number_of_depreciations_booked: frm.doc.is_existing_asset ?
-						frm.doc.number_of_depreciations_booked : 0
-				},
+				method: "get_depreciation_rate",
+				doc: frm.doc,
+				args: row,
 				callback: function(r) {
 					if (r.message) {
 						frappe.model.set_value(row.doctype, row.name, "rate_of_depreciation", r.message);
diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py
index b703bca..8011038 100644
--- a/erpnext/assets/doctype/asset/asset.py
+++ b/erpnext/assets/doctype/asset/asset.py
@@ -101,9 +101,7 @@
 
 	def set_depreciation_rate(self):
 		for d in self.get("finance_books"):
-			if not d.rate_of_depreciation:
-				d.rate_of_depreciation = get_depreciation_rate(d, self.gross_purchase_amount,
-					self.number_of_depreciations_booked)
+			d.rate_of_depreciation = self.get_depreciation_rate(d)
 
 	def make_depreciation_schedule(self):
 		depreciation_method = [d.depreciation_method for d in self.finance_books]
@@ -405,6 +403,32 @@
 			make_gl_entries(gl_entries)
 			self.db_set('booked_fixed_asset', 1)
 
+	def get_depreciation_rate(self, args):
+		if isinstance(args, string_types):
+			args = json.loads(args)
+
+		number_of_depreciations_booked = 0
+		if self.is_existing_asset:
+			number_of_depreciations_booked = self.number_of_depreciations_booked
+
+		float_precision = cint(frappe.db.get_default("float_precision")) or 2
+		tot_no_of_depreciation = flt(args.get("total_number_of_depreciations")) - flt(number_of_depreciations_booked)
+
+		if args.get("depreciation_method") in ["Straight Line", "Manual"]:
+			return 1.0 / tot_no_of_depreciation
+
+		if args.get("depreciation_method") == 'Double Declining Balance':
+			return 200.0 / args.get("total_number_of_depreciations")
+
+		if args.get("depreciation_method") == "Written Down Value" and not args.get("rate_of_depreciation"):
+			no_of_years = flt(args.get("total_number_of_depreciations") * flt(args.get("frequency_of_depreciation"))) / 12
+			value = flt(args.get("expected_value_after_useful_life")) / flt(self.gross_purchase_amount)
+
+			# square root of flt(salvage_value) / flt(asset_cost)
+			depreciation_rate = math.pow(value, 1.0/flt(no_of_years, 2))
+
+			return 100 * (1 - flt(depreciation_rate, float_precision))
+
 def update_maintenance_status():
 	assets = frappe.get_all('Asset', filters = {'docstatus': 1, 'maintenance_required': 1})
 
@@ -568,25 +592,3 @@
 
 def is_cwip_accounting_disabled():
 	return cint(frappe.db.get_single_value("Asset Settings", "disable_cwip_accounting"))
-
-@frappe.whitelist()
-def get_depreciation_rate(args, asset_cost, number_of_depreciations_booked=0):
-	if isinstance(args, string_types):
-		args = json.loads(args)
-
-	float_precision = cint(frappe.db.get_default("float_precision")) or 2
-
-	if args.get("depreciation_method") == 'Double Declining Balance':
-		return 200.0 / flt(args.get("total_number_of_depreciations"))
-
-	if args.get("depreciation_method") in ["Straight Line", "Manual"]:
-		return 1.0 / (flt(args.get("total_number_of_depreciations")) - flt(number_of_depreciations_booked))
-
-	if args.get("depreciation_method") == "Written Down Value":
-		no_of_years = flt(flt(args.get("total_number_of_depreciations")) * flt(args.get("frequency_of_depreciation"))) / 12
-		value = flt(args.get("expected_value_after_useful_life")) / flt(asset_cost)
-
-		# square root of flt(salvage_value) / flt(asset_cost)
-		depreciation_rate = math.pow(value, 1.0/flt(no_of_years, 2))
-
-		return 100 * (1 - flt(depreciation_rate, float_precision))
\ No newline at end of file
diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py
index a12348e..985097b 100644
--- a/erpnext/assets/doctype/asset/test_asset.py
+++ b/erpnext/assets/doctype/asset/test_asset.py
@@ -160,9 +160,9 @@
 		asset.save()
 
 		expected_schedules = [
-			["2020-06-06", 66667.0, 66667.0],
-			["2021-04-06", 22222.0, 88889.0],
-			["2022-02-06", 1111.0, 90000.0]
+			["2020-06-06", 66666.67, 66666.67],
+			["2021-04-06", 22222.22, 88888.89],
+			["2022-02-06", 1111.11, 90000.0]
 		]
 
 		schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
@@ -192,8 +192,8 @@
 		asset.save()
 
 		expected_schedules = [
-			["2020-06-06", 33333.0, 83333.0],
-			["2021-04-06", 6667.0, 90000.0]
+			["2020-06-06", 33333.33, 83333.33],
+			["2021-04-06", 6666.67, 90000.0]
 		]
 
 		schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
@@ -209,7 +209,7 @@
 		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
 		asset = frappe.get_doc('Asset', asset_name)
 		asset.calculate_depreciation = 1
-		asset.purchase_date = '2020-06-06'
+		asset.purchase_date = '2020-01-30'
 		asset.is_existing_asset = 0
 		asset.available_for_use_date = "2020-01-30"
 		asset.append("finance_books", {
@@ -244,7 +244,7 @@
 		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
 		asset = frappe.get_doc('Asset', asset_name)
 		asset.calculate_depreciation = 1
-		asset.purchase_date = '2020-06-06'
+		asset.purchase_date = '2020-01-30'
 		asset.available_for_use_date = "2020-01-30"
 		asset.append("finance_books", {
 			"expected_value_after_useful_life": 10000,
@@ -277,6 +277,37 @@
 		self.assertEqual(gle, expected_gle)
 		self.assertEqual(asset.get("value_after_depreciation"), 0)
 
+	def test_depreciation_entry_for_wdv(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=8000.0, location="Test Location")
+
+		asset_name = frappe.db.get_value("Asset", {"purchase_receipt": pr.name}, 'name')
+		asset = frappe.get_doc('Asset', asset_name)
+		asset.calculate_depreciation = 1
+		asset.available_for_use_date = '2030-06-06'
+		asset.purchase_date = '2030-06-06'
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 1000,
+			"depreciation_method": "Written Down Value",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 12,
+			"depreciation_start_date": "2030-12-31"
+		})
+		asset.save(ignore_permissions=True)
+
+		self.assertEqual(asset.finance_books[0].rate_of_depreciation, 50.0)
+
+		expected_schedules = [
+			["2030-12-31", 4000.0, 4000.0],
+			["2031-12-31", 2000.0, 6000.0],
+			["2032-12-31", 1000.0, 7000.0],
+		]
+
+		schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)]
+			for d in asset.get("schedules")]
+
+		self.assertEqual(schedules, expected_schedules)
+
 	def test_depreciation_entry_cancellation(self):
 		pr = make_purchase_receipt(item_code="Macbook Pro",
 			qty=1, rate=100000.0, location="Test Location")