feat: delete cancelled allocation from ledger
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 60d3595..12be479 100644
--- a/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.py
+++ b/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.py
@@ -5,13 +5,14 @@
 from __future__ import unicode_literals
 import frappe
 from frappe.model.document import Document
+from frappe import _
 from frappe.utils import add_days
 
 class LeaveLedgerEntry(Document):
 	pass
 
-def create_leave_ledger_entry(ref_doc, args):
-	ledger = dict(
+def create_leave_ledger_entry(ref_doc, args, submit):
+	ledger = frappe._dict(
 		doctype='Leave Ledger Entry',
 		employee=ref_doc.employee,
 		employee_name=ref_doc.employee_name,
@@ -20,6 +21,27 @@
 		transaction_type=ref_doc.doctype,
 		transaction_name=ref_doc.name
 	)
-
 	ledger.update(args)
-	frappe.get_doc(ledger).insert(ignore_permissions=True)
\ No newline at end of file
+
+	if submit:
+		frappe.get_doc(ledger).insert(ignore_permissions=True)
+	else:
+		delete_ledger_entry(ledger)
+
+def delete_ledger_entry(ledger):
+	''' Delete ledger entry on cancel of leave application/allocation '''
+	ledger_entry, creation_date = frappe.db.get_value("Leave Ledger Entry",
+		{'transaction_name': ledger.transaction_name},
+		['name', 'creation']
+		)
+	leave_application_records = frappe.get_all("Leave Ledger Entry",
+		filters={
+			'transaction_type': 'Leave Application',
+			'creation_date': (">", creation_date)
+		},
+		fields=['transaction_type'])
+	if not leave_application_records:
+		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