IceHrm v18.0
This commit is contained in:
@@ -2,16 +2,16 @@
|
||||
|
||||
<div class="small-box bg-teal">
|
||||
<div class="inner">
|
||||
<h3>Reports</h3>
|
||||
<h3><t>Reports</t></h3>
|
||||
<p>
|
||||
View / Download Reports
|
||||
<t>View / Download Reports</t>
|
||||
</p>
|
||||
</div>
|
||||
<div class="icon">
|
||||
<i class="ion ion-document-text"></i>
|
||||
</div>
|
||||
<a href="#_moduleLink_#" class="small-box-footer" id="reportsLink">
|
||||
Create a Report <i class="fa fa-arrow-circle-right"></i>
|
||||
<t>Generate a Report</t> <i class="fa fa-arrow-circle-right"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -7,7 +7,7 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
|
||||
?><div class="span9">
|
||||
|
||||
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
|
||||
<li class="active"><a id="tabReport" href="#tabPageReport">Reports</a></li>
|
||||
<li class="active"><a id="tabReport" href="#tabPageReport"><?=LanguageManager::tran('Reports')?></a></li>
|
||||
</ul>
|
||||
|
||||
<div class="tab-content">
|
||||
@@ -30,12 +30,9 @@ modJsList['tabReport'] = new ReportAdapter('Report','Report','','report_group');
|
||||
modJsList['tabReport'].setShowAddNew(false);
|
||||
modJsList['tabReport'].setRemoteTable(true);
|
||||
|
||||
/*
|
||||
modJsList['tabReport'] = new ReportGenAdapter('File','File','{"file_group":"Report"}','group');
|
||||
modJsList['tabReport'].setShowAddNew(false);
|
||||
*/
|
||||
|
||||
|
||||
var modJs = modJsList['tabReport'];
|
||||
|
||||
</script>
|
||||
<?php include APP_BASE_PATH.'footer.php';?>
|
||||
<?php include APP_BASE_PATH.'footer.php';?>
|
||||
|
||||
@@ -10,15 +10,20 @@
|
||||
|
||||
function ReportAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
this._formFileds = [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Name","type":"label","validation":""}],
|
||||
[ "parameters", {"label":"Parameters","type":"fieldset","validation":"none"}]
|
||||
];
|
||||
this._construct();
|
||||
}
|
||||
|
||||
ReportAdapter.inherits(AdapterBase);
|
||||
|
||||
ReportAdapter.method('_construct', function() {
|
||||
this._formFileds = [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Name","type":"label","validation":""}],
|
||||
[ "parameters", {"label":"Parameters","type":"fieldset","validation":"none"}]
|
||||
];
|
||||
this.remoteFieldsExists = false;
|
||||
});
|
||||
|
||||
ReportAdapter.method('_initLocalFormFields', function() {
|
||||
this._formFileds = [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
@@ -27,9 +32,14 @@ ReportAdapter.method('_initLocalFormFields', function() {
|
||||
];
|
||||
});
|
||||
|
||||
ReportAdapter.method('setRemoteFieldExists', function(val) {
|
||||
this.remoteFieldsExists = val;
|
||||
});
|
||||
|
||||
ReportAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"icon",
|
||||
"name",
|
||||
"details",
|
||||
"parameters"
|
||||
@@ -39,12 +49,14 @@ ReportAdapter.method('getDataMapping', function() {
|
||||
ReportAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "","bSortable":false,"sWidth":"22px"},
|
||||
{ "sTitle": "Name","sWidth":"30%"},
|
||||
{ "sTitle": "Details"},
|
||||
{ "sTitle": "Parameters","bVisible":false},
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
ReportAdapter.method('getFormFields', function() {
|
||||
return this._formFileds;
|
||||
});
|
||||
@@ -55,12 +67,16 @@ ReportAdapter.method('processFormFieldsWithObject', function(object) {
|
||||
var len = this._formFileds.length;
|
||||
var fieldIDsToDelete = [];
|
||||
var fieldsToDelete = [];
|
||||
this.remoteFieldsExists = false;
|
||||
for(var i=0;i<len;i++){
|
||||
if(this._formFileds[i][1]['type']=="fieldset"){
|
||||
var newFields = JSON.parse(object[this._formFileds[i][0]]);
|
||||
fieldsToDelete.push(this._formFileds[i][0]);
|
||||
newFields.forEach(function(entry) {
|
||||
that._formFileds.push(entry);
|
||||
if(entry[1]['remote-source'] != undefined && entry[1]['remote-source'] != null){
|
||||
that.remoteFieldsExists = true;
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
@@ -76,14 +92,179 @@ ReportAdapter.method('processFormFieldsWithObject', function(object) {
|
||||
that._formFileds = tempArray;
|
||||
});
|
||||
|
||||
|
||||
ReportAdapter.method('renderForm', function(object) {
|
||||
var that = this;
|
||||
this.processFormFieldsWithObject(object);
|
||||
var cb = function(){
|
||||
that.uber('renderForm',object);
|
||||
};
|
||||
this.initFieldMasterData(cb);
|
||||
if(this.remoteFieldsExists){
|
||||
var cb = function(){
|
||||
that.renderFormNew(object);
|
||||
};
|
||||
this.initFieldMasterData(cb);
|
||||
}else{
|
||||
this.initFieldMasterData();
|
||||
that.renderFormNew(object);
|
||||
}
|
||||
|
||||
this.currentReport = object;
|
||||
|
||||
});
|
||||
|
||||
ReportAdapter.method('renderFormNew', function(object) {
|
||||
|
||||
var that = this;
|
||||
var signatureIds = [];
|
||||
if(object == null || object == undefined){
|
||||
this.currentId = null;
|
||||
}
|
||||
|
||||
this.preRenderForm(object);
|
||||
|
||||
var formHtml = this.templates['formTemplate'];
|
||||
var html = "";
|
||||
var fields = this.getFormFields();
|
||||
|
||||
for(var i=0;i<fields.length;i++){
|
||||
var metaField = this.getMetaFieldForRendering(fields[i][0]);
|
||||
if(metaField == "" || metaField == undefined){
|
||||
html += this.renderFormField(fields[i]);
|
||||
}else{
|
||||
var metaVal = object[metaField];
|
||||
if(metaVal != '' && metaVal != null && metaVal != undefined && metaVal.trim() != ''){
|
||||
html += this.renderFormField(JSON.parse(metaVal));
|
||||
}else{
|
||||
html += this.renderFormField(fields[i]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
formHtml = formHtml.replace(/_id_/g,this.getTableName()+"_submit");
|
||||
formHtml = formHtml.replace(/_fields_/g,html);
|
||||
|
||||
|
||||
var $tempDomObj;
|
||||
var randomFormId = this.generateRandom(14);
|
||||
if(!this.showFormOnPopup){
|
||||
$tempDomObj = $("#"+this.getTableName()+'Form');
|
||||
}else{
|
||||
$tempDomObj = $('<div class="reviewBlock popupForm" data-content="Form"></div>');
|
||||
$tempDomObj.attr('id',randomFormId);
|
||||
|
||||
}
|
||||
|
||||
$tempDomObj.html(formHtml);
|
||||
|
||||
|
||||
$tempDomObj.find('.datefield').datepicker({'viewMode':2});
|
||||
$tempDomObj.find('.timefield').datetimepicker({
|
||||
language: 'en',
|
||||
pickDate: false
|
||||
});
|
||||
$tempDomObj.find('.datetimefield').datetimepicker({
|
||||
language: 'en'
|
||||
});
|
||||
|
||||
$tempDomObj.find('.colorpick').colorpicker();
|
||||
|
||||
//$tempDomObj.find('.select2Field').select2();
|
||||
$tempDomObj.find('.select2Field').each(function() {
|
||||
$(this).select2().select2('val', $(this).find("option:eq(0)").val());
|
||||
|
||||
});
|
||||
|
||||
$tempDomObj.find('.select2Multi').each(function() {
|
||||
$(this).select2().on("change",function(e){
|
||||
var parentRow = $(this).parents(".row");
|
||||
var height = parentRow.find(".select2-choices").height();
|
||||
parentRow.height(parseInt(height));
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
$tempDomObj.find('.signatureField').each(function() {
|
||||
//$(this).data('signaturePad',new SignaturePad($(this)));
|
||||
signatureIds.push($(this).attr('id'));
|
||||
});
|
||||
|
||||
for(var i=0;i<fields.length;i++){
|
||||
if(fields[i][1].type == "datagroup"){
|
||||
$tempDomObj.find("#"+fields[i][0]).data('field',fields[i]);
|
||||
}
|
||||
}
|
||||
|
||||
if(this.showSave == false){
|
||||
$tempDomObj.find('.saveBtn').remove();
|
||||
}else{
|
||||
$tempDomObj.find('.saveBtn').off();
|
||||
$tempDomObj.find('.saveBtn').data("modJs",this);
|
||||
$tempDomObj.find('.saveBtn').on( "click", function() {
|
||||
if($(this ).data('modJs').saveSuccessItemCallback != null && $(this ).data('modJs').saveSuccessItemCallback!= undefined){
|
||||
$(this ).data('modJs').save($(this ).data('modJs').retriveItemsAfterSave(), $(this ).data('modJs').saveSuccessItemCallback);
|
||||
}else{
|
||||
$(this ).data('modJs').save();
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
if(this.showCancel== false){
|
||||
$tempDomObj.find('.cancelBtn').remove();
|
||||
}else{
|
||||
$tempDomObj.find('.cancelBtn').off();
|
||||
$tempDomObj.find('.cancelBtn').data("modJs",this);
|
||||
$tempDomObj.find('.cancelBtn').on( "click", function() {
|
||||
$(this ).data('modJs').cancel();
|
||||
return false;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
if(!this.showFormOnPopup){
|
||||
$("#"+this.getTableName()+'Form').show();
|
||||
$("#"+this.getTableName()).hide();
|
||||
|
||||
for(var i=0;i<signatureIds.length;i++){
|
||||
$("#"+signatureIds[i])
|
||||
.data('signaturePad',
|
||||
new SignaturePad(document.getElementById(signatureIds[i])));
|
||||
|
||||
}
|
||||
|
||||
if(object != undefined && object != null){
|
||||
this.fillForm(object);
|
||||
}
|
||||
|
||||
}else{
|
||||
|
||||
|
||||
|
||||
//var tHtml = $tempDomObj.wrap('<div>').parent().html();
|
||||
//this.showMessage("Edit",tHtml,null,null,true);
|
||||
this.showMessage("Edit","",null,null,true);
|
||||
|
||||
$("#plainMessageModel .modal-body").html("");
|
||||
$("#plainMessageModel .modal-body").append($tempDomObj);
|
||||
|
||||
|
||||
for(var i=0;i<signatureIds.length;i++){
|
||||
$("#"+signatureIds[i])
|
||||
.data('signaturePad',
|
||||
new SignaturePad(document.getElementById(signatureIds[i])));
|
||||
|
||||
}
|
||||
|
||||
if(object != undefined && object != null){
|
||||
this.fillForm(object,"#"+randomFormId);
|
||||
}
|
||||
}
|
||||
|
||||
this.postRenderForm(object,$tempDomObj);
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
||||
ReportAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
@@ -94,40 +275,48 @@ ReportAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
});
|
||||
|
||||
ReportAdapter.method('addSuccessCallBack', function(callBackData,serverData) {
|
||||
//var link = '<a href="'+this.getCustomActionUrl("download",{'file':serverData})+'" target="_blank">Download Report <i class="icon-download-alt"></i> </a>';
|
||||
//this.showMessage("Download Report",link);
|
||||
|
||||
var fileName = serverData[0];
|
||||
var link;
|
||||
|
||||
|
||||
if(fileName.indexOf("https:") == 0){
|
||||
link = '<a href="'+fileName+'" target="_blank" style="font-size:14px;font-weight:bold;">Download Report <img src="_BASE_images/download.png"></img> </a>';
|
||||
link = '<a href="'+fileName+'" target="_blank" style="font-size:14px;font-weight:bold;">Download Report <img src="_BASE_images/download.png"></img> </a>';
|
||||
}else{
|
||||
link = '<a href="'+modJs.getCustomActionUrl("download",{'file':fileName})+'" target="_blank" style="font-size:14px;font-weight:bold;">Download Report <img src="_BASE_images/download.png"></img> </a>';
|
||||
}
|
||||
link = link.replace(/_BASE_/g,this.baseUrl);
|
||||
|
||||
var tableHtml = link+'<br/><br/><div class="box-body table-responsive" style="overflow-x:scroll;padding: 5px;border: solid 1px #DDD;"><table id="tempReportTable" cellpadding="0" cellspacing="0" border="0" class="table table-bordered table-striped"></table></div>';
|
||||
|
||||
//Delete existing temp report table
|
||||
$("#tempReportTable").remove();
|
||||
|
||||
//this.showMessage("Report",tableHtml);
|
||||
|
||||
$("#Report").html(tableHtml);
|
||||
$("#Report").show();
|
||||
$("#ReportForm").hide();
|
||||
|
||||
//Prepare headers
|
||||
var headers = [];
|
||||
for(title in serverData[1]){
|
||||
headers.push({ "sTitle": serverData[1][title]});
|
||||
}
|
||||
|
||||
var data = serverData[2];
|
||||
|
||||
|
||||
var dataTableParams = {
|
||||
if(this.currentReport.output == "PDF"){
|
||||
|
||||
this.showMessage("Download Report",link);
|
||||
|
||||
}else{
|
||||
if(serverData[1].length == 0){
|
||||
this.showMessage("Empty Report","There were no data for selected filters");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
var tableHtml = link+'<br/><br/><div class="box-body table-responsive" style="overflow-x:scroll;padding: 5px;border: solid 1px #DDD;"><table id="tempReportTable" cellpadding="0" cellspacing="0" border="0" class="table table-bordered table-striped"></table></div>';
|
||||
|
||||
//Delete existing temp report table
|
||||
$("#tempReportTable").remove();
|
||||
|
||||
//this.showMessage("Report",tableHtml);
|
||||
|
||||
$("#"+this.table).html(tableHtml);
|
||||
$("#"+this.table).show();
|
||||
$("#"+this.table+"Form").hide();
|
||||
|
||||
//Prepare headers
|
||||
var headers = [];
|
||||
for(title in serverData[1]){
|
||||
headers.push({ "sTitle": serverData[1][title]});
|
||||
}
|
||||
|
||||
var data = serverData[2];
|
||||
|
||||
|
||||
var dataTableParams = {
|
||||
"oLanguage": {
|
||||
"sLengthMenu": "_MENU_ records per page"
|
||||
},
|
||||
@@ -137,17 +326,21 @@ ReportAdapter.method('addSuccessCallBack', function(callBackData,serverData) {
|
||||
"iDisplayLength": 15,
|
||||
"iDisplayStart": 0
|
||||
};
|
||||
|
||||
$("#tempReportTable").dataTable( dataTableParams );
|
||||
|
||||
$(".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();
|
||||
|
||||
$("#tempReportTable").dataTable( dataTableParams );
|
||||
|
||||
$(".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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
@@ -201,4 +394,3 @@ ReportGenAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
html = html.replace(/_BASE_/g,this.baseUrl);
|
||||
return html;
|
||||
});
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"label":"Reports",
|
||||
"menu":"Reports",
|
||||
"menu":"Admin Reports",
|
||||
"order":"1",
|
||||
"icon":"fa-file-o",
|
||||
"user_levels":["Admin","Manager"],
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
class ActiveEmployeeReport extends ReportBuilder{
|
||||
class ActiveEmployeeReport extends CSVReportBuilder implements CSVReportBuilderInterface{
|
||||
|
||||
public function getMainQuery(){
|
||||
$query = "Select id, employee_id as 'Employee ID',
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
class EmployeeAttendanceReport extends ReportBuilder{
|
||||
class EmployeeAttendanceReport extends CSVReportBuilder implements CSVReportBuilderInterface{
|
||||
|
||||
public function getMainQuery(){
|
||||
$query = "SELECT
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
<?php
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
if(!interface_exists('ReportBuilderInterface')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilderInterface.php';
|
||||
}
|
||||
@@ -6,7 +9,7 @@ if(!interface_exists('ReportBuilderInterface')){
|
||||
if(!class_exists('LeavesActionManager')){
|
||||
include_once APP_BASE_PATH.'modules/leaves/api/LeavesActionManager.php';
|
||||
}
|
||||
class EmployeeLeaveEntitlementReport implements ReportBuilderInterface{
|
||||
class EmployeeLeaveEntitlementReport extends ClassBasedReportBuilder implements ReportBuilderInterface{
|
||||
public function getData($report,$req){
|
||||
|
||||
$leaveActionManager = new LeavesActionManager();
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
class EmployeeLeavesReport extends ReportBuilder{
|
||||
class EmployeeLeavesReport extends CSVReportBuilder implements CSVReportBuilderInterface{
|
||||
|
||||
public function getMainQuery(){
|
||||
$query = "SELECT
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
<?php
|
||||
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
if(!interface_exists('ReportBuilderInterface')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilderInterface.php';
|
||||
}
|
||||
|
||||
class EmployeeTimeSheetData implements ReportBuilderInterface{
|
||||
class EmployeeTimeSheetData extends ClassBasedReportBuilder implements ReportBuilderInterface{
|
||||
public function getData($report,$request){
|
||||
|
||||
$employeeCache = array();
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
<?php
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
if(!interface_exists('ReportBuilderInterface')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilderInterface.php';
|
||||
}
|
||||
class EmployeeTimeTrackReport implements ReportBuilderInterface{
|
||||
class EmployeeTimeTrackReport extends ClassBasedReportBuilder implements ReportBuilderInterface{
|
||||
public function getData($report,$req){
|
||||
|
||||
LogManager::getInstance()->info(json_encode($report));
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
class EmployeeTimesheetReport extends ReportBuilder{
|
||||
class EmployeeTimesheetReport extends CSVReportBuilder implements CSVReportBuilderInterface{
|
||||
|
||||
public function getMainQuery(){
|
||||
$query = "SELECT
|
||||
@@ -28,34 +28,58 @@ FROM EmployeeTimeEntry te";
|
||||
if(in_array("NULL", $employeeList) ){
|
||||
$employeeList = array();
|
||||
}
|
||||
|
||||
|
||||
if(!empty($employeeList) && ($request['project'] != "NULL" && !empty($request['project']))){
|
||||
$query = "where employee in (".implode(",", $employeeList).") and date_start >= ? and date_end <= ? and project = ?;";
|
||||
$params = array(
|
||||
$request['date_start'],
|
||||
$request['date_end'],
|
||||
$request['project']
|
||||
);
|
||||
}else if(!empty($employeeList)){
|
||||
$query = "where employee in (".implode(",", $employeeList).") and date_start >= ? and date_end <= ?;";
|
||||
$params = array(
|
||||
|
||||
if(($request['client'] != "NULL" && !empty($request['client']))) {
|
||||
|
||||
$project = new Project();
|
||||
$projects = $project->Find("client = ?",array($request['client']));
|
||||
$projectIds = array();
|
||||
foreach($projects as $project){
|
||||
$projectIds[] = $project->id;
|
||||
}
|
||||
|
||||
if (!empty($employeeList) && ($request['project'] != "NULL" && !empty($request['project']))) {
|
||||
$query = "where employee in (" . implode(",", $employeeList) . ") and date_start >= ? and date_end <= ? and project in (".implode(",",$projectIds).");";
|
||||
$params = array(
|
||||
$request['date_start'],
|
||||
$request['date_end']
|
||||
);
|
||||
}else if(($request['project'] != "NULL" && !empty($request['project']))){
|
||||
$query = "where project = ? and date_start >= ? and date_end <= ?;";
|
||||
$params = array(
|
||||
);
|
||||
} else {
|
||||
$query = "where date_start >= ? and date_end <= ? and project in (".implode(",",$projectIds).");";
|
||||
$params = array(
|
||||
$request['date_start'],
|
||||
$request['date_end']
|
||||
);
|
||||
}
|
||||
}else{
|
||||
if (!empty($employeeList) && ($request['project'] != "NULL" && !empty($request['project']))) {
|
||||
$query = "where employee in (" . implode(",", $employeeList) . ") and date_start >= ? and date_end <= ? and project = ?;";
|
||||
$params = array(
|
||||
$request['date_start'],
|
||||
$request['date_end'],
|
||||
$request['project']
|
||||
);
|
||||
} else if (!empty($employeeList)) {
|
||||
$query = "where employee in (" . implode(",", $employeeList) . ") and date_start >= ? and date_end <= ?;";
|
||||
$params = array(
|
||||
$request['date_start'],
|
||||
$request['date_end']
|
||||
);
|
||||
} else if (($request['project'] != "NULL" && !empty($request['project']))) {
|
||||
$query = "where project = ? and date_start >= ? and date_end <= ?;";
|
||||
$params = array(
|
||||
$request['project'],
|
||||
$request['date_start'],
|
||||
$request['date_end']
|
||||
);
|
||||
}else{
|
||||
$query = "where date_start >= ? and date_end <= ?;";
|
||||
$params = array(
|
||||
);
|
||||
} else {
|
||||
$query = "where date_start >= ? and date_end <= ?;";
|
||||
$params = array(
|
||||
$request['date_start'],
|
||||
$request['date_end']
|
||||
);
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
LogManager::getInstance()->info("Query:".$query);
|
||||
|
||||
@@ -2,7 +2,10 @@
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
class ExpenseReport extends ReportBuilder{
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
class ExpenseReport extends CSVReportBuilder implements CSVReportBuilderInterface{
|
||||
|
||||
public function getMainQuery(){
|
||||
$query = "SELECT
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
<?php
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
if(!interface_exists('ReportBuilderInterface')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilderInterface.php';
|
||||
}
|
||||
@@ -6,7 +9,7 @@ if(!interface_exists('ReportBuilderInterface')){
|
||||
if(!class_exists('AttendanceAdminManager')){
|
||||
include_once APP_BASE_PATH.'admin/attendance/api/AttendanceAdminManager.php';
|
||||
}
|
||||
class OvertimeReport implements ReportBuilderInterface{
|
||||
class OvertimeReport extends ClassBasedReportBuilder implements ReportBuilderInterface{
|
||||
public function getData($report,$request){
|
||||
|
||||
$employeeList = array();
|
||||
|
||||
@@ -2,15 +2,8 @@
|
||||
if(!interface_exists('ReportBuilderInterface')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilderInterface.php';
|
||||
}
|
||||
abstract class ReportBuilder implements ReportBuilderInterface{
|
||||
|
||||
public function getData($report,$request){
|
||||
$query = $this->getMainQuery();
|
||||
$where = $this->getWhereQuery($request);
|
||||
$query.=" ".$where[0];
|
||||
return $this->execute($report, $query, $where[1]);
|
||||
}
|
||||
|
||||
abstract class ReportBuilder{
|
||||
|
||||
protected function execute($report, $query, $parameters){
|
||||
$report->DB()->SetFetchMode(ADODB_FETCH_ASSOC);
|
||||
LogManager::getInstance()->debug("Query: ".$query);
|
||||
@@ -46,12 +39,170 @@ abstract class ReportBuilder implements ReportBuilderInterface{
|
||||
|
||||
return $reportData;
|
||||
}
|
||||
|
||||
abstract public function getWhereQuery($request);
|
||||
|
||||
abstract public function getMainQuery();
|
||||
|
||||
|
||||
public function transformData($name, $value){
|
||||
return $value;
|
||||
}
|
||||
}
|
||||
|
||||
public function createReportFile($report, $data){
|
||||
$fileFirstPart = "Report_".str_replace(" ", "_", $report->name)."-".date("Y-m-d_H-i-s");
|
||||
$fileName = $fileFirstPart.".csv";
|
||||
|
||||
$fileFullName = CLIENT_BASE_PATH.'data/'.$fileName;
|
||||
$fp = fopen($fileFullName, 'w');
|
||||
|
||||
foreach ($data as $fields) {
|
||||
fputcsv($fp, $fields);
|
||||
}
|
||||
|
||||
fclose($fp);
|
||||
return array($fileFirstPart, $fileName, $fileFullName);
|
||||
}
|
||||
|
||||
public function saveFile($fileFirstPart, $file, $fileFullName){
|
||||
$uploadedToS3 = false;
|
||||
|
||||
$uploadFilesToS3 = SettingsManager::getInstance()->getSetting("Files: Upload Files to S3");
|
||||
$uploadFilesToS3Key = SettingsManager::getInstance()->getSetting("Files: Amazon S3 Key for File Upload");
|
||||
$uploadFilesToS3Secret = SettingsManager::getInstance()->getSetting("Files: Amazone S3 Secret for File Upload");
|
||||
$s3Bucket = SettingsManager::getInstance()->getSetting("Files: S3 Bucket");
|
||||
$s3WebUrl = SettingsManager::getInstance()->getSetting("Files: S3 Web Url");
|
||||
|
||||
if($uploadFilesToS3.'' == '1' && !empty($uploadFilesToS3Key)
|
||||
&& !empty($uploadFilesToS3Secret) && !empty($s3Bucket) && !empty($s3WebUrl)){
|
||||
|
||||
$uploadname = CLIENT_NAME."/".$file;
|
||||
$s3FileSys = new S3FileSystem($uploadFilesToS3Key, $uploadFilesToS3Secret);
|
||||
$res = $s3FileSys->putObject($s3Bucket, $uploadname, $fileFullName, 'authenticated-read');
|
||||
|
||||
if(empty($res)){
|
||||
return array("ERROR",$file);
|
||||
}
|
||||
|
||||
unlink($fileFullName);
|
||||
$file_url = $s3WebUrl.$uploadname;
|
||||
$file_url = $s3FileSys->generateExpiringURL($file_url);
|
||||
$uploadedToS3 = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
$fileObj = new File();
|
||||
$fileObj->name = $fileFirstPart;
|
||||
$fileObj->filename = $file;
|
||||
$fileObj->file_group = "Report";
|
||||
$ok = $fileObj->Save();
|
||||
|
||||
if(!$ok){
|
||||
LogManager::getInstance()->info($fileObj->ErrorMsg());
|
||||
return array("ERROR","Error generating report");
|
||||
}
|
||||
|
||||
$reportFile = new ReportFile();
|
||||
$reportFile->name = $fileObj->filename;
|
||||
$reportFile->attachment = $fileObj->name;
|
||||
$reportFile->created = date("Y-m-d H:i:s");
|
||||
$reportFile->employee = BaseService::getInstance()->getCurrentProfileId();
|
||||
$ok = $reportFile->Save();
|
||||
|
||||
if(!$ok){
|
||||
LogManager::getInstance()->info($reportFile->ErrorMsg());
|
||||
return array("ERROR","Error generating report");
|
||||
}
|
||||
|
||||
|
||||
if($uploadedToS3){
|
||||
return array("SUCCESS",$file_url);
|
||||
}else{
|
||||
return array("SUCCESS",$file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class CSVReportBuilder extends ReportBuilder{
|
||||
public function getData($report,$request){
|
||||
$query = $this->getMainQuery();
|
||||
$where = $this->getWhereQuery($request);
|
||||
if($query == null || $where == null){
|
||||
return null;
|
||||
}
|
||||
$query.=" ".$where[0];
|
||||
return $this->execute($report, $query, $where[1]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class ClassBasedReportBuilder extends ReportBuilder{
|
||||
|
||||
}
|
||||
|
||||
class PDFReportBuilder extends ReportBuilder{
|
||||
|
||||
var $twig;
|
||||
|
||||
protected function getDefaultData(){
|
||||
$defaultData = array();
|
||||
$defaultData['BASE_URL'] = BASE_URL;
|
||||
$defaultData['LOGO'] = UIManager::getInstance()->getCompanyLogoUrl();
|
||||
$defaultData['LOGO'] = str_replace("https:","http:",$defaultData['LOGO']);
|
||||
$defaultData['companyName'] = SettingsManager::getInstance()->getSetting("Company: Name");
|
||||
LogManager::getInstance()->debug("Logo Url:".$defaultData['LOGO']);
|
||||
return $defaultData;
|
||||
}
|
||||
|
||||
protected function initTemplateEngine($report){
|
||||
if($report->_table = "UserReports"){
|
||||
$path = APP_BASE_PATH."modules/reports/customTemplates/";
|
||||
}else{
|
||||
$path = APP_BASE_PATH."admin/reports/customTemplates/";
|
||||
}
|
||||
$loader = new Twig_Loader_Filesystem($path);
|
||||
$twigOptions = array();
|
||||
//false
|
||||
if(defined('CACHE_THEME') && CACHE_THEME){
|
||||
$twigOptions = array(
|
||||
);
|
||||
}else{
|
||||
$twigOptions = array(
|
||||
"cache"=>false
|
||||
);
|
||||
}
|
||||
$this->twig = new Twig_Environment($loader, $twigOptions);
|
||||
}
|
||||
|
||||
public function createReportFile($report, $data){
|
||||
$fileFirstPart = "Report_".str_replace(" ", "_", $report->name)."-".date("Y-m-d_H-i-s");
|
||||
$fileName = $fileFirstPart.".html";
|
||||
|
||||
$fileFullName = CLIENT_BASE_PATH.'data/'.$fileName;
|
||||
|
||||
$this->initTemplateEngine($report);
|
||||
|
||||
$template = $this->twig->loadTemplate($this->getTemplate());
|
||||
$result = $template->render($data);
|
||||
|
||||
|
||||
$fp = fopen($fileFullName, 'w');
|
||||
fwrite($fp,$result);
|
||||
fclose($fp);
|
||||
|
||||
try{
|
||||
$fileFullNamePdf = CLIENT_BASE_PATH.'data/'.$fileFirstPart.".pdf";
|
||||
//Try generating the pdf
|
||||
exec(WK_HTML_PATH." ".$fileFullName." ".$fileFullNamePdf, $output, $ret);
|
||||
|
||||
LogManager::getInstance()->debug("wkhtmltopdf:".print_r($output,true));
|
||||
LogManager::getInstance()->debug("wkhtmltopdf:".print_r($ret,true));
|
||||
|
||||
if(file_exists($fileFullNamePdf)){
|
||||
$fileName = $fileFirstPart.".pdf";
|
||||
$fileFullName = $fileFullNamePdf;
|
||||
}
|
||||
}catch(Exception $exp){
|
||||
|
||||
}
|
||||
return array($fileFirstPart, $fileName, $fileFullName);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,18 @@
|
||||
<?php
|
||||
interface ReportBuilderInterface{
|
||||
public function getData($report,$request);
|
||||
public function createReportFile($report, $data);
|
||||
}
|
||||
|
||||
interface CSVReportBuilderInterface{
|
||||
public function getData($report,$request);
|
||||
public function createReportFile($report, $data);
|
||||
public function getMainQuery();
|
||||
public function getWhereQuery($request);
|
||||
}
|
||||
|
||||
interface PDFReportBuilderInterface{
|
||||
public function getData($report,$request);
|
||||
public function createReportFile($report, $data);
|
||||
public function getTemplate();
|
||||
}
|
||||
@@ -2,7 +2,7 @@
|
||||
if(!class_exists('ReportBuilder')){
|
||||
include_once APP_BASE_PATH.'admin/reports/reportClasses/ReportBuilder.php';
|
||||
}
|
||||
class TravelRequestReport extends ReportBuilder{
|
||||
class TravelRequestReport extends CSVReportBuilder implements CSVReportBuilderInterface{
|
||||
|
||||
public function getMainQuery(){
|
||||
$query = "SELECT
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
_fields_
|
||||
<div class="control-group">
|
||||
<div class="controls">
|
||||
<button onclick="try{modJs.save()}catch(e){};return false;" class="btn">Download</button>
|
||||
<button onclick="modJs.cancel();return false;" class="btn">Cancel</button>
|
||||
<button onclick="try{modJs.save()}catch(e){};return false;" class="btn"><t>Download</t></button>
|
||||
<button onclick="modJs.cancel();return false;" class="btn"><t>Cancel</t></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</form>
|
||||
|
||||
Reference in New Issue
Block a user