📄 leave.php
字号:
<?php
/**
* OrangeHRM is a comprehensive Human Resource Management (HRM) System that captures
* all the essential functionalities required for any enterprise.
* Copyright (C) 2006 OrangeHRM Inc., http://www.orangehrm.com
*
* OrangeHRM is free software; you can redistribute it and/or modify it under the terms of
* the GNU General Public License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* OrangeHRM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program;
* if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA
*
*/
require_once ROOT_PATH . '/lib/dao/DMLFunctions.php';
require_once ROOT_PATH . '/lib/dao/SQLQBuilder.php';
require_once ROOT_PATH . '/lib/models/leave/LeaveType.php';
require_once ROOT_PATH . '/lib/models/leave/Holidays.php';
require_once ROOT_PATH . '/lib/models/leave/Weekends.php';
require_once ROOT_PATH . '/lib/models/time/Workshift.php';
require_once ROOT_PATH . '/lib/common/UniqueIDGenerator.php';
/**
* Leave Class
*
* This class handles taking/request/approve of leave, and list leaves
*
*/
class Leave {
/**
* Leave Status Constants
*
*/
const LEAVE_LENGTH_FULL_DAY = 8;
const LEAVE_LENGTH_HALF_DAY_MORNING = -4;
const LEAVE_LENGTH_HALF_DAY_AFTERNOON = 4;
const LEAVE_LENGTH_HALF_DAY = 4;
const LEAVE_STATUS_LEAVE_REJECTED = -1;
const LEAVE_STATUS_LEAVE_CANCELLED = 0;
const LEAVE_STATUS_LEAVE_PENDING_APPROVAL = 1;
const LEAVE_STATUS_LEAVE_APPROVED = 2;
const LEAVE_STATUS_LEAVE_TAKEN = 3;
public $statusLeaveRejected = -1;
public $statusLeaveCancelled = 0;
public $statusLeavePendingApproval = 1;
public $statusLeaveApproved = 2;
public $statusLeaveTaken = 3;
/**
* Leave Length Constants
*
*/
public $lengthFullDay = 8;
public $lengthHalfDayMorning = -4;
public $lengthHalfDayAfternoon = 4;
/**
* Class Attributes
*
*/
private $leaveId;
private $leaveRequestId;
private $employeeId;
private $leaveTypeId;
private $leaveTypeName;
private $dateApplied;
private $leaveDate;
private $leaveLengthHours;
private $leaveLengthDays;
private $leaveStatus;
private $leaveComments;
private $employeeName;
private $startTime;
private $endTime;
protected $weekends;
/**
* Class Constructor
*
*/
public function __construct() {
$weekendObj = new Weekends();
$this->weekends = $weekendObj->fetchWeek();
}
/**
* Setter method followed by getter method for each
* attribute
*
*/
public function setLeaveId($leaveId) {
$this->leaveId = $leaveId;
}
public function getLeaveId() {
return $this->leaveId;
}
public function setLeaveRequestId($leaveId) {
$this->leaveRequestId = $leaveId;
}
public function getLeaveRequestId() {
return $this->leaveRequestId;
}
public function setEmployeeId($employeeId) {
$this->employeeId = $employeeId;
}
public function getEmployeeId() {
return $this->employeeId;
}
public function setLeaveTypeId($leaveTypeId) {
$this->leaveTypeId = $leaveTypeId;
}
public function getLeaveTypeId() {
return $this->leaveTypeId;
}
public function setLeaveTypeName($leaveTypeName) {
$this->leaveTypeName = $leaveTypeName;
}
public function getLeaveTypeName() {
return $this->leaveTypeName;
}
public function setDateApplied($dateApplied) {
$this->dateApplied = $dateApplied;
}
public function getDateApplied() {
return $this->dateApplied;
}
public function setLeaveDate($leaveDate) {
$this->leaveDate = $leaveDate;
}
public function getLeaveDate() {
return $this->leaveDate;
}
public function setLeaveLengthHours($leaveLengthHours) {
$this->leaveLengthHours = $leaveLengthHours;
}
public function getLeaveLengthHours() {
return $this->leaveLengthHours;
}
public function setLeaveLengthDays($leaveLengthDays) {
$this->leaveLengthDays = $leaveLengthDays;
}
public function getLeaveLengthDays() {
return $this->leaveLengthDays;
}
public function setLeaveStatus($leaveStatus) {
$this->leaveStatus = $leaveStatus;
}
public function getLeaveStatus() {
return $this->leaveStatus;
}
public function setLeaveComments($leaveComments) {
$this->leaveComments = $leaveComments;
}
public function getLeaveComments() {
return $this->leaveComments;
}
public function setStartTime($startTime) {
$this->startTime = $startTime;
}
public function getStartTime() {
return $this->startTime;
}
public function setEndTime($endTime) {
$this->endTime = $endTime;
}
public function getEndTime() {
return $this->endTime;
}
public function setEmployeeName($employeeName) {
$this->employeeName = $employeeName;
}
public function getEmployeeName() {
return $this->employeeName;
}
/**
* Retrieves leave taken for supervisors and
* HRAdmin
*
* @param String $year, String $employeeId
* @return Leave[][] $leaveArr A 2D array of the leaves
*/
public function retrieveTakenLeave($year, $employeeId) {
$this->setEmployeeId($employeeId);
$sqlBuilder = new SQLQBuilder();
$arrFields[0] = 'a.`leave_date`';
$arrFields[1] = 'a.`leave_status`';
$arrFields[2] = 'a.`leave_length_hours`';
$arrFields[3] = 'a.`leave_length_days`';
$arrFields[4] = 'a.`leave_comments`';
$arrFields[5] = 'a.`leave_id`';
$arrFields[6] = 'd.`emp_firstname`';
$arrFields[7] = 'd.`emp_lastname`';
$arrFields[8] = 'a.`employee_id`';
$arrFields[9] = 'b.`leave_type_name` as leave_type_name';
$arrFields[10] = 'a.`start_time`';
$arrFields[11] = 'a.`end_time`';
$arrTables[0] = "`hs_hr_leave` a";
$arrTables[1] = "`hs_hr_employee` d";
$arrTables[2] = "`hs_hr_leave_requests` b";
$joinConditions[1] = "a.`employee_id` = d.`emp_number`";
$joinConditions[2] = "a.`leave_request_id` = b.`leave_request_id`";
$selectConditions[1] = "a.`employee_id` = '".$employeeId."'";
$selectConditions[2] = "a.`leave_status` = ".$this->statusLeaveTaken;
$selectConditions[3] = "a.`leave_date` >= '".$year."-01-01'";
$query = $sqlBuilder->selectFromMultipleTable($arrFields, $arrTables, $joinConditions, $selectConditions);
$dbConnection = new DMLFunctions();
$result = $dbConnection -> executeQuery($query);
$leaveArr = $this->_buildObjArr($result, true);
return $leaveArr;
}
public function retrieveLeave($requestId) {
$this->setLeaveRequestId($requestId);
$sqlBuilder = new SQLQBuilder();
$arrFields[0] = 'a.`leave_date` as leave_date';
$arrFields[1] = 'a.`leave_status` as leave_status';
$arrFields[2] = 'a.`leave_length_hours` as leave_length_hours';
$arrFields[3] = 'a.`leave_length_days` as leave_length_days';
$arrFields[4] = 'a.`leave_comments` as leave_comments';
$arrFields[5] = 'a.`leave_id` as leave_id';
$arrFields[6] = 'b.`leave_type_name` as leave_type_name';
$arrFields[7] = 'c.`emp_firstname` as emp_firstname';
$arrFields[8] = 'c.`emp_lastname` as emp_lastname';
$arrFields[9] = 'a.`employee_id` as employee_id';
$arrFields[10] = 'a.`leave_request_id` as leave_request_id';
$arrFields[11] = 'a.`start_time` as start_time';
$arrFields[12] = 'a.`end_time` as end_time';
$arrTables[0] = "`hs_hr_leave` a";
$arrTables[1] = "`hs_hr_leave_requests` b";
$arrTables[2] = "`hs_hr_employee` c";
$selectConditions[1] = "a.`leave_request_id` = '".$requestId."'";
$joinConditions[1] = "a.`leave_request_id` = b.`leave_request_id`";
$joinConditions[2] = "a.`employee_id` = c.`emp_number`";
$query = $sqlBuilder->selectFromMultipleTable($arrFields, $arrTables, $joinConditions, $selectConditions);
$dbConnection = new DMLFunctions();
$result = $dbConnection->executeQuery($query);
$leaveArr = $this->_buildObjArr($result, true);
return $leaveArr;
}
/**
* Retrieves Leave Details of all leave that have been applied for but
* not yet taken of the employee.
*
* @return Leave[][] $leaveArr A 2D array of the leaves
*/
public function retrieveLeaveEmployee($employeeId) {
$sqlBuilder = new SQLQBuilder();
$arrFields[0] = '`leave_date`';
$arrFields[1] = '`leave_status`';
$arrFields[2] = '`leave_length_hours`';
$arrFields[3] = '`leave_length_days`';
$arrFields[4] = '`leave_comments`';
$arrFields[5] = '`leave_id`';
$arrFields[6] = '`start_time`';
$arrFields[7] = '`end_time`';
$arrTable = "`hs_hr_leave`";
$selectConditions[1] = "`employee_id` = '".$employeeId."'";
$selectConditions[2] = "`leave_date` >= '".date('Y')."-01-01'";
$query = $sqlBuilder->simpleSelect($arrTable, $arrFields, $selectConditions, $arrFields[0], 'ASC');
$dbConnection = new DMLFunctions();
$result = $dbConnection -> executeQuery($query);
$leaveArr = $this->_buildObjArr($result);
return $leaveArr;
}
public function retrieveIndividualLeave($leaveId) {
$sqlBuilder = new SQLQBuilder();
$arrFields[0] = '`leave_date`';
$arrFields[1] = '`leave_status`';
$arrFields[2] = '`leave_length_hours`';
$arrFields[3] = '`leave_length_days`';
$arrFields[4] = '`leave_comments`';
$arrFields[5] = '`leave_id`';
$arrFields[6] = '`start_time`';
$arrFields[7] = '`end_time`';
$arrFields[8] = '`leave_request_id`';
$arrFields[9] = 'a.`leave_type_id`';
$arrFields[10] = '`employee_id`';
$arrFields[11] = '`leave_type_name`';
$arrTables[0] = "`hs_hr_leave` a";
$arrTables[1] = "`hs_hr_leavetype` b";
$joinConditions[1] = "a.`leave_type_id` = b.`leave_type_id`";
$selectConditions[1] = "`leave_id` = '".$leaveId."'";
$query = $sqlBuilder->selectFromMultipleTable($arrFields, $arrTables, $joinConditions, $selectConditions);
$dbConnection = new DMLFunctions();
$result = $dbConnection -> executeQuery($query);
$leaveArr = $this->_buildObjArr($result);
return $leaveArr;
}
/**
* Retrieves leave for the given employee between the given two dates.
* If the given dates are the same and startTime and endTime are given
* looks for leave on that date between the given times.
*
*
*/
public function retrieveDuplicateLeave($employeeNum, $fromDate, $toDate) {
$sqlBuilder = new SQLQBuilder();
$arrFields[0] = 'a.`leave_id`';
$arrFields[1] = 'a.`leave_date`';
$arrFields[2] = 'a.`leave_length_hours`';
$arrFields[3] = 'a.`leave_length_days`';
$arrFields[4] = 'a.`leave_status`';
$arrFields[5] = 'a.`leave_comments`';
$arrFields[6] = 'a.`leave_request_id`';
$arrFields[7] = 'a.`leave_type_id`';
$arrFields[8] = 'a.`employee_id`';
$arrFields[9] = 'a.`start_time`';
$arrFields[10] = 'a.`end_time`';
$arrFields[11] = 'b.`leave_type_name`';
$arrFields[12] = 'c.`emp_firstname`';
$arrFields[13] = 'c.`emp_lastname`';
$arrTable = "`hs_hr_leave`";
$arrTables[0] = "`hs_hr_leave` a";
$arrTables[1] = "`hs_hr_leavetype` b";
$arrTables[2] = "`hs_hr_employee` c";
$joinConditions[1] = "a.`leave_type_id` = b.`leave_type_id`";
$joinConditions[2] = "a.`employee_id` = c.`emp_number`";
$dbConnection = new DMLFunctions();
$selectConditions[1] = "a.`employee_id` = '". mysql_real_escape_string($employeeNum) . "'";
$selectConditions[2] = "a.`leave_date` >='". mysql_real_escape_string($fromDate) . "'";
$selectConditions[3] = "a.`leave_date` <='". mysql_real_escape_string($toDate) . "'";
$selectConditions[4] = "a.`leave_status` <>'". self::LEAVE_STATUS_LEAVE_CANCELLED . "'";
$query = $sqlBuilder->selectFromMultipleTable($arrFields, $arrTables, $joinConditions, $selectConditions);
$result = $dbConnection->executeQuery($query);
$leaveArr = $this->_buildObjArr($result, true);
return $leaveArr;
}
/**
* Add Leave record to for a employee.
*
* @access public
* @return void
*/
public function applyLeave() {
$this->_addLeave();
}
public function cancelLeave($id = null) {
return $this->changeLeaveStatus($id);
}
public function changeLeaveStatus($id = null) {
if (isset($id)) {
$this->setLeaveId($id);
}
$leaveObjs = $this->retrieveIndividualLeave($this->leaveId);
if (!isset($leaveObjs)) {
return false;
}
$leave = $leaveObjs[0];
$newStatus = $this->getLeaveStatus();
/** Check if no change */
if ($newStatus == $leave->getLeaveStatus()) {
return false;
}
$taken = ($leave->getLeaveStatus() == self::LEAVE_STATUS_LEAVE_TAKEN);
$this->setLeaveStatus($newStatus);
$res = $this->_changeLeaveStatus();
if ($res && $taken) {
$this->setLeaveTypeId($leave->getLeaveTypeId());
$this->setLeaveDate($leave->getLeaveDate());
$this->setLeaveLengthDays($leave->leaveLengthDays*-1);
$this->setLeaveLengthHours($leave->leaveLengthHours*-1);
$res = $this->storeLeaveTaken();
}
return $res;
}
/**
* Counts Leaves taken of particular Leave type
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -