Пример #1
0
 function setTimeStamp($epoch, $enable_rounding = TRUE)
 {
     $epoch = $original_epoch = trim($epoch);
     if ($enable_rounding == TRUE and $this->getTransfer() == FALSE) {
         $epoch = $this->roundTimeStamp($epoch);
     } else {
         Debug::text(' Rounding Disabled... ', __FILE__, __LINE__, __METHOD__, 10);
     }
     //Always round to one min, no matter what. Even on a transfer.
     $epoch = TTDate::roundTime($epoch, 60);
     if ($this->Validator->isDate('time_stamp', $epoch, TTi18n::gettext('Incorrect time stamp'))) {
         Debug::text(' Set: ' . $epoch, __FILE__, __LINE__, __METHOD__, 10);
         $this->data['time_stamp'] = $epoch;
         return TRUE;
     }
     return FALSE;
 }
Пример #2
0
 function Execute($php_cli = NULL, $dir = NULL)
 {
     global $config_vars;
     $lock_file = new LockFile($config_vars['cache']['dir'] . DIRECTORY_SEPARATOR . $this->getName() . '.lock');
     //Check job last updated date, if its more then 12hrs and its still in the "running" status,
     //chances are its an orphan. Change status.
     //if ( $this->getStatus() != 10 AND $this->getLastRunDate() < time()-(12*3600) ) {
     if ($this->getStatus() != 10 and $this->getUpdatedDate() > 0 and $this->getUpdatedDate() < time() - 6 * 3600) {
         Debug::text('ERROR: Job has been running for more then 6 hours! Asssuming its an orphan, marking as ready for next run.', __FILE__, __LINE__, __METHOD__, 10);
         $this->setStatus(10);
         $this->Save(FALSE);
         $lock_file->delete();
     }
     if (!is_executable($php_cli)) {
         Debug::text('ERROR: PHP CLI is not executable: ' . $php_cli, __FILE__, __LINE__, __METHOD__, 10);
         return FALSE;
     }
     if ($this->isSystemLoadValid() == FALSE) {
         Debug::text('System load is too high, skipping...', __FILE__, __LINE__, __METHOD__, 10);
         return FALSE;
     }
     //Cron script to execute
     $script = $dir . DIRECTORY_SEPARATOR . $this->getCommand();
     if ($this->getStatus() == 10 and $lock_file->exists() == FALSE) {
         $lock_file->create();
         $this->setExecuteFlag(TRUE);
         Debug::text('Job is NOT currently running, running now...', __FILE__, __LINE__, __METHOD__, 10);
         //Mark job as running
         $this->setStatus(20);
         //Running
         $this->Save(FALSE);
         //Even if the file does not exist, we still need to "pretend" the cron job ran (set last ran date) so we don't
         //display the big red error message saying that NO jobs have run in the last 24hrs.
         if (file_exists($script)) {
             $command = '"' . $php_cli . '" "' . $script . '"';
             //if ( OPERATING_SYSTEM == 'WIN' ) {
             //Windows requires quotes around the entire command, and each individual section with that might have spaces.
             //23-May-13: This seems to cause the command to fail now. Perhaps its related to newer versions of PHP?
             //$command = '"'. $command .'"';
             //}
             Debug::text('Command: ' . $command, __FILE__, __LINE__, __METHOD__, 10);
             $start_time = microtime(TRUE);
             exec($command, $output, $retcode);
             Debug::Arr($output, 'Time: ' . (microtime(TRUE) - $start_time) . 's - Command RetCode: ' . $retcode . ' Output: ', __FILE__, __LINE__, __METHOD__, 10);
             TTLog::addEntry($this->getId(), 500, TTi18n::getText('Executing Cron Job') . ': ' . $this->getID() . ' ' . TTi18n::getText('Command') . ': ' . $command . ' ' . TTi18n::getText('Return Code') . ': ' . $retcode, NULL, $this->getTable());
         } else {
             Debug::text('WARNING: File does not exist, skipping: ' . $script, __FILE__, __LINE__, __METHOD__, 10);
         }
         $this->setStatus(10);
         //Ready
         $this->setLastRunDate(TTDate::roundTime(time(), 60, 30));
         $this->Save(FALSE);
         $this->setExecuteFlag(FALSE);
         $lock_file->delete();
         return TRUE;
     } else {
         Debug::text('Job is currently running, skipping...', __FILE__, __LINE__, __METHOD__, 10);
     }
     return FALSE;
 }
 function setGrace($value)
 {
     $value = trim($value);
     if ($this->Validator->isNumeric('grace', $value, TTi18n::gettext('Incorrect grace value'))) {
         //If someone is using hour parse format ie: 0.12 we need to round to the nearest
         //minute other wise it'll be like 7mins and 23seconds messing up rounding.
         //$this->data['grace'] = $value;
         $this->data['grace'] = TTDate::roundTime($value, 60, 20);
         return TRUE;
     }
     return FALSE;
 }
