Merge branch 'marination-account_stock_sync_error' into develop
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py
index bf7e833..9530fc9 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.py
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py
@@ -931,9 +931,9 @@
 			grand_total = doc.rounded_total or doc.grand_total
 		outstanding_amount = doc.outstanding_amount
 	elif dt in ("Expense Claim"):
-		grand_total = doc.total_sanctioned_amount
-		outstanding_amount = doc.total_sanctioned_amount \
-			- doc.total_amount_reimbursed - flt(doc.total_advance_amount)
+		grand_total = doc.total_sanctioned_amount + doc.total_taxes_and_charges
+		outstanding_amount = doc.grand_total \
+			- doc.total_amount_reimbursed
 	elif dt == "Employee Advance":
 		grand_total = doc.advance_amount
 		outstanding_amount = flt(doc.advance_amount) - flt(doc.paid_amount)
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index 19d54a0..75107b0 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -237,7 +237,7 @@
 					item.expense_account = warehouse_account[item.warehouse]["account"]
 				else:
 					item.expense_account = stock_not_billed_account
-			elif item.is_fixed_asset and not is_cwip_accounting_enabled(self.company, asset_category):
+			elif item.is_fixed_asset and not is_cwip_accounting_enabled(asset_category):
 				item.expense_account = get_asset_category_account('fixed_asset_account', item=item.item_code,
 					company = self.company)
 			elif item.is_fixed_asset and item.pr_detail:
@@ -408,7 +408,7 @@
 		for item in self.get("items"):
 			if item.item_code and item.is_fixed_asset:
 				asset_category = frappe.get_cached_value("Item", item.item_code, "asset_category")
-				if is_cwip_accounting_enabled(self.company, asset_category):
+				if is_cwip_accounting_enabled(asset_category):
 					return 1
 		return 0
 
@@ -504,8 +504,7 @@
 							"credit": flt(item.rm_supp_cost)
 						}, warehouse_account[self.supplier_warehouse]["account_currency"], item=item))
 
-				elif not item.is_fixed_asset or (item.is_fixed_asset and not is_cwip_accounting_enabled(self.company,
-					asset_category)):
+				elif not item.is_fixed_asset or (item.is_fixed_asset and not is_cwip_accounting_enabled(asset_category)):
 					expense_account = (item.expense_account
 						if (not item.enable_deferred_expense or self.is_return) else item.deferred_expense_account)
 					
diff --git a/erpnext/accounts/general_ledger.py b/erpnext/accounts/general_ledger.py
index 3a24147..7a48fcc 100644
--- a/erpnext/accounts/general_ledger.py
+++ b/erpnext/accounts/general_ledger.py
@@ -191,11 +191,7 @@
 					})
 
 def validate_cwip_accounts(gl_map):
