fix: half day leave (#19323)

diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py
index 737f602..97de40f 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.py
+++ b/erpnext/hr/doctype/leave_application/leave_application.py
@@ -404,8 +404,11 @@
 	if cint(half_day) == 1:
 		if from_date == to_date:
 			number_of_days = 0.5
-		else:
+		elif half_day_date and half_day_date <= to_date:
 			number_of_days = date_diff(to_date, from_date) + .5
+		else:
+			number_of_days = date_diff(to_date, from_date) + 1
+
 	else:
 		number_of_days = date_diff(to_date, from_date) + 1
 
@@ -549,8 +552,16 @@
 			if leave_entry.to_date > getdate(to_date):
 				leave_entry.to_date = to_date
 
+			half_day = 0
+			half_day_date = None
+			# fetch half day date for leaves with half days
+			if leave_entry.leaves % 1:
+				half_day = 1
+				half_day_date = frappe.db.get_value('Leave Application',
+					{'name': leave_entry.transaction_name}, ['half_day_date'])
+
 			leave_days += get_number_of_leave_days(employee, leave_type,
-				leave_entry.from_date, leave_entry.to_date) * -1
+				leave_entry.from_date, leave_entry.to_date, half_day, half_day_date) * -1
 
 	return leave_days
 
@@ -562,7 +573,7 @@
 def get_leave_entries(employee, leave_type, from_date, to_date):
 	''' Returns leave entries between from_date and to_date '''
 	return frappe.db.sql("""
-		select employee, leave_type, from_date, to_date, leaves, transaction_type, is_carry_forward
+		select employee, leave_type, from_date, to_date, leaves, transaction_type, is_carry_forward, transaction_name
 		from `tabLeave Ledger Entry`
 		where employee=%(employee)s and leave_type=%(leave_type)s
 			and docstatus=1