Refactoring

This commit is contained in:
gamonoid
2017-09-03 20:39:22 +02:00
parent af40881847
commit a7274d3cfd
5075 changed files with 238202 additions and 16291 deletions

View File

@@ -0,0 +1,23 @@
<?php
/**
* Created by PhpStorm.
* User: Thilina
* Date: 8/19/17
* Time: 6:40 PM
*/
namespace Reports\Admin\Api;
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]);
}
}

View File

@@ -0,0 +1,17 @@
<?php
/**
* Created by PhpStorm.
* User: Thilina
* Date: 8/19/17
* Time: 6:52 PM
*/
namespace Reports\Admin\Api;
interface CSVReportBuilderInterface
{
public function getData($report, $request);
public function createReportFile($report, $data);
public function getMainQuery();
public function getWhereQuery($request);
}

View File

@@ -0,0 +1,14 @@
<?php
/**
* Created by PhpStorm.
* User: Thilina
* Date: 8/19/17
* Time: 6:43 PM
*/
namespace Reports\Admin\Api;
class ClassBasedReportBuilder extends ReportBuilder
{
}

View File

@@ -0,0 +1,85 @@
<?php
/**
* Created by PhpStorm.
* User: Thilina
* Date: 8/19/17
* Time: 6:44 PM
*/
namespace Reports\Admin\Api;
use Classes\SettingsManager;
use Classes\UIManager;
use Utils\LogManager;
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
LogManager::getInstance()->debug("wkhtmltopdf 1:".print_r(WK_HTML_PATH." ".$fileFullName." ".$fileFullNamePdf, true));
exec(WK_HTML_PATH." ".$fileFullName." ".$fileFullNamePdf, $output, $ret);
LogManager::getInstance()->debug("wkhtmltopdf 2:".print_r($output, true));
LogManager::getInstance()->debug("wkhtmltopdf 3:".print_r($ret, true));
if (file_exists($fileFullNamePdf)) {
$fileName = $fileFirstPart.".pdf";
$fileFullName = $fileFullNamePdf;
}
} catch (\Exception $exp) {
}
return array($fileFirstPart, $fileName, $fileFullName);
}
}

View File

@@ -0,0 +1,16 @@
<?php
/**
* Created by PhpStorm.
* User: Thilina
* Date: 8/19/17
* Time: 6:53 PM
*/
namespace Reports\Admin\Api;
interface PDFReportBuilderInterface
{
public function getData($report, $request);
public function createReportFile($report, $data);
public function getTemplate();
}

View File

@@ -0,0 +1,133 @@
<?php
/**
* Created by PhpStorm.
* User: Thilina
* Date: 8/19/17
* Time: 6:36 PM
*/
namespace Reports\Admin\Api;
use Classes\BaseService;
use Classes\S3FileSystem;
use Classes\SettingsManager;
use Model\File;
use Model\ReportFile;
use Utils\LogManager;
abstract class ReportBuilder
{
protected function execute($report, $query, $parameters)
{
$report->DB()->SetFetchMode(ADODB_FETCH_ASSOC);
LogManager::getInstance()->debug("Query: ".$query);
LogManager::getInstance()->debug("Parameters: ".json_encode($parameters));
$rs = $report->DB()->Execute($query, $parameters);
if (!$rs) {
LogManager::getInstance()->info($report->DB()->ErrorMsg());
return array("ERROR","Error generating report");
}
$reportNamesFilled = false;
$columnNames = array();
$reportData = array();
foreach ($rs as $rowId => $row) {
$reportData[] = array();
if (!$reportNamesFilled) {
$countIt = 0;
foreach ($row as $name => $value) {
$countIt++;
$columnNames[$countIt] = $name;
$reportData[count($reportData)-1][] = $value;
}
$reportNamesFilled = true;
} else {
foreach ($row as $name => $value) {
$reportData[count($reportData)-1][] = $this->transformData($name, $value);
}
}
}
array_unshift($reportData, $columnNames);
return $reportData;
}
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);
}
}
}

View File

@@ -0,0 +1,15 @@
<?php
/**
* Created by PhpStorm.
* User: Thilina
* Date: 8/19/17
* Time: 6:52 PM
*/
namespace Reports\Admin\Api;
interface ReportBuilderInterface
{
public function getData($report, $request);
public function createReportFile($report, $data);
}

View File

@@ -0,0 +1,33 @@
<?php
/**
* Created by PhpStorm.
* User: Thilina
* Date: 8/19/17
* Time: 6:25 PM
*/
namespace Reports\Admin\Api;
use Classes\AbstractModuleManager;
class ReportsAdminManager extends AbstractModuleManager
{
public function initializeUserClasses()
{
}
public function initializeFieldMappings()
{
}
public function initializeDatabaseErrorMappings()
{
}
public function setupModuleClassDefinitions()
{
//This is a fixed module, store model classes in Models.inc.php
}
}

View File