-	cwip_enabled = cint(frappe.get_cached_value("Company",
-		gl_map[0].company, "enable_cwip_accounting"))
-
-	if not cwip_enabled:
-		cwip_enabled = any([cint(ac.enable_cwip_accounting) for ac in frappe.db.get_all("Asset Category","enable_cwip_accounting")])
+	cwip_enabled = any([cint(ac.enable_cwip_accounting) for ac in frappe.db.get_all("Asset Category","enable_cwip_accounting")])
 
 	if cwip_enabled and gl_map[0].voucher_type == "Journal Entry":
 			cwip_accounts = [d[0] for d in frappe.db.sql("""select name from tabAccount
diff --git a/erpnext/assets/doctype/asset/asset.js b/erpnext/assets/doctype/asset/asset.js
index f0889bf..6b3f2c7 100644
--- a/erpnext/assets/doctype/asset/asset.js
+++ b/erpnext/assets/doctype/asset/asset.js
@@ -42,6 +42,24 @@
 	},
 
 	setup: function(frm) {
+		frm.make_methods = {
+			'Asset Movement': () => {
+				frappe.call({
+				method: "erpnext.assets.doctype.asset.asset.make_asset_movement",
+				freeze: true,
+				args:{
+					"assets": [{ name: cur_frm.doc.name }]
+				},
+				callback: function (r) {
+					if (r.message) {
+						var doc = frappe.model.sync(r.message)[0];
+						frappe.set_route("Form", doc.doctype, doc.name);
+					}
+				}
+			});
+			},
+		}
+
 		frm.set_query("purchase_receipt", (doc) => {
 			return {
 				query: "erpnext.controllers.queries.get_purchase_receipts",
@@ -487,92 +505,19 @@
 	})
 };
 
-erpnext.asset.transfer_asset = function(frm) {
-	var dialog = new frappe.ui.Dialog({
-		title: __("Transfer Asset"),
-		fields: [
-			{
-				"label": __("Target Location"),
-				"fieldname": "target_location",
-				"fieldtype": "Link",
-				"options": "Location",
-				"get_query": function () {
-					return {
-						filters: [
-							["Location", "is_group", "=", 0]
-						]
-					}
-				},
-				"reqd": 1
-			},
-			{
-				"label": __("Select Serial No"),
-				"fieldname": "serial_nos",
-				"fieldtype": "Link",
-				"options": "Serial No",
-				"get_query": function () {
-					return {
-						filters: {
-							'asset': frm.doc.name
-						}
-					}
-				},
-				"onchange": function() {
-					let val = this.get_value();
-					if (val) {
-						let serial_nos = dialog.get_value("serial_no") || val;
-						if (serial_nos) {
-							serial_nos = serial_nos.split('\n');
-							serial_nos.push(val);
-
-							const unique_sn = serial_nos.filter(function(elem, index, self) {
-							    return index === self.indexOf(elem);
-							});
-
-							dialog.set_value("serial_no", unique_sn.join('\n'));
-							dialog.set_value("serial_nos", "");
-						}
-					}
-				}
-			},
-			{
-				"label": __("Serial No"),
-				"fieldname": "serial_no",
-				"read_only": 1,
-				"fieldtype": "Small Text"
-			},
-			{
-				"label": __("Date"),
-				"fieldname": "transfer_date",
-				"fieldtype": "Datetime",
-				"reqd": 1,
-				"default": frappe.datetime.now_datetime()
+erpnext.asset.transfer_asset = function() {
+	frappe.call({
+		method: "erpnext.assets.doctype.asset.asset.make_asset_movement",
+		freeze: true,
+		args:{
+			"assets": [{ name: cur_frm.doc.name }],
+			"purpose": "Transfer"
+		},
+		callback: function (r) {
+			if (r.message) {
+				var doc = frappe.model.sync(r.message)[0];
+				frappe.set_route("Form", doc.doctype, doc.name);
 			}
-		]
+		}
 	});
-
-	dialog.set_primary_action(__("Transfer"), function() {
-		var args = dialog.get_values();
-		if(!args) return;
-		dialog.hide();
-		return frappe.call({
-			type: "GET",
-			method: "erpnext.assets.doctype.asset.asset.transfer_asset",
-			args: {
-				args: {
-					"asset": frm.doc.name,
-					"transaction_date": args.transfer_date,
-					"source_location": frm.doc.location,
-					"target_location": args.target_location,
-					"serial_no": args.serial_no,
-					"company": frm.doc.company
-				}
-			},
-			freeze: true,
-			callback: function(r) {
-				cur_frm.reload_doc();
-			}
-		})
-	});
-	dialog.show();
 };
diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py
index 9415eed..546f374 100644
--- a/erpnext/assets/doctype/asset/asset.py
+++ b/erpnext/assets/doctype/asset/asset.py
@@ -31,8 +31,7 @@
 		self.validate_in_use_date()
 		self.set_status()
 		self.make_asset_movement()
-		if not self.booked_fixed_asset and is_cwip_accounting_enabled(self.company,
-			self.asset_category):
+		if not self.booked_fixed_asset and is_cwip_accounting_enabled(self.asset_category):
 			self.make_gl_entries()
 		
 	def before_cancel(self):
@@ -99,7 +98,7 @@
 		if not flt(self.gross_purchase_amount):
 			frappe.throw(_("Gross Purchase Amount is mandatory"), frappe.MandatoryError)
 
-		if is_cwip_accounting_enabled(self.company, self.asset_category):
+		if is_cwip_accounting_enabled(self.asset_category):
 			if not self.is_existing_asset and not (self.purchase_receipt or self.purchase_invoice):
 				frappe.throw(_("Please create purchase receipt or purchase invoice for the item {0}").
 					format(self.item_code))
@@ -295,7 +294,9 @@
 				.format(row.idx))
 
 		if not row.depreciation_start_date:
-			frappe.throw(_("Row {0}: Depreciation Start Date is required").format(row.idx))
+			if not self.available_for_use_date:
+				frappe.throw(_("Row {0}: Depreciation Start Date is required").format(row.idx))
+			row.depreciation_start_date = self.available_for_use_date
 
 		if not self.is_existing_asset:
 			self.opening_accumulated_depreciation = 0
@@ -514,7 +515,7 @@
 			asset.set_status('Out of Order')
 
 def make_post_gl_entry():
-	if not is_cwip_accounting_enabled(self.company, self.asset_category):
+	if not is_cwip_accounting_enabled(self.asset_category):
 		return
 
 	assets = frappe.db.sql_list(""" select name from `tabAsset`
@@ -646,7 +647,7 @@
 	return je
 
 @frappe.whitelist()
-def make_asset_movement(assets):
+def make_asset_movement(assets, purpose=None):
 	import json
 	from six import string_types
 	
@@ -657,7 +658,7 @@
 		frappe.throw(_('Atleast one asset has to be selected.'))
 
 	asset_movement = frappe.new_doc("Asset Movement")
-	asset_movement.quantity = len(assets)
+	asset_movement.purpose = purpose
 	prev_reference_docname = ''
 
 	for asset in assets:
@@ -683,12 +684,7 @@
 	if asset_movement.get('assets'):
 		return asset_movement.as_dict()
 
-def is_cwip_accounting_enabled(company, asset_category=None):
-	enable_cwip_in_company = cint(frappe.db.get_value("Company", company, "enable_cwip_accounting"))
-
-	if enable_cwip_in_company or not asset_category:
-		return enable_cwip_in_company
-
+def is_cwip_accounting_enabled(asset_category):
 	return cint(frappe.db.get_value("Asset Category", asset_category, "enable_cwip_accounting"))
 
 def get_pro_rata_amt(row, depreciation_amount, from_date, to_date):
diff --git a/erpnext/assets/doctype/asset/asset_list.js b/erpnext/assets/doctype/asset/asset_list.js
index 46cde6e..02f39e0 100644
--- a/erpnext/assets/doctype/asset/asset_list.js
+++ b/erpnext/assets/doctype/asset/asset_list.js
@@ -37,6 +37,7 @@
 			const assets = me.get_checked_items();
 			frappe.call({
 				method: "erpnext.assets.doctype.asset.asset.make_asset_movement",
+				freeze: true,
 				args:{
 					"assets": assets
 				},
diff --git a/erpnext/assets/doctype/asset/test_asset.py b/erpnext/assets/doctype/asset/test_asset.py
index 53fd6d3..a56440d 100644
--- a/erpnext/assets/doctype/asset/test_asset.py
+++ b/erpnext/assets/doctype/asset/test_asset.py
@@ -69,508 +69,508 @@
 		self.assertFalse(frappe.db.get_value("GL Entry",
 			{"voucher_type": "Purchase Invoice", "voucher_no": pi.name}))
 
-	# def test_is_fixed_asset_set(self):
-	# 	asset = create_asset(is_existing_asset = 1)
-	# 	doc = frappe.new_doc('Purchase Invoice')
-	# 	doc.supplier = '_Test Supplier'
-	# 	doc.append('items', {
-	# 		'item_code': 'Macbook Pro',
-	# 		'qty': 1,
-	# 		'asset': asset.name
-	# 	})
+	def test_is_fixed_asset_set(self):
+		asset = create_asset(is_existing_asset = 1)
+		doc = frappe.new_doc('Purchase Invoice')
+		doc.supplier = '_Test Supplier'
+		doc.append('items', {
+			'item_code': 'Macbook Pro',
+			'qty': 1,
+			'asset': asset.name
+		})
 
-	# 	doc.set_missing_values()
-	# 	self.assertEquals(doc.items[0].is_fixed_asset, 1)
+		doc.set_missing_values()
+		self.assertEquals(doc.items[0].is_fixed_asset, 1)
 
 
-	# def test_schedule_for_straight_line_method(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=100000.0, location="Test Location")
+	def test_schedule_for_straight_line_method(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=100000.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-01-01'
-	# 	asset.purchase_date = '2030-01-01'
+		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-01-01'
+		asset.purchase_date = '2030-01-01'
 
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Straight Line",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 12,
-	# 		"depreciation_start_date": "2030-12-31"
-	# 	})
-	# 	asset.save()
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Straight Line",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 12,
+			"depreciation_start_date": "2030-12-31"
+		})
+		asset.save()
 
-	# 	self.assertEqual(asset.status, "Draft")
-	# 	expected_schedules = [
-	# 		["2030-12-31", 30000.00, 30000.00],
-	# 		["2031-12-31", 30000.00, 60000.00],
-	# 		["2032-12-31", 30000.00, 90000.00]
-	# 	]
+		self.assertEqual(asset.status, "Draft")
+		expected_schedules = [
+			["2030-12-31", 30000.00, 30000.00],
+			["2031-12-31", 30000.00, 60000.00],
+			["2032-12-31", 30000.00, 90000.00]
+		]
 
-	# 	schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
-	# 		for d in asset.get("schedules")]
+		schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
+			for d in asset.get("schedules")]
 
-	# 	self.assertEqual(schedules, expected_schedules)
+		self.assertEqual(schedules, expected_schedules)
 
-	# def test_schedule_for_straight_line_method_for_existing_asset(self):
-	# 	create_asset(is_existing_asset=1)
-	# 	asset = frappe.get_doc("Asset", {"asset_name": "Macbook Pro 1"})
-	# 	asset.calculate_depreciation = 1
-	# 	asset.number_of_depreciations_booked = 1
-	# 	asset.opening_accumulated_depreciation = 40000
-	# 	asset.available_for_use_date = "2030-06-06"
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Straight Line",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 12,
-	# 		"depreciation_start_date": "2030-12-31"
-	# 	})
-	# 	asset.insert()
-	# 	self.assertEqual(asset.status, "Draft")
-	# 	asset.save()
-	# 	expected_schedules = [
-	# 		["2030-12-31", 14246.58, 54246.58],
-	# 		["2031-12-31", 25000.00, 79246.58],
-	# 		["2032-06-06", 10753.42, 90000.00]
-	# 	]
-	# 	schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), d.accumulated_depreciation_amount]
-	# 		for d in asset.get("schedules")]
+	def test_schedule_for_straight_line_method_for_existing_asset(self):
+		create_asset(is_existing_asset=1)
+		asset = frappe.get_doc("Asset", {"asset_name": "Macbook Pro 1"})
+		asset.calculate_depreciation = 1
+		asset.number_of_depreciations_booked = 1
+		asset.opening_accumulated_depreciation = 40000
+		asset.available_for_use_date = "2030-06-06"
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Straight Line",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 12,
+			"depreciation_start_date": "2030-12-31"
+		})
+		asset.insert()
+		self.assertEqual(asset.status, "Draft")
+		asset.save()
+		expected_schedules = [
+			["2030-12-31", 14246.58, 54246.58],
+			["2031-12-31", 25000.00, 79246.58],
+			["2032-06-06", 10753.42, 90000.00]
+		]
+		schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), d.accumulated_depreciation_amount]
+			for d in asset.get("schedules")]
 
-	# 	self.assertEqual(schedules, expected_schedules)
+		self.assertEqual(schedules, expected_schedules)
 
-	# def test_schedule_for_double_declining_method(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=100000.0, location="Test Location")
+	def test_schedule_for_double_declining_method(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=100000.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-01-01'
-	# 	asset.purchase_date = '2030-01-01'
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Double Declining Balance",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 12,
-	# 		"depreciation_start_date": '2030-12-31'
-	# 	})
-	# 	asset.insert()
-	# 	self.assertEqual(asset.status, "Draft")
-	# 	asset.save()
+		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-01-01'
+		asset.purchase_date = '2030-01-01'
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Double Declining Balance",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 12,
+			"depreciation_start_date": '2030-12-31'
+		})
+		asset.insert()
+		self.assertEqual(asset.status, "Draft")
+		asset.save()
 
-	# 	expected_schedules = [
-	# 		['2030-12-31', 66667.00, 66667.00],
-	# 		['2031-12-31', 22222.11, 88889.11],
-	# 		['2032-12-31', 1110.89, 90000.0]
-	# 	]
+		expected_schedules = [
+			['2030-12-31', 66667.00, 66667.00],
+			['2031-12-31', 22222.11, 88889.11],
+			['2032-12-31', 1110.89, 90000.0]
+		]
 
-	# 	schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
-	# 		for d in asset.get("schedules")]
+		schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
+			for d in asset.get("schedules")]
 
