leave application calendar: add leaves based on permission; add holidays applicable to the employee
diff --git a/hr/doctype/leave_application/leave_application.py b/hr/doctype/leave_application/leave_application.py
index 4ad1c23..5170e26 100755
--- a/hr/doctype/leave_application/leave_application.py
+++ b/hr/doctype/leave_application/leave_application.py
@@ -103,9 +103,7 @@
raise Exception
def validate_balance_leaves(self):
- if self.doc.from_date and self.doc.to_date and not is_lwp(self.doc.leave_type):
- self.doc.leave_balance = get_leave_balance(self.doc.employee,
- self.doc.leave_type, self.doc.fiscal_year)["leave_balance"]
+ if self.doc.from_date and self.doc.to_date:
self.doc.total_leave_days = self.get_total_leave_days()["total_leave_days"]
if self.doc.total_leave_days == 0:
@@ -113,9 +111,13 @@
coincide with holiday(s). You need not apply for leave."),
raise_exception=1)
- if self.doc.leave_balance - self.doc.total_leave_days < 0:
- msgprint("There is not enough leave balance for Leave Type: %s" % \
- (self.doc.leave_type,), raise_exception=1)
+ if not is_lwp(self.doc.leave_type):
+ self.doc.leave_balance = get_leave_balance(self.doc.employee,
+ self.doc.leave_type, self.doc.fiscal_year)["leave_balance"]
+
+ if self.doc.leave_balance - self.doc.total_leave_days < 0:
+ msgprint("There is not enough leave balance for Leave Type: %s" % \
+ (self.doc.leave_type,), raise_exception=1)
def validate_leave_overlap(self):
for d in webnotes.conn.sql("""select name, leave_type, posting_date,
@@ -221,9 +223,22 @@
events = []
employee = webnotes.conn.get_default("employee", webnotes.session.user)
company = webnotes.conn.get_default("company", webnotes.session.user)
-
- add_department_leaves(events, start, end, employee, company)
+
+ from webnotes.widgets.reportview import build_match_conditions
+ match_conditions = build_match_conditions({"doctype": "Leave Application"})
+
+ # show department leaves for employee
+ show_department_leaves = match_conditions and \
+ len(match_conditions.split("or"))==1 and "employee" in match_conditions
+
+ if show_department_leaves:
+ add_department_leaves(events, start, end, employee, company)
+ else:
+ add_leaves(events, start, end, employee, company, match_conditions)
+
add_block_dates(events, start, end, employee, company)
+ add_holidays(events, start, end, employee, company)
+
return events
def add_department_leaves(events, start, end, employee, company):
@@ -233,28 +248,33 @@
return
# department leaves
- department_employees = webnotes.conn.sql_list("select name from tabEmployee where department=%s",
- department)
+ department_employees = webnotes.conn.sql_list("""select name from tabEmployee where department=%s
+ and company=%s""", (department, company))
- for d in webnotes.conn.sql("""select name, from_date, to_date, employee_name, half_day,
+ match_conditions = "employee in (\"%s\")" % '", "'.join(department_employees)
+ add_leaves(events, start, end, employee, company, match_conditions=match_conditions)
+
+def add_leaves(events, start, end, employee, company, match_conditions=None):
+ query = """select name, from_date, to_date, employee_name, half_day,
status, employee, docstatus
from `tabLeave Application` where
(from_date between %s and %s or to_date between %s and %s)
and docstatus < 2
- and status!="Rejected"
- and employee in ('%s')""" % ("%s", "%s", "%s", "%s", "', '".join(department_employees)),
- (start, end, start, end), as_dict=True):
- events.append({
- "name": d.name,
- "doctype": "Leave Application",
- "from_date": d.from_date,
- "to_date": d.to_date,
- "status": d.status,
- "title": _("Leave by") + " " + cstr(d.employee_name) + \
- (d.half_day and _(" (Half Day)") or ""),
- "docstatus": d.docstatus
- })
+ and status!="Rejected" """
+ if match_conditions:
+ query += " and " + match_conditions
+ for d in webnotes.conn.sql(query, (start, end, start, end), as_dict=True):
+ events.append({
+ "name": d.name,
+ "doctype": "Leave Application",
+ "from_date": d.from_date,
+ "to_date": d.to_date,
+ "status": d.status,
+ "title": _("Leave by") + " " + cstr(d.employee_name) + \
+ (d.half_day and _(" (Half Day)") or ""),
+ "docstatus": d.docstatus
+ })
def add_block_dates(events, start, end, employee, company):
# block days
@@ -271,4 +291,18 @@
"name": "_" + str(cnt),
})
cnt+=1
+
+def add_holidays(events, start, end, employee, company):
+ applicable_holiday_list = webnotes.conn.get_value("Employee", employee, "holiday_list")
+ if not applicable_holiday_list:
+ return
+ for holiday in webnotes.conn.sql("""select name, holiday_date, description
+ from `tabHoliday` where parent=%s and holiday_date between %s and %s""",
+ (applicable_holiday_list, start, end), as_dict=True):
+ events.append({
+ "doctype": "Holiday",
+ "from_date": holiday.holiday_date,
+ "title": _("Holiday") + ": " + cstr(holiday.description),
+ "name": holiday.name
+ })