Пример #4
0
 function getAverageTime($user_id)
 {
     $udtlf = TTnew('UserDateTotalListFactory');
     //Check if Min and Max time is the same, if so we can skip any averaging.
     if ($this->getHolidayPolicyObject()->getMinimumTime() > 0 and $this->getHolidayPolicyObject()->getMaximumTime() > 0 and $this->getHolidayPolicyObject()->getMinimumTime() == $this->getHolidayPolicyObject()->getMaximumTime()) {
         Debug::text('Min and Max times are equal.', __FILE__, __LINE__, __METHOD__, 10);
         return $this->getHolidayPolicyObject()->getMinimumTime();
     }
     if ($this->getHolidayPolicyObject()->getAverageTimeWorkedDays() == TRUE) {
         Debug::text('Using worked days only...', __FILE__, __LINE__, __METHOD__, 10);
         if ($this->getHolidayPolicyObject()->getIncludeOverTime() == TRUE) {
             $last_days_worked = (array) $udtlf->getDaysWorkedByUserIDAndStartDateAndEndDate($user_id, $this->getDateStamp() - $this->getHolidayPolicyObject()->getAverageTimeDays() * 86400, $this->getDateStamp() - 86400);
         } else {
             //Make sure if they aren't including overtime, we don't include days where they only worked overtime.
             $last_days_worked = (array) $udtlf->getDaysWorkedRegularTimeByUserIDAndStartDateAndEndDate($user_id, $this->getDateStamp() - $this->getHolidayPolicyObject()->getAverageTimeDays() * 86400, $this->getDateStamp() - 86400);
         }
         $paid_absence_before_days = array();
         if ($this->getHolidayPolicyObject()->getIncludePaidAbsenceTime() == TRUE) {
             $paid_absence_before_days = (array) $udtlf->getDaysPaidAbsenceByUserIDAndStartDateAndEndDate($user_id, $this->getDateStamp() - $this->getHolidayPolicyObject()->getAverageTimeDays() * 86400, $this->getDateStamp() - 86400);
             Debug::text('Employee has paid absence days prior: ' . count($paid_absence_before_days), __FILE__, __LINE__, __METHOD__, 10);
         }
         //Debug::Arr($last_days_worked, 'Last Days Worked: ', __FILE__, __LINE__, __METHOD__,10);
         $last_days_worked_count = count(array_unique(array_merge($last_days_worked, $paid_absence_before_days)));
         unset($last_days_worked, $paid_absence_before_days);
     } else {
         $last_days_worked_count = $this->getHolidayPolicyObject()->getAverageDays();
     }
     Debug::text('Average time over days:' . $last_days_worked_count, __FILE__, __LINE__, __METHOD__, 10);
     if ($this->getHolidayPolicyObject()->getIncludeOverTime() == TRUE) {
         Debug::text('Including OverTime!', __FILE__, __LINE__, __METHOD__, 10);
         $total_seconds_worked = $udtlf->getWorkedTimeSumByUserIDAndStartDateAndEndDate($user_id, $this->getDateStamp() - $this->getHolidayPolicyObject()->getAverageTimeDays() * 86400, $this->getDateStamp() - 86400);
     } else {
         Debug::text('NOT Including OverTime!', __FILE__, __LINE__, __METHOD__, 10);
         $total_seconds_worked = $udtlf->getRegularTimeSumByUserIDAndStartDateAndEndDate($user_id, $this->getDateStamp() - $this->getHolidayPolicyObject()->getAverageTimeDays() * 86400, $this->getDateStamp() - 86400);
     }
     if ($this->getHolidayPolicyObject()->getIncludePaidAbsenceTime() == TRUE) {
         //FIXME: How does this affect the number of days worked above?
         Debug::text('Including Paid Absence Time!', __FILE__, __LINE__, __METHOD__, 10);
         $total_seconds_worked += $udtlf->getPaidAbsenceTimeSumByUserIDAndStartDateAndEndDate($user_id, $this->getDateStamp() - $this->getHolidayPolicyObject()->getAverageTimeDays() * 86400, $this->getDateStamp() - 86400);
     } else {
         Debug::text('NOT Including Paid Absence Time!', __FILE__, __LINE__, __METHOD__, 10);
     }
     if ($last_days_worked_count > 0) {
         $avg_seconds_worked_per_day = bcdiv($total_seconds_worked, $last_days_worked_count);
         Debug::text('AVG hours worked per day:' . TTDate::getHours($avg_seconds_worked_per_day), __FILE__, __LINE__, __METHOD__, 10);
     } else {
         $avg_seconds_worked_per_day = 0;
     }
     if ($this->getHolidayPolicyObject()->getMaximumTime() > 0 and $avg_seconds_worked_per_day > $this->getHolidayPolicyObject()->getMaximumTime()) {
         $avg_seconds_worked_per_day = $this->getHolidayPolicyObject()->getMaximumTime();
         Debug::text('AVG hours worked per day exceeds maximum regulars hours per day, setting to:' . $avg_seconds_worked_per_day / 60 / 60, __FILE__, __LINE__, __METHOD__, 10);
     }
     if ($avg_seconds_worked_per_day < $this->getHolidayPolicyObject()->getMinimumTime()) {
         $avg_seconds_worked_per_day = $this->getHolidayPolicyObject()->getMinimumTime();
         Debug::text('AVG hours worked per day is less then minimum regulars hours per day, setting to:' . $avg_seconds_worked_per_day / 60 / 60, __FILE__, __LINE__, __METHOD__, 10);
     }
     //Round to nearest 15mins.
     if ((int) $this->getHolidayPolicyObject()->getRoundIntervalPolicyID() != 0 and is_object($this->getHolidayPolicyObject()->getRoundIntervalPolicyObject())) {
         $avg_seconds_worked_per_day = TTDate::roundTime($avg_seconds_worked_per_day, $this->getHolidayPolicyObject()->getRoundIntervalPolicyObject()->getInterval(), $this->getHolidayPolicyObject()->getRoundIntervalPolicyObject()->getRoundType());
         Debug::text('Rounding Stat Time To: ' . $avg_seconds_worked_per_day, __FILE__, __LINE__, __METHOD__, 10);
     } else {
         Debug::text('NOT Rounding Stat Time!', __FILE__, __LINE__, __METHOD__, 10);
     }
     return $avg_seconds_worked_per_day;
 }