-	# 	self.assertEqual(schedules, expected_schedules)
+		self.assertEqual(schedules, expected_schedules)
 
-	# def test_schedule_for_double_declining_method_for_existing_asset(self):
-	# 	create_asset(is_existing_asset = 1)
-	# 	asset = frappe.get_doc("Asset", {"asset_name": "Macbook Pro 1"})
-	# 	asset.calculate_depreciation = 1
-	# 	asset.is_existing_asset = 1
-	# 	asset.number_of_depreciations_booked = 1
-	# 	asset.opening_accumulated_depreciation = 50000
-	# 	asset.available_for_use_date = '2030-01-01'
-	# 	asset.purchase_date = '2029-11-30'
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Double Declining Balance",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 12,
-	# 		"depreciation_start_date": "2030-12-31"
-	# 	})
-	# 	asset.insert()
-	# 	self.assertEqual(asset.status, "Draft")
+	def test_schedule_for_double_declining_method_for_existing_asset(self):
+		create_asset(is_existing_asset = 1)
+		asset = frappe.get_doc("Asset", {"asset_name": "Macbook Pro 1"})
+		asset.calculate_depreciation = 1
+		asset.is_existing_asset = 1
+		asset.number_of_depreciations_booked = 1
+		asset.opening_accumulated_depreciation = 50000
+		asset.available_for_use_date = '2030-01-01'
+		asset.purchase_date = '2029-11-30'
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Double Declining Balance",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 12,
+			"depreciation_start_date": "2030-12-31"
+		})
+		asset.insert()
+		self.assertEqual(asset.status, "Draft")
 
-	# 	expected_schedules = [
-	# 		["2030-12-31", 33333.50, 83333.50],
-	# 		["2031-12-31", 6666.50, 90000.0]
-	# 	]
+		expected_schedules = [
+			["2030-12-31", 33333.50, 83333.50],
+			["2031-12-31", 6666.50, 90000.0]
+		]
 
-	# 	schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
-	# 		for d in asset.get("schedules")]
+		schedules = [[cstr(d.schedule_date), d.depreciation_amount, d.accumulated_depreciation_amount]
+			for d in asset.get("schedules")]
 
-	# 	self.assertEqual(schedules, expected_schedules)
+		self.assertEqual(schedules, expected_schedules)
 
-	# def test_schedule_for_prorated_straight_line_method(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=100000.0, location="Test Location")
+	def test_schedule_for_prorated_straight_line_method(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=100000.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.purchase_date = '2030-01-30'
-	# 	asset.is_existing_asset = 0
-	# 	asset.available_for_use_date = "2030-01-30"
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Straight Line",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 12,
-	# 		"depreciation_start_date": "2030-12-31"
-	# 	})
+		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 = '2030-01-30'
+		asset.is_existing_asset = 0
+		asset.available_for_use_date = "2030-01-30"
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Straight Line",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 12,
+			"depreciation_start_date": "2030-12-31"
+		})
 
-	# 	asset.insert()
-	# 	asset.save()
+		asset.insert()
+		asset.save()
 
-	# 	expected_schedules = [
-	# 		["2030-12-31", 27534.25, 27534.25],
-	# 		["2031-12-31", 30000.0, 57534.25],
-	# 		["2032-12-31", 30000.0, 87534.25],
-	# 		["2033-01-30", 2465.75, 90000.0]
-	# 	]
+		expected_schedules = [
+			["2030-12-31", 27534.25, 27534.25],
+			["2031-12-31", 30000.0, 57534.25],
+			["2032-12-31", 30000.0, 87534.25],
+			["2033-01-30", 2465.75, 90000.0]
+		]
 
-	# 	schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)]
-	# 		for d in asset.get("schedules")]
+		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)
+		self.assertEqual(schedules, expected_schedules)
 
-	# def test_depreciation(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=100000.0, location="Test Location")
+	def test_depreciation(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=100000.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.purchase_date = '2020-01-30'
-	# 	asset.available_for_use_date = "2020-01-30"
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Straight Line",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 10,
-	# 		"depreciation_start_date": "2020-12-31"
-	# 	})
-	# 	asset.insert()
-	# 	asset.submit()
-	# 	asset.load_from_db()
-	# 	self.assertEqual(asset.status, "Submitted")
+		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-01-30'
+		asset.available_for_use_date = "2020-01-30"
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Straight Line",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 10,
+			"depreciation_start_date": "2020-12-31"
+		})
+		asset.insert()
+		asset.submit()
+		asset.load_from_db()
+		self.assertEqual(asset.status, "Submitted")
 
-	# 	frappe.db.set_value("Company", "_Test Company", "series_for_depreciation_entry", "DEPR-")
-	# 	post_depreciation_entries(date="2021-01-01")
-	# 	asset.load_from_db()
+		frappe.db.set_value("Company", "_Test Company", "series_for_depreciation_entry", "DEPR-")
+		post_depreciation_entries(date="2021-01-01")
+		asset.load_from_db()
 
-	# 	# check depreciation entry series
-	# 	self.assertEqual(asset.get("schedules")[0].journal_entry[:4], "DEPR")
+		# check depreciation entry series
+		self.assertEqual(asset.get("schedules")[0].journal_entry[:4], "DEPR")
 
-	# 	expected_gle = (
-	# 		("_Test Accumulated Depreciations - _TC", 0.0, 30000.0),
-	# 		("_Test Depreciations - _TC", 30000.0, 0.0)
-	# 	)
+		expected_gle = (
+			("_Test Accumulated Depreciations - _TC", 0.0, 30000.0),
+			("_Test Depreciations - _TC", 30000.0, 0.0)
+		)
 
