fix: create reverse expiry for back dated leaves
diff --git a/erpnext/hr/doctype/leave_encashment/leave_encashment.py b/erpnext/hr/doctype/leave_encashment/leave_encashment.py
index 70cd578..c47ff85 100644
--- a/erpnext/hr/doctype/leave_encashment/leave_encashment.py
+++ b/erpnext/hr/doctype/leave_encashment/leave_encashment.py
@@ -11,6 +11,7 @@
 from erpnext.hr.doctype.leave_application.leave_application import get_leave_balance_on
 from erpnext.hr.doctype.salary_structure_assignment.salary_structure_assignment import get_assigned_salary_structure
 from erpnext.hr.doctype.leave_ledger_entry.leave_ledger_entry import create_leave_ledger_entry
+from erpnext.hr.doctype.leave_allocation.leave_allocation import get_unused_leaves
 
 class LeaveEncashment(Document):
 	def validate(self):
@@ -26,7 +27,7 @@
 
 	def on_submit(self):
 		if not self.leave_allocation:
-			self.leave_allocation = self.get_leave_allocation()
+			self.leave_allocation = self.get_leave_allocation().get('name')
 		additional_salary = frappe.new_doc("Additional Salary")
 		additional_salary.company = frappe.get_value("Employee", self.employee, "company")
 		additional_salary.employee = self.employee
@@ -61,8 +62,9 @@
 		if not frappe.db.get_value("Leave Type", self.leave_type, 'allow_encashment'):
 			frappe.throw(_("Leave Type {0} is not encashable").format(self.leave_type))
 
-		self.leave_balance = get_leave_balance_on(self.employee, self.leave_type,
-			self.encashment_date or getdate(nowdate()), consider_all_leaves_in_the_allocation_period=True)
+		allocation = self.get_leave_allocation()
+
+		self.leave_balance = allocation.total_leaves_allocated - get_unused_leaves(self.employee, self.leave_type, allocation.from_date, self.encashment_date)
 
 		encashable_days = self.leave_balance - frappe.db.get_value('Leave Type', self.leave_type, 'encashment_threshold_days')
 		self.encashable_days = encashable_days if encashable_days > 0 else 0
@@ -70,15 +72,15 @@
 		per_day_encashment = frappe.db.get_value('Salary Structure', salary_structure , 'leave_encashment_amount_per_day')
 		self.encashment_amount = self.encashable_days * per_day_encashment if per_day_encashment > 0 else 0
 
-		self.leave_allocation = self.get_leave_allocation()
+		self.leave_allocation = allocation.name
 		return True
 
 	def get_leave_allocation(self):
-		leave_allocation = frappe.db.sql("""select name from `tabLeave Allocation` where '{0}'
+		leave_allocation = frappe.db.sql("""select name, to_date, total_leaves_allocated from `tabLeave Allocation` where '{0}'
 		between from_date and to_date and docstatus=1 and leave_type='{1}'
-		and employee= '{2}'""".format(self.encashment_date or getdate(nowdate()), self.leave_type, self.employee))
+		and employee= '{2}'""".format(self.encashment_date or getdate(nowdate()), self.leave_type, self.employee), as_dict=1)
 
-		return leave_allocation[0][0] if leave_allocation else None
+		return leave_allocation[0] if leave_allocation else None
 
 	def create_leave_ledger_entry(self, submit=True):
 		args = frappe._dict(
@@ -87,4 +89,16 @@
 			to_date=self.encashment_date,
 			is_carry_forward=0
 		)
-		create_leave_ledger_entry(self, args, submit)
\ No newline at end of file
+		create_leave_ledger_entry(self, args, submit)
+
+		# create reverse entry for expired leaves
+		to_date = self.get_leave_allocation().get('to_date')
+		if to_date < getdate(nowdate()):
+			args = frappe._dict(
+				leaves=self.encashable_days,
+				from_date=to_date,
+				to_date=to_date,
+				is_carry_forward=0
+			)
+			create_leave_ledger_entry(self, args, submit)
+
diff --git a/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py b/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py
index 2daeffc..e5bd170 100644
--- a/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py
+++ b/erpnext/hr/doctype/leave_encashment/test_leave_encashment.py
@@ -38,7 +38,6 @@
 		self.leave_period = create_leave_period(add_months(today(), -3), add_months(today(), 3))
 		self.leave_period.grant_leave_allocation(employee=self.employee)
 
-
 	def test_leave_balance_value_and_amount(self):
 		frappe.db.sql('''delete from `tabLeave Encashment`''')
 		leave_encashment = frappe.get_doc(dict(