function setUserDate($user_id, $date) { $user_date_id = UserDateFactory::findOrInsertUserDate($user_id, $date); Debug::text(' User Date ID: ' . $user_date_id, __FILE__, __LINE__, __METHOD__, 10); if ($user_date_id != '') { $this->setUserDateID($user_date_id); return TRUE; } Debug::text(' No User Date ID found', __FILE__, __LINE__, __METHOD__, 10); return FALSE; }
} else { Debug::Text('Editing absence, absence policy changed, deleting old record ID: '. $udt_data['id'] , __FILE__, __LINE__, __METHOD__,10); $udtlf = TTnew( 'UserDateTotalListFactory' ); $udtlf->getById( $udt_data['id'] ); if ( $udtlf->getRecordCount() == 1 ) { $udt_obj = $udtlf->getCurrent(); $udt_obj->setDeleted(TRUE); if ( $udt_obj->isValid() ) { $udt_obj->Save(); } } unset($udtlf, $udt_obj); } */ } $udtf->setUserDateId(UserDateFactory::findOrInsertUserDate($udt_data['user_id'], $date_stamp)); $udtf->setStatus(30); //Absence $udtf->setType(10); //Total $udtf->setAbsencePolicyID($udt_data['absence_policy_id']); //Total if (isset($udt_data['branch_id'])) { $udtf->setBranch($udt_data['branch_id']); } if (isset($udt_data['department_id'])) { $udtf->setDepartment($udt_data['department_id']); } if (isset($udt_data['job_id'])) { $udtf->setJob($udt_data['job_id']); }
function postSave() { if ($this->getEnableTimeSheetVerificationCheck()) { //Check to see if schedule is verified, if so unverify it on modified punch. //Make sure exceptions are calculated *after* this so TimeSheet Not Verified exceptions can be triggered again. if (is_object($this->getUserDateObject()) and is_object($this->getUserDateObject()->getPayPeriodObject()) and is_object($this->getUserDateObject()->getPayPeriodObject()->getPayPeriodScheduleObject()) and $this->getUserDateObject()->getPayPeriodObject()->getPayPeriodScheduleObject()->getTimeSheetVerifyType() != 10) { //Find out if timesheet is verified or not. $pptsvlf = TTnew('PayPeriodTimeSheetVerifyListFactory'); $pptsvlf->getByPayPeriodIdAndUserId($this->getUserDateObject()->getPayPeriod(), $this->getUserDateObject()->getUser()); if ($pptsvlf->getRecordCount() > 0) { //Pay period is verified, delete all records and make log entry. //These can be added during the maintenance jobs, so the audit records are recorded as user_id=0, check those first. Debug::text('Pay Period is verified, deleting verification records: ' . $pptsvlf->getRecordCount() . ' User ID: ' . $this->getUserDateObject()->getUser() . ' Pay Period ID: ' . $this->getUserDateObject()->getPayPeriod(), __FILE__, __LINE__, __METHOD__, 10); foreach ($pptsvlf as $pptsv_obj) { TTLog::addEntry($pptsv_obj->getId(), 500, TTi18n::getText('Schedule Modified After Verification') . ': ' . UserListFactory::getFullNameById($this->getUserDateObject()->getUser()) . ' ' . TTi18n::getText('Schedule') . ': ' . TTDate::getDate('DATE', $this->getStartTime()), NULL, $pptsvlf->getTable()); $pptsv_obj->setDeleted(TRUE); if ($pptsv_obj->isValid()) { $pptsv_obj->Save(); } } } } } if ($this->getEnableReCalculateDay() == TRUE) { //Calculate total time. Mainly for docked. //Calculate entire week as Over Schedule (Weekly) OT policy needs to be reapplied if the schedule changes. if (is_object($this->getUserDateObject()) and $this->getUserDateObject()->getUser() > 0) { //When shifts are assigned to different days, we need to calculate both days the schedule touches, as the shift could be assigned to either of them. UserDateTotalFactory::smartReCalculate($this->getUserDateObject()->getUser(), array($this->getUserDateID(), $this->getOldUserDateID(), UserDateFactory::findOrInsertUserDate($this->getUserDateObject()->getUser(), $this->getStartTime()), UserDateFactory::findOrInsertUserDate($this->getUserDateObject()->getUser(), $this->getEndTime())), TRUE, FALSE); } } return TRUE; }
function createSchedule($user_id, $date_stamp, $data = NULL) { $sf = new ScheduleFactory(); $sf->setUserDateId(UserDateFactory::findOrInsertUserDate($user_id, $date_stamp)); if (isset($data['status_id'])) { $sf->setStatus($data['status_id']); } else { $sf->setStatus(10); } if (isset($data['schedule_policy_id'])) { $sf->setSchedulePolicyID($data['schedule_policy_id']); } if (isset($data['absence_policy_id'])) { $sf->setAbsencePolicyID($data['absence_policy_id']); } if (isset($data['branch_id'])) { $sf->setBranch($data['branch_id']); } if (isset($data['department_id'])) { $sf->setDepartment($data['department_id']); } if (isset($data['job_id'])) { $sf->setJob($data['job_id']); } if (isset($data['job_item_id'])) { $sf->setJobItem($data['job_item_id']); } if ($data['start_time'] != '') { $start_time = strtotime($data['start_time'], $date_stamp); } if ($data['end_time'] != '') { Debug::Text('End Time: ' . $data['end_time'] . ' Date Stamp: ' . $date_stamp, __FILE__, __LINE__, __METHOD__, 10); $end_time = strtotime($data['end_time'], $date_stamp); Debug::Text('bEnd Time: ' . $data['end_time'] . ' - ' . TTDate::getDate('DATE+TIME', $data['end_time']), __FILE__, __LINE__, __METHOD__, 10); } $sf->setStartTime($start_time); $sf->setEndTime($end_time); if ($sf->isValid()) { $sf->setEnableReCalculateDay(FALSE); $insert_id = $sf->Save(); Debug::Text('Schedule ID: ' . $insert_id, __FILE__, __LINE__, __METHOD__, 10); return $insert_id; } Debug::Text('Failed Creating Schedule!', __FILE__, __LINE__, __METHOD__, 10); return FALSE; }
foreach ($udtlf as $udt_obj) { $udt_obj->setDeleted($delete); if ($id_count == $i) { $udt_obj->setEnableCalcSystemTotalTime(TRUE); } $udt_obj->Save(); } $i++; } } Redirect::Page(URLBuilder::getURL(array('user_id' => $user_id, 'filter_date' => $filter_date), 'UserDateTotalList.php')); break; default: if ((!isset($user_date_id) or isset($user_date_id) and $user_date_id == '') and $user_id != '' and $filter_date != '') { Debug::Text('User Date ID not passed, inserting one.', __FILE__, __LINE__, __METHOD__, 10); $user_date_id = UserDateFactory::findOrInsertUserDate($user_id, $filter_date); } if ($user_date_id != '') { $udtlf = new UserDateTotalListFactory(); $udtlf->getByUserDateIDAndStatusAndType($user_date_id, array(10, 20, 30), array(10, 20, 30, 40, 100), $current_user_prefs->getItemsPerPage(), $page, NULL, $sort_array); $pager = new Pager($udtlf); $blf = new BranchListFactory(); $branch_options = $blf->getByCompanyIdArray($current_company->getId()); $dlf = new DepartmentListFactory(); $department_options = $dlf->getByCompanyIdArray($current_company->getId()); //Absence policies $otplf = new AbsencePolicyListFactory(); $absence_policy_options = $otplf->getByCompanyIDArray($current_company->getId(), TRUE); //Overtime policies $otplf = new OverTimePolicyListFactory(); $over_time_policy_options = $otplf->getByCompanyIDArray($current_company->getId(), TRUE);
if ($c_obj->getStatus() != 30) { $ppslf = new PayPeriodScheduleListFactory(); $ulf = new UserListFactory(); $ulf->getByCompanyId($c_obj->getId()); if ($ulf->getRecordCount() > 0) { $i = 0; foreach ($ulf as $u_obj) { if ($u_obj->getStatus() != 10) { continue; } Debug::text($i . '. User: '******'22-Jan-08'); UserDateFactory::findOrInsertUserDate($u_obj->getId(), TTDate::getBeginDayEpoch($epoch)); } $i++; } } } else { Debug::text('Company is not ACTIVE: ' . $c_obj->getId(), __FILE__, __LINE__, __METHOD__, 10); } } } Debug::writeToLog(); Debug::Display();
function getHolidayUserDateIDs() { Debug::text('reCalculating Holiday...', __FILE__, __LINE__, __METHOD__, 10); //Get Holiday policies and determine how many days we need to look ahead/behind in order //to recalculate the holiday eligilibility/time. $holiday_before_days = 0; $holiday_after_days = 0; if (is_object($this->getUserDateObject()) and is_object($this->getUserDateObject()->getUserObject())) { $hplf = TTnew('HolidayPolicyListFactory'); $hplf->getByCompanyId($this->getUserDateObject()->getUserObject()->getCompany()); if ($hplf->getRecordCount() > 0) { foreach ($hplf as $hp_obj) { if ($hp_obj->getMinimumWorkedPeriodDays() > $holiday_before_days) { $holiday_before_days = $hp_obj->getMinimumWorkedPeriodDays(); } if ($hp_obj->getAverageTimeDays() > $holiday_before_days) { $holiday_before_days = $hp_obj->getAverageTimeDays(); } if ($hp_obj->getMinimumWorkedAfterPeriodDays() > $holiday_after_days) { $holiday_after_days = $hp_obj->getMinimumWorkedAfterPeriodDays(); } } } } Debug::text('Holiday Before Days: ' . $holiday_before_days . ' Holiday After Days: ' . $holiday_after_days, __FILE__, __LINE__, __METHOD__, 10); if ($holiday_before_days > 0 or $holiday_after_days > 0) { $retarr = array(); $search_start_date = TTDate::getBeginWeekEpoch($this->getUserDateObject()->getDateStamp() - $holiday_after_days * 86400); $search_end_date = TTDate::getEndWeekEpoch(TTDate::getEndDayEpoch($this->getUserDateObject()->getDateStamp()) + $holiday_before_days * 86400 + 3601); Debug::text('Holiday search start date: ' . TTDate::getDate('DATE', $search_start_date) . ' End date: ' . TTDate::getDate('DATE', $search_end_date) . ' Current Date: ' . TTDate::getDate('DATE', $this->getUserDateObject()->getDateStamp()), __FILE__, __LINE__, __METHOD__, 10); $hlf = TTnew('HolidayListFactory'); //$hlf->getByPolicyGroupUserIdAndStartDateAndEndDate( $this->getUserDateObject()->getUser(), TTDate::getEndWeekEpoch( $this->getUserDateObject()->getDateStamp() )+86400, TTDate::getEndDayEpoch()+($max_average_time_days*86400)+3601 ); $hlf->getByPolicyGroupUserIdAndStartDateAndEndDate($this->getUserDateObject()->getUser(), $search_start_date, $search_end_date); if ($hlf->getRecordCount() > 0) { Debug::text('Found Holidays within range: ' . $hlf->getRecordCount(), __FILE__, __LINE__, __METHOD__, 10); $udlf = TTnew('UserDateListFactory'); foreach ($hlf as $h_obj) { Debug::text('ReCalculating Day due to Holiday: ' . TTDate::getDate('DATE', $h_obj->getDateStamp()), __FILE__, __LINE__, __METHOD__, 10); $user_date_ids = $udlf->getArrayByListFactory($udlf->getByUserIdAndDate($this->getUserDateObject()->getUser(), $h_obj->getDateStamp())); if ($user_date_ids == FALSE and TTDate::getBeginDayEpoch($h_obj->getDateStamp()) <= TTDate::getBeginDayEpoch(time())) { //This fixes a bug where if an employee was added after a holiday (ie: Sept 3rd after Labor day of Sept 2nd) //then had time added before the holiday, the holiday would not be calculated as no user_date record would exist. $user_date_ids = (array) UserDateFactory::findOrInsertUserDate($this->getUserDateObject()->getUser(), TTDate::getBeginDayEpoch($h_obj->getDateStamp())); Debug::Text('User Date ID for holiday doesnt exist, creating it now: ' . $user_date_ids[0], __FILE__, __LINE__, __METHOD__, 10); } if (is_array($user_date_ids)) { $retarr = array_merge($retarr, $user_date_ids); } unset($user_date_ids); } } } if (isset($retarr) and is_array($retarr) and count($retarr) > 0) { //Debug::Arr($retarr, 'bHoliday UserDateIDs: ', __FILE__, __LINE__, __METHOD__, 10); return $retarr; } Debug::text('No Holidays within range...', __FILE__, __LINE__, __METHOD__, 10); return FALSE; }
/** * ReCalculate timesheet/policies * @return bool */ function reCalculateTimeSheet($pay_period_ids, $user_ids = NULL) { //Debug::text('Recalculating Employee Timesheet: User ID: '. $user_ids .' Pay Period ID: '. $pay_period_ids, __FILE__, __LINE__, __METHOD__,10); //Debug::setVerbosity(11); if (!$this->getPermissionObject()->Check('punch', 'enabled') or !($this->getPermissionObject()->Check('punch', 'edit') or $this->getPermissionObject()->Check('punch', 'edit_child'))) { return $this->getPermissionObject()->PermissionDenied(); } //Make sure pay period is not CLOSED. //We can re-calc on locked though. $pplf = TTnew('PayPeriodListFactory'); $pplf->getByIdList($pay_period_ids); if ($pplf->getRecordCount() > 0) { $pp_obj = $pplf->getCurrent(); if ($pp_obj->getStatus() != 20) { $udlf = TTnew('UserDateListFactory'); if (is_array($user_ids) and count($user_ids) > 0 and isset($user_ids[0]) and $user_ids[0] > 0) { $udlf->getByUserIdAndPayPeriodID($user_ids, $pay_period_ids); } elseif ($this->getPermissionObject()->Check('punch', 'edit') == TRUE) { //Make sure they have the permissions to recalculate all employees. TTLog::addEntry($this->getCurrentCompanyObject()->getId(), TTi18n::gettext('Notice'), TTi18n::gettext('Recalculating Company TimeSheet'), $this->getCurrentUserObject()->getId(), 'user_date_total'); $udlf->getByCompanyIdAndPayPeriodID($this->getCurrentCompanyObject()->getId(), $pay_period_ids); } else { return $this->getPermissionObject()->PermissionDenied(); } if ($udlf->getRecordCount() > 0) { Debug::text('Found days to re-calculate: ' . $udlf->getRecordCount(), __FILE__, __LINE__, __METHOD__, 10); $this->getProgressBarObject()->start($this->getAMFMessageID(), $udlf->getRecordCount(), NULL, TTi18n::getText('ReCalculating...')); $x = 1; $prev_date_stamp = FALSE; foreach ($udlf as $ud_obj) { Debug::text($x . ' / ' . $udlf->getRecordCount() . ' - User Date Id: ' . $ud_obj->getId() . ' Date: ' . $ud_obj->getDateStamp(TRUE) . ' User ID: ' . $ud_obj->getUser(), __FILE__, __LINE__, __METHOD__, 10); if ($prev_date_stamp != FALSE and abs($ud_obj->getDateStamp() - $prev_date_stamp) > 86400) { Debug::text('Found gap between user_date rows! - User Date Id: ' . $ud_obj->getId() . ' Date: ' . $ud_obj->getDateStamp(TRUE) . ' Previous Date: ' . TTDate::getDate('DATE', $prev_date_stamp) . ' User ID: ' . $ud_obj->getUser(), __FILE__, __LINE__, __METHOD__, 10); for ($n = $prev_date_stamp; $n < $ud_obj->getDateStamp(); $n += 86400) { $tmp_user_date_id = UserDateFactory::findOrInsertUserDate($ud_obj->getUser(), TTDate::getBeginDayEpoch($n)); Debug::text('Filling gap in user_date rows! - Date: ' . TTDate::getDate('DATE', $n) . ' User ID: ' . $ud_obj->getUser() . ' New User Date ID: ' . $tmp_user_date_id, __FILE__, __LINE__, __METHOD__, 10); UserDateTotalFactory::reCalculateDay($tmp_user_date_id, TRUE); } unset($n, $tmp_user_date_id); } TTLog::addEntry($ud_obj->getId(), 500, TTi18n::gettext('Recalculating Employee TimeSheet') . ': ' . $ud_obj->getUserObject()->getFullName() . ' ' . TTi18n::gettext('Date') . ': ' . TTDate::getDate('DATE', $ud_obj->getDateStamp()), $this->getCurrentUserObject()->getId(), 'user_date_total'); $udlf->StartTransaction(); //If a transaction wraps the entire recalculation process, a deadlock is likely to occur for large batches. UserDateTotalFactory::reCalculateDay($ud_obj->getId(), TRUE); $udlf->CommitTransaction(); $this->getProgressBarObject()->set($this->getAMFMessageID(), $x); $prev_date_stamp = $ud_obj->getDateStamp(); $x++; } $this->getProgressBarObject()->stop($this->getAMFMessageID()); } else { Debug::text('No User Date rows to calculate!', __FILE__, __LINE__, __METHOD__, 10); } } else { Debug::text('Pay Period is CLOSED: ', __FILE__, __LINE__, __METHOD__, 10); } } return $this->returnHandler(TRUE); }