diff --git a/erpnext/setup/doctype/authorization_control/authorization_control.py b/erpnext/setup/doctype/authorization_control/authorization_control.py
index 03c187b..fa708b5 100644
--- a/erpnext/setup/doctype/authorization_control/authorization_control.py
+++ b/erpnext/setup/doctype/authorization_control/authorization_control.py
@@ -3,19 +3,11 @@
 
 from __future__ import unicode_literals
 import frappe
-
-from frappe.utils import cstr, flt, has_common, make_esc, comma_or
-
+from frappe.utils import cstr, flt, has_common, comma_or
 from frappe import session, _
-
-
 from erpnext.utilities.transaction_base import TransactionBase
 
 class AuthorizationControl(TransactionBase):
-
-
-	# Get Names of all Approving Users and Roles
-	# -------------------------------------------
 	def get_appr_user_role(self, det, doctype_name, total, based_on, condition, item, company):
 		amt_list, appr_users, appr_roles = [], [], []
 		users, roles = '',''
@@ -24,10 +16,18 @@
 				amt_list.append(flt(x[0]))
 			max_amount = max(amt_list)
 
-			app_dtl = frappe.db.sql("select approving_user, approving_role from `tabAuthorization Rule` where transaction = %s and (value = %s or value > %s) and docstatus != 2 and based_on = %s and company = %s %s" % ('%s', '%s', '%s', '%s', '%s', condition), (doctype_name, flt(max_amount), total, based_on, company))
+			app_dtl = frappe.db.sql("""select approving_user, approving_role from `tabAuthorization Rule`
+				where transaction = %s and (value = %s or value > %s)
+				and docstatus != 2 and based_on = %s and company = %s %s""" %
+				('%s', '%s', '%s', '%s', '%s', condition),
+				(doctype_name, flt(max_amount), total, based_on, company))
 
 			if not app_dtl:
-				app_dtl = frappe.db.sql("select approving_user, approving_role from `tabAuthorization Rule` where transaction = %s and (value = %s or value > %s) and docstatus != 2 and based_on = %s and ifnull(company,'') = '' %s" % ('%s', '%s', '%s', '%s', condition), (doctype_name, flt(max_amount), total, based_on))
+				app_dtl = frappe.db.sql("""select approving_user, approving_role from `tabAuthorization Rule`
+					where transaction = %s and (value = %s or value > %s) and docstatus != 2
+					and based_on = %s and ifnull(company,'') = '' %s""" %
+					('%s', '%s', '%s', '%s', condition), (doctype_name, flt(max_amount), total, based_on))
+
 			for d in app_dtl:
 				if(d[0]): appr_users.append(d[0])
 				if(d[1]): appr_roles.append(d[1])
@@ -36,43 +36,56 @@
 				frappe.msgprint(_("Not authroized since {0} exceeds limits").format(_(based_on)))
 				frappe.throw(_("Can be approved by {0}").format(comma_or(appr_roles + appr_users)))
 
-
-	# Check if authorization rule is set specific to user
-	# ----------------------------------------------------
 	def validate_auth_rule(self, doctype_name, total, based_on, cond, company, item = ''):
 		chk = 1
 		add_cond1,add_cond2	= '',''
 		if based_on == 'Itemwise Discount':
-			add_cond1 += " and master_name = '"+cstr(item)+"'"
-			itemwise_exists = frappe.db.sql("select value from `tabAuthorization Rule` where transaction = %s and value <= %s and based_on = %s and company = %s and docstatus != 2 %s %s" % ('%s', '%s', '%s', '%s', cond, add_cond1), (doctype_name, total, based_on, company))
+			add_cond1 += " and master_name = '"+cstr(item.replace("'", "\'"))+"'"
+			itemwise_exists = frappe.db.sql("""select value from `tabAuthorization Rule`
+				where transaction = %s and value <= %s
+				and based_on = %s and company = %s and docstatus != 2 %s %s""" %
+				('%s', '%s', '%s', '%s', cond, add_cond1), (doctype_name, total, based_on, company))
+
 			if not itemwise_exists:
