added leave applications and block lists to calendar
diff --git a/utilities/page/calendar/calendar.js b/utilities/page/calendar/calendar.js
index cac5ec8..aab8f0b 100644
--- a/utilities/page/calendar/calendar.js
+++ b/utilities/page/calendar/calendar.js
@@ -20,6 +20,8 @@
// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
+wn.provide("erpnext.calendar");
+
pscript.onload_calendar = function(wrapper) {
wn.ui.make_app_page({
parent: wrapper,
@@ -31,7 +33,81 @@
wn.require('lib/js/lib/fullcalendar/fullcalendar.js');
}
-pscript.update_event = function(event) {
+pscript.onshow_calendar = function(wrapper) {
+ if(!wrapper.setup_complete) {
+ erpnext.calendar.setup(wrapper);
+ } else {
+ $("#fullcalendar").fullCalendar("refetchEvents");
+ }
+}
+
+erpnext.calendar.setup = function(wrapper) {
+ wn.model.with_doctype("Event", function() {
+ $('<div id="fullcalendar">').appendTo($(wrapper).find('.layout-main')).fullCalendar({
+ header: {
+ left: 'prev,next today',
+ center: 'title',
+ right: 'month,agendaWeek,agendaDay'
+ },
+ editable: true,
+ selectable: true,
+ selectHelper: true,
+ events: function(start, end, callback) {
+ wn.call({
+ method: 'utilities.page.calendar.calendar.get_events',
+ type: "GET",
+ args: {
+ start: dateutil.obj_to_str(start),
+ end: dateutil.obj_to_str(end),
+ company: wn.user.get_default("company")[0],
+ employee: wn.user.get_default("employee")[0]
+ },
+ callback: function(r) {
+ var events = r.message;
+ $.each(events, function(i, d) {
+ d.editable = d.owner==user;
+ var options = erpnext.calendar.event_options[d.doctype];
+ if(options && options.prepare)
+ options.prepare(d);
+ });
+ callback(events);
+ }
+ })
+ },
+ eventClick: function(event, jsEvent, view) {
+ // edit event description or delete
+ var options = erpnext.calendar.event_options[event.doctype];
+ if(options && options.click)
+ options.click(event);
+ },
+ eventDrop: function(event, dayDelta, minuteDelta, allDay, revertFunc) {
+ erpnext.calendar.update_event(event);
+ },
+ eventResize: function(event, dayDelta, minuteDelta, allDay, revertFunc) {
+ erpnext.calendar.update_event(event);
+ },
+ select: function(startDate, endDate, allDay, jsEvent, view) {
+ if(jsEvent.day_clicked && view.name=="month")
+ return;
+ var event = wn.model.get_new_doc("Event");
+ event.starts_on = wn.datetime.get_datetime_as_string(startDate);
+ event.ends_on = wn.datetime.get_datetime_as_string(endDate);
+ event.all_day = allDay ? 1 : 0;
+ wn.set_route("Form", "Event", event.name);
+ },
+ dayClick: function(date, allDay, jsEvent, view) {
+ jsEvent.day_clicked = true;
+ $("#fullcalendar").fullCalendar("gotoDate", date)
+ return false;
+ }
+ });
+ });
+
+ wrapper.setup_complete = true;
+
+}
+
+erpnext.calendar.update_event = function(event) {
wn.model.remove_from_locals("Event", event.id);
wn.call({
module: "utilities",
@@ -40,6 +116,7 @@
args: {
"start": wn.datetime.get_datetime_as_string(event.start),
"end": wn.datetime.get_datetime_as_string(event.end),
+ "all_day": event.allDay,
"name": event.id
},
callback: function(r) {
@@ -50,57 +127,31 @@
});
}
-
-pscript.onshow_calendar = function(wrapper) {
- if(!wrapper.setup_complete) {
- $('<div id="fullcalendar">').appendTo($(wrapper).find('.layout-main')).fullCalendar({
- header: {
- left: 'prev,next today',
- center: 'title',
- right: 'month,agendaWeek,agendaDay'
- },
- editable: true,
- events: function(start, end, callback) {
- wn.call({
- method: 'utilities.page.calendar.calendar.get_events',
- type: "GET",
- args: {
- start: dateutil.obj_to_str(start),
- end: dateutil.obj_to_str(end)
- },
- callback: function(r) {
- var events = r.message;
- $.each(events, function(i, d) {
- d.editable = d.owner==user;
- d.allDay = false;
- });
- callback(events);
- }
- })
- },
- dayClick: function(date, allDay, jsEvent, view) {
- // if current date, show popup to create a new event
- var ev = wn.model.create('Event')
- ev.doc.set('start', date);
- ev.doc.set('end', new Date(date));
- ev.doc.set('all_day', 1);
-
- },
- eventClick: function(calEvent, jsEvent, view) {
- // edit event description or delete
- wn.set_route("Form", "Event", calEvent.id);
- },
- eventDrop: function(event, dayDelta, minuteDelta, allDay, revertFunc) {
- pscript.update_event(event);
- },
- eventResize: function(event, dayDelta, minuteDelta, allDay, revertFunc) {
- pscript.update_event(event);
+erpnext.calendar.event_options = {
+ "Leave Block List Date": {
+ prepare: function(d) {
+ d.color = "#aaa";
+ }
+ },
+ "Event": {
+ prepare: function(d) {
+ if(d.event_type=="Public") {
+ d.color = "#57AF5B";
}
- });
-
- wrapper.setup_complete = true;
- } else {
- $("#fullcalendar").fullCalendar("refetchEvents");
+ },
+ click: function(event) {
+ wn.set_route("Form", "Event", event.id);
+ }
+ },
+ "Leave Application": {
+ prepare: function(d) {
+ d.color = "#4F9F96";
+ },
+ click: function(event) {
+ if(event.employee==wn.user.get_default("employee")[0]) {
+ wn.set_route("Form", "Leave Application", event.id);
+ }
+ }
}
}
diff --git a/utilities/page/calendar/calendar.py b/utilities/page/calendar/calendar.py
index 09b3297..06d4385 100644
--- a/utilities/page/calendar/calendar.py
+++ b/utilities/page/calendar/calendar.py
@@ -1,29 +1,83 @@
from __future__ import unicode_literals
import webnotes
+from webnotes import _
@webnotes.whitelist()
-def get_events(start, end):
+def get_events(start, end, employee=None, company=None):
roles = webnotes.get_roles()
events = webnotes.conn.sql("""select name as `id`, subject as title,
- starts_on as `start`, ends_on as `end`, "Event" as doctype, owner
- from tabEvent where event_date between %s and %s
+ starts_on as `start`, ends_on as `end`, "Event" as doctype, owner,
+ all_day as allDay, event_type
+ from tabEvent where (
+ (starts_on between %s and %s)
+ or (ends_on between %s and %s)
+ )
and (event_type='Public' or owner=%s
or exists(select * from `tabEvent User` where
`tabEvent User`.parent=tabEvent.name and person=%s)
or exists(select * from `tabEvent Role` where
`tabEvent Role`.parent=tabEvent.name
- and `tabEvent Role`.role in ('%s')))""" % ('%s', '%s', '%s', '%s',
- "', '".join(roles)), (start, end,
- webnotes.session.user, webnotes.session.user), as_dict=1, debug=1)
-
+ and `tabEvent Role`.role in ('%s')))""" % ('%s', '%s', '%s', '%s', '%s', '%s',
+ "', '".join(roles)), (start, end, start, end,
+ webnotes.session.user, webnotes.session.user), as_dict=1)
+
+
+ if employee:
+ add_block_dates(events, start, end, employee, company)
+ add_department_leaves(events, start, end, employee, company)
+
return events
-
- block_days = webnotes.conn.sql("""select block_date as `start`,
- name as `id`, reason as `title`, "Holiday List Block Date" as doctype,
- where block_date between %s and %s
- and """)
-
+
+def add_department_leaves(events, start, end, employee, company):
+ department = webnotes.conn.get_value("Employee", employee, "department")
+
+ if not department:
+ return
+
+ # department leaves
+ department_employees = webnotes.conn.sql_list("select name from tabEmployee where department=%s",
+ department)
+
+ for d in webnotes.conn.sql("""select name, from_date, to_date, employee_name, half_day,
+ status, employee
+ 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({
+ "id": d.name,
+ "employee": d.employee,
+ "doctype": "Leave Application",
+ "start": d.from_date,
+ "end": d.to_date,
+ "allDay": True,
+ "status": d.status,
+ "title": _("Leave by") + " " + d.employee_name + \
+ (d.half_day and _(" (Half Day)") or "")
+ })
+
+
+def add_block_dates(events, start, end, employee, company):
+ # block days
+ from hr.doctype.leave_block_list.leave_block_list import get_applicable_block_dates
+
+ cnt = 0
+ block_dates = get_applicable_block_dates(start, end, employee, company, all_lists=True)
+
+ for block_date in block_dates:
+ events.append({
+ "doctype": "Leave Block List Date",
+ "start": block_date.block_date,
+ "title": _("Leave Blocked") + ": " + block_date.reason,
+ "id": "_" + str(cnt),
+ "allDay": True
+ })
+ cnt+=1
+
+
@webnotes.whitelist()
def update_event(name, start, end):
webnotes.conn.sql("""update tabEvent set starts_on=%s, ends_on=%s where