Пример #5
0
 function test_roundTime()
 {
     //10 = Down
     //20 = Average
     //30 = Up
     //Test rounding down by 15minutes
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 8:06 AM'), 60 * 15, 10), strtotime('15-Apr-07 8:00 AM'));
     //Test rounding down by 5minutes
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 8:06 AM'), 60 * 5, 10), strtotime('15-Apr-07 8:05 AM'));
     //Test rounding down by 5minutes when no rounding should occur.
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 8:05 AM'), 60 * 5, 10), strtotime('15-Apr-07 8:05 AM'));
     //Test rounding down by 15minutes with 3minute grace.
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 4:58 PM'), 60 * 15, 10, 60 * 3), strtotime('15-Apr-07 5:00 PM'));
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 4:56 PM'), 60 * 15, 10, 60 * 3), strtotime('15-Apr-07 4:45 PM'));
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 5:11 PM'), 60 * 15, 10, 60 * 3), strtotime('15-Apr-07 5:00 PM'));
     //Test rounding down by 5minutes with 2minute grace
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 5:11 PM'), 60 * 5, 10, 60 * 2), strtotime('15-Apr-07 5:10 PM'));
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 5:07 PM'), 60 * 5, 10, 60 * 2), strtotime('15-Apr-07 5:05 PM'));
     //Test rounding avg by 15minutes
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 8:06 AM'), 60 * 15, 20), strtotime('15-Apr-07 8:00 AM'));
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 8:08 AM'), 60 * 15, 20), strtotime('15-Apr-07 8:15 AM'));
     //Test rounding avg by 5minutes
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 8:06 AM'), 60 * 5, 20), strtotime('15-Apr-07 8:05 AM'));
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 8:08 AM'), 60 * 5, 20), strtotime('15-Apr-07 8:10 AM'));
     //Test rounding avg by 5minutes when no rounding should occur.
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 8:05 AM'), 60 * 5, 20), strtotime('15-Apr-07 8:05 AM'));
     //Test rounding up by 15minutes
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 8:06 AM'), 60 * 15, 30), strtotime('15-Apr-07 8:15 AM'));
     //Test rounding up by 5minutes
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 8:06 AM'), 60 * 5, 30), strtotime('15-Apr-07 8:10 AM'));
     //Test rounding up by 5minutes when no rounding should occur.
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 8:05 AM'), 60 * 5, 30), strtotime('15-Apr-07 8:05 AM'));
     //Test rounding up by 15minutes with 3minute grace.
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 8:01 AM'), 60 * 15, 30, 60 * 3), strtotime('15-Apr-07 8:00 AM'));
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 8:04 AM'), 60 * 15, 30, 60 * 3), strtotime('15-Apr-07 8:15 AM'));
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 8:03 AM'), 60 * 15, 30, 60 * 3), strtotime('15-Apr-07 8:00 AM'));
     //Test rounding up by 5minutes with 2minute grace
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 8:03 AM'), 60 * 5, 30, 60 * 2), strtotime('15-Apr-07 8:05 AM'));
     $this->assertEquals((int) TTDate::roundTime(strtotime('15-Apr-07 8:01 AM'), 60 * 5, 30, 60 * 2), strtotime('15-Apr-07 8:00 AM'));
 }
 function getAverageTime($user_id)
 {
     $udtlf = new UserDateTotalListFactory();
     //Check if Min and Max time is the same, if so we can skip any averaging.
     if ($this->getHolidayPolicyObject()->getMinimumTime() > 0 and $this->getHolidayPolicyObject()->getMaximumTime() > 0 and $this->getHolidayPolicyObject()->getMinimumTime() == $this->getHolidayPolicyObject()->getMaximumTime()) {
         Debug::text('Min and Max times are equal.', __FILE__, __LINE__, __METHOD__, 10);
         return $this->getHolidayPolicyObject()->getMinimumTime();
     }
     if ($this->getHolidayPolicyObject()->getAverageTimeWorkedDays() == TRUE) {
         $last_days_worked_count = $udtlf->getDaysWorkedByUserIDAndStartDateAndEndDate($user_id, $this->getDateStamp() - $this->getHolidayPolicyObject()->getAverageTimeDays() * 86400, $this->getDateStamp() - 86400);
     } else {
         Debug::text('NOT Using worked days!', __FILE__, __LINE__, __METHOD__, 10);
         $last_days_worked_count = $this->getHolidayPolicyObject()->getAverageTimeDays();
     }
     Debug::text('Last Days Worked:' . $last_days_worked_count, __FILE__, __LINE__, __METHOD__, 10);
     if ($this->getHolidayPolicyObject()->getIncludeOverTime() == TRUE) {
         Debug::text('Including OverTime!', __FILE__, __LINE__, __METHOD__, 10);
         $total_seconds_worked = $udtlf->getWorkedTimeSumByUserIDAndStartDateAndEndDate($user_id, $this->getDateStamp() - $this->getHolidayPolicyObject()->getAverageTimeDays() * 86400, $this->getDateStamp() - 86400);
     } else {
         Debug::text('NOT Including OverTime!', __FILE__, __LINE__, __METHOD__, 10);
         $total_seconds_worked = $udtlf->getRegularTimeSumByUserIDAndStartDateAndEndDate($user_id, $this->getDateStamp() - $this->getHolidayPolicyObject()->getAverageTimeDays() * 86400, $this->getDateStamp() - 86400);
     }
     if ($this->getHolidayPolicyObject()->getIncludePaidAbsenceTime() == TRUE) {
         Debug::text('Including Paid Absence Time!', __FILE__, __LINE__, __METHOD__, 10);
         $total_seconds_worked += $udtlf->getPaidAbsenceTimeSumByUserIDAndStartDateAndEndDate($user_id, $this->getDateStamp() - $this->getHolidayPolicyObject()->getAverageTimeDays() * 86400, $this->getDateStamp() - 86400);
     } else {
         Debug::text('NOT Including Paid Absence Time!', __FILE__, __LINE__, __METHOD__, 10);
     }
     if ($last_days_worked_count > 0) {
         $avg_seconds_worked_per_day = bcdiv($total_seconds_worked, $last_days_worked_count);
         Debug::text('AVG hours worked per day:' . TTDate::getHours($avg_seconds_worked_per_day), __FILE__, __LINE__, __METHOD__, 10);
     } else {
         $avg_seconds_worked_per_day = 0;
     }
     if ($this->getHolidayPolicyObject()->getMaximumTime() > 0 and $avg_seconds_worked_per_day > $this->getHolidayPolicyObject()->getMaximumTime()) {
         $avg_seconds_worked_per_day = $this->getHolidayPolicyObject()->getMaximumTime();
         Debug::text('AVG hours worked per day exceeds maximum regulars hours per day, setting to:' . $avg_seconds_worked_per_day / 60 / 60, __FILE__, __LINE__, __METHOD__, 10);
     }
     if ($avg_seconds_worked_per_day < $this->getHolidayPolicyObject()->getMinimumTime()) {
         $avg_seconds_worked_per_day = $this->getHolidayPolicyObject()->getMinimumTime();
         Debug::text('AVG hours worked per day is less then minimum regulars hours per day, setting to:' . $avg_seconds_worked_per_day / 60 / 60, __FILE__, __LINE__, __METHOD__, 10);
     }
     //Round to nearest 15mins.
     if ((int) $this->getHolidayPolicyObject()->getRoundIntervalPolicyID() != 0 and is_object($this->getHolidayPolicyObject()->getRoundIntervalPolicyObject())) {
         $avg_seconds_worked_per_day = TTDate::roundTime($avg_seconds_worked_per_day, $this->getHolidayPolicyObject()->getRoundIntervalPolicyObject()->getInterval(), $this->getHolidayPolicyObject()->getRoundIntervalPolicyObject()->getRoundType());
         Debug::text('Rounding Stat Time To: ' . $avg_seconds_worked_per_day, __FILE__, __LINE__, __METHOD__, 10);
     } else {
         Debug::text('NOT Rounding Stat Time!', __FILE__, __LINE__, __METHOD__, 10);
     }
     return $avg_seconds_worked_per_day;
 }
 function getAccrualRatePerTimeFrequency($accrual_rate, $annual_pay_periods = NULL)
 {
     $retval = FALSE;
     switch ($this->getApplyFrequency()) {
         case 10:
             //Pay Period
             if ($annual_pay_periods == '') {
                 return FALSE;
             }
             $retval = bcdiv($accrual_rate, $annual_pay_periods, 0);
             break;
         case 20:
             //Year
             $retval = $accrual_rate;
             break;
         case 30:
             //Month
             $retval = bcdiv($accrual_rate, 12, 0);
             break;
         case 40:
             //Week
             $retval = bcdiv($accrual_rate, 52, 0);
             break;
     }
     //Round to nearest minute, or 15mins?
     $retval = TTDate::roundTime($retval, 60, 20);
     Debug::Text('Accrual Rate Per Frequency: ' . $retval . ' Accrual Rate: ' . $accrual_rate . ' Pay Periods: ' . $annual_pay_periods, __FILE__, __LINE__, __METHOD__, 10);
     return $retval;
 }
Пример #8
0
 function setTimeStamp($epoch, $enable_rounding = TRUE)
 {
     $epoch = $original_epoch = trim($epoch);
     //We can't disable rounding if its the first IN punch and no transfer actually needs to occur.
     //Have setTransfer check to see if there is a previous punch and if not, don't allow it to be set.
     if ($enable_rounding == TRUE and ($this->getTransfer() == FALSE or $this->getEnableAutoTransfer() == FALSE)) {
         $epoch = $this->roundTimeStamp($epoch);
     } else {
         Debug::text(' Rounding Disabled... ', __FILE__, __LINE__, __METHOD__, 10);
     }
     //Always round to one min, no matter what. Even on a transfer.
     $epoch = TTDate::roundTime($epoch, 60);
     if ($this->Validator->isDate('time_stamp', $epoch, TTi18n::gettext('Incorrect time stamp'))) {
         Debug::text(' Set: ' . $epoch, __FILE__, __LINE__, __METHOD__, 10);
         $this->data['time_stamp'] = $epoch;
         return TRUE;
     }
     return FALSE;
 }