-				itemwise_exists = frappe.db.sql("select value from `tabAuthorization Rule` where transaction = %s and value <= %s and based_on = %s and ifnull(company,'') = '' and docstatus != 2 %s %s" % ('%s', '%s', '%s', cond, add_cond1), (doctype_name, total, based_on))
+				itemwise_exists = frappe.db.sql("""select value from `tabAuthorization Rule`
+					where transaction = %s and value <= %s and based_on = %s
+					and ifnull(company,'') = ''	and docstatus != 2 %s %s""" %
+					('%s', '%s', '%s', cond, add_cond1), (doctype_name, total, based_on))
+
 			if itemwise_exists:
 				self.get_appr_user_role(itemwise_exists, doctype_name, total, based_on, cond+add_cond1, item,company)
 				chk = 0
 		if chk == 1:
-			if based_on == 'Itemwise Discount': add_cond2 += " and ifnull(master_name,'') = ''"
-			appr = frappe.db.sql("select value from `tabAuthorization Rule` where transaction = %s and value <= %s and based_on = %s and company = %s and docstatus != 2 %s %s" % ('%s', '%s', '%s', '%s', cond, add_cond2), (doctype_name, total, based_on, company))
+			if based_on == 'Itemwise Discount':
+				add_cond2 += " and ifnull(master_name,'') = ''"
+
+			appr = frappe.db.sql("""select value from `tabAuthorization Rule`
+				where transaction = %s and value <= %s and based_on = %s
+				and company = %s and docstatus != 2 %s %s""" %
+				('%s', '%s', '%s', '%s', cond, add_cond2), (doctype_name, total, based_on, company))
 
 			if not appr:
-				appr = frappe.db.sql("select value from `tabAuthorization Rule` where transaction = %s and value <= %s and based_on = %s and ifnull(company,'') = '' and docstatus != 2 %s %s"% ('%s', '%s', '%s', cond, add_cond2), (doctype_name, total, based_on))
+				appr = frappe.db.sql("""select value from `tabAuthorization Rule`
+					where transaction = %s and value <= %s and based_on = %s
+					and ifnull(company,'') = '' and docstatus != 2 %s %s""" %
+					('%s', '%s', '%s', cond, add_cond2), (doctype_name, total, based_on))
+
 			self.get_appr_user_role(appr, doctype_name, total, based_on, cond+add_cond2, item, company)
 
-
-	# Bifurcate Authorization based on type
-	# --------------------------------------
 	def bifurcate_based_on_type(self, doctype_name, total, av_dis, based_on, doc_obj, val, company):
 		add_cond = ''
 		auth_value = av_dis
-		if val == 1: add_cond += " and system_user = '"+session['user']+"'"
+
+		if val == 1: add_cond += " and system_user = '"+session['user'].replace("'", "\'")+"'"
 		elif val == 2: add_cond += " and system_role IN %s" % ("('"+"','".join(frappe.user.get_roles())+"')")
 		else: add_cond += " and ifnull(system_user,'') = '' and ifnull(system_role,'') = ''"
+
 		if based_on == 'Grand Total': auth_value = total
 		elif based_on == 'Customerwise Discount':
 			if doc_obj:
 				if doc_obj.doctype == 'Sales Invoice': customer = doc_obj.customer
 				else: customer = doc_obj.customer_name
-				add_cond = " and master_name = '"+make_esc("'")(cstr(customer))+"'"
+				add_cond = " and master_name = '"+cstr(customer).replace("'", "\'")+"'"
 		if based_on == 'Itemwise Discount':
 			if doc_obj:
 				for t in doc_obj.get(doc_obj.fname):
@@ -80,9 +93,6 @@
 		else:
 			self.validate_auth_rule(doctype_name, auth_value, based_on, add_cond, company)
 
