Compensatory Leave Request - leave allocation create and update - fix
diff --git a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py
index ec52228..4140668 100644
--- a/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py
+++ b/erpnext/hr/doctype/compensatory_leave_request/compensatory_leave_request.py
@@ -5,7 +5,7 @@
from __future__ import unicode_literals
import frappe
from frappe import _
-from frappe.utils import date_diff
+from frappe.utils import date_diff, add_days
from frappe.model.document import Document
from erpnext.hr.utils import validate_dates, validate_overlap, get_leave_period
@@ -20,21 +20,49 @@
frappe.throw(_("Please select a leave type to submit the request"))
else:
company = frappe.db.get_value("Employee", self.employee, "company")
+ date_difference = date_diff(self.work_end_date, self.work_from_date) + 1
leave_period = get_leave_period(self.work_from_date, self.work_end_date, company)
if leave_period:
- self.create_leave_allocation(leave_period)
+ leave_allocation_name = self.exists_allocation_for_period(leave_period)
+ if leave_allocation_name:
+ leave_allocation = frappe.get_doc("Leave Allocation", leave_allocation_name)
+ new_leaves_allocated = leave_allocation.new_leaves_allocated
+ leave_allocation.new_leaves_allocated += date_difference
+ leave_allocation.submit()
+ else:
+ self.create_leave_allocation(leave_period, date_difference)
else:
frappe.throw(_("There is no leave period in between {0} and {1}").format(self.work_from_date, self.work_end_date))
- def create_leave_allocation(self, leave_period):
- date_difference = date_diff(self.work_end_date, self.work_from_date) + 1
+ def exists_allocation_for_period(self, leave_period):
+ leave_allocation = frappe.db.sql("""
+ select name
+ from `tabLeave Allocation`
+ where employee=%(employee)s and leave_type=%(leave_type)s
+ and docstatus=1
+ and (from_date between %(from_date)s and %(to_date)s
+ or to_date between %(from_date)s and %(to_date)s
+ or (from_date < %(from_date)s and to_date > %(to_date)s))
+ """, {
+ "from_date": leave_period[0].from_date,
+ "to_date": leave_period[0].to_date,
+ "employee": self.employee,
+ "leave_type": self.leave_type
+ }, as_dict=1)
+
+ if leave_allocation:
+ return leave_allocation[0].name
+ else:
+ False
+
+ def create_leave_allocation(self, leave_period, date_difference):
is_carry_forward = frappe.db.get_value("Leave Type", self.leave_type, "is_carry_forward")
allocation = frappe.new_doc("Leave Allocation")
allocation.employee = self.employee
allocation.employee_name = self.employee_name
allocation.leave_type = self.leave_type
- allocation.from_date = self.work_from_date
- allocation.to_date = self.work_end_date
+ allocation.from_date = add_days(self.work_end_date, 1)
+ allocation.to_date = leave_period[0].to_date
allocation.new_leaves_allocated = date_difference
allocation.total_leaves_allocated = date_difference
allocation.compensatory_request = self.name