From 5ad83c06c225f5a8a8cb47f0f5b5dc412f988fe5 Mon Sep 17 00:00:00 2001 From: Mangesh-Khairnar Date: Fri, 10 May 2019 19:50:04 +0530 Subject: [PATCH] feat: add ledger entries on leave addition --- .../leave_allocation/leave_allocation.py | 24 ++++++++++++++++--- .../leave_application/leave_application.py | 21 ++++++++++++++++ .../leave_ledger_entry/leave_ledger_entry.py | 19 +++------------ 3 files changed, 45 insertions(+), 19 deletions(-) diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.py b/erpnext/hr/doctype/leave_allocation/leave_allocation.py index aa1cc9ecad..5f474a4554 100755 --- a/erpnext/hr/doctype/leave_allocation/leave_allocation.py +++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.py @@ -42,10 +42,10 @@ class LeaveAllocation(Document): .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 @@ class LeaveAllocation(Document): 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 f542fa1e5c..61f617806f 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.utils import set_employee_name, get_leave_period 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 @@ class LeaveApplication(Document): # notify leave applier about approval self.notify_employee() + self.create_leave_ledger_entry() self.reload() def on_cancel(self): @@ -57,6 +59,7 @@ class LeaveApplication(Document): # 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 @@ class LeaveApplication(Document): 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 @@ -384,6 +395,16 @@ def get_leave_details(employee, date): 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 35dce97936..60d35957b9 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 @@ from frappe.utils import add_days 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 @@ def create_leave_ledger_entry(ref_doc, submit=True): 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