-
-	# Check Approving Authority for transactions other than expense voucher and Appraisal
-	# -------------------------
 	def validate_approving_authority(self, doctype_name,company, total, doc_obj = ''):
 		av_dis = 0
 		if doc_obj:
@@ -94,11 +104,12 @@
 			if price_list_rate: av_dis = 100 - flt(base_rate * 100 / price_list_rate)
 
 		final_based_on = ['Grand Total','Average Discount','Customerwise Discount','Itemwise Discount']
-		# Individual User
-		# ================
-		# Check for authorization set for individual user
 
-		based_on = [x[0] for x in frappe.db.sql("select distinct based_on from `tabAuthorization Rule` where transaction = %s and system_user = %s and (company = %s or ifnull(company,'')='') and docstatus != 2", (doctype_name, session['user'], company))]
+		# Check for authorization set for individual user
+		based_on = [x[0] for x in frappe.db.sql("""select distinct based_on from `tabAuthorization Rule`
+			where transaction = %s and system_user = %s
+			and (company = %s or ifnull(company,'')='') and docstatus != 2""",
+			(doctype_name, session['user'], company))]
 
 		for d in based_on:
 			self.bifurcate_based_on_type(doctype_name, total, av_dis, d, doc_obj, 1, company)
@@ -107,8 +118,6 @@
 		for r in based_on:
 			if r in final_based_on and r != 'Itemwise Discount': final_based_on.remove(r)
 
