feat: add ledger entries on leave addition
diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.py b/erpnext/hr/doctype/leave_allocation/leave_allocation.py
index aa1cc9e..5f474a4 100755
--- a/erpnext/hr/doctype/leave_allocation/leave_allocation.py
+++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.py
@@ -42,10 +42,10 @@
 				.format(self.leave_type, self.employee))
 
 	def on_submit(self):
-		create_leave_ledger_entry(self)
+		self.create_leave_ledger_entry()
 
-	def on_cancel(self):
-		create_leave_ledger_entry(self)
+	# def before_cancel(self):
+	# 	self.create_leave_ledger_entry(submit=False)
 
 	def on_update_after_submit(self):
 		self.validate_new_leaves_allocated_value()
@@ -118,6 +118,24 @@
 			else:
 				frappe.throw(_("Total allocated leaves {0} cannot be less than already approved leaves {1} for the period").format(self.total_leaves_allocated, leaves_taken), LessAllocationError)
 
+	def create_leave_ledger_entry(self, submit=True):
+		if self.carry_forwarded_leaves:
+			expiry_days = frappe.db.get_value("Leave Type", self.leave_type, "carry_forward_leave_expiry")
+
+			args = dict(
+				leaves=self.carry_forwarded_leaves * 1 if submit else -1,
+				to_date=add_days(self.from_date, expiry_days) if expiry_days else self.to_date,
+				is_carry_forward=1
+			)
+			create_leave_ledger_entry(self, args)
+
+		args = dict(
+			leaves=self.new_leaves_allocated * 1 if submit else -1,
+			to_date=self.to_date,
+			is_carry_forward=0
+		)
+		create_leave_ledger_entry(self, args)
+
 def get_leave_allocation_for_period(employee, leave_type, from_date, to_date):
 	leave_allocated = 0
 	leave_allocations = frappe.db.sql("""
diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py
index f542fa1..61f6178 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.py
+++ b/erpnext/hr/doctype/leave_application/leave_application.py
@@ -10,6 +10,7 @@
 from erpnext.hr.doctype.leave_block_list.leave_block_list import get_applicable_block_dates
 from erpnext.hr.doctype.employee.employee import get_holiday_list_for_employee
 from erpnext.buying.doctype.supplier_scorecard.supplier_scorecard import daterange
+from erpnext.hr.doctype.leave_ledger_entry.leave_ledger_entry import create_leave_ledger_entry
 
 class LeaveDayBlockedError(frappe.ValidationError): pass
 class OverlapError(frappe.ValidationError): pass
@@ -50,6 +51,7 @@
 
 		# notify leave applier about approval
 		self.notify_employee()
+		self.create_leave_ledger_entry()
 		self.reload()
 
 	def on_cancel(self):
@@ -57,6 +59,7 @@
 		# notify leave applier about cancellation
 		self.notify_employee()
 		self.cancel_attendance()
+		self.create_leave_ledger_entry(submit=False)
 
 	def validate_applicable_after(self):
 		if self.leave_type:
@@ -346,6 +349,14 @@
 			except frappe.OutgoingEmailError:
 				pass
 
+	def create_leave_ledger_entry(self, submit=True):
+		args = dict(
+			leaves=self.total_leave_days * -1 if submit else 1,
+			to_date=self.to_date,
+			is_carry_forward=0
+		)
+		create_leave_ledger_entry(self, args)
+
 @frappe.whitelist()
 def get_number_of_leave_days(employee, leave_type, from_date, to_date, half_day = None, half_day_date = None):
 	number_of_days = 0
@@ -385,6 +396,16 @@
 	return ret
 
 @frappe.whitelist()
+def get_leave_balance(employee, leave_type, date):
+	leave_records = frappe.get_all("Leave Ledger Entry",
+	filters={'Employee':employee,
+	'leave_type':leave_type,
+	'to_date':("<=", date)},
+	fields=['leaves'])
+
+	return sum(record.get("leaves") for record in leave_records)
+
+@frappe.whitelist()
 def get_leave_balance_on(employee, leave_type, date, allocation_records=None, docname=None,
 		consider_all_leaves_in_the_allocation_period=False, consider_encashed_leaves=True):
 
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 35dce97..60d3595 100644
--- a/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.py
+++ b/erpnext/hr/doctype/leave_ledger_entry/leave_ledger_entry.py
@@ -10,7 +10,7 @@
 class LeaveLedgerEntry(Document):
 	pass
 
-def create_leave_ledger_entry(ref_doc, submit=True):
+def create_leave_ledger_entry(ref_doc, args):
 	ledger = dict(
 		doctype='Leave Ledger Entry',
 		employee=ref_doc.employee,
@@ -20,19 +20,6 @@
 		transaction_type=ref_doc.doctype,
 		transaction_name=ref_doc.name
 	)
-	if ref_doc.carry_forwarded_leaves:
-		expiry_days = frappe.db.get_value("Leave Type", ref_doc.leave_type, "carry_forward_leave_expiry")
 
-		ledger.update(dict(
-			leaves=ref_doc.carry_forwarded_leaves * 1 if submit else -1,
-			to_date=add_days(ref_doc.from_date, expiry_days) if expiry_days else ref_doc.to_date,
-			is_carry_forward=1
-		))
-		frappe.get_doc(ledger).submit()
-
-	ledger.update(dict(
-		leaves=ref_doc.new_leaves_allocated * 1 if submit else -1,
-		to_date=ref_doc.to_date,
-		is_carry_forward=0
-	))
-	frappe.get_doc(ledger).submit()
\ No newline at end of file
+	ledger.update(args)
+	frappe.get_doc(ledger).insert(ignore_permissions=True)
\ No newline at end of file