Merge pull request #14108 from ESS-LLP/tax_deduction

Variable tax deduction
diff --git a/erpnext/accounts/page/pos/pos.js b/erpnext/accounts/page/pos/pos.js
old mode 100644
new mode 100755
index c07b851..2146ace
--- a/erpnext/accounts/page/pos/pos.js
+++ b/erpnext/accounts/page/pos/pos.js
@@ -1051,6 +1051,7 @@
 						item_name: obj.name === obj.item_name ? "" : obj.item_name,
 						item_image: obj.image,
 						item_stock: __('Stock Qty') + ": " + me.get_actual_qty(obj),
+						item_uom: obj.stock_uom,
 						color: frappe.get_palette(obj.item_name),
 						abbr: frappe.get_abbr(obj.item_name)
 					})).tooltip().appendTo($wrap);
diff --git a/erpnext/assets/doctype/asset/asset.js b/erpnext/assets/doctype/asset/asset.js
index 88e7f78..658107b 100644
--- a/erpnext/assets/doctype/asset/asset.js
+++ b/erpnext/assets/doctype/asset/asset.js
@@ -82,7 +82,7 @@
 			}
 			if (frm.doc.status != 'Fully Depreciated') {
 				frm.add_custom_button(__("Asset Adjustment"), function() {
-					frm.trigger("create_asset_maintenance");
+					frm.trigger("create_asset_adjustment");
 				}, __("Make"));
 			}
 
@@ -233,6 +233,22 @@
 		})
 	},
 
