⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 leave.php

📁 国外的人才求职招聘最新版
💻 PHP
📖 第 1 页 / 共 2 页
字号:
<?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 + -