added leave applications and block lists to calendar

This commit is contained in:
Rushabh Mehta
2013-02-14 20:42:33 +05:30
parent b496756696
commit 6227527cdb
10 changed files with 267 additions and 111 deletions

View File

@@ -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 @@ pscript.onload_calendar = function(wrapper) {
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 @@ pscript.update_event = function(event) {
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.update_event = function(event) {
});
}
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);
}
}
}
}

View File

@@ -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