/* This file is part of iCE Hrm. iCE Hrm is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. iCE Hrm is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with iCE Hrm. If not, see . ------------------------------------------------------------------ Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd] Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah) */ function EmployeeTimeSheetAdapter(endPoint,tab,filter,orderBy) { this.initAdapter(endPoint,tab,filter,orderBy); } EmployeeTimeSheetAdapter.inherits(AdapterBase); this.currentTimesheetId = null; this.currentTimesheet = null; this.needStartEndTime = false; EmployeeTimeSheetAdapter.method('getDataMapping', function() { return [ "id", "date_start", "date_end", "total_time", "status" ]; }); EmployeeTimeSheetAdapter.method('getHeaders', function() { return [ { "sTitle": "ID" ,"bVisible":false}, { "sTitle": "Start Date"}, { "sTitle": "End Date"}, { "sTitle": "Total Time"}, { "sTitle": "Status"} ]; }); EmployeeTimeSheetAdapter.method('getFormFields', function() { return [ [ "id", {"label":"ID","type":"hidden"}], [ "date_start", {"label":"TimeSheet Start Date","type":"date","validation":""}], [ "date_end", {"label":"TimeSheet End Date","type":"date","validation":""}], [ "details", {"label":"Reason","type":"textarea","validation":"none"}] ]; }); EmployeeTimeSheetAdapter.method('preProcessTableData', function(row) { row[1] = Date.parse(row[1]).toString('MMM d, yyyy (dddd)'); row[2] = Date.parse(row[2]).toString('MMM d, yyyy (dddd)'); return row; }); EmployeeTimeSheetAdapter.method('setNeedStartEndTime', function(status) { this.needStartEndTime = status; }); EmployeeTimeSheetAdapter.method('renderForm', function(object) { var formHtml = this.templates['formTemplate']; $('#EmployeeTimesheetBlock').remove(); $("#"+this.getTableName()+'Form').html(formHtml); $("#"+this.getTableName()+'Form').show(); $("#"+this.getTableName()).hide(); $('.timesheet_start').html(Date.parse(object.date_start).toString('MMM d, yyyy (dddd)')); $('.timesheet_end').html(Date.parse(object.date_end).toString('MMM d, yyyy (dddd)')); this.currentTimesheet = object; this.getTimeEntries(); var st = Date.parse(object.date_start); $('#EmployeeTimesheetBlock').fullCalendar({ header: { //left: 'prev,next today', left: false, //center: 'title', center: false, //right: 'month,agendaWeek,agendaDay' right: false }, year: st.toString('yyyy'), month: st.toString('M'), date: st.toString('d'), defaultView: 'basicWeek', height:200, editable: false, events: modJs.getScheduleJsonUrl(this.currentTimesheet.employee), loading: function(bool) { if (bool) $('#loadingBlock').show(); else $('#loadingBlock').hide(); }, dayClick: function(date, jsEvent, view, resourceObj) { modJs.renderFormByDate(date.format()); }, eventClick: function(calEvent, jsEvent, view) { modJs.renderFormTimeEntryCalender(calEvent.id); }, eventRender: function(event, element) { element.find(".fc-time").remove(); } }); $('#EmployeeTimesheetBlock').fullCalendar('gotoDate', st); $('.fc-toolbar').hide(); }); EmployeeTimeSheetAdapter.method('quickEdit', function(id, status, sdate, edate) { $('#Qtsheet').data('lastActiveTab', modJs.tab); modJs = modJsList['tabQtsheet']; modJs.setCurrentTimeSheetId(id); $('.timesheet_start').html(sdate); $('.timesheet_end').html(edate); $("#timesheetTabs").find('.active').find('.reviewBlock.reviewBlockTable').hide(); $("#QtsheetHeader").show(); $("#Qtsheet").show(); $("#QtsheetDataButtons").show(); if(status == 'Submitted' || status == 'Approved'){ $(".completeBtnTable").hide(); $(".saveBtnTable").hide(); }else{ $(".completeBtnTable").show(); $(".saveBtnTable").show(); } modJs.get([]); }); EmployeeTimeSheetAdapter.method('getScheduleJsonUrl', function(employeeId) { var url = this.moduleRelativeURL+"?a=ca&sa=getEmployeeTimeEntries&t="+this.table+"&mod=modules%3Dtime_sheets&e="+employeeId; return url; }); EmployeeTimeSheetAdapter.method('renderFormByDate', function (date) { var start, end; var origDate = date; if(date.indexOf('T') < 0){ var s1 = moment(); date = date + " " + s1.format("HH:mm:ss"); } start = date.replace('T',' '); var m1 = moment(start); m1.add(1,'h'); end = m1.format('YYYY-MM-DD HH:mm:ss'); var obj = {}; obj.date = origDate; obj.date_start = start; obj.date_end = end; this.renderFormTimeEntryCalender(obj); }); EmployeeTimeSheetAdapter.method('renderFormTimeEntryCalender', function(object) { if (this.needStartEndTime+'' == '0') { return; } this.openTimeEntryDialog(object); if(object.id != undefined && object.id != null){ var cid = object.id; $('.deleteBtnWorkSchedule').show(); $('.deleteBtnWorkSchedule').off().on('click',function(){ modJs.deleteRow(cid); return false; }); }else{ $('.deleteBtnWorkSchedule').remove(); } }); EmployeeTimeSheetAdapter.method('openTimeEntryDialog', function(object) { this.currentTimesheetId = this.currentId; var obj = modJsList['tabEmployeeTimeEntry']; $('#TimeEntryModel').modal({ backdrop: 'static', keyboard: false }); obj.currentTimesheet = this.currentTimesheet; obj.renderForm(object); obj.timesheetId = this.currentId; }); EmployeeTimeSheetAdapter.method('closeTimeEntryDialog', function() { $('#TimeEntryModel').modal('hide'); }); EmployeeTimeSheetAdapter.method('getTimeEntries', function() { timesheetId = this.currentId; var sourceMappingJson = JSON.stringify(modJsList['tabEmployeeTimeEntry'].getSourceMapping()); object = {"id":timesheetId,"sm":sourceMappingJson}; var reqJson = JSON.stringify(object); var callBackData = []; callBackData['callBackData'] = []; callBackData['callBackSuccess'] = 'getTimeEntriesSuccessCallBack'; callBackData['callBackFail'] = 'getTimeEntriesFailCallBack'; this.customAction('getTimeEntries','modules=time_sheets',reqJson,callBackData); }); EmployeeTimeSheetAdapter.method('getTimeEntriesSuccessCallBack', function(callBackData) { var entries = callBackData; var html = ""; var temp = '_start__end__duration__project__details_'; for(var i=0;i' + '' + '_redoBtn_'+ ''; }else{ html = '
' + '' + '_redoBtn_'+ '
'; } if(this.getTableName() == "EmployeeTimeSheetAll"){ var redoBtn = ''; html = html.replace(/_redoBtn_/g,redoBtn); } else { html = html.replace(/_redoBtn_/g,''); } html = html.replace(/_id_/g,id); html = html.replace(/_sdate_/g,data[1]); html = html.replace(/_edate_/g,data[2]); html = html.replace(/_status_/g,data[4]); html = html.replace(/_BASE_/g,this.baseUrl); return html; }); EmployeeTimeSheetAdapter.method('getCustomTableParams', function() { var that = this; var dataTableParams = { "aoColumnDefs": [ { "fnRender": function(data, cell){ return that.preProcessRemoteTableData(data, cell, 1) } , "aTargets": [1] }, { "fnRender": function(data, cell){ return that.preProcessRemoteTableData(data, cell, 2) } , "aTargets": [2] }, { "fnRender": that.getActionButtons, "aTargets": [that.getDataMapping().length] } ] }; return dataTableParams; }); EmployeeTimeSheetAdapter.method('preProcessRemoteTableData', function(data, cell, id) { return Date.parse(cell).toString('MMM d, yyyy (dddd)'); }); /* * Subordinate TimeSheets */ function SubEmployeeTimeSheetAdapter(endPoint,tab,filter,orderBy) { this.initAdapter(endPoint,tab,filter,orderBy); } this.timeSheetStatusChangeId = null; SubEmployeeTimeSheetAdapter.inherits(EmployeeTimeSheetAdapter); SubEmployeeTimeSheetAdapter.method('getDataMapping', function() { return [ "id", "employee", "date_start", "date_end", "status" ]; }); SubEmployeeTimeSheetAdapter.method('getHeaders', function() { return [ { "sTitle": "ID" ,"bVisible":false}, { "sTitle": "Employee","bSearchable":true}, { "sTitle": "Start Date","bSearchable":true}, { "sTitle": "End Date","bSearchable":true}, { "sTitle": "Status"} ]; }); SubEmployeeTimeSheetAdapter.method('getFormFields', function() { return [ [ "id", {"label":"ID","type":"hidden"}], [ "employee", {"label":"Employee","type":"select","allow-null":false,"remote-source":["Employee","id","first_name+last_name"]}], [ "date_start", {"label":"TimeSheet Start Date","type":"date","validation":""}], [ "date_end", {"label":"TimeSheet Start Date","type":"date","validation":""}], [ "details", {"label":"Reason","type":"textarea","validation":"none"}] ]; }); SubEmployeeTimeSheetAdapter.method('isSubProfileTable', function() { return true; }); SubEmployeeTimeSheetAdapter.method('getCustomSuccessCallBack', function(serverData) { var data = []; var mapping = this.getDataMapping(); for(var i=0;i' + '' + '' + ''; }else{ html = '
' + '' + '' + '
'; } html = html.replace(/_id_/g,id); html = html.replace(/_BASE_/g,this.baseUrl); html = html.replace(/_sdate_/g,data[1]); html = html.replace(/_edate_/g,data[2]); html = html.replace(/_status_/g,data[4]); return html; }); SubEmployeeTimeSheetAdapter.method('getCustomTableParams', function() { var that = this; var dataTableParams = { "aoColumnDefs": [ { "fnRender": function(data, cell){ return that.preProcessRemoteTableData(data, cell, 2) } , "aTargets": [2] }, { "fnRender": function(data, cell){ return that.preProcessRemoteTableData(data, cell, 3) } , "aTargets": [3] }, { "fnRender": that.getActionButtons, "aTargets": [that.getDataMapping().length] } ] }; return dataTableParams; }); SubEmployeeTimeSheetAdapter.method('getFilters', function() { return [ [ "employee", {"label":"Employee","type":"select2","allow-null":true,"null-label":"All Employees","remote-source":["Employee","id","first_name+last_name"]}], [ "status", {"label":"Status","type":"select","allow-null":true,"null-label":"All","source":[["Submitted","Submitted"],["Pending","Pending"],["Approved","Approved"], ["Rejected","Rejected"]]}], ]; }); /** * EmployeeTimeEntryAdapter */ function EmployeeTimeEntryAdapter(endPoint,tab,filter,orderBy) { this.initAdapter(endPoint,tab,filter,orderBy); } EmployeeTimeEntryAdapter.inherits(AdapterBase); this.timesheetId = null; this.currentTimesheet = null; this.allProjectsAllowed = 1; this.employeeProjects = []; EmployeeTimeEntryAdapter.method('getDataMapping', function() { return [ "id", "project", "date_start", "time_start", "date_end", "time_end", "details" ]; }); EmployeeTimeEntryAdapter.method('getHeaders', function() { return [ { "sTitle": "ID" ,"bVisible":false}, { "sTitle": "Project"}, { "sTitle": "Start Date"}, { "sTitle": "Start Time"}, { "sTitle": "End Date"}, { "sTitle": "End Time"}, { "sTitle": "Details"} ]; }); EmployeeTimeEntryAdapter.method('getFormFields', function() { return [ [ "id", {"label":"ID","type":"hidden"}], [ "project", {"label":"Project","type":"select2","allow-null":false,"remote-source":["Project","id","name","getEmployeeProjects"]}], [ "date_select", {"label":"Date","type":"select","source":[]}], [ "date_start", {"label":"Start Time","type":"time","validation":""}], [ "date_end", {"label":"End Time","type":"time","validation":""}], [ "details", {"label":"Details","type":"textarea","validation":""}] ]; }); EmployeeTimeEntryAdapter.method('getDates', function(startDate, stopDate) { var dateArray = new Array(); var currentDate = startDate; while (currentDate <= stopDate) { dateArray.push( new Date (currentDate) ); currentDate = currentDate.add({ days: 1 }); } return dateArray; }); EmployeeTimeEntryAdapter.method('renderForm', function(object) { var formHtml = this.getCustomTemplate('time_entry_form.html'); formHtml = formHtml.replace(/modJs/g,"modJsList['tabEmployeeTimeEntry']"); var html = ""; var fields = this.getFormFields(); for(var i=0;i'+k.toUTCString().slice(0, -13)+''; optionList += ''; } formHtml = formHtml.replace(/_id_/g,this.getTableName()+"_submit"); formHtml = formHtml.replace(/_fields_/g,html); $("#"+this.getTableName()+'Form').html(formHtml); $("#"+this.getTableName()+'Form').show(); $("#"+this.getTableName()).hide(); $("#"+this.getTableName()+'Form .datefield').datepicker({'viewMode':2}); $("#"+this.getTableName()+'Form .datetimefield').datetimepicker({ language: 'en' }); $("#"+this.getTableName()+'Form .timefield').datetimepicker({ language: 'en', pickDate: false }); $("#"+this.getTableName()+'Form .select2Field').select2(); $("#date_select").html(optionList); if(object != undefined && object != null){ this.fillForm(object); } }); EmployeeTimeEntryAdapter.method('fillForm', function(object, formId, fields) { if(formId == null || formId == undefined || formId == ""){ formId = "#"+this.getTableName()+'Form'; } if(object.id != null && object.id != undefined){ $(formId + ' #id').val(object.id); } if(object.project != null && object.project != undefined){ $(formId + ' #project').select2('val',object.project); } if(object.date != null && object.date != undefined){ $(formId + ' #date_select').val(object.date); } }); EmployeeTimeEntryAdapter.method('cancel', function() { $('#TimeEntryModel').modal('hide'); }); EmployeeTimeEntryAdapter.method('setAllProjectsAllowed', function(allProjectsAllowed) { this.allProjectsAllowed = allProjectsAllowed; }); EmployeeTimeEntryAdapter.method('setEmployeeProjects', function(employeeProjects) { this.employeeProjects = employeeProjects; }); EmployeeTimeEntryAdapter.method('save', function() { var validator = new FormValidation(this.getTableName()+"_submit",true,{'ShowPopup':false,"LabelErrorClass":"error"}); if(validator.checkValues()){ var params = validator.getFormParameters(); $(params).attr('timesheet',this.timesheetId); params.time_start = params.date_start; params.time_end = params.date_end; params.date_start = params.date_select+" "+params.date_start; params.date_end = params.date_select+" "+params.date_end; var msg = this.doCustomValidation(params); if(msg == null){ var id = $('#'+this.getTableName()+"_submit #id").val(); if(id != null && id != undefined && id != ""){ $(params).attr('id',id); } this.add(params,[]); this.cancel(); }else{ $("#"+this.getTableName()+'Form .label').html(msg); $("#"+this.getTableName()+'Form .label').show(); } } }); EmployeeTimeEntryAdapter.method('doCustomValidation', function(params) { var st = Date.parse(params.date_start); var et = Date.parse(params.date_end); if(st.compareTo(et) != -1){ return "Start time should be less than End time"; } /* var sd = Date.parse(this.currentTimesheet.date_start); var ed = Date.parse(this.currentTimesheet.date_end).addDays(1); if(sd.compareTo(et) != -1 || sd.compareTo(st) > 0 || st.compareTo(ed) != -1 || et.compareTo(ed) != -1){ return "Start time and end time shoud be with in " + sd.toString('MMM d, yyyy (dddd)') + " and " + ed.toString('MMM d, yyyy (dddd)'); } */ return null; }); EmployeeTimeEntryAdapter.method('addSuccessCallBack', function(callBackData,serverData) { this.get(callBackData); modJs.getTimeEntries(); }); EmployeeTimeEntryAdapter.method('deleteRow', function(id) { this.deleteObj(id,[]); }); EmployeeTimeEntryAdapter.method('deleteSuccessCallBack', function(callBackData,serverData) { modJs.getTimeEntries(); }); /** * QtsheetAdapter */ function QtsheetAdapter(endPoint) { this.initAdapter(endPoint); this.cellDataUpdates = {}; this.currentId = null; } QtsheetAdapter.inherits(TableEditAdapter); QtsheetAdapter.method('validateCellValue', function(element, evt, newValue) { if ( !ValidationRules.float(newValue)) { return false; } var val = parseFloat(newValue); if(val < 0 || val > 24){ return false; } //Update total //Find current column number //Adding 2 because nth child is based on 1 and we are adding a virtual column for row names var coldNum = this.columnIDMap[element.data('colId')] + 2; var columnTotal = 0; var columnTotalWithoutCurrent = 0; $("#"+this.getTableName()+' tr td:nth-child('+coldNum+')').each(function(){ var rowId = $(this).data('rowId'); var tval = ''; if(element.data('rowId') == rowId){ tval = newValue; }else{ tval = $(this).html(); } if(rowId != -1){ if(ValidationRules.float(tval)){ columnTotal += parseFloat(tval); if(element.data('rowId') != rowId){ columnTotalWithoutCurrent += parseFloat(tval); } } }else{ if(columnTotal > 24){ $(this).html(columnTotalWithoutCurrent); }else{ $(this).html(columnTotal); } } }); if(columnTotal > 24){ return false; } modJs.addCellDataUpdate(element.data('colId'),element.data('rowId'),newValue); return true; }); QtsheetAdapter.method('setCurrentTimeSheetId', function(val) { this.currentId = val; this.cellDataUpdates = {}; }); QtsheetAdapter.method('addAdditionalRequestData' , function(type, req) { if(type == 'updateData'){ req.currentId = this.currentId; }else if(type == 'updateAllData'){ req.currentId = this.currentId; }else if(type == 'getAllData'){ req.currentId = this.currentId; } return req; }); QtsheetAdapter.method('modifyCSVHeader', function(header) { header.unshift(""); return header; }); QtsheetAdapter.method('getCSVData' , function() { var csv = ""; for(var i=0;i
'; //Find current page var activePage = $('#'+elementId +" .dataTables_paginate .active a").html(); var start = 0; if(activePage != undefined && activePage != null){ start = parseInt(activePage, 10)*100 - 100; } $('#'+elementId).html(html); var dataTableParams = { "oLanguage": { "sLengthMenu": "_MENU_ records per page" }, "aaData": data, "aoColumns": headers, "bSort": false, "iDisplayLength": 100, "iDisplayStart": start }; var customTableParams = this.getCustomTableParams(); $.extend(dataTableParams, customTableParams); $('#'+elementId+' #grid').dataTable( dataTableParams ); $('#'+elementId+' #grid tr:last').find('td').removeClass('editcell'); $(".dataTables_paginate ul").addClass("pagination"); $(".dataTables_length").hide(); $(".dataTables_filter input").addClass("form-control"); $(".dataTables_filter input").attr("placeholder","Search"); $(".dataTables_filter label").contents().filter(function(){ return (this.nodeType == 3); }).remove(); //$('.tableActionButton').tooltip(); $('#'+elementId+' #grid').editableTableWidget(); $('#'+elementId+' #grid .editcell').on('validate', function(evt, newValue) { return modJs.validateCellValue($(this), evt, newValue); }); });