diff --git a/erpnext/patches/v12_0/generate_leave_ledger_entries.py b/erpnext/patches/v12_0/generate_leave_ledger_entries.py
index 065a013..07e53c7 100644
--- a/erpnext/patches/v12_0/generate_leave_ledger_entries.py
+++ b/erpnext/patches/v12_0/generate_leave_ledger_entries.py
@@ -3,84 +3,70 @@
 
 from __future__ import unicode_literals
 import frappe
+from frappe.utils import getdate
 
 def execute():
     """ Generates leave ledger entries for leave allocation/application/encashment
         for last allocation """
-    frappe.reload_doc("HR","doctype", "Leave Ledger Entry")
-    frappe.reload_doc("HR","doctype", "Leave Encashment")
+    frappe.reload_doc("HR", "doctype", "Leave Ledger Entry")
+    frappe.reload_doc("HR", "doctype", "Leave Encashment")
     if frappe.db.a_row_exists("Leave Ledger Entry"):
         return
 
-    allocation_list = get_allocation_records()
-    generate_allocation_ledger_entries(allocation_list)
-    generate_application_leave_ledger_entries(allocation_list)
-    generate_encashment_leave_ledger_entries(allocation_list)
+    generate_allocation_ledger_entries()
+    generate_application_leave_ledger_entries()
+    generate_encashment_leave_ledger_entries()
 
-def generate_allocation_ledger_entries(allocation_list):
+def generate_allocation_ledger_entries():
     ''' fix ledger entries for missing leave allocation transaction '''
-    from erpnext.hr.doctype.leave_allocation.leave_allocation import LeaveAllocation
+    allocation_list = get_allocation_records()
 
     for allocation in allocation_list:
         if not frappe.db.exists("Leave Ledger Entry", {'transaction_type': 'Leave Allocation', 'transaction_name': allocation.name}):
             allocation.update(dict(doctype="Leave Allocation"))
-            leave_allocation = LeaveAllocation(allocation)
-            leave_allocation.create_leave_ledger_entry()
+            allocation_obj = frappe.get_doc(allocation)
+            allocation_obj.create_leave_ledger_entry()
+            if allocation.to_date <= getdate():
+                allocation_obj.expire_allocation()
 
-def generate_application_leave_ledger_entries(allocation_list):
+
+def generate_application_leave_ledger_entries():
     ''' fix ledger entries for missing leave application transaction '''
-    from erpnext.hr.doctype.leave_application.leave_application import LeaveApplication
+    leave_applications = get_leaves_application_records()
 
-    leave_applications = get_leaves_application_records(allocation_list)
-
-    for record in leave_applications:
+    for application in leave_applications:
         if not frappe.db.exists("Leave Ledger Entry", {'transaction_type': 'Leave Application', 'transaction_name': record.name}):
-            record.update(dict(doctype="Leave Application"))
-            leave_application = LeaveApplication(record)
-            leave_application.create_leave_ledger_entry()
+            application.update(dict(doctype="Leave Application"))
+            frappe.get_doc(application).create_leave_ledger_entry()
 
-def generate_encashment_leave_ledger_entries(allocation_list):
+def generate_encashment_leave_ledger_entries():
     ''' fix ledger entries for missing leave encashment transaction '''
-    from erpnext.hr.doctype.leave_encashment.leave_encashment import LeaveEncashment
+    leave_encashments = get_leave_encashment_records()
 
-    leave_encashments = get_leave_encashment_records(allocation_list)
-
-    for record in leave_encashments:
+    for encashment in leave_encashments:
         if not frappe.db.exists("Leave Ledger Entry", {'transaction_type': 'Leave Encashment', 'transaction_name': record.name}):
-            record.update(dict(doctype="Leave Encashment"))
-            leave_encashment = LeaveEncashment(record)
-            leave_encashment.create_leave_ledger_entry()
+            encashment.update(dict(doctype="Leave Encashment"))
+            frappe.get_doc(encashment).create_leave_ledger_entry()
 
 def get_allocation_records():
     return frappe.db.sql("""
-        WITH allocation_values AS (
-            SELECT
-                DISTINCT name,
-                employee,
-                leave_type,
-                new_leaves_allocated,
-                carry_forwarded_leaves,
-                from_date,
-                to_date,
-                carry_forward,
-                RANK() OVER(
-                    PARTITION BY employee, leave_type
-                    ORDER BY to_date DESC
-                ) as allocation
-            FROM `tabLeave Allocation`
-        )
         SELECT
-            *
-        FROM
-            `allocation_values`
+            DISTINCT name,
+            employee,
+            leave_type,
+            new_leaves_allocated,
+            carry_forwarded_leaves,
+            from_date,
+            to_date,
+            carry_forward
+        FROM `tabLeave Allocation`
         WHERE
-            allocation=1
+            docstatus=1
+        ORDER BY to_date ASC
     """, as_dict=1)
 
-def get_leaves_application_records(allocation_list):
-    leave_applications = []
-    for allocation in allocation_list:
-        leave_applications += frappe.db.sql("""
+def get_leaves_application_records():
+    return frappe.db.sql("""
             SELECT
                 DISTINCT name,
                 employee,
@@ -90,16 +76,11 @@
                 to_date
             FROM `tabLeave Application`
             WHERE
-                from_date >= %s
-                AND leave_type = %s
-                AND employee = %s
-        """, (allocation.from_date, allocation.leave_type, allocation.employee), as_dict=1)
-    return leave_applications
+                docstatus=1
+        """, as_dict=1)
 
-def get_leave_encashment_records(allocation_list):
-    leave_encashments = []
-    for allocation in allocation_list:
-        leave_encashments += frappe.db.sql("""
+def get_leave_encashment_records():
+    return frappe.db.sql("""
             SELECT
                 DISTINCT name,
                 employee,
@@ -108,8 +89,5 @@
                 encashment_date
             FROM `tabLeave Encashment`
             WHERE
-                leave_type = %s
-                AND employee = %s
-                AND encashment_date >= %s
-        """, (allocation.leave_type, allocation.employee, allocation.from_date), as_dict=1)
-    return leave_encashments
\ No newline at end of file
+                AND docstatus=1
+        """, as_dict=1)
\ No newline at end of file
