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