-	# 	gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
-	# 		where against_voucher_type='Asset' and against_voucher = %s
-	# 		order by account""", asset.name)
+		gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+			where against_voucher_type='Asset' and against_voucher = %s
+			order by account""", asset.name)
 
-	# 	self.assertEqual(gle, expected_gle)
-	# 	self.assertEqual(asset.get("value_after_depreciation"), 0)
+		self.assertEqual(gle, expected_gle)
+		self.assertEqual(asset.get("value_after_depreciation"), 0)
 
-	# def test_depreciation_entry_for_wdv_without_pro_rata(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=8000.0, location="Test Location")
+	def test_depreciation_entry_for_wdv_without_pro_rata(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-01-01'
-	# 	asset.purchase_date = '2030-01-01'
-	# 	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)
+		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-01-01'
+		asset.purchase_date = '2030-01-01'
+		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)
+		self.assertEqual(asset.finance_books[0].rate_of_depreciation, 50.0)
 
-	# 	expected_schedules = [
-	# 		["2030-12-31", 4000.00, 4000.00],
-	# 		["2031-12-31", 2000.00, 6000.00],
-	# 		["2032-12-31", 1000.00, 7000.0],
-	# 	]
+		expected_schedules = [
+			["2030-12-31", 4000.00, 4000.00],
+			["2031-12-31", 2000.00, 6000.00],
+			["2032-12-31", 1000.00, 7000.0],
+		]
 
-	# 	schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)]
-	# 		for d in asset.get("schedules")]
+		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)
+		self.assertEqual(schedules, expected_schedules)
 
-	# def test_pro_rata_depreciation_entry_for_wdv(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=8000.0, location="Test Location")
+	def test_pro_rata_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-01-01'
-	# 	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)
+		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-01-01'
+		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)
+		self.assertEqual(asset.finance_books[0].rate_of_depreciation, 50.0)
 
-	# 	expected_schedules = [
-	# 		["2030-12-31", 2279.45, 2279.45],
-	# 		["2031-12-31", 2860.28, 5139.73],
-	# 		["2032-12-31", 1430.14, 6569.87],
-	# 		["2033-06-06", 430.13, 7000.0],
-	# 	]
+		expected_schedules = [
+			["2030-12-31", 2279.45, 2279.45],
+			["2031-12-31", 2860.28, 5139.73],
+			["2032-12-31", 1430.14, 6569.87],
+			["2033-06-06", 430.13, 7000.0],
+		]
 
-	# 	schedules = [[cstr(d.schedule_date), flt(d.depreciation_amount, 2), flt(d.accumulated_depreciation_amount, 2)]
-	# 		for d in asset.get("schedules")]
+		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)
+		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")
+	def test_depreciation_entry_cancellation(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=100000.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 = '2020-06-06'
-	# 	asset.purchase_date = '2020-06-06'
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Straight Line",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 10,
-	# 		"depreciation_start_date": "2020-12-31"
-	# 	})
-	# 	asset.insert()
-	# 	asset.submit()
-	# 	post_depreciation_entries(date="2021-01-01")
+		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 = '2020-06-06'
+		asset.purchase_date = '2020-06-06'
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Straight Line",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 10,
+			"depreciation_start_date": "2020-12-31"
+		})
+		asset.insert()
+		asset.submit()
+		post_depreciation_entries(date="2021-01-01")
 
-	# 	asset.load_from_db()
+		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()
+		# 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)
+		asset.load_from_db()
+		depr_entry = asset.get("schedules")[0].journal_entry
+		self.assertFalse(depr_entry)
 
-	# def test_scrap_asset(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=100000.0, location="Test Location")
+	def test_scrap_asset(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=100000.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 = nowdate()
-	# 	asset.purchase_date = nowdate()
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Straight Line",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 10,
-	# 		"depreciation_start_date": nowdate()
-	# 	})
-	# 	asset.insert()
-	# 	asset.submit()
+		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 = nowdate()
+		asset.purchase_date = nowdate()
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Straight Line",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 10,
+			"depreciation_start_date": nowdate()
+		})
+		asset.insert()
+		asset.submit()
 
-	# 	post_depreciation_entries(date=add_months(nowdate(), 10))
+		post_depreciation_entries(date=add_months(nowdate(), 10))
 
-	# 	scrap_asset(asset.name)
+		scrap_asset(asset.name)
 
-	# 	asset.load_from_db()
-	# 	self.assertEqual(asset.status, "Scrapped")
-	# 	self.assertTrue(asset.journal_entry_for_scrap)
+		asset.load_from_db()
+		self.assertEqual(asset.status, "Scrapped")
+		self.assertTrue(asset.journal_entry_for_scrap)
 
-	# 	expected_gle = (
-	# 		("_Test Accumulated Depreciations - _TC", 30000.0, 0.0),
-	# 		("_Test Fixed Asset - _TC", 0.0, 100000.0),
-	# 		("_Test Gain/Loss on Asset Disposal - _TC", 70000.0, 0.0)
-	# 	)
+		expected_gle = (
+			("_Test Accumulated Depreciations - _TC", 30000.0, 0.0),
+			("_Test Fixed Asset - _TC", 0.0, 100000.0),
+			("_Test Gain/Loss on Asset Disposal - _TC", 70000.0, 0.0)
+		)
 
-	# 	gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
-	# 		where voucher_type='Journal Entry' and voucher_no = %s
-	# 		order by account""", asset.journal_entry_for_scrap)
-	# 	self.assertEqual(gle, expected_gle)
+		gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+			where voucher_type='Journal Entry' and voucher_no = %s
+			order by account""", asset.journal_entry_for_scrap)
+		self.assertEqual(gle, expected_gle)
 
-	# 	restore_asset(asset.name)
+		restore_asset(asset.name)
 
-	# 	asset.load_from_db()
-	# 	self.assertFalse(asset.journal_entry_for_scrap)
-	# 	self.assertEqual(asset.status, "Partially Depreciated")
+		asset.load_from_db()
+		self.assertFalse(asset.journal_entry_for_scrap)
+		self.assertEqual(asset.status, "Partially Depreciated")
 
-	# def test_asset_sale(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=100000.0, location="Test Location")
+	def test_asset_sale(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=100000.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 = '2020-06-06'
-	# 	asset.purchase_date = '2020-06-06'
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Straight Line",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 10,
-	# 		"depreciation_start_date": "2020-12-31"
-	# 	})
-	# 	asset.insert()
-	# 	asset.submit()
-	# 	post_depreciation_entries(date="2021-01-01")
+		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 = '2020-06-06'
+		asset.purchase_date = '2020-06-06'
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Straight Line",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 10,
+			"depreciation_start_date": "2020-12-31"
+		})
+		asset.insert()
+		asset.submit()
+		post_depreciation_entries(date="2021-01-01")
 
-	# 	si = make_sales_invoice(asset=asset.name, item_code="Macbook Pro", company="_Test Company")
-	# 	si.customer = "_Test Customer"
-	# 	si.due_date = nowdate()
-	# 	si.get("items")[0].rate = 25000
-	# 	si.insert()
-	# 	si.submit()
+		si = make_sales_invoice(asset=asset.name, item_code="Macbook Pro", company="_Test Company")
+		si.customer = "_Test Customer"
+		si.due_date = nowdate()
+		si.get("items")[0].rate = 25000
+		si.insert()
+		si.submit()
 
-	# 	self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Sold")
+		self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Sold")
 
-	# 	expected_gle = (
-	# 		("_Test Accumulated Depreciations - _TC", 20392.16, 0.0),
-	# 		("_Test Fixed Asset - _TC", 0.0, 100000.0),
-	# 		("_Test Gain/Loss on Asset Disposal - _TC", 54607.84, 0.0),
-	# 		("Debtors - _TC", 25000.0, 0.0)
-	# 	)
+		expected_gle = (
+			("_Test Accumulated Depreciations - _TC", 20392.16, 0.0),
+			("_Test Fixed Asset - _TC", 0.0, 100000.0),
+			("_Test Gain/Loss on Asset Disposal - _TC", 54607.84, 0.0),
+			("Debtors - _TC", 25000.0, 0.0)
+		)
 
-	# 	gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
-	# 		where voucher_type='Sales Invoice' and voucher_no = %s
-	# 		order by account""", si.name)
+		gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+			where voucher_type='Sales Invoice' and voucher_no = %s
+			order by account""", si.name)
 
-	# 	self.assertEqual(gle, expected_gle)
+		self.assertEqual(gle, expected_gle)
 
-	# 	si.cancel()
-	# 	self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Partially Depreciated")
+		si.cancel()
+		self.assertEqual(frappe.db.get_value("Asset", asset.name, "status"), "Partially Depreciated")
 
-	# def test_asset_expected_value_after_useful_life(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=100000.0, location="Test Location")
+	def test_asset_expected_value_after_useful_life(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=100000.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 = '2020-06-06'
-	# 	asset.purchase_date = '2020-06-06'
-	# 	asset.append("finance_books", {
-	# 		"expected_value_after_useful_life": 10000,
-	# 		"depreciation_method": "Straight Line",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 10,
-	# 		"depreciation_start_date": "2020-06-06"
-	# 	})
-	# 	asset.insert()
-	# 	accumulated_depreciation_after_full_schedule = \
-	# 		max([d.accumulated_depreciation_amount for d in asset.get("schedules")])
+		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 = '2020-06-06'
+		asset.purchase_date = '2020-06-06'
+		asset.append("finance_books", {
+			"expected_value_after_useful_life": 10000,
+			"depreciation_method": "Straight Line",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 10,
+			"depreciation_start_date": "2020-06-06"
+		})
+		asset.insert()
+		accumulated_depreciation_after_full_schedule = \
+			max([d.accumulated_depreciation_amount for d in asset.get("schedules")])
 
-	# 	asset_value_after_full_schedule = (flt(asset.gross_purchase_amount) -
-	# 		flt(accumulated_depreciation_after_full_schedule))
+		asset_value_after_full_schedule = (flt(asset.gross_purchase_amount) -
+			flt(accumulated_depreciation_after_full_schedule))
 
-	# 	self.assertTrue(asset.finance_books[0].expected_value_after_useful_life >= asset_value_after_full_schedule)
+		self.assertTrue(asset.finance_books[0].expected_value_after_useful_life >= asset_value_after_full_schedule)
 
-	# def test_cwip_accounting(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=1, rate=5000, do_not_submit=True, location="Test Location")
+	def test_cwip_accounting(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=1, rate=5000, do_not_submit=True, location="Test Location")
 
-	# 	pr.set('taxes', [{
-	# 		'category': 'Total',
-	# 		'add_deduct_tax': 'Add',
-	# 		'charge_type': 'On Net Total',
-	# 		'account_head': '_Test Account Service Tax - _TC',
-	# 		'description': '_Test Account Service Tax',
-	# 		'cost_center': 'Main - _TC',
-	# 		'rate': 5.0
-	# 	}, {
-	# 		'category': 'Valuation and Total',
-	# 		'add_deduct_tax': 'Add',
-	# 		'charge_type': 'On Net Total',
-	# 		'account_head': '_Test Account Shipping Charges - _TC',
-	# 		'description': '_Test Account Shipping Charges',
-	# 		'cost_center': 'Main - _TC',
-	# 		'rate': 5.0
-	# 	}])
+		pr.set('taxes', [{
+			'category': 'Total',
+			'add_deduct_tax': 'Add',
+			'charge_type': 'On Net Total',
+			'account_head': '_Test Account Service Tax - _TC',
+			'description': '_Test Account Service Tax',
+			'cost_center': 'Main - _TC',
+			'rate': 5.0
+		}, {
+			'category': 'Valuation and Total',
+			'add_deduct_tax': 'Add',
+			'charge_type': 'On Net Total',
+			'account_head': '_Test Account Shipping Charges - _TC',
+			'description': '_Test Account Shipping Charges',
+			'cost_center': 'Main - _TC',
+			'rate': 5.0
+		}])
 
-	# 	pr.submit()
+		pr.submit()
 
-	# 	expected_gle = (
-	# 		("Asset Received But Not Billed - _TC", 0.0, 5250.0),
-	# 		("CWIP Account - _TC", 5250.0, 0.0)
-	# 	)
+		expected_gle = (
+			("Asset Received But Not Billed - _TC", 0.0, 5250.0),
+			("CWIP Account - _TC", 5250.0, 0.0)
+		)
 
-	# 	pr_gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
-	# 		where voucher_type='Purchase Receipt' and voucher_no = %s
-	# 		order by account""", pr.name)
+		pr_gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+			where voucher_type='Purchase Receipt' and voucher_no = %s
+			order by account""", pr.name)
 
-	# 	self.assertEqual(pr_gle, expected_gle)
+		self.assertEqual(pr_gle, expected_gle)
 
-	# 	pi = make_invoice(pr.name)
-	# 	pi.submit()
+		pi = make_invoice(pr.name)
+		pi.submit()
 
-	# 	expected_gle = (
-	# 		("_Test Account Service Tax - _TC", 250.0, 0.0),
-	# 		("_Test Account Shipping Charges - _TC", 250.0, 0.0),
-	# 		("Asset Received But Not Billed - _TC", 5250.0, 0.0),
-	# 		("Creditors - _TC", 0.0, 5500.0),
-	# 		("Expenses Included In Asset Valuation - _TC", 0.0, 250.0),
-	# 	)
+		expected_gle = (
+			("_Test Account Service Tax - _TC", 250.0, 0.0),
+			("_Test Account Shipping Charges - _TC", 250.0, 0.0),
+			("Asset Received But Not Billed - _TC", 5250.0, 0.0),
+			("Creditors - _TC", 0.0, 5500.0),
+			("Expenses Included In Asset Valuation - _TC", 0.0, 250.0),
+		)
 
-	# 	pi_gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
-	# 		where voucher_type='Purchase Invoice' and voucher_no = %s
-	# 		order by account""", pi.name)
+		pi_gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+			where voucher_type='Purchase Invoice' and voucher_no = %s
+			order by account""", pi.name)
 
-	# 	self.assertEqual(pi_gle, expected_gle)
+		self.assertEqual(pi_gle, expected_gle)
 
-	# 	asset = frappe.db.get_value('Asset',
-	# 		{'purchase_receipt': pr.name, 'docstatus': 0}, 'name')
+		asset = frappe.db.get_value('Asset',
+			{'purchase_receipt': pr.name, 'docstatus': 0}, 'name')
 
-	# 	asset_doc = frappe.get_doc('Asset', asset)
+		asset_doc = frappe.get_doc('Asset', asset)
 
-	# 	month_end_date = get_last_day(nowdate())
-	# 	asset_doc.available_for_use_date = nowdate() if nowdate() != month_end_date else add_days(nowdate(), -15)
-	# 	self.assertEqual(asset_doc.gross_purchase_amount, 5250.0)
+		month_end_date = get_last_day(nowdate())
+		asset_doc.available_for_use_date = nowdate() if nowdate() != month_end_date else add_days(nowdate(), -15)
+		self.assertEqual(asset_doc.gross_purchase_amount, 5250.0)
 
-	# 	asset_doc.append("finance_books", {
-	# 		"expected_value_after_useful_life": 200,
-	# 		"depreciation_method": "Straight Line",
-	# 		"total_number_of_depreciations": 3,
-	# 		"frequency_of_depreciation": 10,
-	# 		"depreciation_start_date": month_end_date
-	# 	})
-	# 	asset_doc.submit()
+		asset_doc.append("finance_books", {
+			"expected_value_after_useful_life": 200,
+			"depreciation_method": "Straight Line",
+			"total_number_of_depreciations": 3,
+			"frequency_of_depreciation": 10,
+			"depreciation_start_date": month_end_date
+		})
+		asset_doc.submit()
 
-	# 	expected_gle = (
-	# 		("_Test Fixed Asset - _TC", 5250.0, 0.0),
-	# 		("CWIP Account - _TC", 0.0, 5250.0)
-	# 	)
+		expected_gle = (
+			("_Test Fixed Asset - _TC", 5250.0, 0.0),
+			("CWIP Account - _TC", 0.0, 5250.0)
+		)
 
-	# 	gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
-	# 		where voucher_type='Asset' and voucher_no = %s
-	# 		order by account""", asset_doc.name)
+		gle = frappe.db.sql("""select account, debit, credit from `tabGL Entry`
+			where voucher_type='Asset' and voucher_no = %s
+			order by account""", asset_doc.name)
 
 
-	# 	self.assertEqual(gle, expected_gle)
+		self.assertEqual(gle, expected_gle)
 