@@ -0,0 +1,92 @@
<?php
namespace Reports\Admin\Reports;
use Company\Common\Model\CompanyStructure;
use Reports\Admin\Api\CSVReportBuilder;
use Reports\Admin\Api\CSVReportBuilderInterface;
use Utils\LogManager;
class ActiveEmployeeReport extends CSVReportBuilder implements CSVReportBuilderInterface
{
public function getMainQuery()
{
$query = "Select id, employee_id as 'Employee ID',
concat(`first_name`,' ',`middle_name`,' ', `last_name`) as 'Name',
(SELECT name from Nationality where id = nationality) as 'Nationality',
birthday as 'Birthday',
gender as 'Gender',
marital_status as 'Marital Status',
ssn_num as 'SSN Number',
nic_num as 'NIC Number',
other_id as 'Other IDs',
driving_license as 'Driving License Number',
(SELECT name from EmploymentStatus where id = employment_status) as 'Employment Status',
(SELECT name from JobTitles where id = job_title) as 'Job Title',
(SELECT name from PayGrades where id = pay_grade) as 'Pay Grade',
work_station_id as 'Work Station ID',
address1 as 'Address 1',
address2 as 'Address 2',
city as 'City',
(SELECT name from Country where code = country) as 'Country',
(SELECT name from Province where id = province) as 'Province',
postal_code as 'Postal Code',
home_phone as 'Home Phone',
mobile_phone as 'Mobile Phone',
work_phone as 'Work Phone',
work_email as 'Work Email',
private_email as 'Private Email',
joined_date as 'Joined Date',
confirmation_date as 'Confirmation Date',
(SELECT title from CompanyStructures where id = department) as 'Department',
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`,' [Employee ID:',`employee_id`,']') from Employees e1 where e1.id = e.supervisor) as 'Supervisor', notes as 'Notes'
FROM Employees e";
return $query;
}
public function getWhereQuery($request)
{
$query = "";
$params = array();
if (empty($request['department']) || $request['department'] == "NULL") {
$params = array();
$query = "where ((termination_date = '0001-01-01 00:00:00' or termination_date = '0000-00-00 00:00:00') and joined_date < NOW()) or (termination_date > NOW() and joined_date < NOW())";
} else {
$depts = $this->getChildCompanyStuctures($request['department']);
$query = "where department in (".implode(",", $depts).") and (((termination_date = '0001-01-01 00:00:00' or termination_date = '0000-00-00 00:00:00') and joined_date < NOW()) or (termination_date > NOW() and joined_date < NOW()))";
}
return array($query, $params);
}
public function getChildCompanyStuctures($companyStructId)
{
$childIds = array();
$childIds[] = $companyStructId;
$nodeIdsAtLastLevel = $childIds;
$count = 0;
do {
$count++;
$companyStructTemp = new CompanyStructure();
if (empty($nodeIdsAtLastLevel) || empty($childIds)) {
break;
}
$idQuery = "parent in (".implode(",", $nodeIdsAtLastLevel).") and id not in(".implode(",", $childIds).")";
LogManager::getInstance()->debug($idQuery);
$list = $companyStructTemp->Find($idQuery, array());
if (!$list) {
LogManager::getInstance()->debug($companyStructTemp->ErrorMsg());
}
$nodeIdsAtLastLevel = array();
foreach ($list as $item) {
$childIds[] = $item->id;
$nodeIdsAtLastLevel[] = $item->id;
}
} while (count($list) > 0 && $count < 10);
return $childIds;
}
}

View File

@@ -0,0 +1,55 @@
<?php
namespace Reports\Admin\Reports;
use Reports\Admin\Api\CSVReportBuilder;
use Reports\Admin\Api\CSVReportBuilderInterface;
use Utils\LogManager;
class EmployeeAttendanceReport extends CSVReportBuilder implements CSVReportBuilderInterface
{
public function getMainQuery()
{
$query = "SELECT
(SELECT `employee_id` from Employees where id = at.employee) as 'Employee',
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) from Employees where id = at.employee) as 'Employee',
in_time as 'Time In',
out_time as 'Time Out',
note as 'Note'
FROM Attendance at";
return $query;
}
public function getWhereQuery($request)
{
$employeeList = array();
if (!empty($request['employee'])) {
$employeeList = json_decode($request['employee'], true);
}
if (in_array("NULL", $employeeList)) {
$employeeList = array();
}
if (!empty($employeeList)) {
$query = "where employee in (".implode(",", $employeeList).") and in_time >= ? and out_time <= ? order by in_time desc;";
$params = array(
$request['date_start']." 00:00:00",
$request['date_end']." 23:59:59",
);
} else {
$query = "where in_time >= ? and out_time <= ? order by in_time desc;";
$params = array(
$request['date_start']." 00:00:00",
$request['date_end']." 23:59:59",
);
}
LogManager::getInstance()->info("Query:".$query);
LogManager::getInstance()->info("Params:".json_encode($params));
return array($query, $params);
}
}

View File

@@ -0,0 +1,54 @@
<?php
namespace Reports\Admin\Reports;
use Employees\Common\Model\Employee;
use Leaves\User\Api\LeavesActionManager;
use Reports\Admin\Api\ClassBasedReportBuilder;
use Reports\Admin\Api\ReportBuilderInterface;
class EmployeeLeaveEntitlementReport extends ClassBasedReportBuilder
implements ReportBuilderInterface
{
public function getData($report, $req)
{
$leaveActionManager = new LeavesActionManager();
$department = $req['department'];
$employeeId = $req['employee'];
if (($employeeId == "NULL" || empty($employeeId)) && ($department == "NULL" || empty($department))) {
$emp = new Employee();
$employees = $emp->Find("status = 'Active'", array());
} elseif ($employeeId != "NULL" && !empty($employeeId)) {
$emp = new Employee();
$employees = $emp->Find("id = ?", array($employeeId));
} else {
$emp = new Employee();
$employees = $emp->Find("department = ? and status = 'Active'", array($department));
}
$reportData = array();
$reportData[] = array("Employee ID","Employee","Leave Type","Pending","Approved","Rejected","Canceled","Available","To be Accrued","Carried Forward from Previous Years");
foreach ($employees as $employee) {
$leaveEntitlements = $leaveActionManager->getEntitlementByEmployee($employee)->getObject();
foreach ($leaveEntitlements as $leaveEntitlement) {
$reportData[] = array(
$employee->employee_id,
$employee->first_name." ".$employee->last_name,
$leaveEntitlement['name'],
$leaveEntitlement['pendingLeaves'],
$leaveEntitlement['approvedLeaves'],
$leaveEntitlement['rejectedLeaves'],
$leaveEntitlement['cancelRequestedLeaves'],
$leaveEntitlement['availableLeaves'],
$leaveEntitlement['tobeAccrued'],
$leaveEntitlement['carriedForward']
);
}
}
return $reportData;
}
}

View File

@@ -0,0 +1,92 @@
<?php
namespace Reports\Admin\Reports;
use Employees\Common\Model\Employee;
use Reports\Admin\Api\CSVReportBuilder;
use Reports\Admin\Api\CSVReportBuilderInterface;
use Utils\LogManager;
class EmployeeLeavesReport extends CSVReportBuilder implements CSVReportBuilderInterface
{
public function getMainQuery()
{
$query = "SELECT
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) from Employees where id = employee) as 'Employee',
(SELECT name from LeaveTypes where id = leave_type) as 'Leave Type',
(SELECT name from LeavePeriods where id = leave_period) as 'Leave Period',
date_start as 'Start Date',
date_end as 'End Date',
details as 'Reason',
status as 'Leave Status',
(select count(*) from EmployeeLeaveDays d where d.employee_leave = lv.id and leave_type = 'Full Day') as 'Full Day Count',
(select count(*) from EmployeeLeaveDays d where d.employee_leave = lv.id and leave_type = 'Half Day - Morning') as 'Half Day (Morning) Count',
(select count(*) from EmployeeLeaveDays d where d.employee_leave = lv.id and leave_type = 'Half Day - Afternoon') as 'Half Day (Afternoon) Count'
from EmployeeLeaves lv";
return $query;
}
public function getWhereQuery($request)
{
$employeeList = array();
if (!empty($request['employee'])) {
$employeeList = json_decode($request['employee'], true);
}
if (in_array("NULL", $employeeList)) {
$employeeList = array();
}
if ($request['department'] != "NULL" && empty($employeeList)) {
$empTmp = new Employee();
$empTemps = $empTmp->Find("department = ? and status = Active", array($request['department']));
foreach ($empTemps as $empTmp) {
$employeeList[] = $empTmp->id;
}
}
if (!empty($employeeList) && ($request['status'] != "NULL" && !empty($request['status']))) {
$query = "where employee in (".implode(",", $employeeList).") and ((date_start >= ? and date_start <= ?) or (date_end >= ? and date_end <= ?)) and status = ?;";
$params = array(
$request['date_start'],
$request['date_end'],
$request['date_start'],
$request['date_end'],
$request['status']
);
} elseif (!empty($employeeList)) {
$query = "where employee in (".implode(",", $employeeList).") and ((date_start >= ? and date_start <= ?) or (date_end >= ? and date_end <= ?));";
$params = array(
$request['date_start'],
$request['date_end'],
$request['date_start'],
$request['date_end']
);
} elseif (($request['status'] != "NULL" && !empty($request['status']))) {
$query = "where status = ? and ((date_start >= ? and date_start <= ?) or (date_end >= ? and date_end <= ?));";
$params = array(
$request['status'],
$request['date_start'],
$request['date_end'],
$request['date_start'],
$request['date_end']
);
} else {
$query = "where ((date_start >= ? and date_start <= ?) or (date_end >= ? and date_end <= ?));";
$params = array(
$request['date_start'],
$request['date_end'],
$request['date_start'],
$request['date_end']
);
}
LogManager::getInstance()->info("Query:".$query);
LogManager::getInstance()->info("Params:".json_encode($params));
return array($query, $params);
}
}

View File

@@ -0,0 +1,74 @@
<?php
namespace Reports\Admin\Reports;
use Employees\Common\Model\Employee;
use Reports\Admin\Api\ClassBasedReportBuilder;
use Reports\Admin\Api\ReportBuilderInterface;
use TimeSheets\Common\Model\EmployeeTimeSheet;
use Utils\LogManager;
class EmployeeTimeSheetData extends ClassBasedReportBuilder implements ReportBuilderInterface
{
public function getData($report, $request)
{
$employeeCache = array();
$employeeList = array();
if (!empty($request['employee'])) {
$employeeList = json_decode($request['employee'], true);
}
if (in_array("NULL", $employeeList)) {
$employeeList = array();
}
$employee_query = "";
if (!empty($employeeList)) {
$employee_query = "employee in (".implode(",", $employeeList).") and ";
}
$timeSheet = new EmployeeTimeSheet();
if ($request['status'] != "NULL") {
$timeSheets = $timeSheet->Find(
$employee_query."status = ? and date_start >= ? and date_end <= ?",
array($request['status'],$request['date_start'],$request['date_end'])
);
} else {
$timeSheets = $timeSheet->Find(
$employee_query."date_start >= ? and date_end <= ?",
array($request['date_start'],$request['date_end'])
);
}
if (!$timeSheets) {
LogManager::getInstance()->info($timeSheet->ErrorMsg());
}
$reportData = array();
$reportData[] = array("Employee ID","Employee","Name","Start","End","Total Time","Status");
foreach ($timeSheets as $ts) {
$employee = $employeeCache[$ts->employee];
if (empty($employee)) {
$employee = new Employee();
$employee->Load("id = ?", array($ts->employee));
if (empty($employee->id)) {
continue;
}
$employeeCache[$employee->id] = $employee;
}
$reportData[] = array(
$employee->employee_id,
$employee->first_name." ".$employee->last_name,
date("F j, Y", strtotime($ts->date_start))." - ".date("F j, Y", strtotime($ts->date_end)),
$ts->date_start,
$ts->date_end,
$ts->getTotalTime(),
$ts->status
);
}
return $reportData;
}
}

View File

@@ -0,0 +1,109 @@
<?php
namespace Reports\Admin\Reports;
use Attendance\Common\Model\Attendance;
use Employees\Common\Model\Employee;
use Reports\Admin\Api\ClassBasedReportBuilder;
use Reports\Admin\Api\ReportBuilderInterface;
use TimeSheets\Common\Model\EmployeeTimeEntry;
use Utils\LogManager;
class EmployeeTimeTrackReport extends ClassBasedReportBuilder implements ReportBuilderInterface
{
public function getData($report, $req)
{
LogManager::getInstance()->info(json_encode($report));
LogManager::getInstance()->info(json_encode($req));
$employeeTimeEntry = new EmployeeTimeEntry();
$timeEntryList = $employeeTimeEntry->Find("employee = ? and date(date_start) >= ? and date(date_end) <= ?", array($req['employee'], $req['date_start'], $req['date_end']));
$seconds = 0;
$graphTimeArray = array();
foreach ($timeEntryList as $entry) {
$seconds = (strtotime($entry->date_end) - strtotime($entry->date_start));
$key = date("Y-m-d", strtotime($entry->date_end));
if (isset($graphTimeArray[$key])) {
$graphTimeArray[$key] += $seconds;
} else {
$graphTimeArray[$key] = $seconds;
}
}
//$minutes = (int)($seconds/60);
//Find Attendance Entries
$attendance = new Attendance();
$atteandanceList = $attendance->Find("employee = ? and date(in_time) >= ? and date(out_time) <= ? and in_time < out_time", array($req['employee'], $req['date_start'], $req['date_end']));
$seconds = 0;
$graphAttendanceArray = array();
$firstTimeInArray = array();
$lastTimeOutArray = array();
foreach ($atteandanceList as $entry) {
$seconds = (strtotime($entry->out_time) - strtotime($entry->in_time));
$key = date("Y-m-d", strtotime($entry->in_time));
if (isset($graphAttendanceArray[$key])) {
$graphAttendanceArray[$key] += $seconds;
$lastTimeOutArray[$key] = $entry->out_time;
} else {
$graphAttendanceArray[$key] = $seconds;
$firstTimeInArray[$key] = $entry->in_time;
$lastTimeOutArray[$key] = $entry->out_time;
}
}
/////////////////////////////////////////
$employeeObject = new Employee();
$employeeObject->Load("id = ?", array($req['employee']));
$reportData = array();
//$reportData[] = array($employeeObject->first_name." ".$employeeObject->last_name,"","","","");
$reportData[] = array("Date","First Punch-In Time","Last Punch-Out Time","Time in Office","Time in Timesheets");
//Iterate date range
$interval = \DateInterval::createFromDateString('1 day');
$period = new \DatePeriod(new \DateTime($req['date_start']), $interval, new \DateTime($req['date_end']));
foreach ($period as $dt) {
$dataRow = array();
$key = $dt->format("Y-m-d");
$dataRow[] = $key;
if (isset($firstTimeInArray[$key])) {
$dataRow[] = $firstTimeInArray[$key];
} else {
$dataRow[] = "Not Found";
}
if (isset($lastTimeOutArray[$key])) {
$dataRow[] = $lastTimeOutArray[$key];
} else {
$dataRow[] = "Not Found";
}
if (isset($graphAttendanceArray[$key])) {
$dataRow[] = round(($graphAttendanceArray[$key]/3600), 2);
} else {
$dataRow[] = 0;
}
if (isset($graphTimeArray[$key])) {
$dataRow[] = round(($graphTimeArray[$key]/3600), 2);
} else {
$dataRow[] = 0;
}
$reportData[] = $dataRow;
}
return $reportData;
}
}

View File

@@ -0,0 +1,103 @@
<?php
namespace Reports\Admin\Reports;
use Projects\Common\Model\Project;
use Reports\Admin\Api\CSVReportBuilder;
use Reports\Admin\Api\CSVReportBuilderInterface;
use Utils\LogManager;
class EmployeeTimesheetReport extends CSVReportBuilder implements CSVReportBuilderInterface
{
public function getMainQuery()
{
$query = "SELECT
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) from Employees where id = te.employee) as 'Employee',
(SELECT name from Projects where id = te.project) as 'Project',
details as 'Details',
date_start as 'Start Time',
date_end as 'End Time',
SEC_TO_TIME(TIMESTAMPDIFF(SECOND,te.date_start,te.date_end)) as 'Duration'
FROM EmployeeTimeEntry te";
return $query;
}
public function getWhereQuery($request)
{
$employeeList = array();
if (!empty($request['employee'])) {
$employeeList = json_decode($request['employee'], true);
}
$request['date_start'] = $request['date_start']." 00:00:00";
$request['date_end'] = $request['date_end']." 23:59:59";
if (in_array("NULL", $employeeList)) {
$employeeList = 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']
);
} elseif (!empty($employeeList)) {
$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 {
$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']
);
} elseif (!empty($employeeList)) {
$query = "where employee in (" . implode(",", $employeeList) . ") and date_start >= ? and date_end <= ?;";
$params = array(
$request['date_start'],
$request['date_end']
);
} elseif (($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(
$request['date_start'],
$request['date_end']
);
}
}
LogManager::getInstance()->info("Query:".$query);
LogManager::getInstance()->info("Params:".json_encode($params));
return array($query, $params);
}
}

View File

@@ -0,0 +1,71 @@
<?php
namespace Reports\Admin\Reports;
use Reports\Admin\Api\CSVReportBuilder;
use Reports\Admin\Api\CSVReportBuilderInterface;
class ExpenseReport extends CSVReportBuilder implements CSVReportBuilderInterface
{
public function getMainQuery()
{
$query = "SELECT
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) from Employees where id = employee) as 'Employee',
expense_date as 'Date',
(SELECT name from ExpensesPaymentMethods where id = payment_method) as 'Payment Method',
transaction_no as 'Transaction Ref',
payee as 'Payee',
(SELECT name from ExpensesCategories where id = category) as 'Category',
notes as 'Notes',
concat(`amount`,' ',`currency`) as 'Amount',
status as 'Status',
created as 'Created',
updated as 'Updated'
from EmployeeExpenses";
return $query;
}
public function getWhereQuery($request)
{
$employeeList = array();
if (!empty($request['employee'])) {
$employeeList = json_decode($request['employee'], true);
}
if (in_array("NULL", $employeeList)) {
$employeeList = array();
}
if (!empty($employeeList) && ($request['status'] != "NULL" && !empty($request['status']))) {
$query = "where employee in (".implode(",", $employeeList).") and date(expense_date) >= ? and date(expense_date) <= ? and status = ?;";
$params = array(
$request['date_start'],
$request['date_end'],
$request['status']
);
} elseif (!empty($employeeList)) {
$query = "where employee in (".implode(",", $employeeList).") and date(expense_date) >= ? and date(expense_date) <= ?;";
$params = array(
$request['date_start'],
$request['date_end']
);
} elseif (($request['status'] != "NULL" && !empty($request['status']))) {
$query = "where status = ? and date(expense_date) >= ? and date(expense_date) <= ?;";
$params = array(
$request['status'],
$request['date_start'],
$request['date_end']
);
} else {
$query = "where date(expense_date) >= ? and date(expense_date) <= ?;";
$params = array(
$request['date_start'],
$request['date_end']
);
}
return array($query, $params);
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace Reports\Admin\Reports;
class NewHiresEmployeeReport extends ActiveEmployeeReport
{
public function getWhereQuery($request)
{
$query = "where ";
$params = array();
if (!empty($request['department']) && $request['department'] != "NULL") {
$depts = $this->getChildCompanyStuctures($request['department']);
$query.="department in(".implode(",", $depts).") and ";
}
if (empty($request['date_start']) || $request['date_start'] == "NULL") {
$request['date_start'] = date("Y-m-d 00:00:00");
}
if (empty($request['date_end']) || $request['date_end'] == "NULL") {
$request['date_end'] = date("Y-m-d 23:59:59");
}
$query.="joined_date >= ? ";
$params[] = $request['date_start']." 00:00:00";
$query.="and joined_date <= ? ";
$params[] = $request['date_end']." 23:59:59";
return array($query, $params);
}
}

View File

@@ -0,0 +1,100 @@
<?php
namespace Reports\Admin\Reports;
use Attendance\Common\Model\Attendance;
use Classes\SettingsManager;
use Employees\Common\Model\Employee;
use Reports\Admin\Api\ClassBasedReportBuilder;
use Reports\Admin\Api\ReportBuilderInterface;
class OvertimeReport extends ClassBasedReportBuilder implements ReportBuilderInterface
{
public function getData($report, $request)
{
$employeeList = array();
if (!empty($request['employee'])) {
$employeeList = json_decode($request['employee'], true);
}
if (in_array("NULL", $employeeList)) {
$employeeList = array();
}
$sevenDateBefore = date('Y-m-d', strtotime('-7 days', strtotime($request['date_start'])));
if (!empty($employeeList)) {
$query = "employee in (".implode(",", $employeeList).") and in_time >= ? and out_time <= ? order by in_time;";
$params = array(
$sevenDateBefore." 00:00:00",
$request['date_end']." 23:59:59",
);
} else {
$query = "in_time >= ? and out_time <= ? order by in_time;";
$params = array(
$sevenDateBefore." 00:00:00",
$request['date_end']." 23:59:59",
);
}
$at = new Attendance();
$attendance = $at->Find($query, $params);
//Group records by employee
$employeeAttendance = array();
foreach ($attendance as $entry) {
if (!isset($employeeAttendance[$entry->employee])) {
$employeeAttendance[$entry->employee] = array();
}
$employeeAttendance[$entry->employee][] = $entry;
}
$atCalClassName = '\\Attendance\Common\Calculations\\';
$atCalClassName .= SettingsManager::getInstance()->getSetting('Attendance: Overtime Calculation Class');
$atCal = new $atCalClassName();
$reportData = array();
if (!$this->isAggregated()) {
$reportData[] = array("Date", "Employee ID", "Employee", "Time in Office", "Regular Time", "Overtime", "Double Time");
} else {
$reportData[] = array("Employee ID", "Employee", "Time in Office", "Regular Time", "Overtime", "Double Time");
}
foreach ($employeeAttendance as $employeeId => $atData) {
$employee = new Employee();
$employee->Load("id = ?", array($employeeId));
$atSum = $atCal->getData($atData, $request['date_start'], $this->isAggregated());
if (!$this->isAggregated()) {
foreach ($atSum as $date => $counts) {
$reportData[] = array(
$date,
$employee->employee_id,
$employee->first_name." ".$employee->last_name,
$counts['t'],
$counts['r'],
$counts['o'],
$counts['d']
);
}
} else {
$reportData[] = array(
$employee->employee_id,
$employee->first_name." ".$employee->last_name,
$atSum['t'],
$atSum['r'],
$atSum['o'],
$atSum['d']
);
}
}
return $reportData;
}
protected function isAggregated()
{
return false;
}
}

View File

@@ -0,0 +1,70 @@
<?php
namespace Reports\Admin\Reports;
use Reports\Admin\Api\CSVReportBuilder;
use Reports\Admin\Api\CSVReportBuilderInterface;
use Utils\LogManager;
class OvertimeRequestReport extends CSVReportBuilder implements CSVReportBuilderInterface
{
public function getMainQuery()
{
$query = "SELECT
(SELECT `employee_id` from Employees where id = at.employee) as 'Employee',
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) from Employees where id = at.employee) as 'Employee',
(SELECT `name` from OvertimeCategories where id = at.category) as 'Category',
(SELECT `name` from Projects where id = at.project) as 'Project',
start_time as 'Start Time',
end_time as 'End Time',
notes as 'Notes',
status as 'Status'
FROM EmployeeOvertime at";
return $query;
}
public function getWhereQuery($request)
{
$employeeList = array();
if (!empty($request['employee'])) {
$employeeList = json_decode($request['employee'], true);
}
if (in_array("NULL", $employeeList)) {
$employeeList = array();
}
if (!empty($employeeList)) {
$query = "where employee in (".implode(",", $employeeList).") and start_time >= ? and end_time <= ?";
$params = array(
$request['date_start']." 00:00:00",
$request['date_end']." 23:59:59",
);
} else {
$query = "where start_time >= ? and end_time <= ?";
$params = array(
$request['date_start']." 00:00:00",
$request['date_end']." 23:59:59",
);
}
if (!empty($request['category']) && $request['category'] != "NULL") {
$query.= " and category = ?";
$params[] = $request['category'];
}
if (!empty($request['project']) && $request['project'] != "NULL") {
$query.= " and project = ?";
$params[] = $request['project'];
}
$query.=" order by start_time desc;";
LogManager::getInstance()->info("Query:".$query);
LogManager::getInstance()->info("Params:".json_encode($params));
return array($query, $params);
}
}

View File

@@ -0,0 +1,10 @@
<?php
namespace Reports\Admin\Reports;
class OvertimeSummaryReport extends OvertimeReport
{
protected function isAggregated()
{
return true;
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace Reports\Admin\Reports;
class TerminatedEmployeeReport extends ActiveEmployeeReport
{
public function getWhereQuery($request)
{
$query = "where ";
$params = array();
if (!empty($request['department']) && $request['department'] != "NULL") {
$depts = $this->getChildCompanyStuctures($request['department']);
$query.="department in(".implode(",", $depts).") and ";
}
if (empty($request['date_start']) || $request['date_start'] == "NULL") {
$request['date_start'] = date("Y-m-d 00:00:00");
}
if (empty($request['date_end']) || $request['date_end'] == "NULL") {
$request['date_end'] = date("Y-m-d 23:59:59");
}
$query.="termination_date >= ? ";
$params[] = $request['date_start']." 00:00:00";
$query.="and termination_date <= ? ";
$params[] = $request['date_end']." 23:59:59";
return array($query, $params);
}
}

View File

@@ -0,0 +1,72 @@
<?php
namespace Reports\Admin\Reports;
use Reports\Admin\Api\CSVReportBuilder;
use Reports\Admin\Api\CSVReportBuilderInterface;
class TravelRequestReport extends CSVReportBuilder implements CSVReportBuilderInterface
{
public function getMainQuery()
{
$query = "SELECT
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) from Employees where id = employee) as 'Employee',
type as 'Type',
purpose as 'Purpose',
travel_from as 'Travel From',
travel_to as 'Travel To',
travel_date as 'Travel Date',
return_date as 'Return Date',
details as 'Other Details',
concat(`funding`,' ',`currency`) as 'Funding',
status as 'Status',
created as 'Created',
updated as 'Updated'
from EmployeeTravelRecords";
return $query;
}
public function getWhereQuery($request)
{
$employeeList = array();
if (!empty($request['employee'])) {
$employeeList = json_decode($request['employee'], true);
}
if (in_array("NULL", $employeeList)) {
$employeeList = array();
}
if (!empty($employeeList) && ($request['status'] != "NULL" && !empty($request['status']))) {
$query = "where employee in (".implode(",", $employeeList).") and date(travel_date) >= ? and date(return_date) <= ? and status = ?;";
$params = array(
$request['date_start'],
$request['date_end'],
$request['status']
);
} elseif (!empty($employeeList)) {
$query = "where employee in (".implode(",", $employeeList).") and date(travel_date) >= ? and date(return_date) <= ?;";
$params = array(
$request['date_start'],
$request['date_end']
);
} elseif (($request['status'] != "NULL" && !empty($request['status']))) {
$query = "where status = ? and date(travel_date) >= ? and date(return_date) <= ?;";
$params = array(
$request['status'],
$request['date_start'],
$request['date_end']
);
} else {
$query = "where date(travel_date) >= ? and date(return_date) <= ?;";
$params = array(
$request['date_start'],
$request['date_end']
);
}
return array($query, $params);
}
}

View File

@@ -0,0 +1,33 @@
<?php
/**
* Created by PhpStorm.
* User: Thilina
* Date: 8/19/17
* Time: 10:26 PM
*/
namespace Reports\User\Api;
use Classes\AbstractModuleManager;
class ReportsModulesManager extends AbstractModuleManager
{
public function initializeUserClasses()
{
}
public function initializeFieldMappings()
{
}
public function initializeDatabaseErrorMappings()
{
}
public function setupModuleClassDefinitions()
{
//This is a fixed module, store model classes in Models.inc.php
}
}

View File

@@ -0,0 +1,182 @@
<?php
namespace Reports\User\Reports;
use Classes\BaseService;
use Classes\SettingsManager;
use Leaves\Common\Model\HoliDay;
use Leaves\Common\Model\WorkDay;
use Metadata\Common\Model\Country;
use Reports\Admin\Api\PDFReportBuilder;
use Reports\Admin\Api\PDFReportBuilderInterface;
use Employees\Common\Model\Employee;
use Projects\Common\Model\Client;
use Projects\Common\Model\Project;
use TimeSheets\Common\Model\EmployeeTimeEntry;
use Utils\CalendarTools;
class ClientProjectTimeReport extends PDFReportBuilder implements PDFReportBuilderInterface
{
public function getData($report, $request)
{
$data = $this->getDefaultData();
$data['company'] = SettingsManager::getInstance()->getSetting('Company: Name');
$client = new Client();
$client->Load("id = ?", array($request['client']));
$data['client'] = $client->name;
$data['period'] = $request['date_start']." to ".$request['date_end'];
$project = new Project();
$projects = $project->Find("client = ?", array($request['client']));
$projectsStr = "";
$projectIds = '';
$projectsMap = array();
foreach ($projects as $pro) {
$projectIds[] = $pro->id;
$projectsMap[$pro->id] = $pro->name;
}
$employeeId = BaseService::getInstance()->getCurrentProfileId();
$employee = new Employee();
$employee->Load("id = ?", array($employeeId));
$data['employee'] = $employee->first_name." ".$employee->last_name;
$employeeTimeEntry = new EmployeeTimeEntry();
$timeEntryList = $employeeTimeEntry->Find(
"employee = ? and date(date_start) >= ? and date(date_end) <= ? and project in (".implode(",", $projectIds).") order by date_start",
array($employeeId, $request['date_start'], $request['date_end'])
);
$totalHours = 0;
$nonWorkingDayHours = 0;
$projectTimes = array();
$timeEntryListNew = array();
$country = new Country();
$country->Load("code = ?", $employee->country);
$countryCode = null;
if (!empty($country->id)) {
$countryCode = $country->id;
}
$projectsWorked = array();
foreach ($timeEntryList as $timeEntry) {
if (!in_array($timeEntry->project, $projectsWorked)) {
$projectsWorked[] = $timeEntry->project;
}
$entry = new \stdClass();
$entry->date = date("d.m.Y", strtotime($timeEntry->date_start));
$entry->startTime = $timeEntry->time_start;
$entry->endTime = $timeEntry->time_end;
$entry->details = $timeEntry->details;
$entry->project = $projectsMap[$timeEntry->project];
$entry->duration = CalendarTools::getTimeDiffInHours(
$timeEntry->date_start,
$timeEntry->date_end
);
$timeEntryListNew[] = $entry;
$totalHours += $entry->duration;
$isWorkingDay = $this->isWorkingDay($timeEntry->date_start, $countryCode);
if (!$isWorkingDay) {
$nonWorkingDayHours += $entry->duration;
}
if (!isset($projectTimes[$projectsMap[$timeEntry->project]])) {
$projectTimes[$projectsMap[$timeEntry->project]] = 0;
}
$projectTimes[$projectsMap[$timeEntry->project]] += $entry->duration;
}
foreach ($projects as $pro) {
if (in_array($pro->id, $projectsWorked)) {
if ($projectsStr != "") {
$projectsStr .= " ,";
}
$projectsStr .= $pro->name;
}
}
$data['projects'] = $projectsStr;
$data['entries'] = $timeEntryListNew;
$data['projectTimes'] = $projectTimes;
$data['totalHours'] = $totalHours;
$data['totalHoursWorking'] = $totalHours - $nonWorkingDayHours;
$data['totalHoursNonWorking'] = $nonWorkingDayHours;
return $data;
}
private function isHoliday($date, $countryId)
{
$hd = new HoliDay();
$allHolidays = $hd->Find(
"dateh = ? and country IS NULL",
array(date('Y-m-d', strtotime($date)))
);
if (count($allHolidays) > 0) {
return true;
}
if (!empty($countryId)) {
$countryHolidays = $hd->Find(
"dateh = ? and country = ?",
array(date('Y-m-d', strtotime($date)), $countryId)
);
if (count($countryHolidays) > 0) {
return true;
}
}
return false;
}
private function isWorkingDay($date, $countryId)
{
$day = date("l", strtotime($date));
$isHoliday = $this->isHoliday($date, $countryId);
if ($isHoliday) {
return false;
}
$wdCountry = new WorkDay();
$wdCountry->Load("name = ? and country = ?", array($day, $countryId));
if (!empty($wdCountry->id)) {
if ($wdCountry->status == 'Full Day' || $wdCountry->status == 'Half Day') {
return true;
} else {
return false;
}
} else {
$wdAll = new WorkDay();
$wdAll->Load("name = ? and country IS NULL", array($day));
if ($wdAll->status == 'Full Day' || $wdAll->status == 'Half Day') {
return true;
} else {
return false;
}
}
}
public function getTemplate()
{
return "client_project_time_report.html";
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace Reports\User\Reports;
use Classes\BaseService;
use Reports\Admin\Api\CSVReportBuilder;
use Reports\Admin\Api\CSVReportBuilderInterface;
use Utils\LogManager;
class EmployeeAttendanceReport extends CSVReportBuilder implements CSVReportBuilderInterface
{
public function getMainQuery()
{
$query = "SELECT
(SELECT `employee_id` from Employees where id = at.employee) as 'Employee',
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) from Employees where id = at.employee) as 'Employee',
in_time as 'Time In',
out_time as 'Time Out',
note as 'Note'
FROM Attendance at";
return $query;
}
public function getWhereQuery($request)
{
$query = "where employee = ? and in_time >= ? and out_time <= ? order by in_time desc;";
$params = array(
BaseService::getInstance()->getCurrentProfileId(),
$request['date_start']." 00:00:00",
$request['date_end']." 23:59:59",
);
LogManager::getInstance()->info("Query:".$query);
LogManager::getInstance()->info("Params:".json_encode($params));
return array($query, $params);
}
}

View File

@@ -0,0 +1,59 @@
<?php
namespace Reports\User\Reports;
use Classes\BaseService;
use Reports\Admin\Api\CSVReportBuilder;
use Reports\Admin\Api\CSVReportBuilderInterface;
use Utils\LogManager;
class EmployeeLeavesReport extends CSVReportBuilder implements CSVReportBuilderInterface
{
public function getMainQuery()
{
$query = "SELECT
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) from Employees where id = employee) as 'Employee',
(SELECT name from LeaveTypes where id = leave_type) as 'Leave Type',
(SELECT name from LeavePeriods where id = leave_period) as 'Leave Period',
date_start as 'Start Date',
date_end as 'End Date',
details as 'Reason',
status as 'Leave Status',
(select count(*) from EmployeeLeaveDays d where d.employee_leave = lv.id and leave_type = 'Full Day') as 'Full Day Count',
(select count(*) from EmployeeLeaveDays d where d.employee_leave = lv.id and leave_type = 'Half Day - Morning') as 'Half Day (Morning) Count',
(select count(*) from EmployeeLeaveDays d where d.employee_leave = lv.id and leave_type = 'Half Day - Afternoon') as 'Half Day (Afternoon) Count'
from EmployeeLeaves lv";
return $query;
}
public function getWhereQuery($request)
{
if (($request['status'] != "NULL" && !empty($request['status']))) {
$query = "where employee = ? and status = ? and ((date_start >= ? and date_start <= ?) or (date_end >= ? and date_end <= ?));";
$params = array(
BaseService::getInstance()->getCurrentProfileId(),
$request['status'],
$request['date_start'],
$request['date_end'],
$request['date_start'],
$request['date_end']
);
} else {
$query = "where employee = ? and ((date_start >= ? and date_start <= ?) or (date_end >= ? and date_end <= ?));";
$params = array(
BaseService::getInstance()->getCurrentProfileId(),
$request['date_start'],
$request['date_end'],
$request['date_start'],
$request['date_end']
);
}
LogManager::getInstance()->info("Query:".$query);
LogManager::getInstance()->info("Params:".json_encode($params));
return array($query, $params);
}
}

View File

@@ -0,0 +1,76 @@
<?php
namespace Reports\User\Reports;
use Employees\Common\Model\Employee;
use Reports\Admin\Api\ClassBasedReportBuilder;
use Reports\Admin\Api\ReportBuilderInterface;
use TimeSheets\Common\Model\EmployeeTimeSheet;
use Utils\LogManager;
class EmployeeTimeSheetData extends ClassBasedReportBuilder implements ReportBuilderInterface
{
public function getData($report, $request)
{
$employeeCache = array();
$employeeList = array();
if (!empty($request['employee'])) {
$employeeList = json_decode($request['employee'], true);
}
if (in_array("NULL", $employeeList)) {
$employeeList = array();
}
$employee_query = "";
if (!empty($employeeList)) {
$employee_query = "employee in (".implode(",", $employeeList).") and ";
}
$timeSheet = new EmployeeTimeSheet();
if ($request['status'] != "NULL") {
$timeSheets = $timeSheet->Find(
$employee_query."status = ? and date_start >= ? and date_end <= ?",
array($request['status'],$request['date_start'],$request['date_end'])
);
} else {
$timeSheets = $timeSheet->Find(
$employee_query."date_start >= ? and date_end <= ?",
array($request['date_start'],$request['date_end'])
);
}
if (!$timeSheets) {
LogManager::getInstance()->info($timeSheet->ErrorMsg());
}
$reportData = array();
$reportData[] = array("Employee ID","Employee","Name","Start","End","Total Time","Status");
foreach ($timeSheets as $ts) {
$employee = $employeeCache[$ts->employee];
if (empty($employee)) {
$employee = new Employee();
$employee->Load("id = ?", array($ts->employee));
if (empty($employee->id)) {
continue;
}
$employeeCache[$employee->id] = $employee;
}
$reportData[] = array(
$employee->employee_id,
$employee->first_name." ".$employee->last_name,
date("F j, Y", strtotime($ts->date_start))
." - "
.date("F j, Y", strtotime($ts->date_end)),
$ts->date_start,
$ts->date_end,
$ts->getTotalTime(),
$ts->status
);
}
return $reportData;
}
}

View File

@@ -0,0 +1,114 @@
<?php
namespace Reports\User\Reports;
use Attendance\Common\Model\Attendance;
use Classes\BaseService;
use Employees\Common\Model\Employee;
use Reports\Admin\Api\ClassBasedReportBuilder;
use Reports\Admin\Api\ReportBuilderInterface;
use TimeSheets\Common\Model\EmployeeTimeEntry;
class EmployeeTimeTrackReport extends ClassBasedReportBuilder implements ReportBuilderInterface
{
public function getData($report, $req)
{
$req['employee'] = BaseService::getInstance()->getCurrentProfileId();
$employeeTimeEntry = new EmployeeTimeEntry();
$timeEntryList = $employeeTimeEntry->Find(
"employee = ? and date(date_start) >= ? and date(date_end) <= ?",
array($req['employee'], $req['date_start'], $req['date_end'])
);
$seconds = 0;
$graphTimeArray = array();
foreach ($timeEntryList as $entry) {
$seconds = (strtotime($entry->date_end) - strtotime($entry->date_start));
$key = date("Y-m-d", strtotime($entry->date_end));
if (isset($graphTimeArray[$key])) {
$graphTimeArray[$key] += $seconds;
} else {
$graphTimeArray[$key] = $seconds;
}
}
//$minutes = (int)($seconds/60);
//Find Attendance Entries
$attendance = new Attendance();
$atteandanceList = $attendance->Find("employee = ? and date(in_time) >= ? and date(out_time) <= ? and in_time < out_time", array($req['employee'], $req['date_start'], $req['date_end']));
$seconds = 0;
$graphAttendanceArray = array();
$firstTimeInArray = array();
$lastTimeOutArray = array();
foreach ($atteandanceList as $entry) {
$seconds = (strtotime($entry->out_time) - strtotime($entry->in_time));
$key = date("Y-m-d", strtotime($entry->in_time));
if (isset($graphAttendanceArray[$key])) {
$graphAttendanceArray[$key] += $seconds;
$lastTimeOutArray[$key] = $entry->out_time;
} else {
$graphAttendanceArray[$key] = $seconds;
$firstTimeInArray[$key] = $entry->in_time;
$lastTimeOutArray[$key] = $entry->out_time;
}
}
/////////////////////////////////////////
$employeeObject = new Employee();
$employeeObject->Load("id = ?", array($req['employee']));
$reportData = array();
//$reportData[] = array($employeeObject->first_name." ".$employeeObject->last_name,"","","","");
$reportData[] = array("Date","First Punch-In Time","Last Punch-Out Time","Time in Office","Time in Timesheets");
//Iterate date range
$interval = \DateInterval::createFromDateString('1 day');
$period = new \DatePeriod(new \DateTime($req['date_start']), $interval, new \DateTime($req['date_end']));
foreach ($period as $dt) {
$dataRow = array();
$key = $dt->format("Y-m-d");
$dataRow[] = $key;
if (isset($firstTimeInArray[$key])) {
$dataRow[] = $firstTimeInArray[$key];
} else {
$dataRow[] = "Not Found";
}
if (isset($lastTimeOutArray[$key])) {
$dataRow[] = $lastTimeOutArray[$key];
} else {
$dataRow[] = "Not Found";
}
if (isset($graphAttendanceArray[$key])) {
$dataRow[] = round(($graphAttendanceArray[$key]/3600), 2);
} else {
$dataRow[] = 0;
}
if (isset($graphTimeArray[$key])) {
$dataRow[] = round(($graphTimeArray[$key]/3600), 2);
} else {
$dataRow[] = 0;
}
$reportData[] = $dataRow;
}
return $reportData;
}
}

View File

@@ -0,0 +1,78 @@
<?php
namespace Reports\User\Reports;
use Classes\BaseService;
use Projects\Common\Model\Project;
use Reports\Admin\Api\CSVReportBuilder;
use Reports\Admin\Api\CSVReportBuilderInterface;
use Utils\LogManager;
class EmployeeTimesheetReport extends CSVReportBuilder implements CSVReportBuilderInterface
{
public function getMainQuery()
{
$query = "SELECT
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) from Employees where id = te.employee) as 'Employee',
(SELECT name from Projects where id = te.project) as 'Project',
details as 'Details',
date_start as 'Start Time',
date_end as 'End Time',
SEC_TO_TIME(TIMESTAMPDIFF(SECOND,te.date_start,te.date_end)) as 'Duration'
FROM EmployeeTimeEntry te";
return $query;
}
public function getWhereQuery($request)
{
if (($request['client'] != "NULL" && !empty($request['client']))) {
if (($request['project'] != "NULL" && !empty($request['project']))) {
$query = "where employee = ? and project = ? and date_start >= ? and date_end <= ?;";
$params = array(
BaseService::getInstance()->getCurrentProfileId(),
$request['project'],
$request['date_start'],
$request['date_end']
);
} else {
$project = new Project();
$projects = $project->Find("client = ?", array($request['client']));
$projectIds = array();
foreach ($projects as $project) {
$projectIds[] = $project->id;
}
$query = "where project in (".implode(",", $projectIds).") and employee = ? and date_start >= ? and date_end <= ?;";
$params = array(
BaseService::getInstance()->getCurrentProfileId(),
$request['date_start'],
$request['date_end']
);
}
} else {
if (($request['project'] != "NULL" && !empty($request['project']))) {
$query = "where employee = ? and project = ? and date_start >= ? and date_end <= ?;";
$params = array(
BaseService::getInstance()->getCurrentProfileId(),
$request['project'],
$request['date_start'],
$request['date_end']
);
} else {
$query = "where employee = ? and date_start >= ? and date_end <= ?;";
$params = array(
BaseService::getInstance()->getCurrentProfileId(),
$request['date_start'],
$request['date_end']
);
}
}
LogManager::getInstance()->info("Query:".$query);
LogManager::getInstance()->info("Params:".json_encode($params));
return array($query, $params);
}
}

View File

@@ -0,0 +1,52 @@
<?php
namespace Reports\User\Reports;
use Classes\BaseService;
use Reports\Admin\Api\CSVReportBuilder;
use Reports\Admin\Api\CSVReportBuilderInterface;
class ExpenseReport extends CSVReportBuilder implements CSVReportBuilderInterface
{
public function getMainQuery()
{
$query = "SELECT
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) from Employees where id = employee) as 'Employee',
expense_date as 'Date',
(SELECT name from ExpensesPaymentMethods where id = payment_method) as 'Payment Method',
transaction_no as 'Transaction Ref',
payee as 'Payee',
(SELECT name from ExpensesCategories where id = category) as 'Category',
notes as 'Notes',
concat(`amount`,' ',`currency`) as 'Amount',
status as 'Status',
created as 'Created',
updated as 'Updated'
from EmployeeExpenses";
return $query;
}
public function getWhereQuery($request)
{
if (($request['status'] != "NULL" && !empty($request['status']))) {
$query = "where employee = ? and status = ? and date(expense_date) >= ? and date(expense_date) <= ?;";
$params = array(
BaseService::getInstance()->getCurrentProfileId(),
$request['status'],
$request['date_start'],
$request['date_end']
);
} else {
$query = "where employee = ? and date(expense_date) >= ? and date(expense_date) <= ?;";
$params = array(
BaseService::getInstance()->getCurrentProfileId(),
$request['date_start'],
$request['date_end']
);
}
return array($query, $params);
}
}

View File

@@ -0,0 +1,86 @@
<?php
namespace Reports\User\Reports;
use Attendance\Common\Model\Attendance;
use Classes\BaseService;
use Classes\SettingsManager;
use Employees\Common\Model\Employee;
use Reports\Admin\Api\ClassBasedReportBuilder;
use Reports\Admin\Api\ReportBuilderInterface;
class OvertimeReport extends ClassBasedReportBuilder implements ReportBuilderInterface
{
public function getData($report, $request)
{
$employeeList = array();
$employeeList[] = BaseService::getInstance()->getCurrentProfileId();
$sevenDateBefore = date('Y-m-d', strtotime('-7 days', strtotime($request['date_start'])));
$query = "employee in (".implode(",", $employeeList).") and in_time >= ? and out_time <= ? order by in_time;";
$params = array(
$sevenDateBefore." 00:00:00",
$request['date_end']." 23:59:59",
);
$at = new Attendance();
$attendance = $at->Find($query, $params);
//Group records by employee
$employeeAttendance = array();
foreach ($attendance as $entry) {
if (!isset($employeeAttendance[$entry->employee])) {
$employeeAttendance[$entry->employee] = array();
}
$employeeAttendance[$entry->employee][] = $entry;
}
$atCalClassName = SettingsManager::getInstance()->getSetting('Attendance: Overtime Calculation Class');
$atCalClassName = '\\Attendance\\Common\\Calculations\\'.$atCalClassName;
$atCal = new $atCalClassName();
$reportData = array();
if (!$this->isAggregated()) {
$reportData[] = array("Date", "Employee ID", "Employee", "Time in Office", "Regular Time", "Overtime", "Double Time");
} else {
$reportData[] = array("Employee ID", "Employee", "Time in Office", "Regular Time", "Overtime", "Double Time");
}
foreach ($employeeAttendance as $employeeId => $atData) {
$employee = new Employee();
$employee->Load("id = ?", array($employeeId));
$atSum = $atCal->getData($atData, $request['date_start'], $this->isAggregated());
if (!$this->isAggregated()) {
foreach ($atSum as $date => $counts) {
$reportData[] = array(
$date,
$employee->employee_id,
$employee->first_name." ".$employee->last_name,
$counts['t'],
$counts['r'],
$counts['o'],
$counts['d']
);
}
} else {
$reportData[] = array(
$employee->employee_id,
$employee->first_name." ".$employee->last_name,
$atSum['t'],
$atSum['r'],
$atSum['o'],
$atSum['d']
);
}
}
return $reportData;
}
protected function isAggregated()
{
return false;
}
}

View File

@@ -0,0 +1,10 @@
<?php
namespace Reports\User\Reports;
class OvertimeSummaryReport extends OvertimeReport
{
protected function isAggregated()
{
return true;
}
}

View File

@@ -0,0 +1,74 @@
<?php
namespace Reports\User\Reports;
use Classes\BaseService;
use Payroll\Common\Model\Payroll;
use Payroll\Common\Model\PayrollColumn;
use Payroll\Common\Model\PayrollData;
use Payroll\Common\Model\PayslipTemplate;
use Reports\Admin\Api\PDFReportBuilder;
use Reports\Admin\Api\PDFReportBuilderInterface;
class PayslipReport extends PDFReportBuilder implements PDFReportBuilderInterface
{
public function getData($report, $request)
{
$data = $this->getDefaultData();
$data['fields'] = array();
$payroll = new Payroll();
$payroll->Load("id = ?", array($request['payroll']));
if (empty($payroll->payslipTemplate)) {
return null;
}
$payslipTemplate = new PayslipTemplate();
$payslipTemplate->Load("id = ?", array($payroll->payslipTemplate));
if (empty($payslipTemplate->id)) {
return null;
}
$fields = json_decode($payslipTemplate->data, true);
foreach ($fields as $field) {
if ($field['type'] == 'Payroll Column') {
$col = new PayrollColumn();
$col->Load("id = ?", $field['payrollColumn']);
if (empty($col->id)) {
continue;
}
$payrollData = new PayrollData();
$payrollData->Load(
"payroll = ? and payroll_item = ? and employee = ?",
array(
$request['payroll'],
$col->id, BaseService::getInstance()->getCurrentProfileId()
)
);
if (empty($payrollData->id)) {
continue;
}
$field['value'] = $payrollData->amount;
if (empty($field['label'])) {
$field['label'] = $col->name;
}
}
if ($field['status'] == 'Show') {
$data['fields'][] = $field;
}
}
return $data;
}
public function getTemplate()
{
return "payslip.html";
}
}

View File

@@ -0,0 +1,53 @@
<?php
namespace Reports\User\Reports;
use Classes\BaseService;
use Reports\Admin\Api\CSVReportBuilder;
use Reports\Admin\Api\CSVReportBuilderInterface;
class TravelRequestReport extends CSVReportBuilder implements CSVReportBuilderInterface
{
public function getMainQuery()
{
$query = "SELECT
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) from Employees where id = employee) as 'Employee',
type as 'Type',
purpose as 'Purpose',
travel_from as 'Travel From',
travel_to as 'Travel To',
travel_date as 'Travel Date',
return_date as 'Return Date',
details as 'Other Details',
concat(`funding`,' ',`currency`) as 'Funding',
status as 'Status',
created as 'Created',
updated as 'Updated'
from EmployeeTravelRecords";
return $query;
}
public function getWhereQuery($request)
{
if (($request['status'] != "NULL" && !empty($request['status']))) {
$query = "where employee = ? and status = ? and date(travel_date) >= ? and date(return_date) <= ?;";
$params = array(
BaseService::getInstance()->getCurrentProfileId(),
$request['status'],
$request['date_start'],
$request['date_end']
);
} else {
$query = "where employee = ? and date(travel_date) >= ? and date(return_date) <= ?;";
$params = array(
BaseService::getInstance()->getCurrentProfileId(),
$request['date_start'],
$request['date_end']
);
}
return array($query, $params);
}
}