📄 leave.php
字号:
*
* @return int
* @param String LeaveTypeId, [int status]
*
*/
public function countLeave($leaveTypeId, $year=null, $status=null) {
if ($year == null) {
$year = date('Y');
}
if ($status == null) {
$status = $this->statusLeaveTaken;
}
$totalLeaveLength = 0;
$leaveLengths = array($this->lengthFullDay, $this->lengthHalfDayAfternoon, $this->lengthHalfDayMorning);
$sqlBuilder = new SQLQBuilder();
$arrFields[0] = 'SUM(ABS(`leave_length_days`))';
$arrTable = "`hs_hr_leave`";
$selectConditions[1] = "`employee_id` = '".$this->getEmployeeId()."'";
$selectConditions[2] = "`leave_status` = ".$status;
$selectConditions[3] = "`leave_type_id` = '".$leaveTypeId."'";
$selectConditions[4] = "`leave_date` BETWEEN DATE('".$year."-01-01') AND DATE('".$year."-12-31')";
$query = $sqlBuilder->simpleSelect($arrTable, $arrFields, $selectConditions);
$dbConnection = new DMLFunctions();
$result = $dbConnection->executeQuery($query);
$count = mysql_fetch_row($result);
$totalLeaveLength = $count[0];
return $totalLeaveLength;
}
protected function _adjustLeaveLength() {
$timeOff = $this->_timeOffLength($this->getLeaveDate());
$shift = Leave::LEAVE_LENGTH_FULL_DAY;
$workShift = Workshift::getWorkshiftForEmployee($this->getEmployeeId());
if (isset($workShift)) {
$shift = $workShift->getHoursPerDay();
}
$hours=$shift;
$days=1;
if ($this->getLeaveLengthHours() != null) {
$hours = $this->getLeaveLengthHours() - ($timeOff * $shift);
$days = round(($hours/$shift), 2);
} else if ($this->getLeaveLengthDays() != null) {
$hours = ($this->getLeaveLengthDays() - $timeOff) * $shift;
$days = round(($hours/$shift), 2);
}
if (0 > $hours) {
$hours=0;
}
if (0 > $days) {
$days=0;
}
$this->setLeaveLengthHours($hours);
$this->setLeaveLengthDays($days);
}
/**
* Adds Leave
*
* @access protected
*/
protected function _addLeave() {
$this->leaveId = UniqueIDGenerator::getInstance()->getNextID('hs_hr_leave', 'leave_id');
$this->_getLeaveTypeName();
$this->setDateApplied(date('Y-m-d'));
$this->_adjustLeaveLength();
$insertFields[0] = '`leave_id`';
$insertFields[1] = '`leave_date`';
$insertFields[2] = '`leave_length_hours`';
$insertFields[3] = '`leave_length_days`';
$insertFields[4] = '`leave_status`';
$insertFields[5] = '`leave_comments`';
$insertFields[6] = '`leave_request_id`';
$insertFields[7] = '`leave_type_id`';
$insertFields[8] = '`employee_id`';
$arrRecordsList[0] = $this->getLeaveId();
$arrRecordsList[1] = "'". $this->getLeaveDate()."'";
$arrRecordsList[2] = "'". $this->getLeaveLengthHours()."'";
$arrRecordsList[3] = "'". $this->getLeaveLengthDays()."'";
$arrRecordsList[4] = $this->statusLeavePendingApproval;
$arrRecordsList[5] = "'".$this->getLeaveComments()."'";
$arrRecordsList[6] = "'". $this->getLeaveRequestId(). "'";
$arrRecordsList[7] = "'".$this->getLeaveTypeId()."'";
$arrRecordsList[8] = "'". $this->getEmployeeId() . "'";
if (($this->getStartTime() != null) && ($this->getEndTime() != null)) {
$insertFields[9] = '`start_time`';
$arrRecordsList[9] = "'". $this->getStartTime() . "'";
$insertFields[10] = '`end_time`';
$arrRecordsList[10] = "'". $this->getEndTime() . "'";
}
$arrTable = "`hs_hr_leave`";
$sqlBuilder = new SQLQBuilder();
$query = $sqlBuilder->simpleInsert($arrTable, $arrRecordsList, $insertFields);
$dbConnection = new DMLFunctions();
$result = $dbConnection -> executeQuery($query);
return $result;
}
/**
* function _changeLeaveStatus, access is private, will not be documented
*
* @access private
*/
protected function _changeLeaveStatus() {
$sqlBuilder = new SQLQBuilder();
$table = "`hs_hr_leave`";
$changeFields[0] = "`leave_status`";
$changeFields[1] = "`leave_comments`";
$changeValues[0] = $this->getLeaveStatus();
$changeValues[1] = "'".$this->getLeaveComments()."'";
$updateConditions[0] = "`leave_id` = ".$this->getLeaveId();
$query = $sqlBuilder->simpleUpdate($table, $changeFields, $changeValues, $updateConditions);
$dbConnection = new DMLFunctions();
$result = $dbConnection->executeQuery($query);
if (isset($result) && (mysql_affected_rows() > 0)) {
return true;
};
return false;
}
/**
*
* function _getLeaveTypeName, access is private, will not be documented
*
* @access private
*
*/
protected function _getLeaveTypeName() {
$sqlBuilder = new SQLQBuilder();
$leave_Type = new LeaveType();
$selectTable = "`hs_hr_leavetype`";
$selectFields[0] = '`leave_type_name`';
$updateConditions[1] = "`leave_type_id` = '".$this->getLeaveTypeId()."'";
$query = $sqlBuilder->simpleSelect($selectTable, $selectFields, $updateConditions, null, null, null);
//echo $query;
$dbConnection = new DMLFunctions();
$result = $dbConnection -> executeQuery($query);
$row = mysql_fetch_row($result);
$this->setLeaveTypeName($row[0]);
}
/**
* Calculates the time off for a particular date
*
* Return values:
* Eg: Returns 1 for full day off, 0.5 for half day off, 0 for no off time
*
* @param String $date
* @return integer $timeOff
*/
protected function _timeOffLength($date) {
$timeOff = 0;
if (isset($this->weekends[date('N', strtotime($date))-1])) {
$timeOff = $this->weekends[date('N', strtotime($date))-1]->getLength();
}
$holidaysObj = new Holidays();
$length = $holidaysObj->isHoliday($date);
if ($length > $timeOff) {
$timeOff = $length;
}
return $timeOff / 8;
}
/**
* Calculates required length of leave.
*
* @param integer $length - leave lenth
* @param integer $timeOff - time off for that day
* @return integer $reqiredLength - length of leave required.
*/
protected function _leaveLength($length, $timeOff) {
$factor = 1;
if ($length < 0) {
$factor = -1;
}
$length = abs($length);
if ($timeOff > $length) {
return 0;
}
$requiredLength = $length-$timeOff;
return $requiredLength*$factor;
}
/**
*
* function _buildObjArr, access is private, will not be documented
*
* @access protected
*/
protected function _buildObjArr($result, $supervisor=false) {
$objArr = null;
while ($row = mysql_fetch_assoc($result)) {
$tmpLeaveArr = new Leave();
$tmpLeaveArr->setLeaveDate($row['leave_date']);
$tmpLeaveArr->setLeaveStatus($row['leave_status']);
$leaveLengthHours = $row['leave_length_hours'];
$leaveLengthDays = $row['leave_length_days'];
$tmpLeaveArr->setLeaveLengthHours($leaveLengthHours);
$tmpLeaveArr->setLeaveLengthDays($leaveLengthDays);
$tmpLeaveArr->setLeaveComments($row['leave_comments']);
$tmpLeaveArr->setLeaveId($row['leave_id']);
if (isset($row['employee_id'])) {
$tmpLeaveArr->setEmployeeId($row['employee_id']);
}
if (isset($row['leave_type_name'])) {
$tmpLeaveArr->setLeaveTypeName($row['leave_type_name']);
}
if (isset($row['leave_type_id'])) {
$tmpLeaveArr->setLeaveTypeId($row['leave_type_id']);
}
if (isset($row['leave_request_id'])) {
$tmpLeaveArr->setLeaveRequestId($row['leave_request_id']);
}
if (!empty($row['start_time']) && !empty($row['start_time'])) {
$tmpLeaveArr->setStartTime(date("H:i", strtotime($row['start_time'])));
$tmpLeaveArr->setEndTime(date("H:i", strtotime($row['end_time'])));
}
if ($supervisor && isset($row['employee_id'])) {
$tmpLeaveArr->setEmployeeName("{$row['emp_firstname']} {$row['emp_lastname']}");
}
$objArr[] = $tmpLeaveArr;
}
return $objArr;
}
/**
* Retrieve the years where there are any leave records
* returns at least current year
*
* @return String[]
* @access public
*/
public function getLeaveYears() {
$sqlBuilder = new SQLQBuilder();
$selectTable = "`hs_hr_leave`";
$selectFields[] = "DISTINCT YEAR(`leave_date`) ";
$selectConditions[] = "`leave_date` < '".date('Y')."-01-01'";
$selectOrder = "ASC";
$selectOrderBy = "`leave_date`";
$query = $sqlBuilder->simpleSelect($selectTable, $selectFields, $selectConditions, $selectOrderBy, $selectOrder, 1);
$dbConnection = new DMLFunctions();
$result = $dbConnection -> executeQuery($query);
if ($row = mysql_fetch_row($result)) {
$firstYears = $row[0];
for ($i=$firstYears; $i<date('Y'); $i++) {
$years[] = $i;
}
}
$years[] = date('Y');
$years[] = date('Y')+1;
$years = array_unique($years);
rsort($years);
return $years;
}
/**
* Changes the leave status to taken if the date is before
* or on today
*
* @access public
*/
public function takeLeave() {
$sqlBuilder = new SQLQBuilder();
$selectFields[0] = '`leave_date`';
$selectFields[1] = '`leave_status`';
$selectFields[2] = '`leave_length_hours`';
$selectFields[3] = '`leave_length_days`';
$selectFields[4] = '`leave_comments`';
$selectFields[5] = '`leave_id`';
$selectFields[6] = '`employee_id`';
$selectFields[7] = '`leave_type_id`';
$selectTable = '`hs_hr_leave`';
$selectConditions[] = "`leave_status` = ".$this->statusLeaveApproved;
$selectConditions[] = "`leave_date` <= NOW()";
$query = $sqlBuilder->simpleSelect($selectTable, $selectFields, $selectConditions);
$dbConnection = new DMLFunctions();
$result = $dbConnection -> executeQuery($query);
if (isset($result) && !empty($result)) {
if (mysql_num_rows($result) > 0) {
$leaveObjs = $this->_buildObjArr($result);
foreach ($leaveObjs as $leaveObj) {
$leaveObj->setLeaveStatus(self::LEAVE_STATUS_LEAVE_TAKEN);
$leaveObj->changeLeaveToTaken();
$leaveObj->storeLeaveTaken();
}
return true;
}
}
return false;
}
/**
* This is the workhorse function for takeLeave() function.
* This needs to be publicly accessible, still this is expected
* to be called from takeLeave()
*
* @return boolean
*/
public function changeLeaveToTaken() {
$sqlBuilder = new SQLQBuilder();
$table = "`hs_hr_leave`";
$changeFields[0] = "`leave_status`";
$changeFields[1] = "`leave_length_hours`";
$changeValues[0] = $this->getLeaveStatus();
$changeValues[1] = "'".$this->getLeaveLengthHours()."'";
$updateConditions[0] = "`leave_id` = ".$this->getLeaveId();
$query = $sqlBuilder->simpleUpdate($table, $changeFields, $changeValues, $updateConditions);
$dbConnection = new DMLFunctions();
$result = $dbConnection->executeQuery($query);
if (isset($result) && (mysql_affected_rows() > 0)) {
return true;
};
return false;
}
public function storeLeaveTaken() {
$sqlBuilder = new SQLQBuilder();
$updateTable = '`hs_hr_employee_leave_quota`';
$updateFields[] = '`leave_taken`';
$updateValues[] = "`leave_taken`+{$this->getLeaveLengthDays()}";
$year = substr($this->getLeaveDate(), 0, 4); // To get the year from the date.
$updateConditions[] = "`year` = {$year}";
$updateConditions[] = "`leave_type_id` = '" . $this->getLeaveTypeId() . "'";
$updateConditions[] = "`employee_id` = {$this->getEmployeeId()}";
$query = $sqlBuilder->simpleUpdate($updateTable, $updateFields, $updateValues, $updateConditions, false);
$dbConnection = new DMLFunctions();
$result = $dbConnection->executeQuery($query);
if (isset($result) && (mysql_affected_rows() > 0)) {
return true;
};
return false;
}
/**
* This function will delete leave records for the given date. This will only for leave status other than 'taken'
* @param $date - string date for delete records
*/
public static function deleteLeavesForDate($date) {
$sql_builder = new SQLQBuilder();
$deleteTable = "`hs_hr_leave`";
$deleteConditions[] = "`leave_date` = '" . $date . "'";
$deleteConditions[] = "`leave_status` <> '" . self::LEAVE_STATUS_LEAVE_TAKEN . "'";
$query = $sql_builder->simpleDelete($deleteTable, $deleteConditions);
//echo $query."\n";
$dbConnection = new DMLFunctions();
$result = $dbConnection->executeQuery($query);
}
}
?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -