Files
icehrm/core/src/TimeSheets/User/Api/TimeSheetsActionManager.php
2018-04-29 17:46:42 +02:00

448 lines
16 KiB
PHP

<?php
/**
* Created by PhpStorm.
* User: Thilina
* Date: 8/20/17
* Time: 9:24 PM
*/
namespace TimeSheets\User\Api;
use Classes\BaseService;
use Classes\IceConstants;
use Classes\IceResponse;
use Classes\SettingsManager;
use Classes\SubActionManager;
use Employees\Common\Model\Employee;
use Leaves\Common\Model\HoliDay;
use Metadata\Common\Model\Country;
use Payroll\Common\Model\PayrollCalculations;
use Projects\Common\Model\Project;
use TimeSheets\Common\Model\EmployeeTimeEntry;
use TimeSheets\Common\Model\EmployeeTimeSheet;
use Utils\CalendarTools;
use Utils\LogManager;
class TimeSheetsActionManager extends SubActionManager
{
public function getTimeEntries($req)
{
$employee = $this->baseService->getElement('Employee', $this->getCurrentProfileId(), null, true);
$timeSheetEntry = new EmployeeTimeEntry();
$list = $timeSheetEntry->Find("timesheet = ? order by date_start", array($req->id));
$mappingStr = $req->sm;
$map = json_decode($mappingStr);
if (!$list) {
LogManager::getInstance()->info($timeSheetEntry->ErrorMsg());
}
if (!empty($mappingStr)) {
$list = $this->baseService->populateMapping($list, $map);
}
return new IceResponse(IceResponse::SUCCESS, $list);
}
public function changeTimeSheetStatus($req)
{
$employee = $this->baseService->getElement('Employee', $this->getCurrentProfileId(), null, true);
$subordinate = new Employee();
$subordinates = $subordinate->Find("supervisor = ?", array($employee->id));
$subordinatesIds = array();
foreach ($subordinates as $sub) {
$subordinatesIds[] = $sub->id;
}
$timeSheet = new EmployeeTimeSheet();
$timeSheet->Load("id = ?", array($req->id));
if ($timeSheet->id != $req->id) {
return new IceResponse(IceResponse::ERROR, "Timesheet not found");
}
if ($req->status == 'Submitted' && $employee->id == $timeSheet->employee) {
} elseif (!in_array($timeSheet->employee, $subordinatesIds) && $this->user->user_level != 'Admin') {
return new IceResponse(IceResponse::ERROR, "This Timesheet does not belong to any of your subordinates");
}
$oldStatus = $timeSheet->status;
$timeSheet->status = $req->status;
//Auto approve admin timesheets
if ($req->status == 'Submitted' && BaseService::getInstance()->getCurrentUser()->user_level == "Admin") {
$timeSheet->status = 'Approved';
}
if ($oldStatus == $req->status) {
return new IceResponse(IceResponse::SUCCESS, "");
}
$ok = $timeSheet->Save();
if (!$ok) {
LogManager::getInstance()->info($timeSheet->ErrorMsg());
}
$timeSheetEmployee = $this->baseService->getElement('Employee', $timeSheet->employee, null, true);
$this->baseService->audit(
IceConstants::AUDIT_ACTION,
"Timesheet [".$timeSheetEmployee->first_name." ".$timeSheetEmployee->last_name
." - ".date("M d, Y (l)", strtotime($timeSheet->date_start))." to "
.date("M d, Y (l)", strtotime($timeSheet->date_end))."] status changed from:"
.$oldStatus." to:".$req->status
);
if ($timeSheet->status == "Submitted" && $employee->id == $timeSheet->employee) {
$notificationMsg = $employee->first_name." ".$employee->last_name
." submitted timesheet from ".date("M d, Y (l)", strtotime($timeSheet->date_start))
." to ".date("M d, Y (l)", strtotime($timeSheet->date_end));
$this->baseService->notificationManager->addNotification(
$employee->supervisor,
$notificationMsg,
'{"type":"url","url":"g=modules&n=time_sheets&m=module_Time_Management#tabSubEmployeeTimeSheetAll"}',
IceConstants::NOTIFICATION_TIMESHEET
);
} elseif ($timeSheet->status == "Approved" || $timeSheet->status == "Rejected") {
$notificationMsg = $employee->first_name." ".$employee->last_name." ".$timeSheet->status
." timesheet from ".date("M d, Y (l)", strtotime($timeSheet->date_start))." to "
.date("M d, Y (l)", strtotime($timeSheet->date_end));
$this->baseService->notificationManager->addNotification(
$timeSheet->employee,
$notificationMsg,
'{"type":"url","url":"g=modules&n=time_sheets&m=module_Time_Management#tabEmployeeTimeSheetApproved"}',
IceConstants::NOTIFICATION_TIMESHEET
);
}
return new IceResponse(IceResponse::SUCCESS, "");
}
public function createPreviousTimesheet($req)
{
$employee = $this->baseService->getElement('Employee', $this->getCurrentProfileId(), null, true);
$timeSheet = new EmployeeTimeSheet();
$timeSheet->Load("id = ?", array($req->id));
if ($timeSheet->id != $req->id) {
return new IceResponse(IceResponse::ERROR, "Timesheet not found");
}
if ($timeSheet->employee != $employee->id) {
return new IceResponse(IceResponse::ERROR, "You don't have permissions to add this Timesheet");
}
$end = date("Y-m-d", strtotime("last Saturday", strtotime($timeSheet->date_start)));
$start = date("Y-m-d", strtotime("last Sunday", strtotime($end)));
$tempTimeSheet = new EmployeeTimeSheet();
$tempTimeSheet->Load("employee = ? and date_start = ?", array($employee->id, $start));
if ($employee->id == $tempTimeSheet->employee) {
return new IceResponse(IceResponse::ERROR, "Timesheet already exists");
}
$newTimeSheet = new EmployeeTimeSheet();
$newTimeSheet->employee = $employee->id;
$newTimeSheet->date_start = $start;
$newTimeSheet->date_end = $end;
$newTimeSheet->status = "Pending";
$ok = $newTimeSheet->Save();
if (!$ok) {
LogManager::getInstance()->info("Error creating time sheet : ".$newTimeSheet->ErrorMsg());
return new IceResponse(IceResponse::ERROR, "Error creating Timesheet");
}
return new IceResponse(IceResponse::SUCCESS, "");
}
public function getSubEmployeeTimeSheets($req)
{
$employee = $this->baseService->getElement('Employee', $this->getCurrentProfileId(), null, true);
$subordinate = new Employee();
$subordinates = $subordinate->Find("supervisor = ?", array($employee->id));
$subordinatesIds = "";
foreach ($subordinates as $sub) {
if ($subordinatesIds != "") {
$subordinatesIds.=",";
}
$subordinatesIds.=$sub->id;
}
$subordinatesIds.="";
$mappingStr = $req->sm;
$map = json_decode($mappingStr);
$timeSheet = new EmployeeTimeSheet();
$list = $timeSheet->Find("employee in (".$subordinatesIds.")", array());
if (!$list) {
LogManager::getInstance()->info($timeSheet->ErrorMsg());
}
if (!empty($mappingStr)) {
$list = $this->baseService->populateMapping($list, $map);
}
return new IceResponse(IceResponse::SUCCESS, $list);
}
public function getEmployeeTimeEntries($req)
{
$req->start = strtotime($req->start);
$req->end = strtotime($req->end);
$employee = $this->baseService->getElement('Employee', $req->e, null, true);
$currEmployee = $employee->id;
$timeEntry = new EmployeeTimeEntry();
$startDate = date("Y-m-d H:i:s", $req->start);
$endDate = date("Y-m-d H:i:s", $req->end);
$list = $timeEntry->Find(
"employee = ? and ((date_start >= ? and date_start <= ? ) or (date_end >= ? and date_end <= ?))",
array($currEmployee, $startDate,$endDate,$startDate,$endDate)
);
if (!$list) {
LogManager::getInstance()->info($timeEntry->ErrorMsg());
}
$map = json_decode('{"employee":["Employee","id","first_name+last_name"]}');
$list = $this->baseService->populateMapping($list, $map);
$data = array();
foreach ($list as $leave) {
$data[] = $this->workScheduleToEvent($leave);
}
$holiday = new HoliDay();
$holidays = $holiday->Find("1=1", array());
foreach ($holidays as $holiday) {
$data[] = $this->holidayToEvent($holiday);
}
echo json_encode($data);
exit();
}
public function workScheduleToEvent($schedule)
{
$event = array();
$event['id'] = $schedule->id;
$event['start'] = $schedule->date_start."+00:00";
$event['end'] = $schedule->date_end."+00:00";
$diff = CalendarTools::getTimeDiffInHours($schedule->date_start, $schedule->date_end);
if (!empty($schedule->project)) {
$project = new Project();
$project->Load("id = ?", array($schedule->project));
$event['title'] = $diff . " h - ".$project->name;
} else {
$event['title'] = $diff . ' h';
}
$eventBackgroundColor = "#FFF";
$event['color'] = $eventBackgroundColor;
$event['backgroundColor'] = $eventBackgroundColor;
$event['textColor'] = "#0a69b7";
$schedule = BaseService::getInstance()->cleanUpAdoDB($schedule);
unset($schedule->keysToIgnore);
$event['event'] = json_encode($schedule);
return $event;
}
public function holidayToEvent($holiday)
{
$event = array();
$event['id'] = "hd_".$holiday->id;
if ($holiday->status == "Full Day") {
$event['title'] = $holiday->name;
} else {
$event['title'] = $holiday->name." (".$holiday->status.")";
}
if (!empty($holiday->country)) {
$country = new Country();
$country->Load("id = ?", array($holiday->country));
$event['title'] .=" / ".$country->name." only";
}
$event['start'] = $holiday->dateh;
$event['end'] = $holiday->dateh;
$eventBackgroundColor = "#3c8dbc";
$event['color'] = $eventBackgroundColor;
$event['backgroundColor'] = $eventBackgroundColor;
$event['textColor'] = "#FFF";
return $event;
}
public function getAllData($req)
{
$timeSheet = new EmployeeTimeSheet();
$timeSheet->Load("id = ?", array($req->currentId));
$cal = new PayrollCalculations();
$rowTable = BaseService::getInstance()->getFullQualifiedModelClassName($req->rowTable);
$columnTable = BaseService::getInstance()->getFullQualifiedModelClassName($req->columnTable);
$valueTable = $req->valueTable;
$save = $req->save;
$project = new $rowTable();
if (SettingsManager::getInstance()->getSetting("Projects: Make All Projects Available to Employees") == "1") {
$projectList = $project->Find("1 = 1");
} else {
$projectList = $project->Find(
"id in (select project from EmployeeProjects where employee = ?)",
array(BaseService::getInstance()->getCurrentProfileId())
);
}
$projects = array();
foreach ($projectList as $project) {
$p = new \stdClass();
$p->id = $project->id;
$p->name = $project->name;
$projects[] = $p;
}
//Add total
$p = new \stdClass();
$p->id = -1;
$p->name = "Total";
$projects[] = $p;
$column = new $columnTable();
$columns = [];
$days = CalendarTools::getDaysBetweenDates($timeSheet->date_start, $timeSheet->date_end);
foreach ($days as $dayObj) {
$day = new \stdClass();
$day->id = $dayObj->format('Y-m-d');
$day->name = $dayObj->format("(D) d M");
if ($timeSheet->status == 'Approved') {
$day->editable = 'No';
} else {
$day->editable = 'Yes';
}
$day->default_value = '0.00';
$columns[] = $day;
}
$timeEntry = new EmployeeTimeEntry();
$timeEntries = $timeEntry->Find("timesheet = ?", array($timeSheet->id));
$dateTotals = array();
//Build value map
$valueMap = array();
foreach ($timeEntries as $val) {
$date = explode(" ", $val->date_start)[0];
if (!isset($valueMap[$val->project])) {
$valueMap[$val->project] = array();
}
if (!isset($valueMap[$val->project][$date])) {
$val->date = $date;
$val->amount = floatval(CalendarTools::getTimeDiffInHours($val->date_start, $val->date_end));
$valueMap[$val->project][$date] = $val;
if (!isset($dateTotals[$date])) {
$dval = new \stdClass();
$dval->project = -1;
$dval->date = $date;
$dval->amount = 0;
$dateTotals[$date] = $dval;
}
$dateTotals[$date]->amount = $dateTotals[$date]->amount + floatval($val->amount);
}
}
$values = array();
foreach ($valueMap as $key => $val) {
$values = array_merge($values, array_values($val));
}
if ($save == "1") {
foreach ($values as $value) {
if (empty($value->id)) {
$value->Save();
}
}
}
$values = array_merge($values, array_values($dateTotals));
return new IceResponse(IceResponse::SUCCESS, array($projects,$columns,$values));
}
public function updateAllData($req)
{
$resp = $this->updateData($req);
if ($resp->getStatus() == IceResponse::SUCCESS) {
$timesheet = new EmployeeTimeSheet();
$timesheet->Load("id = ?", array($req->currentId));
$req->id = $timesheet->id;
$req->status = 'Submitted';
$this->changeTimeSheetStatus($req);
}
return $resp;
}
public function updateData($req)
{
$timesheet = new EmployeeTimeSheet();
$timesheet->Load("id = ?", array($req->currentId));
if (empty($timesheet->id)) {
return new IceResponse(IceResponse::ERROR, true);
}
if ($timesheet->status == 'Submitted') {
return new IceResponse(IceResponse::ERROR, true);
}
foreach ($req as $key => $val) {
if (!is_array($val) || $val[1].'' == '-1') {
continue;
}
$data = new EmployeeTimeEntry();
$data->Load(
"project = ? and timesheet = ? and date(date_start) = ?",
array($val[1],$req->currentId, $val[0])
);
if (empty($data->id)) {
$data->project = $val[1];
$data->employee = $timesheet->employee;
$data->details = '';
$data->created = date('Y-m-d H:i:s');
$data->status = 'Active';
$data->timesheet = $req->currentId;
}
$time = floatval($val[2]) * 60 * 60;
$data->date_start = $val[0].' 00:00:00';
$data->time_start = '00:00:00';
$data->date_end = date('Y-m-d H:i:s', strtotime($data->date_start) + $time);
$data->time_end = date('H:i:s', strtotime($data->date_end));
$ok = $data->Save();
if (!$ok) {
LogManager::getInstance()->error("Error saving payroll data:".$data->ErrorMsg());
}
}
return new IceResponse(IceResponse::SUCCESS, true);
}
}