-	# def test_expense_head(self):
-	# 	pr = make_purchase_receipt(item_code="Macbook Pro",
-	# 		qty=2, rate=200000.0, location="Test Location")
+	def test_expense_head(self):
+		pr = make_purchase_receipt(item_code="Macbook Pro",
+			qty=2, rate=200000.0, location="Test Location")
 
-	# 	doc = make_invoice(pr.name)
+		doc = make_invoice(pr.name)
 
-	# 	self.assertEquals('Asset Received But Not Billed - _TC', doc.items[0].expense_account)
+		self.assertEquals('Asset Received But Not Billed - _TC', doc.items[0].expense_account)
 
 def create_asset_data():
 	if not frappe.db.exists("Asset Category", "Computers"):
diff --git a/erpnext/assets/doctype/asset_category/asset_category.py b/erpnext/assets/doctype/asset_category/asset_category.py
index 14f3922..2a42894 100644
--- a/erpnext/assets/doctype/asset_category/asset_category.py
+++ b/erpnext/assets/doctype/asset_category/asset_category.py
@@ -11,7 +11,6 @@
 class AssetCategory(Document):
 	def validate(self):
 		self.validate_finance_books()
-		self.validate_enable_cwip_accounting()
 
 	def validate_finance_books(self):
 		for d in self.finance_books:
@@ -19,15 +18,6 @@
 				if cint(d.get(frappe.scrub(field)))<1:
 					frappe.throw(_("Row {0}: {1} must be greater than 0").format(d.idx, field), frappe.MandatoryError)
 
-	def validate_enable_cwip_accounting(self):
-		if self.enable_cwip_accounting :
-			for d in self.accounts:
-				cwip = frappe.db.get_value("Company",d.company_name,"enable_cwip_accounting")
-				if cwip:
-					frappe.throw(_
-						("CWIP is enabled globally in Company {1}. To enable it in Asset Category, first disable it in {1} ").format(
-							frappe.bold(d.idx), frappe.bold(d.company_name)))
-
 @frappe.whitelist()
 def get_asset_category_account(fieldname, item=None, asset=None, account=None, asset_category = None, company = None):
 	if item and frappe.db.get_value("Item", item, "is_fixed_asset"):
diff --git a/erpnext/assets/doctype/asset_movement/asset_movement.js b/erpnext/assets/doctype/asset_movement/asset_movement.js
index a71212e..89977e2 100644
--- a/erpnext/assets/doctype/asset_movement/asset_movement.js
+++ b/erpnext/assets/doctype/asset_movement/asset_movement.js
@@ -132,7 +132,7 @@
 				if(asset_doc.location) frappe.model.set_value(cdt, cdn, 'source_location', asset_doc.location);
 				if(asset_doc.custodian) frappe.model.set_value(cdt, cdn, 'from_employee', asset_doc.custodian);
 			}).catch((err) => {
-				console.log(err);
+				console.log(err); // eslint-disable-line
 			});
 		}
 	}
