fix(Asset Repair): Return Depreciation Schedule to original state on cancellation
diff --git a/erpnext/assets/doctype/asset_repair/asset_repair.py b/erpnext/assets/doctype/asset_repair/asset_repair.py
index e7b8b45..01b3688 100644
--- a/erpnext/assets/doctype/asset_repair/asset_repair.py
+++ b/erpnext/assets/doctype/asset_repair/asset_repair.py
@@ -42,15 +42,25 @@
 				self.modify_depreciation_schedule()
 
 		self.asset_doc.flags.ignore_validate_update_after_submit = True
+		self.asset_doc.prepare_depreciation_data()
 		self.asset_doc.save()
 
 	def on_cancel(self):
+		self.asset_doc = frappe.get_doc('Asset', self.asset)
+
 		if self.get('stock_consumption') or self.get('capitalize_repair_cost'):
 			self.decrease_asset_value()
 		if self.get('stock_consumption'):
 			self.increase_stock_quantity()
 		if self.get('capitalize_repair_cost'):
+			self.ignore_linked_doctypes = ('GL Entry', 'Stock Ledger Entry')
 			self.make_gl_entries(cancel=True)
+			if frappe.db.get_value('Asset', self.asset, 'calculate_depreciation') and self.increase_in_asset_life:
+				self.revert_depreciation_schedule_on_cancellation()
+
+		self.asset_doc.flags.ignore_validate_update_after_submit = True
+		self.asset_doc.prepare_depreciation_data()
+		self.asset_doc.save()
 
 	def check_repair_status(self):
 		if self.repair_status == "Pending":
@@ -101,7 +111,8 @@
 			stock_entry.append('items', {
 				"s_warehouse": self.warehouse,
 				"item_code": stock_item.item,
-				"qty": stock_item.consumed_quantity
+				"qty": stock_item.consumed_quantity,
+				"basic_rate": stock_item.valuation_rate
 			})
 
 		stock_entry.insert()
@@ -118,7 +129,7 @@
 
 		for stock_item in self.get('stock_items'):
 			stock_entry.append('items', {
-				"s_warehouse": self.warehouse,
+				"t_warehouse": self.warehouse,
 				"item_code": stock_item.item,
 				"qty": stock_item.consumed_quantity
 			})
@@ -126,6 +137,8 @@
 		stock_entry.insert()
 		stock_entry.submit()
 
+		self.stock_entry = stock_entry.name
+
 	def make_gl_entries(self, cancel=False):
 		if flt(self.repair_cost) > 0:
 			gl_entries = self.get_gl_entries()
@@ -216,6 +229,34 @@
 		if asset.to_date > schedule_date:
 			row.total_number_of_depreciations += 1
 
+	def revert_depreciation_schedule_on_cancellation(self):
+		for row in self.asset_doc.finance_books:
+			row.total_number_of_depreciations -= self.increase_in_asset_life/row.frequency_of_depreciation
+
+			self.asset_doc.flags.increase_in_asset_life = False
+			extra_months = self.increase_in_asset_life % row.frequency_of_depreciation
+			if extra_months != 0:
+				self.calculate_last_schedule_date_before_modification(self.asset_doc, row, extra_months)
+
+	def calculate_last_schedule_date_before_modification(self, asset, row, extra_months):
+		asset.flags.increase_in_asset_life = True
+		number_of_pending_depreciations = cint(row.total_number_of_depreciations) - \
+			cint(asset.number_of_depreciations_booked)
+
+		# the Schedule Date in the final row of the modified Depreciation Schedule
+		last_schedule_date = asset.schedules[len(asset.schedules)-1].schedule_date
+
+		# the Schedule Date in the final row of the original Depreciation Schedule
+		asset.to_date = add_months(last_schedule_date, -extra_months)
+
+		# the latest possible date at which the depreciation can occur, without decreasing the Total Number of Depreciations
+		# if depreciations happen yearly and the Depreciation Posting Date is 01-01-2020, this could be 01-01-2021, 01-01-2022...
+		schedule_date = add_months(row.depreciation_start_date,
+			(number_of_pending_depreciations - 1) * cint(row.frequency_of_depreciation))
+
+		if asset.to_date < schedule_date:
+			row.total_number_of_depreciations -= 1
+
 @frappe.whitelist()
 def get_downtime(failure_date, completion_date):
 	downtime = time_diff_in_hours(completion_date, failure_date)