fix: consider min days remaining as remaining leaves
diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py
index 70d7aa4..9e0ed0f 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.py
+++ b/erpnext/hr/doctype/leave_application/leave_application.py
@@ -351,15 +351,9 @@
 				pass
 
 	def create_leave_ledger_entry(self, submit=True):
-		# check if there is a carry forwarded allocation expiry between application
-		allocation = frappe.db.get_value('Leave Ledger Entry',
-			filters={
-				'transaction_type': "Leave Allocation",
-				'is_carry_forward': 1,
-				'from_date': self.to_date
-			})
 		args = frappe._dict(
 			leaves=self.total_leave_days,
+			from_date=self.from_date,
 			to_date=self.to_date,
 			is_carry_forward=0
 		)
@@ -403,38 +397,37 @@
 
 	return ret
 
-@frappe.whitelist()
-def get_leave_balance_on(employee, leave_type, date, allocation_records=None, consider_all_leaves_in_the_allocation_period=False):
+def get_leave_balance_on(employee, leave_type, date, allocation_records=None, docname=None,
+		consider_all_leaves_in_the_allocation_period=False, consider_encashed_leaves=True):
 
-	if allocation_records:
-		# leave_balance based on current allocation records
-		allocation = allocation_records.get(leave_type, frappe._dict())
-		from_date = allocation.from_date
-		to_date = allocation.to_date
-	else:
-		# fetched the expired allocation creation date
-		from_date, to_date = frappe.db.get_value('Leave Ledger Entry',
-			filters={
-				'transaction_type': 'Leave Allocation',
-				'employee': employee,
-				'leave_type': leave_type,
-				'is_expired': 0,
-				'is_carry_forward': 0,
-			},
-			fieldname=['from_date', 'to_date'],
-			order_by='to_date DESC')
-
+	if allocation_records == None:
+		allocation_records = get_leave_allocation_records(date, employee).get(employee, frappe._dict())
+	allocation = allocation_records.get(leave_type, frappe._dict())
 	if consider_all_leaves_in_the_allocation_period:
-		date = to_date
-
-	leave_records = frappe.get_all("Leave Ledger Entry",
-		filters={'Employee':employee,
+		date = allocation.to_date
+	leaves_taken = frappe.db.get_value("Leave Ledger Entry", filters={
+		'Employee':employee,
 		'leave_type':leave_type,
+		'transaction_type': ('!=', 'Leave Allocation'),
 		'to_date':("<=", date),
 		'from_date': from_date},
-		fields=['leaves'])
+		fields=['SUM(leaves)'])
 
-	return sum(record.get("leaves") for record in leave_records)
+	remaining_unused_leaves = flt(allocation.unused_leaves + leaves_taken)
+	if allocation.carry_forward and remaining_unused_leaves > 0:
+		expiry_date = frappe.db.get_value("Leave Ledger Entry", filters={
+			'Employee':employee,
+			'leave_type':leave_type,
+			'transaction_type': 'Leave Allocation',
+			'transaction_name': allocation.name,
+			'is_carry_forward': 1,
+			'is_expiry': 0
+		}, fieldname=['to_date'])
+		remaining_days = date_diff(expiry_date, date) + 1
+
+		remaining_unused_leaves = min(remaining_days, remaining_unused_leaves)
+
+	return flt(allocation.new_leaves) + remaining_unused_leaves + leaves_taken
 
 def get_total_allocated_leaves(employee, leave_type, date):
 	filters= {
@@ -495,8 +488,10 @@
 		allocated_leaves.setdefault(d.employee, frappe._dict()).setdefault(d.leave_type, frappe._dict({
 			"from_date": d.from_date,
 			"to_date": d.to_date,
-			"total_leaves_allocated": d.total_leaves_allocated,
-			"total_leaves_encashed":d.total_leaves_encashed
+			"carry_forward": d.carry_forward,
+			"unused_leaves": d.carry_forwarded_leaves,
+			"new_leaves": d.new_leaves_allocated,
+			"name": d.name
 		}))
 	return allocated_leaves
 
@@ -677,4 +672,4 @@
 
 	if department:
 		return frappe.db.get_value('Department Approver', {'parent': department,
-			'parentfield': 'leave_approvers', 'idx': 1}, 'approver')
+			'parentfield': 'leave_approvers', 'idx': 1}, 'approver')
\ No newline at end of file