diff --git a/erpnext/assets/doctype/asset_movement/asset_movement.json b/erpnext/assets/doctype/asset_movement/asset_movement.json
index 19af81d..e62d684 100644
--- a/erpnext/assets/doctype/asset_movement/asset_movement.json
+++ b/erpnext/assets/doctype/asset_movement/asset_movement.json
@@ -54,7 +54,7 @@
   {
    "fieldname": "reference_doctype",
    "fieldtype": "Link",
-   "label": "Reference DocType",
+   "label": "Reference Document",
    "no_copy": 1,
    "options": "DocType",
    "reqd": 1
@@ -62,7 +62,7 @@
   {
    "fieldname": "reference_name",
    "fieldtype": "Dynamic Link",
-   "label": "Reference Name",
+   "label": "Reference Document Name",
    "no_copy": 1,
    "options": "reference_doctype",
    "reqd": 1
@@ -93,7 +93,7 @@
   }
  ],
  "is_submittable": 1,
- "modified": "2019-11-13 15:37:48.870147",
+ "modified": "2019-11-21 14:35:51.880332",
  "modified_by": "Administrator",
  "module": "Assets",
  "name": "Asset Movement",
diff --git a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json
index a25b4ce..3236e72 100644
--- a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json
+++ b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json
@@ -60,7 +60,8 @@
   {
    "fieldname": "date",
    "fieldtype": "Date",
-   "label": "Date"
+   "label": "Date",
+   "reqd": 1
   },
   {
    "fieldname": "current_asset_value",
@@ -110,7 +111,7 @@
   }
  ],
  "is_submittable": 1,
- "modified": "2019-05-26 09:46:23.613412",
+ "modified": "2019-11-22 14:09:25.800375",
  "modified_by": "Administrator",
  "module": "Assets",
  "name": "Asset Value Adjustment",
diff --git a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py
index 56425a0..155597e 100644
--- a/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py
+++ b/erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py
@@ -5,12 +5,13 @@
 from __future__ import unicode_literals
 import frappe
 from frappe import _
-from frappe.utils import flt, getdate, cint, date_diff
+from frappe.utils import flt, getdate, cint, date_diff, formatdate
 from erpnext.assets.doctype.asset.depreciation import get_depreciation_accounts
 from frappe.model.document import Document
 
 class AssetValueAdjustment(Document):
 	def validate(self):
+		self.validate_date()
 		self.set_difference_amount()
 		self.set_current_asset_value()
 
@@ -23,6 +24,12 @@
 			frappe.throw(_("Cancel the journal entry {0} first").format(self.journal_entry))
 
 		self.reschedule_depreciations(self.current_asset_value)
+	
+	def validate_date(self):
+		asset_purchase_date = frappe.db.get_value('Asset', self.asset, 'purchase_date')
+		if getdate(self.date) < getdate(asset_purchase_date):
+			frappe.throw(_("Asset Value Adjustment cannot be posted before Asset's purchase date <b>{0}</b>.")
+				.format(formatdate(asset_purchase_date)), title="Incorrect Date")
 
 	def set_difference_amount(self):
 		self.difference_amount = flt(self.current_asset_value - self.new_asset_value)
diff --git a/erpnext/buying/doctype/purchase_receipt_item_supplied/purchase_receipt_item_supplied.json b/erpnext/buying/doctype/purchase_receipt_item_supplied/purchase_receipt_item_supplied.json
index 2e0fc94..6f2fbe5 100644
--- a/erpnext/buying/doctype/purchase_receipt_item_supplied/purchase_receipt_item_supplied.json
+++ b/erpnext/buying/doctype/purchase_receipt_item_supplied/purchase_receipt_item_supplied.json
@@ -1,537 +1,168 @@
 {
- "allow_copy": 0, 
- "allow_events_in_timeline": 0, 
- "allow_guest_to_view": 0, 
- "allow_import": 0, 
- "allow_rename": 0, 
- "beta": 0, 
- "creation": "2013-02-22 01:27:42", 
- "custom": 0, 
- "docstatus": 0, 
- "doctype": "DocType", 
- "editable_grid": 1, 
- "engine": "InnoDB", 
+ "creation": "2013-02-22 01:27:42",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+  "main_item_code",
+  "rm_item_code",
+  "description",
+  "batch_no",
+  "serial_no",
+  "col_break1",
+  "required_qty",
+  "consumed_qty",
+  "stock_uom",
+  "rate",
+  "amount",
+  "conversion_factor",
+  "current_stock",
+  "reference_name",
+  "bom_detail_no"
+ ],
  "fields": [
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "main_item_code", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Item Code", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "main_item_code", 
-   "oldfieldtype": "Data", 
-   "options": "Item", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "main_item_code",
+   "fieldtype": "Link",
+   "in_list_view": 1,
+   "label": "Item Code",
+   "oldfieldname": "main_item_code",
+   "oldfieldtype": "Data",
+   "options": "Item",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "rm_item_code", 
-   "fieldtype": "Link", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Raw Material Item Code", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "rm_item_code", 
-   "oldfieldtype": "Data", 
-   "options": "Item", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "rm_item_code",
+   "fieldtype": "Link",
+   "in_list_view": 1,
+   "label": "Raw Material Item Code",
+   "oldfieldname": "rm_item_code",
+   "oldfieldtype": "Data",
+   "options": "Item",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "description", 
-   "fieldtype": "Text Editor", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 1, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Description", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "description", 
-   "oldfieldtype": "Data", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "print_width": "300px", 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0, 
+   "fieldname": "description",
+   "fieldtype": "Text Editor",
+   "in_global_search": 1,
+   "in_list_view": 1,
+   "label": "Description",
+   "oldfieldname": "description",
+   "oldfieldtype": "Data",
+   "print_width": "300px",
+   "read_only": 1,
    "width": "300px"
-  }, 
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "batch_no", 
-   "fieldtype": "Link", 
-   "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": "Batch No", 
-   "length": 0, 
-   "no_copy": 1, 
-   "options": "Batch", 
-   "permlevel": 0, 
-   "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, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "batch_no",
+   "fieldtype": "Link",
+   "label": "Batch No",
+   "no_copy": 1,
+   "options": "Batch"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "serial_no", 
-   "fieldtype": "Text", 
-   "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": "Serial No", 
-   "length": 0, 
-   "no_copy": 1, 
-   "permlevel": 0, 
-   "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, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "serial_no",
+   "fieldtype": "Text",
+   "label": "Serial No",
+   "no_copy": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "col_break1", 
-   "fieldtype": "Column 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, 
-   "length": 0, 
-   "no_copy": 0, 
-   "permlevel": 0, 
-   "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, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "col_break1",
+   "fieldtype": "Column Break"
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "required_qty", 
-   "fieldtype": "Float", 
-   "hidden": 0, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Required Qty", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "required_qty", 
-   "oldfieldtype": "Currency", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "required_qty",
+   "fieldtype": "Float",
+   "in_list_view": 1,
+   "label": "Required Qty",
+   "oldfieldname": "required_qty",
+   "oldfieldtype": "Currency",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "consumed_qty", 
-   "fieldtype": "Float", 
-   "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": "Consumed Qty", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "consumed_qty", 
-   "oldfieldtype": "Currency", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 1, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "consumed_qty",
+   "fieldtype": "Float",
+   "label": "Consumed Qty",
+   "oldfieldname": "consumed_qty",
+   "oldfieldtype": "Currency",
+   "read_only": 1,
+   "reqd": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "stock_uom", 
-   "fieldtype": "Link", 
-   "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": "Stock Uom", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "stock_uom", 
-   "oldfieldtype": "Data", 
-   "options": "UOM", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "stock_uom",
+   "fieldtype": "Link",
+   "label": "Stock Uom",
+   "oldfieldname": "stock_uom",
+   "oldfieldtype": "Data",
+   "options": "UOM",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "rate", 
-   "fieldtype": "Currency", 
-   "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": "Rate", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "rate", 
-   "oldfieldtype": "Currency", 
-   "options": "Company:company:default_currency", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "rate",
+   "fieldtype": "Currency",
+   "label": "Rate",
+   "oldfieldname": "rate",
+   "oldfieldtype": "Currency",
+   "options": "Company:company:default_currency",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "amount", 
-   "fieldtype": "Currency", 
-   "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": "Amount", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "amount", 
-   "oldfieldtype": "Currency", 
-   "options": "Company:company:default_currency", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "amount",
+   "fieldtype": "Currency",
+   "label": "Amount",
+   "oldfieldname": "amount",
+   "oldfieldtype": "Currency",
+   "options": "Company:company:default_currency",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "conversion_factor", 
-   "fieldtype": "Float", 
-   "hidden": 1, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "label": "Conversion Factor", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "conversion_factor", 
-   "oldfieldtype": "Currency", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "conversion_factor",
+   "fieldtype": "Float",
+   "hidden": 1,
+   "label": "Conversion Factor",
+   "oldfieldname": "conversion_factor",
+   "oldfieldtype": "Currency",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "current_stock", 
-   "fieldtype": "Float", 
-   "hidden": 1, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 0, 
-   "in_standard_filter": 0, 
-   "label": "Current Stock", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "current_stock", 
-   "oldfieldtype": "Currency", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "current_stock",
+   "fieldtype": "Float",
+   "in_list_view": 1,
+   "label": "Current Stock",
+   "oldfieldname": "current_stock",
+   "oldfieldtype": "Currency",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "reference_name", 
-   "fieldtype": "Data", 
-   "hidden": 1, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "Reference Name", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "reference_name", 
-   "oldfieldtype": "Data", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
-  }, 
+   "fieldname": "reference_name",
+   "fieldtype": "Data",
+   "hidden": 1,
+   "in_list_view": 1,
+   "label": "Reference Name",
+   "oldfieldname": "reference_name",
+   "oldfieldtype": "Data",
+   "read_only": 1
+  },
   {
-   "allow_bulk_edit": 0, 
-   "allow_in_quick_entry": 0, 
-   "allow_on_submit": 0, 
-   "bold": 0, 
-   "collapsible": 0, 
-   "columns": 0, 
-   "fieldname": "bom_detail_no", 
-   "fieldtype": "Data", 
-   "hidden": 1, 
-   "ignore_user_permissions": 0, 
-   "ignore_xss_filter": 0, 
-   "in_filter": 0, 
-   "in_global_search": 0, 
-   "in_list_view": 1, 
-   "in_standard_filter": 0, 
-   "label": "BOM Detail No", 
-   "length": 0, 
-   "no_copy": 0, 
-   "oldfieldname": "bom_detail_no", 
-   "oldfieldtype": "Data", 
-   "permlevel": 0, 
-   "print_hide": 0, 
-   "print_hide_if_no_value": 0, 
-   "read_only": 1, 
-   "remember_last_selected_value": 0, 
-   "report_hide": 0, 
-   "reqd": 0, 
-   "search_index": 0, 
-   "set_only_once": 0, 
-   "translatable": 0, 
-   "unique": 0
+   "fieldname": "bom_detail_no",
+   "fieldtype": "Data",
+   "hidden": 1,
+   "in_list_view": 1,
+   "label": "BOM Detail No",
+   "oldfieldname": "bom_detail_no",
+   "oldfieldtype": "Data",
+   "read_only": 1
   }
