[Fix] Leave Application & Expense Claim query fix | Leave Balance Report fix (#14149)

* move set_query to setup function

* rectify leave balance report according to deparmtent changes
diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.js b/erpnext/hr/doctype/expense_claim/expense_claim.js
index f9d1c43..0da8ac2 100644
--- a/erpnext/hr/doctype/expense_claim/expense_claim.js
+++ b/erpnext/hr/doctype/expense_claim/expense_claim.js
@@ -147,6 +147,15 @@
 				]
 			};
 		});
+		frm.set_query("expense_approver", function() {
+			return {
+				query: "erpnext.hr.doctype.department_approver.department_approver.get_approvers",
+				filters: {
+					employee: frm.doc.employee,
+					doctype: frm.doc.doctype
+				}
+			};
+		});
 	},
 
 	onload: function(frm) {
@@ -163,15 +172,6 @@
 				}
 			});
 		}
-		frm.set_query("expense_approver", function() {
-			return {
-				query: "erpnext.hr.doctype.department_approver.department_approver.get_approvers",
-				filters: {
-					employee: frm.doc.employee,
-					doctype: frm.doc.doctype
-				}
-			};
-		});
 	},
 
 	refresh: function(frm) {
diff --git a/erpnext/hr/doctype/leave_application/leave_application.js b/erpnext/hr/doctype/leave_application/leave_application.js
index 7a6b246..0b48706 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.js
+++ b/erpnext/hr/doctype/leave_application/leave_application.js
@@ -5,6 +5,19 @@
 cur_frm.add_fetch('employee','company','company');
 
 frappe.ui.form.on("Leave Application", {
+	setup: function(frm) {
+		frm.set_query("leave_approver", function() {
+			return {
+				query: "erpnext.hr.doctype.department_approver.department_approver.get_approvers",
+				filters: {
+					employee: frm.doc.employee,
+					doctype: frm.doc.doctype
+				}
+			};
+		}); 
+
+		frm.set_query("employee", erpnext.queries.employee);
+	},
 	onload: function(frm) {
 		if (!frm.doc.posting_date) {
 			frm.set_value("posting_date", frappe.datetime.get_today());
@@ -22,17 +35,6 @@
 				}
 			});
 		}
-		frm.set_query("leave_approver", function() {
-			return {
-				query: "erpnext.hr.doctype.department_approver.department_approver.get_approvers",
-				filters: {
-					employee: frm.doc.employee,
-					doctype: frm.doc.doctype
-				}
-			};
-		}); 
-
-		frm.set_query("employee", erpnext.queries.employee);
 	},
 
 	validate: function(frm) {
diff --git a/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py b/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py
index 8105e1a..a603015 100644
--- a/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py
+++ b/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py
@@ -39,8 +39,7 @@
 	
 	data = []
 	for employee in active_employees:
-		leave_approvers = [l.leave_approver for l in frappe.db.sql("""select leave_approver from `tabEmployee Leave Approver` where parent = %s""",
-							(employee.name),as_dict=True)]
+		leave_approvers = get_approvers(employee.department)
 		if (len(leave_approvers) and user in leave_approvers) or (user in ["Administrator", employee.user_id]) or ("HR Manager" in frappe.get_roles(user)):
 			row = [employee.name, employee.employee_name, employee.department]
 
@@ -54,7 +53,25 @@
 					allocation_records_based_on_to_date.get(employee.name, frappe._dict()))
 
 				row += [leaves_taken, closing]
-			
+
 			data.append(row)
 		
-	return data
\ No newline at end of file
+	return data
+
+def get_approvers(department):
+	if not department:
+		return []
+
+	approvers = []
+	# get current department and all its child
+	department_details = frappe.db.get_value("Department", {"name": department}, ["lft", "rgt"], as_dict=True)
+	department_list = frappe.db.sql("""select name from `tabDepartment`
+		where lft >= %s and rgt <= %s order by lft desc
+		""", (department_details.lft, department_details.rgt), as_list = True)
+
+	# retrieve approvers list from current department and from its subsequent child departments
+	for d in department_list:
+		approvers.extend([l.leave_approver for l in frappe.db.sql("""select approver from `tabDepartment Approver` \
+			where parent = %s and parentfield = 'leave_approver'""", (d), as_dict=True)])
+
+	return approvers