Leave Allocation Tool and Employee. Fixes #1555
diff --git a/erpnext/hr/doctype/employee/employee.py b/erpnext/hr/doctype/employee/employee.py
index f5be944..abda8ae 100644
--- a/erpnext/hr/doctype/employee/employee.py
+++ b/erpnext/hr/doctype/employee/employee.py
@@ -86,33 +86,32 @@
 
 	def update_user(self):
 		# add employee role if missing
-		if not "Employee" in frappe.db.sql_list("""select role from tabUserRole
-				where parent=%s""", self.user_id):
-			from frappe.utils.user import add_role
-			add_role(self.user_id, "Employee")
+		user = frappe.get_doc("User", self.user_id)
+		user.ignore_permissions = True
 
-		user_wrapper = frappe.get_doc("User", self.user_id)
+		if "Employee" not in user.get("user_roles"):
+			user.add_roles("Employee")
 
 		# copy details like Fullname, DOB and Image to User
 		if self.employee_name:
 			employee_name = self.employee_name.split(" ")
 			if len(employee_name) >= 3:
-				user_wrapper.last_name = " ".join(employee_name[2:])
-				user_wrapper.middle_name = employee_name[1]
+				user.last_name = " ".join(employee_name[2:])
+				user.middle_name = employee_name[1]
 			elif len(employee_name) == 2:
-				user_wrapper.last_name = employee_name[1]
+				user.last_name = employee_name[1]
 
-			user_wrapper.first_name = employee_name[0]
+			user.first_name = employee_name[0]
 
 		if self.date_of_birth:
-			user_wrapper.birth_date = self.date_of_birth
+			user.birth_date = self.date_of_birth
 
 		if self.gender:
-			user_wrapper.gender = self.gender
+			user.gender = self.gender
 
 		if self.image:
-			if not user_wrapper.user_image == self.image:
-				user_wrapper.user_image = self.image
+			if not user.user_image:
+				user.user_image = self.image
 				try:
 					frappe.get_doc({
 						"doctype": "File Data",
@@ -123,8 +122,8 @@
 				except frappe.DuplicateEntryError, e:
 					# already exists
 					pass
-		user_wrapper.ignore_permissions = True
-		user_wrapper.save()
+
+		user.save()
 
 	def validate_date(self):
 		if self.date_of_birth and self.date_of_joining and getdate(self.date_of_birth) >= getdate(self.date_of_joining):
diff --git a/erpnext/hr/doctype/leave_application/leave_application.js b/erpnext/hr/doctype/leave_application/leave_application.js
index 695ae55..3ce7a5b 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.js
+++ b/erpnext/hr/doctype/leave_application/leave_application.js
@@ -4,20 +4,20 @@
 cur_frm.add_fetch('employee','employee_name','employee_name');
 
 cur_frm.cscript.onload = function(doc, dt, dn) {
-	if(!doc.posting_date) 
+	if(!doc.posting_date)
 		set_multiple(dt,dn,{posting_date:get_today()});
 	if(doc.__islocal) {
 		cur_frm.set_value("status", "Open");
 		cur_frm.cscript.calculate_total_days(doc, dt, dn);
 	}
-	
+
 	var leave_approver = doc.leave_approver;
 	return cur_frm.call({
 		method: "erpnext.hr.utils.get_leave_approver_list",
 		callback: function(r) {
-			cur_frm.set_df_property("leave_approver", "options", $.map(r.message, 
-				function(user) { 
-					return {value: user, label: frappe.user_info(user).fullname}; 
+			cur_frm.set_df_property("leave_approver", "options", $.map(r.message,
+				function(user) {
+					return {value: user, label: frappe.user_info(user).fullname};
 				}));
 			if(leave_approver) cur_frm.set_value("leave_approver", leave_approver);
 			cur_frm.cscript.get_leave_balance(cur_frm.doc);
@@ -54,7 +54,7 @@
 				cur_frm.set_intro(__("Leave application has been rejected."));
 			}
 		}
-	}	
+	}
 }
 
 cur_frm.cscript.employee = function (doc, dt, dn){
@@ -86,11 +86,11 @@
 cur_frm.cscript.to_date = function(doc, dt, dn) {
 	if(cint(doc.half_day) == 1 && cstr(doc.from_date) && doc.from_date != doc.to_date){
 		msgprint(__("To Date should be same as From Date for Half Day leave"));
-		set_multiple(dt,dn,{to_date:doc.from_date});		
+		set_multiple(dt,dn,{to_date:doc.from_date});
 	}
 	cur_frm.cscript.calculate_total_days(doc, dt, dn);
 }
-	
+
 cur_frm.cscript.get_leave_balance = function(doc, dt, dn) {
 	if(doc.docstatus==0 && doc.employee && doc.leave_type && doc.fiscal_year) {
 		return cur_frm.call({
@@ -114,8 +114,4 @@
 	}
 }
 
-cur_frm.fields_dict.employee.get_query = function() {
-	return {
-		query: "erpnext.hr.doctype.leave_application.leave_application.query_for_permitted_employees"
-	};
-}
\ No newline at end of file
+cur_frm.fields_dict.employee.get_query = erpnext.queries.employee;
diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py
index dd24463..863b2c6 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.py
+++ b/erpnext/hr/doctype/leave_application/leave_application.py
@@ -318,28 +318,3 @@
 				"title": _("Holiday") + ": " + cstr(holiday.description),
 				"name": holiday.name
 			})
-
-@frappe.whitelist()
-def query_for_permitted_employees(doctype, txt, searchfield, start, page_len, filters):
-	txt = "%" + cstr(txt) + "%"
-
-	if "Leave Approver" in frappe.user.get_roles():
-		user = frappe.session.user.replace('"', '\"')
-		condition = """and (exists(select ela.name from `tabEmployee Leave Approver` ela
-				where ela.parent=`tabEmployee`.name and ela.leave_approver= "%s") or
-			not exists(select ela.name from `tabEmployee Leave Approver` ela
-				where ela.parent=`tabEmployee`.name)
-			or user_id = "%s")""" % (user, user)
-	else:
-		from frappe.widgets.reportview import build_match_conditions
-		condition = build_match_conditions("Employee")
-		condition = ("and " + condition) if condition else ""
-
-	return frappe.db.sql("""select name, employee_name from `tabEmployee`
-		where status = 'Active' and docstatus < 2 and
-		(`%s` like %s or employee_name like %s) %s
-		order by
-		case when name like %s then 0 else 1 end,
-		case when employee_name like %s then 0 else 1 end,
-		name limit %s, %s""" % tuple([searchfield] + ["%s"]*2 + [condition] + ["%s"]*4),
-		(txt, txt, txt, txt, start, page_len))
diff --git a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py
index 79f298c..3e758b4 100644
--- a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py
+++ b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py
@@ -40,7 +40,7 @@
 
 		for d in self.get_employees():
 			try:
-				la = frappe.get_doc('Leave Allocation')
+				la = frappe.new_doc('Leave Allocation')
 				la.set("__islocal", 1)
 				la.employee = cstr(d[0])
 				la.employee_name = frappe.db.get_value('Employee',cstr(d[0]),'employee_name')
diff --git a/erpnext/public/js/queries.js b/erpnext/public/js/queries.js
index cdd14c6..1f404db 100644
--- a/erpnext/public/js/queries.js
+++ b/erpnext/public/js/queries.js
@@ -64,4 +64,8 @@
 	not_a_group_filter: function() {
 		return { filters: { is_group: "No" } };
 	},
+
+	employee: function() {
+		return { query: "erpnext.controllers.queries.employee_query" }
+	}
 });