Merge pull request #18104 from rohitwaghchaure/incorrect_value_of_accumualated_depreciation_in_the_sales_invoice_develop

fix: incorrect value booked in the accumulated depreciation account on sell of the asset
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index e166fa2..d6cf5d8 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -768,7 +768,14 @@
 				if item.is_fixed_asset:
 					asset = frappe.get_doc("Asset", item.asset)
 
-					fixed_asset_gl_entries = get_gl_entries_on_asset_disposal(asset, item.base_net_amount)
+					if (len(asset.finance_books) > 1 and not item.finance_book
+						and asset.finance_books[0].finance_book):
+						frappe.throw(_("Select finance book for the item {0} at row {1}")
+							.format(item.item_code, item.idx))
+
+					fixed_asset_gl_entries = get_gl_entries_on_asset_disposal(asset,
+						item.base_net_amount, item.finance_book)
+
 					for gle in fixed_asset_gl_entries:
 						gle["against"] = self.customer
 						gl_entries.append(self.get_gl_dict(gle))
diff --git a/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json b/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json
index d7eb8ed..465df27 100644
--- a/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json
+++ b/erpnext/accounts/doctype/sales_invoice_item/sales_invoice_item.json
@@ -57,6 +57,7 @@
   "income_account",
   "is_fixed_asset",
   "asset",
+  "finance_book",
   "col_break4",
   "expense_account",
   "deferred_revenue",
@@ -770,11 +771,18 @@
   {
    "fieldname": "dimension_col_break",
    "fieldtype": "Column Break"
+  },
+  {
+   "depends_on": "asset",
+   "fieldname": "finance_book",
+   "fieldtype": "Link",
+   "label": "Finance Book",
+   "options": "Finance Book"
   }
  ],
  "idx": 1,
  "istable": 1,
- "modified": "2019-05-25 22:05:59.971263",
+ "modified": "2019-06-28 17:30:12.156086",
  "modified_by": "Administrator",
  "module": "Accounts",
  "name": "Sales Invoice Item",
diff --git a/erpnext/assets/doctype/asset/depreciation.py b/erpnext/assets/doctype/asset/depreciation.py
index 797075b..61108ec 100644
--- a/erpnext/assets/doctype/asset/depreciation.py
+++ b/erpnext/assets/doctype/asset/depreciation.py
@@ -36,7 +36,7 @@
 	fixed_asset_account, accumulated_depreciation_account, depreciation_expense_account = \
 		get_depreciation_accounts(asset)
 
-	depreciation_cost_center, depreciation_series = frappe.get_cached_value('Company',  asset.company, 
+	depreciation_cost_center, depreciation_series = frappe.get_cached_value('Company',  asset.company,
 		["depreciation_cost_center", "series_for_depreciation_entry"])
 
 	depreciation_cost_center = asset.cost_center or depreciation_cost_center
@@ -70,7 +70,7 @@
 			je.submit()
 
 			d.db_set("journal_entry", je.name)
-			
+
 			idx = cint(d.finance_book_id)
 			finance_books = asset.get('finance_books')[idx - 1]
 			finance_books.value_after_depreciation -= d.depreciation_amount
@@ -88,15 +88,15 @@
 		fieldname = ['fixed_asset_account', 'accumulated_depreciation_account',
 			'depreciation_expense_account'], as_dict=1)
 
-	if accounts:	
+	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',  asset.company, 
+		accounts = frappe.get_cached_value('Company',  asset.company,
 			["accumulated_depreciation_account", "depreciation_expense_account"])
-		
+
 		if not accumulated_depreciation_account:
 			accumulated_depreciation_account = accounts[0]
 		if not depreciation_expense_account:
@@ -135,11 +135,11 @@
 
 	je.flags.ignore_permissions = True
 	je.submit()
-	
+
 	frappe.db.set_value("Asset", asset_name, "disposal_date", today())
 	frappe.db.set_value("Asset", asset_name, "journal_entry_for_scrap", je.name)
 	asset.set_status("Scrapped")
-	
+
 	frappe.msgprint(_("Asset scrapped via Journal Entry {0}").format(je.name))
 
 @frappe.whitelist()
@@ -147,21 +147,29 @@
 	asset = frappe.get_doc("Asset", asset_name)
 
 	je = asset.journal_entry_for_scrap
-	
+
 	asset.db_set("disposal_date", None)
 	asset.db_set("journal_entry_for_scrap", None)
-	
+
 	frappe.get_doc("Journal Entry", je).cancel()
 
 	asset.set_status()
 
 @frappe.whitelist()
-def get_gl_entries_on_asset_disposal(asset, selling_amount=0):
+def get_gl_entries_on_asset_disposal(asset, selling_amount=0, finance_book=None):
 	fixed_asset_account, accumulated_depr_account, depr_expense_account = get_depreciation_accounts(asset)
 	disposal_account, depreciation_cost_center = get_disposal_account_and_cost_center(asset.company)
 	depreciation_cost_center = asset.cost_center or depreciation_cost_center
 
-	accumulated_depr_amount = flt(asset.gross_purchase_amount) - flt(asset.value_after_depreciation)
+	idx = 1
+	if finance_book:
+		for d in asset.finance_books:
+			if d.finance_book == finance_book:
+				idx = d.idx
+				break
+
+	value_after_depreciation = asset.finance_books[idx - 1].value_after_depreciation
+	accumulated_depr_amount = flt(asset.gross_purchase_amount) - flt(value_after_depreciation)
 
 	gl_entries = [
 		{
@@ -176,7 +184,7 @@
 		}
 	]
 
-	profit_amount = flt(selling_amount) - flt(asset.value_after_depreciation)
+	profit_amount = flt(selling_amount) - flt(value_after_depreciation)
 	if profit_amount:
 		debit_or_credit = "debit" if profit_amount < 0 else "credit"
 		gl_entries.append({
@@ -190,7 +198,7 @@
 
 @frappe.whitelist()
 def get_disposal_account_and_cost_center(company):
-	disposal_account, depreciation_cost_center = frappe.get_cached_value('Company',  company, 
+	disposal_account, depreciation_cost_center = frappe.get_cached_value('Company',  company,
 		["disposal_account", "depreciation_cost_center"])
 
 	if not disposal_account:
diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py
index ef85ffa..fceccfb 100644
--- a/erpnext/assets/doctype/asset/test_asset.py
+++ b/erpnext/assets/doctype/asset/test_asset.py
@@ -366,8 +366,9 @@
 		self.assertTrue(asset.journal_entry_for_scrap)
 
 		expected_gle = (
-			("_Test Accumulated Depreciations - _TC", 100000.0, 0.0),
-			("_Test Fixed Asset - _TC", 0.0, 100000.0)
+			("_Test Accumulated Depreciations - _TC", 147.54, 0.0),
+			("_Test Fixed Asset - _TC", 0.0, 100000.0),
+			("_Test Gain/Loss on Asset Disposal - _TC", 99852.46, 0.0)
 		)
 
 		gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
@@ -411,9 +412,9 @@
 		self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Sold")
 
 		expected_gle = (
-			("_Test Accumulated Depreciations - _TC", 100000.0, 0.0),
+			("_Test Accumulated Depreciations - _TC", 23051.47, 0.0),
 			("_Test Fixed Asset - _TC", 0.0, 100000.0),
-			("_Test Gain/Loss on Asset Disposal - _TC", 0, 25000.0),
+			("_Test Gain/Loss on Asset Disposal - _TC", 51948.53, 0.0),
 			("Debtors - _TC", 25000.0, 0.0)
 		)