-		# Specific Role
-		# ===============
 		# Check for authorization set on particular roles
 		based_on = [x[0] for x in frappe.db.sql("""select based_on
 			from `tabAuthorization Rule`
@@ -124,19 +133,24 @@
 		for r in based_on:
 			if r in final_based_on and r != 'Itemwise Discount': final_based_on.remove(r)
 
-		# Global Rule
-		# =============
 		# Check for global authorization
 		for g in final_based_on:
 			self.bifurcate_based_on_type(doctype_name, total, av_dis, g, doc_obj, 0, company)
 
-	#========================================================================================================================
-	# payroll related check
 	def get_value_based_rule(self,doctype_name,employee,total_claimed_amount,company):
 		val_lst =[]
-		val = frappe.db.sql("select value from `tabAuthorization Rule` where transaction=%s and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s)) and ifnull(value,0)< %s and company = %s and docstatus!=2",(doctype_name,employee,employee,total_claimed_amount,company))
+		val = frappe.db.sql("""select value from `tabAuthorization Rule`
+			where transaction=%s and (to_emp=%s or
+				to_designation IN (select designation from `tabEmployee` where name=%s))
+			and ifnull(value,0)< %s and company = %s and docstatus!=2""",
+			(doctype_name,employee,employee,total_claimed_amount,company))
+
 		if not val:
-			val = frappe.db.sql("select value from `tabAuthorization Rule` where transaction=%s and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s)) and ifnull(value,0)< %s and ifnull(company,'') = '' and docstatus!=2",(doctype_name, employee, employee, total_claimed_amount))
+			val = frappe.db.sql("""select value from `tabAuthorization Rule`
+				where transaction=%s and (to_emp=%s or
+					to_designation IN (select designation from `tabEmployee` where name=%s))
+				and ifnull(value,0)< %s and ifnull(company,'') = '' and docstatus!=2""",
+				(doctype_name, employee, employee, total_claimed_amount))
 
 		if val:
 			val_lst = [y[0] for y in val]
@@ -144,13 +158,23 @@
 			val_lst.append(0)
 
 		max_val = max(val_lst)
-		rule = frappe.db.sql("select name, to_emp, to_designation, approving_role, approving_user from `tabAuthorization Rule` where transaction=%s and company = %s and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s)) and ifnull(value,0)= %s and docstatus!=2",(doctype_name,company,employee,employee,flt(max_val)), as_dict=1)
+		rule = frappe.db.sql("""select name, to_emp, to_designation, approving_role, approving_user
+			from `tabAuthorization Rule`
+			where transaction=%s and company = %s
+			and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s))
+			and ifnull(value,0)= %s and docstatus!=2""",
+			(doctype_name,company,employee,employee,flt(max_val)), as_dict=1)
+
 		if not rule:
-			rule = frappe.db.sql("select name, to_emp, to_designation, approving_role, approving_user from `tabAuthorization Rule` where transaction=%s and ifnull(company,'') = '' and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s)) and ifnull(value,0)= %s and docstatus!=2",(doctype_name,employee,employee,flt(max_val)), as_dict=1)
+			rule = frappe.db.sql("""select name, to_emp, to_designation, approving_role, approving_user
+				from `tabAuthorization Rule`
+				where transaction=%s and ifnull(company,'') = ''
+				and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s))
+				and ifnull(value,0)= %s and docstatus!=2""",
+				(doctype_name,employee,employee,flt(max_val)), as_dict=1)
 
 		return rule
 
-	#---------------------------------------------------------------------------------------------------------------------
 	# related to payroll module only
 	def get_approver_name(self, doctype_name, total, doc_obj=''):
 		app_user=[]
@@ -159,11 +183,22 @@
 
 		if doc_obj:
 			if doctype_name == 'Expense Claim':
-				rule = self.get_value_based_rule(doctype_name,doc_obj.employee,doc_obj.total_claimed_amount, doc_obj.company)
+				rule = self.get_value_based_rule(doctype_name, doc_obj.employee,
+					doc_obj.total_claimed_amount, doc_obj.company)
 			elif doctype_name == 'Appraisal':
-				rule = frappe.db.sql("select name, to_emp, to_designation, approving_role, approving_user from `tabAuthorization Rule` where transaction=%s and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s)) and company = %s and docstatus!=2",(doctype_name,doc_obj.employee, doc_obj.employee, doc_obj.company),as_dict=1)
+				rule = frappe.db.sql("""select name, to_emp, to_designation, approving_role, approving_user
+					from `tabAuthorization Rule` where transaction=%s
+					and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s))
+					and company = %s and docstatus!=2""",
+					(doctype_name,doc_obj.employee, doc_obj.employee, doc_obj.company),as_dict=1)
+
 				if not rule:
-					rule = frappe.db.sql("select name, to_emp, to_designation, approving_role, approving_user from `tabAuthorization Rule` where transaction=%s and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s)) and ifnull(company,'') = '' and docstatus!=2",(doctype_name,doc_obj.employee, doc_obj.employee),as_dict=1)
+					rule = frappe.db.sql("""select name, to_emp, to_designation, approving_role, approving_user
+						from `tabAuthorization Rule`
+						where transaction=%s and (to_emp=%s or
+							to_designation IN (select designation from `tabEmployee` where name=%s))
+							and ifnull(company,'') = '' and docstatus!=2""",
+							(doctype_name,doc_obj.employee, doc_obj.employee), as_dict=1)
 
 			if rule:
 				for m in rule:
@@ -171,7 +206,11 @@
 						if m['approving_user']:
 							app_specific_user.append(m['approving_user'])
 						elif m['approving_role']:
-							user_lst = [z[0] for z in frappe.db.sql("select distinct t1.name from `tabUser` t1, `tabUserRole` t2 where t2.role=%s and t2.parent=t1.name and t1.name !='Administrator' and t1.name != 'Guest' and t1.docstatus !=2",m['approving_role'])]
+							user_lst = [z[0] for z in frappe.db.sql("""select distinct t1.name
+								from `tabUser` t1, `tabUserRole` t2 where t2.role=%s
+								and t2.parent=t1.name and t1.name !='Administrator'
+								and t1.name != 'Guest' and t1.docstatus !=2""", m['approving_role'])]
+
 							for x in user_lst:
 								if not x in app_user:
 									app_user.append(x)