- ], 
- "has_web_view": 0, 
- "hide_heading": 0, 
- "hide_toolbar": 0, 
- "idx": 1, 
- "image_view": 0, 
- "in_create": 0, 
- "is_submittable": 0, 
- "issingle": 0, 
- "istable": 1, 
- "max_attachments": 0, 
- "modified": "2019-01-07 16:51:59.536291", 
- "modified_by": "Administrator", 
- "module": "Buying", 
- "name": "Purchase Receipt Item Supplied", 
- "owner": "wasim@webnotestech.com", 
- "permissions": [], 
- "quick_entry": 0, 
- "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, 
- "track_views": 0
+ ],
+ "idx": 1,
+ "istable": 1,
+ "modified": "2019-11-21 16:25:29.909112",
+ "modified_by": "Administrator",
+ "module": "Buying",
+ "name": "Purchase Receipt Item Supplied",
+ "owner": "wasim@webnotestech.com",
+ "permissions": [],
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 1
 }
\ No newline at end of file
diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py
index d0befcb..3392850 100644
--- a/erpnext/controllers/buying_controller.py
+++ b/erpnext/controllers/buying_controller.py
@@ -577,6 +577,7 @@
 
 	def auto_make_assets(self, asset_items):
 		items_data = get_asset_item_details(asset_items)
+		messages = []
 
 		for d in self.items:
 			if d.is_fixed_asset:
@@ -589,12 +590,16 @@
 						for qty in range(cint(d.qty)):
 							self.make_asset(d)
 						is_plural = 's' if cint(d.qty) != 1 else ''
-						frappe.msgprint(_('{0} Asset{2} Created for {1}').format(cint(d.qty), d.item_code, is_plural))
+						messages.append(_('{0} Asset{2} Created for <b>{1}</b>').format(cint(d.qty), d.item_code, is_plural))
 					else:
-						frappe.throw(_("Asset Naming Series is mandatory for the auto creation for item {0}").format(d.item_code))
+						frappe.throw(_("Row {1}: Asset Naming Series is mandatory for the auto creation for item {0}")
+							.format(d.item_code, d.idx))
 				else:
-					frappe.msgprint(_("Assets not created. You will have to create asset manually."))
-					
+					messages.append(_("Assets not created for <b>{0}</b>. You will have to create asset manually.")
+						.format(d.item_code))
+
+		for message in messages:
+			frappe.msgprint(message, title="Success")
 
 	def make_asset(self, row):
 		if not row.asset_location:
diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.js b/erpnext/hr/doctype/expense_claim/expense_claim.js
index 6d3a28e..0d37c10 100644
--- a/erpnext/hr/doctype/expense_claim/expense_claim.js
+++ b/erpnext/hr/doctype/expense_claim/expense_claim.js
@@ -208,6 +208,24 @@
 		frm.refresh_fields();
 	},
 
+	grand_total: function(frm) {
+		frm.trigger("update_employee_advance_claimed_amount");
+	},
+
+	update_employee_advance_claimed_amount: function(frm) {
+		let amount_to_be_allocated = frm.doc.grand_total;
+		$.each(frm.doc.advances || [], function(i, advance){
+			if (amount_to_be_allocated >= advance.unclaimed_amount){
+				frm.doc.advances[i].allocated_amount = frm.doc.advances[i].unclaimed_amount;
+				amount_to_be_allocated -= advance.allocated_amount;
+			} else{
+				frm.doc.advances[i].allocated_amount = amount_to_be_allocated;
+				amount_to_be_allocated = 0;
+			}
+			frm.refresh_field("advances");
+		});
+	},
+
 	make_payment_entry: function(frm) {
 		var method = "erpnext.accounts.doctype.payment_entry.payment_entry.get_payment_entry";
 		if(frm.doc.__onload && frm.doc.__onload.make_payment_via_journal_entry) {
@@ -300,7 +318,7 @@
 							row.advance_account = d.advance_account;
 							row.advance_paid = d.paid_amount;
 							row.unclaimed_amount = flt(d.paid_amount) - flt(d.claimed_amount);
-							row.allocated_amount = flt(d.paid_amount) - flt(d.claimed_amount);
+							row.allocated_amount = 0;
 						});
 						refresh_field("advances");
 					}
diff --git a/erpnext/patches/v12_0/set_cwip_and_delete_asset_settings.py b/erpnext/patches/v12_0/set_cwip_and_delete_asset_settings.py
index 5842e9e..4d4fc7c 100644
--- a/erpnext/patches/v12_0/set_cwip_and_delete_asset_settings.py
+++ b/erpnext/patches/v12_0/set_cwip_and_delete_asset_settings.py
@@ -7,15 +7,11 @@
 	'''Get 'Disable CWIP Accounting value' from Asset Settings, set it in 'Enable Capital Work in Progress Accounting' field
 	in Company, delete Asset Settings '''
 
-	if frappe.db.exists("DocType","Asset Settings"):
-		frappe.reload_doctype("Company")
-		cwip_value = frappe.db.get_single_value("Asset Settings","disable_cwip_accounting")
+	if frappe.db.exists("DocType", "Asset Settings"):
+		frappe.reload_doctype("Asset Category")
+		cwip_value = frappe.db.get_single_value("Asset Settings", "disable_cwip_accounting")
+		
+		frappe.db.sql("""UPDATE `tabAsset Category` SET enable_cwip_accounting = %s""", cint(cwip_value))
 
-		companies = [x['name'] for x in frappe.get_all("Company", "name")]
-		for company in companies:
-			enable_cwip_accounting = cint(not cint(cwip_value))
-			frappe.db.set_value("Company", company, "enable_cwip_accounting", enable_cwip_accounting)
-
-		frappe.db.sql(
-			""" DELETE FROM `tabSingles` where doctype = 'Asset Settings' """)
-		frappe.delete_doc_if_exists("DocType","Asset Settings")
\ No newline at end of file
+		frappe.db.sql("""DELETE FROM `tabSingles` where doctype = 'Asset Settings'""")
+		frappe.delete_doc_if_exists("DocType", "Asset Settings")
\ No newline at end of file
diff --git a/erpnext/selling/doctype/customer/customer.js b/erpnext/selling/doctype/customer/customer.js
index 458a56c..cca8efe 100644
--- a/erpnext/selling/doctype/customer/customer.js
+++ b/erpnext/selling/doctype/customer/customer.js
@@ -49,9 +49,9 @@
 		})
 		frm.set_query('customer_primary_address', function(doc) {
 			return {
-				query: "erpnext.selling.doctype.customer.customer.get_customer_primary_address",
 				filters: {
-					'customer': doc.name
+					'link_doctype': 'Customer',
+					'link_name': doc.name
 				}
 			}
 		})
diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py
index a8e3ce4..67e20b1 100644
--- a/erpnext/selling/doctype/customer/customer.py
+++ b/erpnext/selling/doctype/customer/customer.py
@@ -397,15 +397,3 @@
 			'customer': customer,
 			'txt': '%%%s%%' % txt
 		})
-
-def get_customer_primary_address(doctype, txt, searchfield, start, page_len, filters):
-	customer = frappe.db.escape(filters.get('customer'))
-	return frappe.db.sql("""
-		select `tabAddress`.name from `tabAddress`, `tabDynamic Link`
-			where `tabAddress`.name = `tabDynamic Link`.parent and `tabDynamic Link`.link_name = %(customer)s
-			and `tabDynamic Link`.link_doctype = 'Customer'
-			and `tabAddress`.name like %(txt)s
-		""", {
-			'customer': customer,
-			'txt': '%%%s%%' % txt
-		})
diff --git a/erpnext/setup/doctype/company/company.json b/erpnext/setup/doctype/company/company.json
index 2d181b5..dd602ec 100644
--- a/erpnext/setup/doctype/company/company.json
+++ b/erpnext/setup/doctype/company/company.json
@@ -72,7 +72,6 @@
   "stock_received_but_not_billed",
   "expenses_included_in_valuation",
   "fixed_asset_depreciation_settings",
-  "enable_cwip_accounting",
   "accumulated_depreciation_account",
   "depreciation_expense_account",
   "series_for_depreciation_entry",
@@ -721,18 +720,12 @@
    "fieldtype": "Link",
    "label": "Default Buying Terms",
    "options": "Terms and Conditions"
-  },
-  {
-   "default": "0",
-   "fieldname": "enable_cwip_accounting",
-   "fieldtype": "Check",
-   "label": "Enable Capital Work in Progress Accounting"
   }
  ],
  "icon": "fa fa-building",
  "idx": 1,
  "image_field": "company_logo",
- "modified": "2019-10-09 14:42:04.440974",
+ "modified": "2019-11-22 13:04:47.470768",
  "modified_by": "Administrator",
  "module": "Setup",
  "name": "Company",
diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js
index 2f4abbc..410d9f1 100644
--- a/erpnext/stock/doctype/item/item.js
+++ b/erpnext/stock/doctype/item/item.js
@@ -49,7 +49,7 @@
 		if (!frm.doc.is_fixed_asset) {
 			erpnext.item.make_dashboard(frm);
 		}
-
+		
 		if (frm.doc.is_fixed_asset) {
 			frm.trigger('is_fixed_asset');
 			frm.trigger('auto_create_assets');
@@ -140,6 +140,7 @@
 		// set serial no to false & toggles its visibility
 		frm.set_value('has_serial_no', 0);
 		frm.toggle_enable(['has_serial_no', 'serial_no_series'], !frm.doc.is_fixed_asset);
+		frm.toggle_reqd(['asset_category'], frm.doc.is_fixed_asset);
 		frm.toggle_display(['has_serial_no', 'serial_no_series'], !frm.doc.is_fixed_asset);
 
 		frm.call({
@@ -150,6 +151,8 @@
 				frm.trigger("set_asset_naming_series");
 			}
 		});
+
+		frm.trigger('auto_create_assets');
 	},
 
 	set_asset_naming_series: function(frm) {
@@ -159,8 +162,8 @@
 	},
 
 	auto_create_assets: function(frm) {
-		frm.toggle_reqd(['asset_category', 'asset_naming_series'], frm.doc.auto_create_assets);
-		frm.toggle_display(['asset_category', 'asset_naming_series'], frm.doc.auto_create_assets);
+		frm.toggle_reqd(['asset_naming_series'], frm.doc.auto_create_assets);
+		frm.toggle_display(['asset_naming_series'], frm.doc.auto_create_assets);
 	},
 
 	page_name: frappe.utils.warn_page_name_change,
diff --git a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
index 173b394..7df40fb 100644
--- a/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
+++ b/erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.py
@@ -138,8 +138,8 @@
 			if item.is_fixed_asset:
 				receipt_document_type = 'purchase_invoice' if item.receipt_document_type == 'Purchase Invoice' \
 						else 'purchase_receipt'
-				docs = frappe.db.get_all('Asset', filters={ receipt_document_type: item.receipt_document }, 
-					fields=['name', 'docstatus'])
+				docs = frappe.db.get_all('Asset', filters={ receipt_document_type: item.receipt_document,
+					'item_code': item.item_code }, fields=['name', 'docstatus'])
 				if not docs or len(docs) != item.qty:
 					frappe.throw(_('There are not enough asset created or linked to {0}. \
 						Please create or link {1} Assets with respective document.').format(item.receipt_document, item.qty))
@@ -148,8 +148,7 @@
 						if d.docstatus == 1:
 							frappe.throw(_('{2} <b>{0}</b> has submitted Assets.\
 								Remove Item <b>{1}</b> from table to continue.').format(
-									item.receipt_document, item.item_code, item.receipt_document_type)
-								)
+									item.receipt_document, item.item_code, item.receipt_document_type))
 
 	def update_rate_in_serial_no_for_non_asset_items(self, receipt_document):
 		for item in receipt_document.get("items"):
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index 0cb21d7..d0fae6a 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -82,11 +82,21 @@
 		self.validate_with_previous_doc()
 		self.validate_uom_is_integer("uom", ["qty", "received_qty"])
 		self.validate_uom_is_integer("stock_uom", "stock_qty")
+		self.validate_cwip_accounts()
 
 		self.check_on_hold_or_closed_status()
 
 		if getdate(self.posting_date) > getdate(nowdate()):
 			throw(_("Posting Date cannot be future date"))
+	
+	def validate_cwip_accounts(self):
+		for item in self.get('items'):
+			if item.is_fixed_asset and is_cwip_accounting_enabled(item.asset_category):
+				# check cwip accounts before making auto assets
+				# Improves UX by not giving messages of "Assets Created" before throwing error of not finding arbnb account
+				arbnb_account = self.get_company_default("asset_received_but_not_billed")
+				cwip_account = get_asset_account("capital_work_in_progress_account", company = self.company)
+				break
 
 	def validate_with_previous_doc(self):
 		super(PurchaseReceipt, self).validate_with_previous_doc({
@@ -343,7 +353,7 @@
 	def get_asset_gl_entry(self, gl_entries):
 		for item in self.get("items"):
 			if item.is_fixed_asset:
-				if is_cwip_accounting_enabled(self.company, item.asset_category):
+				if is_cwip_accounting_enabled(item.asset_category):
 					self.add_asset_gl_entries(item, gl_entries)
 				if flt(item.landed_cost_voucher_amount):
 					self.add_lcv_gl_entries(item, gl_entries)
@@ -386,7 +396,7 @@
 	
 	def add_lcv_gl_entries(self, item, gl_entries):
 		expenses_included_in_asset_valuation = self.get_company_default("expenses_included_in_asset_valuation")
-		if not is_cwip_accounting_enabled(self.company, item.asset_category):
+		if not is_cwip_accounting_enabled(item.asset_category):
 			asset_account = get_asset_category_account(asset_category=item.asset_category, \
 					fieldname='fixed_asset_account', company=self.company)
 		else:
diff --git a/erpnext/stock/report/stock_balance/stock_balance.py b/erpnext/stock/report/stock_balance/stock_balance.py
index 68b8b50..a74253e 100644
--- a/erpnext/stock/report/stock_balance/stock_balance.py
+++ b/erpnext/stock/report/stock_balance/stock_balance.py
@@ -292,7 +292,7 @@
 	if not (filters.get("item_code") or filters.get("warehouse")):
 		sle_count = flt(frappe.db.sql("""select count(name) from `tabStock Ledger Entry`""")[0][0])
 		if sle_count > 500000:
-			frappe.throw(_("Please set filter based on Item or Warehouse"))
+			frappe.throw(_("Please set filter based on Item or Warehouse due to a large amount of entries."))
 
 def get_variants_attributes():
 	'''Return all item variant attributes.'''