feat: create expiry ledger entry on allocation period completion
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index 53da013..72c538f 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -264,6 +264,7 @@
 		"erpnext.projects.doctype.project.project.update_project_sales_billing",
 		"erpnext.projects.doctype.project.project.send_project_status_email_to_users",
 		"erpnext.quality_management.doctype.quality_review.quality_review.review",
+		"erpnext.hr.doctype.leave_ledger_entry.leave_ledger_entry.check_expired_allocation"
 		"erpnext.support.doctype.service_level_agreement.service_level_agreement.check_agreement_status"
 	],
 	"daily_long": [
diff --git a/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.py b/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.py
index 23258f1..585e107 100644
--- a/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.py
+++ b/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.py
@@ -6,12 +6,12 @@
 import frappe
 from frappe.model.document import Document
 from frappe import _
-from frappe.utils import add_days
+from frappe.utils import add_days, today
 
 class LeaveLedgerEntry(Document):
 	pass
 
-def create_leave_ledger_entry(ref_doc, args, submit):
+def create_leave_ledger_entry(ref_doc, args, submit=True):
 	ledger = frappe._dict(
 		doctype='Leave Ledger Entry',
 		employee=ref_doc.employee,
@@ -47,4 +47,27 @@
 		frappe.delete_doc("Leave Ledger Entry", ledger_entry)
 	else:
 		frappe.throw(_("Leave allocation %s is linked with leave application %s"
-			% (ledger_entry, ', '.join(leave_application_records))))
\ No newline at end of file
+			% (ledger_entry, ', '.join(leave_application_records))))
+
+def check_expired_allocation():
+	''' Checks for expired allocation by comparing to_date with current_date and
+		based on that creates an expiry ledger entry '''
+	expired_allocation = frappe.db.get_all("Leave Ledger Allocation",
+		filters={
+			'to_date': today(),
+			'transaction_type': 'Leave Allocation'
+		},
+		fields=['name', 'transaction_name'])
+
+	if expired_allocation:
+		create_expiry_ledger_entry(expired_allocation)
+
+def create_expiry_ledger_entry(expired_allocation):
+	for allocation in expired_allocation:
+		ledger_entry = frappe.get_doc('Leave Ledger Entry', allocation.name)
+		args = {
+			'leaves': -ledger_entry.leaves,
+			'to_date': '',
+			'is_carry_forward': ledger_entry.is_carry_forward
+		}
+		create_leave_ledger_entry(ledger_entry, args)
\ No newline at end of file