+	create_asset_adjustment: function(frm) {
+		frappe.call({
+			args: {
+				"asset": frm.doc.name,
+				"asset_category": frm.doc.asset_category,
+				"company": frm.doc.company
+			},
+			method: "erpnext.assets.doctype.asset.asset.create_asset_adjustment",
+			freeze: 1,
+			callback: function(r) {
+				var doclist = frappe.model.sync(r.message);
+				frappe.set_route("Form", doclist[0].doctype, doclist[0].name);
+			}
+		})
+	},
+
 	calculate_depreciation: function(frm) {
 		frappe.db.get_value("Asset Settings", {'name':"Asset Settings"}, 'schedule_based_on_fiscal_year', (data) => {
 			if (data.schedule_based_on_fiscal_year == 1) {
@@ -329,6 +345,42 @@
 				"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",
@@ -349,8 +401,9 @@
 				args: {
 					"asset": frm.doc.name,
 					"transaction_date": args.transfer_date,
-					"source_warehouse": frm.doc.location,
-					"target_warehouse": args.target_location,
+					"source_location": frm.doc.location,
+					"target_location": args.target_location,
+					"serial_no": args.serial_no,
 					"company": frm.doc.company
 				}
 			},
diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py
index 75e8088..1069db6 100644
--- a/erpnext/assets/doctype/asset/asset.py
+++ b/erpnext/assets/doctype/asset/asset.py
@@ -422,9 +422,23 @@
 	return asset_maintenance
 
 @frappe.whitelist()
+def create_asset_adjustment(asset, asset_category, company):
+	asset_maintenance = frappe.new_doc("Asset Adjustment")
+	asset_maintenance.update({
+		"asset": asset,
+		"company": company,
+		"asset_category": asset_category
+	})
+	return asset_maintenance
+
+@frappe.whitelist()
 def transfer_asset(args):
 	import json
 	args = json.loads(args)
+
+	if args.get('serial_no'):
+		args['quantity'] = len(args.get('serial_no').split('\n'))
+
 	movement_entry = frappe.new_doc("Asset Movement")
 	movement_entry.update(args)
 	movement_entry.insert()
diff --git a/erpnext/assets/doctype/asset_adjustment/asset_adjustment.js b/erpnext/assets/doctype/asset_adjustment/asset_adjustment.js
index 11c02e1..346a2f1 100644
--- a/erpnext/assets/doctype/asset_adjustment/asset_adjustment.js
+++ b/erpnext/assets/doctype/asset_adjustment/asset_adjustment.js
@@ -2,6 +2,18 @@
 // For license information, please see license.txt
 
 frappe.ui.form.on('Asset Adjustment', {
+	setup: function(frm) {
+		frm.add_fetch('company', 'cost_center', 'cost_center');
+		frm.set_query('cost_center', function() {
+			return {
+				filters: {
+					company: frm.doc.company,
+					is_group: 0
+				}
+			}
+		});
+	},
+
 	asset: function(frm) {
 		frm.trigger("set_current_asset_value");
 	},
@@ -11,7 +23,6 @@
 	},
 
 	set_current_asset_value: function(frm) {
-		debugger
 		if (frm.doc.finance_book && frm.doc.asset) {
 			frm.call({
 				method: "erpnext.assets.doctype.asset_adjustment.asset_adjustment.get_current_asset_value",
diff --git a/erpnext/assets/doctype/asset_adjustment/asset_adjustment.json b/erpnext/assets/doctype/asset_adjustment/asset_adjustment.json
index faa36ef..3f4f77c 100644
--- a/erpnext/assets/doctype/asset_adjustment/asset_adjustment.json
+++ b/erpnext/assets/doctype/asset_adjustment/asset_adjustment.json
@@ -41,6 +41,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -72,6 +73,7 @@
    "reqd": 1, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -103,6 +105,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -134,6 +137,7 @@
    "reqd": 1, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -165,6 +169,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -194,6 +199,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -203,7 +209,7 @@
    "collapsible": 0, 
    "columns": 0, 
    "fieldname": "date", 
-   "fieldtype": "Datetime", 
+   "fieldtype": "Date", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
    "ignore_xss_filter": 0, 
@@ -224,6 +230,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -254,6 +261,7 @@
    "reqd": 1, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -284,6 +292,7 @@
    "reqd": 1, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -314,6 +323,39 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_bulk_edit": 0, 
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
+   "fieldname": "cost_center", 
+   "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": "Cost Center", 
+   "length": 0, 
+   "no_copy": 0, 
+   "options": "Cost Center", 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 0, 
+   "remember_last_selected_value": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }, 
   {
@@ -344,6 +386,7 @@
    "reqd": 0, 
    "search_index": 0, 
    "set_only_once": 0, 
+   "translatable": 0, 
    "unique": 0
   }
  ], 
@@ -357,7 +400,7 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2018-05-11 21:45:03.459696", 
+ "modified": "2018-05-17 11:12:38.110774", 
  "modified_by": "Administrator", 
  "module": "Assets", 
  "name": "Asset Adjustment", 
@@ -366,7 +409,6 @@
  "permissions": [
   {
    "amend": 1, 
-   "apply_user_permissions": 0, 
    "cancel": 1, 
    "create": 1, 
    "delete": 1, 
@@ -386,7 +428,6 @@
   }, 
   {
    "amend": 1, 
-   "apply_user_permissions": 0, 
    "cancel": 1, 
    "create": 1, 
    "delete": 1, 
@@ -406,7 +447,6 @@
   }, 
   {
    "amend": 1, 
-   "apply_user_permissions": 0, 
    "cancel": 1, 
    "create": 1, 
    "delete": 1, 
diff --git a/erpnext/assets/doctype/asset_adjustment/asset_adjustment.py b/erpnext/assets/doctype/asset_adjustment/asset_adjustment.py
index 6b4b752..af806e4 100644
--- a/erpnext/assets/doctype/asset_adjustment/asset_adjustment.py
+++ b/erpnext/assets/doctype/asset_adjustment/asset_adjustment.py
@@ -16,12 +16,14 @@
 
 	def on_submit(self):
 		self.make_depreciation_entry()
-		self.reschedule_depreciations()
+		self.reschedule_depreciations(self.new_asset_value)
 
 	def on_cancel(self):
 		if self.journal_entry:
 			frappe.throw(_("Cancel the journal entry {0} first").format(self.journal_entry))
 
+		self.reschedule_depreciations(self.current_asset_value)
+
 	def set_difference_amount(self):
 		self.difference_amount = flt(self.current_asset_value - self.new_asset_value)
 
@@ -47,12 +49,13 @@
 		je.append("accounts", {
 			"account": accumulated_depreciation_account,
 			"credit_in_account_currency": self.difference_amount,
+			"cost_center": depreciation_cost_center or self.cost_center
 		})
 
 		je.append("accounts", {
 			"account": depreciation_expense_account,
 			"debit_in_account_currency": self.difference_amount,
-			"cost_center": depreciation_cost_center
+			"cost_center": depreciation_cost_center or self.cost_center
 		})
 
 		je.flags.ignore_permissions = True
@@ -60,11 +63,11 @@
 
 		self.db_set("journal_entry", je.name)
 
-	def reschedule_depreciations(self):
+	def reschedule_depreciations(self, asset_value):
 		asset = frappe.get_doc('Asset', self.asset)
 
 		for d in asset.finance_books:
-			d.value_after_depreciation = self.new_asset_value
+			d.value_after_depreciation = asset_value
 
 			if d.depreciation_method in ("Straight Line", "Manual"):
 				end_date = max([s.schedule_date for s in asset.schedules if cint(s.finance_book_id) == d.idx])
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index b68f24a..adab972 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -635,8 +635,8 @@
 						frappe.throw(_("Row #{0}: Asset {1} does not linked to Item {2}")
 							.format(d.idx, d.asset, d.item_code))
 
-					elif asset.docstatus != 1:
-						frappe.throw(_("Row #{0}: Asset {1} must be submitted").format(d.idx, d.asset))
+					# elif asset.docstatus != 1:
+# 						frappe.throw(_("Row #{0}: Asset {1} must be submitted").format(d.idx, d.asset))
 
 					elif self.doctype == "Purchase Invoice":
 						# if asset.status != "Submitted":
diff --git a/erpnext/hr/doctype/employee_transfer/employee_transfer.py b/erpnext/hr/doctype/employee_transfer/employee_transfer.py
index b58d334..6cdd22f 100644
--- a/erpnext/hr/doctype/employee_transfer/employee_transfer.py
+++ b/erpnext/hr/doctype/employee_transfer/employee_transfer.py
@@ -14,7 +14,7 @@
 		if frappe.get_value("Employee", self.employee, "status") == "Left":
 			frappe.throw(_("Cannot transfer Employee with status Left"))
 		if self.new_company and self.company == self.new_company:
-			frappe.throw_("New Company must be different from current company")
+			frappe.throw(_("New Company must be different from current company"))
 
 	def before_submit(self):
 		if getdate(self.transfer_date) > getdate():
diff --git a/erpnext/public/js/pos/pos_item.html b/erpnext/public/js/pos/pos_item.html
old mode 100644
new mode 100755
index f6ef5a4..52f3cf6
--- a/erpnext/public/js/pos/pos_item.html
+++ b/erpnext/public/js/pos/pos_item.html
@@ -25,7 +25,7 @@
 				{% } %}
 			</div>
 			<span class="price-info">
-				{{item_price}}
+				{{item_price}} / {{item_uom}}
 			</span>
 		</a>
 	</div>