fix: expiry logic for carry forwarded allocation
diff --git a/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.json b/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.json
index c7e6b70..89c703d 100644
--- a/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.json
+++ b/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.json
@@ -12,6 +12,7 @@
   "from_date",
   "to_date",
   "is_carry_forward",
+  "is_expired",
   "amended_from"
  ],
  "fields": [
@@ -72,10 +73,15 @@
    "fieldname": "is_carry_forward",
    "fieldtype": "Check",
    "label": "Is Carry Forward"
+  },
+  {
+   "fieldname": "is_expired",
+   "fieldtype": "Check",
+   "label": "Is Expired"
   }
  ],
  "is_submittable": 1,
- "modified": "2019-05-09 18:36:07.383714",
+ "modified": "2019-05-13 12:56:45.542495",
  "modified_by": "Administrator",
  "module": "HR",
  "name": "Leave Ledger Entry",
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 585e107..526a91e 100644
--- a/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.py
+++ b/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.py
@@ -9,7 +9,10 @@
 from frappe.utils import add_days, today
 
 class LeaveLedgerEntry(Document):
-	pass
+	def validate_entries(self):
+		leave_records = frappe.get_all('Leave Ledger Entry', ['leaves'])
+		if sum(record.get("leaves") for record in leave_records) <0:
+			frappe.throw(_("Invalid Ledger Entry"))
 
 def create_leave_ledger_entry(ref_doc, args, submit=True):
 	ledger = frappe._dict(
@@ -19,7 +22,7 @@
 		leave_type=ref_doc.leave_type,
 		from_date=ref_doc.from_date,
 		transaction_type=ref_doc.doctype,
-		transaction_name=ref_doc.name
+		transaction_name=ref_doc.name,
 	)
 	ledger.update(args)
 
@@ -52,22 +55,42 @@
 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",
+	expired_allocation = frappe.get_all("Leave Ledger Allocation",
 		filters={
 			'to_date': today(),
 			'transaction_type': 'Leave Allocation'
 		},
-		fields=['name', 'transaction_name'])
+		fields=['*'])
 
 	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
+		filters = {
+				'employee': allocation.employee,
+				'leave_type': allocation.leave_type,
+				'from_date': ('>=', allocation.from_date),
+			}
+		# get only application ledger entries in case of carry forward
+		if allocation.is_carry_forward:
+			filters.update(dict(transaction_type='Leave Application'))
+
+		leave_records = frappe.get_all("Leave Ledger Entry",
+			filters=filters,
+			fields=['leaves'])
+
+		leaves = sum(record.get("leaves") for record in leave_records)
+
+		if allocation.is_carry_forward:
+			leaves = allocation.leaves + leaves
+
+		if leaves > 0:
+			args = frappe._dict(
+				leaves=allocation.leaves * -1,
+				to_date='',
+				is_carry_forward=allocation.is_carry_forward,
+				is_expired=1,
+				from_date=allocation.to_date
+			)
+			create_leave_ledger_entry(allocation, args)
\ No newline at end of file