Compensatory Leave Request (#14611)
* Compensatory Leave Request - Validate Holidays and Attendance * Compensatory Leave Request - Cancel * Half Day in Compensatory Leave Request * Leave allocation on Compensatory Leave Request - Fix * Unused import
This commit is contained in:
parent
227489193b
commit
f76dbbae68
@ -10,5 +10,13 @@ frappe.ui.form.on('Compensatory Leave Request', {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
half_day: function(frm) {
|
||||||
|
if(frm.doc.half_day == 1){
|
||||||
|
frm.set_df_property('half_day_date', 'reqd', true);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
frm.set_df_property('half_day_date', 'reqd', false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -116,6 +116,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
@ -177,6 +178,71 @@
|
|||||||
"translatable": 0,
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "half_day",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Half Day",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"depends_on": "half_day",
|
||||||
|
"fieldname": "half_day_date",
|
||||||
|
"fieldtype": "Date",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Half Day Date",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_in_quick_entry": 0,
|
"allow_in_quick_entry": 0,
|
||||||
@ -349,7 +415,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2018-05-25 12:02:05.585184",
|
"modified": "2018-06-20 17:32:40.735664",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "HR",
|
"module": "HR",
|
||||||
"name": "Compensatory Leave Request",
|
"name": "Compensatory Leave Request",
|
||||||
|
@ -5,22 +5,49 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe
|
import frappe
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.utils import date_diff, add_days
|
from frappe.utils import date_diff, add_days, getdate
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
from erpnext.hr.utils import validate_dates, validate_overlap, get_leave_period
|
from erpnext.hr.utils import validate_dates, validate_overlap, get_leave_period, get_holidays_for_employee
|
||||||
|
|
||||||
class CompensatoryLeaveRequest(Document):
|
class CompensatoryLeaveRequest(Document):
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
validate_dates(self, self.work_from_date, self.work_end_date)
|
validate_dates(self, self.work_from_date, self.work_end_date)
|
||||||
|
if self.half_day:
|
||||||
|
if not self.half_day_date:
|
||||||
|
frappe.throw(_("Half Day Date is mandatory"))
|
||||||
|
if not getdate(self.work_from_date)<=getdate(self.half_day_date)<=getdate(self.work_end_date):
|
||||||
|
frappe.throw(_("Half Day Date should be in between Work From Date and Work End Date"))
|
||||||
validate_overlap(self, self.work_from_date, self.work_end_date)
|
validate_overlap(self, self.work_from_date, self.work_end_date)
|
||||||
|
self.validate_holidays()
|
||||||
|
self.validate_attendance()
|
||||||
|
if not self.leave_type:
|
||||||
|
frappe.throw(_("Leave Type is madatory"))
|
||||||
|
|
||||||
|
def validate_attendance(self):
|
||||||
|
query = """select attendance_date, status
|
||||||
|
from `tabAttendance` where
|
||||||
|
attendance_date between %(work_from_date)s and %(work_end_date)s
|
||||||
|
and docstatus=1 and status = 'Present' and employee=%(employee)s"""
|
||||||
|
|
||||||
|
attendance = frappe.db.sql(query, {
|
||||||
|
"work_from_date": self.work_from_date,
|
||||||
|
"work_end_date": self.work_end_date,
|
||||||
|
"employee": self.employee
|
||||||
|
}, as_dict=True)
|
||||||
|
if len(attendance) < date_diff(self.work_end_date, self.work_from_date) + 1:
|
||||||
|
frappe.throw(_("You are not present all day(s) between compensatory leave request days"))
|
||||||
|
|
||||||
|
def validate_holidays(self):
|
||||||
|
holidays = get_holidays_for_employee(self.employee, self.work_from_date, self.work_end_date)
|
||||||
|
if len(holidays) < date_diff(self.work_end_date, self.work_from_date) + 1:
|
||||||
|
frappe.throw(_("Compensatory leave request days not in valid holidays"))
|
||||||
|
|
||||||
def on_submit(self):
|
def on_submit(self):
|
||||||
if not self.leave_type:
|
|
||||||
frappe.throw(_("Please select a leave type to submit the request"))
|
|
||||||
else:
|
|
||||||
company = frappe.db.get_value("Employee", self.employee, "company")
|
company = frappe.db.get_value("Employee", self.employee, "company")
|
||||||
date_difference = date_diff(self.work_end_date, self.work_from_date) + 1
|
date_difference = date_diff(self.work_end_date, self.work_from_date) + 1
|
||||||
|
if self.half_day:
|
||||||
|
date_difference -= 0.5
|
||||||
leave_period = get_leave_period(self.work_from_date, self.work_end_date, company)
|
leave_period = get_leave_period(self.work_from_date, self.work_end_date, company)
|
||||||
if leave_period:
|
if leave_period:
|
||||||
leave_allocation = self.exists_allocation_for_period(leave_period)
|
leave_allocation = self.exists_allocation_for_period(leave_period)
|
||||||
@ -33,6 +60,18 @@ class CompensatoryLeaveRequest(Document):
|
|||||||
else:
|
else:
|
||||||
frappe.throw(_("There is no leave period in between {0} and {1}").format(self.work_from_date, self.work_end_date))
|
frappe.throw(_("There is no leave period in between {0} and {1}").format(self.work_from_date, self.work_end_date))
|
||||||
|
|
||||||
|
def on_cancel(self):
|
||||||
|
if self.leave_allocation:
|
||||||
|
date_difference = date_diff(self.work_end_date, self.work_from_date) + 1
|
||||||
|
if self.half_day:
|
||||||
|
date_difference -= 0.5
|
||||||
|
leave_allocation = frappe.get_doc("Leave Allocation", self.leave_allocation)
|
||||||
|
if leave_allocation:
|
||||||
|
leave_allocation.new_leaves_allocated -= date_difference
|
||||||
|
if leave_allocation.total_leaves_allocated - date_difference <= 0:
|
||||||
|
leave_allocation.total_leaves_allocated = 0
|
||||||
|
leave_allocation.submit()
|
||||||
|
|
||||||
def exists_allocation_for_period(self, leave_period):
|
def exists_allocation_for_period(self, leave_period):
|
||||||
leave_allocation = frappe.db.sql("""
|
leave_allocation = frappe.db.sql("""
|
||||||
select name
|
select name
|
||||||
|
@ -92,7 +92,7 @@ class LeaveAllocation(Document):
|
|||||||
|
|
||||||
self.total_leaves_allocated = flt(self.carry_forwarded_leaves) + flt(self.new_leaves_allocated)
|
self.total_leaves_allocated = flt(self.carry_forwarded_leaves) + flt(self.new_leaves_allocated)
|
||||||
|
|
||||||
if not self.total_leaves_allocated and not frappe.db.get_value("Leave Type", self.leave_type, "is_earned_leave"):
|
if not self.total_leaves_allocated and not frappe.db.get_value("Leave Type", self.leave_type, "is_earned_leave") and not frappe.db.get_value("Leave Type", self.leave_type, "is_compensatory"):
|
||||||
frappe.throw(_("Total leaves allocated is mandatory for Leave Type {0}".format(self.leave_type)))
|
frappe.throw(_("Total leaves allocated is mandatory for Leave Type {0}".format(self.leave_type)))
|
||||||
|
|
||||||
def validate_total_leaves_allocated(self):
|
def validate_total_leaves_allocated(self):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user