function setOverTimePolicy($id) { $id = trim($id); $otplf = new OverTimePolicyListFactory(); if ($id == 0 or $this->Validator->isResultSetWithRows('over_time_policy', $otplf->getByID($id), TTi18n::gettext('Selected Overtime Policy is invalid'))) { $this->data['over_time_policy_id'] = $id; return TRUE; } return FALSE; }
} $pgf->FailTransaction(); default: if (isset($id)) { BreadCrumb::setCrumb($title); $pglf = new PolicyGroupListFactory(); $pglf->getByIdAndCompanyID($id, $current_company->getID()); foreach ($pglf as $pg_obj) { //Debug::Arr($station,'Department', __FILE__, __LINE__, __METHOD__,10); $data = array('id' => $pg_obj->getId(), 'name' => $pg_obj->getName(), 'meal_policy_ids' => $pg_obj->getMealPolicy(), 'break_policy_ids' => $pg_obj->getBreakPolicy(), 'holiday_policy_ids' => $pg_obj->getHolidayPolicy(), 'exception_policy_control_id' => $pg_obj->getExceptionPolicyControlID(), 'user_ids' => $pg_obj->getUser(), 'over_time_policy_ids' => $pg_obj->getOverTimePolicy(), 'premium_policy_ids' => $pg_obj->getPremiumPolicy(), 'round_interval_policy_ids' => $pg_obj->getRoundIntervalPolicy(), 'accrual_policy_ids' => $pg_obj->getAccrualPolicy(), 'created_date' => $pg_obj->getCreatedDate(), 'created_by' => $pg_obj->getCreatedBy(), 'updated_date' => $pg_obj->getUpdatedDate(), 'updated_by' => $pg_obj->getUpdatedBy(), 'deleted_date' => $pg_obj->getDeletedDate(), 'deleted_by' => $pg_obj->getDeletedBy()); } } $none_array_option = array('0' => TTi18n::gettext('-- None --')); $ulf = new UserListFactory(); $user_options = $ulf->getByCompanyIDArray($current_company->getId(), FALSE, TRUE); $otplf = new OverTimePolicyListFactory(); $over_time_policy_options = Misc::prependArray($none_array_option, $otplf->getByCompanyIDArray($current_company->getId(), FALSE)); $pplf = new PremiumPolicyListFactory(); $premium_policy_options = Misc::prependArray($none_array_option, $pplf->getByCompanyIDArray($current_company->getId(), FALSE)); $riplf = new RoundIntervalPolicyListFactory(); $round_interval_policy_options = Misc::prependArray($none_array_option, $riplf->getByCompanyIDArray($current_company->getId(), FALSE)); $mplf = new MealPolicyListFactory(); $meal_options = Misc::prependArray($none_array_option, $mplf->getByCompanyIdArray($current_company->getId(), FALSE)); $bplf = new BreakPolicyListFactory(); $break_options = Misc::prependArray($none_array_option, $bplf->getByCompanyIdArray($current_company->getId(), FALSE)); $epclf = new ExceptionPolicyControlListFactory(); $exception_options = Misc::prependArray($none_array_option, $epclf->getByCompanyIdArray($current_company->getId(), FALSE)); $hplf = new HolidayPolicyListFactory(); $holiday_policy_options = Misc::prependArray($none_array_option, $hplf->getByCompanyIdArray($current_company->getId(), FALSE)); $aplf = new AccrualPolicyListFactory(); $aplf->getByCompanyIdAndTypeID($current_company->getId(), array(20, 30));
//$otpf->setLevel( $data['level'] ); $otpf->setTriggerTime($data['trigger_time']); $otpf->setRate($data['rate']); $otpf->setWageGroup($data['wage_group_id']); $otpf->setAccrualPolicyId($data['accrual_policy_id']); $otpf->setAccrualRate($data['accrual_rate']); $otpf->setPayStubEntryAccountId($data['pay_stub_entry_account_id']); if ($otpf->isValid()) { $otpf->Save(); Redirect::Page(URLBuilder::getURL(NULL, 'OverTimePolicyList.php')); break; } default: if (isset($id)) { BreadCrumb::setCrumb($title); $otplf = new OverTimePolicyListFactory(); $otplf->getByIdAndCompanyID($id, $current_company->getID()); foreach ($otplf as $otp_obj) { //Debug::Arr($station,'Department', __FILE__, __LINE__, __METHOD__,10); $data = array('id' => $otp_obj->getId(), 'name' => $otp_obj->getName(), 'type_id' => $otp_obj->getType(), 'trigger_time' => $otp_obj->getTriggerTime(), 'rate' => Misc::removeTrailingZeros($otp_obj->getRate()), 'wage_group_id' => $otp_obj->getWageGroup(), 'accrual_rate' => Misc::removeTrailingZeros($otp_obj->getAccrualRate()), 'accrual_policy_id' => $otp_obj->getAccrualPolicyID(), 'pay_stub_entry_account_id' => $otp_obj->getPayStubEntryAccountId(), 'created_date' => $otp_obj->getCreatedDate(), 'created_by' => $otp_obj->getCreatedBy(), 'updated_date' => $otp_obj->getUpdatedDate(), 'updated_by' => $otp_obj->getUpdatedBy(), 'deleted_date' => $otp_obj->getDeletedDate(), 'deleted_by' => $otp_obj->getDeletedBy()); } } elseif ($action != 'submit') { $data = array('trigger_time' => 0, 'rate' => '1.00', 'accrual_rate' => '1.00'); } $aplf = new AccrualPolicyListFactory(); $accrual_options = $aplf->getByCompanyIDArray($current_company->getId(), TRUE); $psealf = new PayStubEntryAccountListFactory(); $pay_stub_entry_options = $psealf->getByCompanyIdAndStatusIdAndTypeIdArray($current_company->getId(), 10, array(10, 20, 30, 50)); $wglf = new WageGroupListFactory(); $data['wage_group_options'] = $wglf->getArrayByListFactory($wglf->getByCompanyId($current_company->getId()), TRUE); //Select box options;
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); //Premium policies $pplf = new PremiumPolicyListFactory(); $premium_policy_options = $pplf->getByCompanyIDArray($current_company->getId(), TRUE); $job_options = array(); $job_item_options = array(); if ($current_company->getProductEdition() == 20) { $jlf = new JobListFactory(); $job_options = $jlf->getByCompanyIdArray($current_company->getId(), FALSE); $jilf = new JobItemListFactory(); $job_item_options = $jilf->getByCompanyIdArray($current_company->getId(), TRUE); } $day_total_time = array('total_time' => 0, 'worked_time' => 0, 'difference' => 0); foreach ($udtlf as $udt_obj) { if ($udt_obj->getStatus() == 20) {
if (!$permission->Check('report', 'enabled') or !$permission->Check('report', 'view_timesheet_summary')) { $permission->Redirect(FALSE); //Redirect } $smarty->assign('title', TTi18n::gettext($title = 'TimeSheet Summary Report')); // See index.php /* * Get FORM variables */ extract(FormVariables::GetVariables(array('action', 'generic_data', 'filter_data'))); URLBuilder::setURL($_SERVER['SCRIPT_NAME'], array('filter_data' => $filter_data)); $static_columns = array('-1000-full_name' => TTi18n::gettext('Full Name'), '-1002-employee_number' => TTi18n::gettext('Employee #'), '-1005-status' => TTi18n::gettext('Status'), '-1010-title' => TTi18n::gettext('Title'), '-1020-province' => TTi18n::gettext('Province/State'), '-1030-country' => TTi18n::gettext('Country'), '-1039-group' => TTi18n::gettext('Group'), '-1040-default_branch' => TTi18n::gettext('Default Branch'), '-1050-default_department' => TTi18n::gettext('Default Department'), '-1060-verified_time_sheet' => TTi18n::gettext('Verified TimeSheet'), '-1062-pending_request' => TTi18n::gettext('Pending Requests'), '-1065-pay_period' => TTi18n::gettext('Pay Period')); $columns = array('-1070-schedule_working' => TTi18n::gettext('Scheduled Time'), '-1080-schedule_absence' => TTi18n::gettext('Scheduled Absence'), '-1085-worked_days' => TTi18n::gettext('Worked Days'), '-1090-worked_time' => TTi18n::gettext('Worked Time'), '-1100-actual_time' => TTi18n::gettext('Actual Time'), '-1110-actual_time_diff' => TTi18n::gettext('Actual Time Diff.'), '-1120-actual_time_diff_wage' => TTi18n::gettext('Actual Time Diff. Wage'), '-1130-paid_time' => TTi18n::gettext('Paid Time'), '-1140-regular_time' => TTi18n::gettext('Regular Time')); $columns = Misc::prependArray($static_columns, $columns); //Get all Overtime policies. $otplf = new OverTimePolicyListFactory(); $otplf->getByCompanyId($current_company->getId()); if ($otplf->getRecordCount() > 0) { foreach ($otplf as $otp_obj) { $otp_columns['over_time_policy-' . $otp_obj->getId()] = $otp_obj->getName(); } $columns = array_merge($columns, $otp_columns); } //Get all Premium policies. $pplf = new PremiumPolicyListFactory(); $pplf->getByCompanyId($current_company->getId()); if ($pplf->getRecordCount() > 0) { foreach ($pplf as $pp_obj) { $pp_columns['premium_policy-' . $pp_obj->getId()] = $pp_obj->getName(); } $columns = array_merge($columns, $pp_columns);
function getByCompanyIdArray($company_id, $include_blank = TRUE, $where = NULL) { $otplf = new OverTimePolicyListFactory(); $otplf->getByCompanyId($company_id, $where); if ($include_blank == TRUE) { $list[0] = '--'; } foreach ($otplf as $otp_obj) { $list[$otp_obj->getID()] = $otp_obj->getName(); } if (isset($list)) { return $list; } return FALSE; }
$delete = FALSE; } $otplf = new OverTimePolicyListFactory(); foreach ($ids as $id) { $otplf->getByIdAndCompanyId($id, $current_company->getId()); foreach ($otplf as $otp_obj) { $otp_obj->setDeleted($delete); if ($otp_obj->isValid()) { $otp_obj->Save(); } } } Redirect::Page(URLBuilder::getURL(NULL, 'OverTimePolicyList.php')); break; default: $otplf = new OverTimePolicyListFactory(); $otplf->getByCompanyId($current_company->getId()); $pager = new Pager($otplf); $type_options = $otplf->getOptions('type'); $show_no_policy_group_notice = FALSE; foreach ($otplf as $otp_obj) { if ((int) $otp_obj->getColumn('assigned_policy_groups') == 0) { $show_no_policy_group_notice = TRUE; } $policies[] = array('id' => $otp_obj->getId(), 'name' => $otp_obj->getName(), 'type_id' => $otp_obj->getType(), 'type' => $type_options[$otp_obj->getType()], 'trigger_time' => $otp_obj->getTriggerTime(), 'assigned_policy_groups' => (int) $otp_obj->getColumn('assigned_policy_groups'), 'deleted' => $otp_obj->getDeleted()); } $smarty->assign_by_ref('policies', $policies); $smarty->assign_by_ref('show_no_policy_group_notice', $show_no_policy_group_notice); $smarty->assign_by_ref('sort_column', $sort_column); $smarty->assign_by_ref('sort_order', $sort_order); $smarty->assign_by_ref('paging_data', $pager->getPageVariables());
function setOverTimePolicyID($id) { $id = trim($id); if ($id == '' or empty($id)) { $id = NULL; } $otplf = new OverTimePolicyListFactory(); if ($id == NULL or $this->Validator->isResultSetWithRows('over_time_policy', $otplf->getByID($id), TTi18n::gettext('Invalid Overtime Policy ID'))) { $this->data['over_time_policy_id'] = $id; return TRUE; } return FALSE; }
*/ if (isset($columns['wage'])) { $uwlf = new UserWageListFactory(); $uwlf->getByUserIdAndCompanyIdAndStartDateAndEndDate($filter_data['user_ids'], $current_company->getId(), $filter_data['start_date'], $filter_data['end_date']); if ($uwlf->getRecordCount() > 0) { foreach ($uwlf as $uw_obj) { $user_wage_rows[$uw_obj->getUser()][] = array('type_id' => $uw_obj->getType(), 'type' => Option::getByKey($uw_obj->getType(), $uw_obj->getOptions('type')), 'wage' => $uw_obj->getWage(), 'currency_symbol' => $uw_obj->getUserObject()->getCurrencyObject()->getSymbol(), 'effective_date' => $uw_obj->getEffectiveDate(), 'effective_date_since' => TTDate::getHumanTimeSince($uw_obj->getEffectiveDate())); } } } /* Get Attendance History */ if (isset($columns['attendance'])) { //Get policy names. $oplf = new OverTimePolicyListFactory(); $over_time_policy_arr = $oplf->getByCompanyIdArray($current_company->getId(), FALSE); $aplf = new AbsencePolicyListFactory(); $absence_policy_arr = $aplf->getByCompanyIdArray($current_company->getId(), FALSE); $pplf = new PremiumPolicyListFactory(); $premium_policy_arr = $pplf->getByCompanyIdArray($current_company->getId(), FALSE); //Get stats on number of days worked per month/week $udlf = new UserDateListFactory(); $udlf->getDaysWorkedByTimePeriodAndUserIdAndCompanyIdAndStartDateAndEndDate('month', $filter_data['user_ids'], $current_company->getId(), $filter_data['start_date'], $filter_data['end_date']); if ($udlf->getRecordCount() > 0) { foreach ($udlf as $ud_obj) { //$user_days_worked[$ud_obj->getUser()]['month'] $user_attendance_rows[$ud_obj->getUser()]['days_worked']['month'] = array('avg' => round($ud_obj->getColumn('avg'), 2), 'min' => $ud_obj->getColumn('min'), 'max' => $ud_obj->getColumn('max')); } } $udlf->getDaysWorkedByTimePeriodAndUserIdAndCompanyIdAndStartDateAndEndDate('week', $filter_data['user_ids'], $current_company->getId(), $filter_data['start_date'], $filter_data['end_date']);
} default: if (isset($id)) { BreadCrumb::setCrumb($title); $splf = new SchedulePolicyListFactory(); $splf->getByIdAndCompanyID($id, $current_company->getID()); foreach ($splf as $sp_obj) { //Debug::Arr($station,'Department', __FILE__, __LINE__, __METHOD__,10); $data = array('id' => $sp_obj->getId(), 'name' => $sp_obj->getName(), 'over_time_policy_id' => $sp_obj->getOverTimePolicyID(), 'absence_policy_id' => $sp_obj->getAbsencePolicyID(), 'meal_policy_id' => $sp_obj->getMealPolicyID(), 'break_policy_ids' => $sp_obj->getBreakPolicy(), 'start_stop_window' => $sp_obj->getStartStopWindow(), 'created_date' => $sp_obj->getCreatedDate(), 'created_by' => $sp_obj->getCreatedBy(), 'updated_date' => $sp_obj->getUpdatedDate(), 'updated_by' => $sp_obj->getUpdatedBy(), 'deleted_date' => $sp_obj->getDeletedDate(), 'deleted_by' => $sp_obj->getDeletedBy()); } } elseif ($action != 'submit') { $data = array('start_stop_window' => 3600); } $aplf = new AbsencePolicyListFactory(); $absence_options = $aplf->getByCompanyIDArray($current_company->getId(), TRUE); $otplf = new OverTimePolicyListFactory(); $over_time_options = $otplf->getByCompanyIDArray($current_company->getId(), TRUE, array('type_id' => '= 200')); $mplf = new MealPolicyListFactory(); $meal_options = $mplf->getByCompanyIDArray($current_company->getId(), TRUE); $bplf = new BreakPolicyListFactory(); $break_options = $bplf->getByCompanyIdArray($current_company->getId(), TRUE); //Select box options; $data['over_time_options'] = $over_time_options; $data['absence_options'] = $absence_options; $data['meal_options'] = $meal_options; $data['break_options'] = $break_options; $smarty->assign_by_ref('data', $data); break; } $smarty->assign_by_ref('spf', $spf); $smarty->display('policy/EditSchedulePolicy.tpl');
function calcOverTimePolicyTotalTime($udt_meal_policy_adjustment_arr, $udt_break_policy_adjustment_arr) { global $profiler; $profiler->startTimer("UserDateTotal::calcOverTimePolicyTotalTime() - Part 1"); //If this user is scheduled, get schedule overtime policy id. $schedule_total_time = 0; $schedule_over_time_policy_id = 0; $slf = new ScheduleListFactory(); $slf->getByUserDateIdAndStatusId($this->getUserDateID(), 10); if ($slf->getRecordCount() > 0) { //Check for schedule policy foreach ($slf as $s_obj) { Debug::text(' Schedule Total Time: ' . $s_obj->getTotalTime(), __FILE__, __LINE__, __METHOD__, 10); $schedule_total_time += $s_obj->getTotalTime(); if (is_object($s_obj->getSchedulePolicyObject()) and $s_obj->getSchedulePolicyObject()->getOverTimePolicyID() != FALSE) { $schedule_over_time_policy_id = $s_obj->getSchedulePolicyObject()->getOverTimePolicyID(); Debug::text('Found New Schedule Overtime Policies to apply: ' . $schedule_over_time_policy_id, __FILE__, __LINE__, __METHOD__, 10); } } } else { //If they are not scheduled, we use the PolicyGroup list to get a Over Schedule / No Schedule overtime policy. //We could check for an active recurring schedule, but there could be multiple, and which //one do we use? } //Apply policies for OverTime hours $otplf = new OverTimePolicyListFactory(); $otp_calculation_order = $otplf->getOptions('calculation_order'); $otplf->getByPolicyGroupUserIdOrId($this->getUserDateObject()->getUser(), $schedule_over_time_policy_id); if ($otplf->getRecordCount() > 0) { Debug::text('Found Overtime Policies to apply.', __FILE__, __LINE__, __METHOD__, 10); //Get Pay Period Schedule info if (is_object($this->getUserDateObject()->getPayPeriodObject()) and is_object($this->getUserDateObject()->getPayPeriodObject()->getPayPeriodScheduleObject())) { $start_week_day_id = $this->getUserDateObject()->getPayPeriodObject()->getPayPeriodScheduleObject()->getStartWeekDay(); } else { $start_week_day_id = 0; } Debug::text('Start Week Day ID: ' . $start_week_day_id, __FILE__, __LINE__, __METHOD__, 10); //Convert all OT policies to daily before applying. //For instance, 40+hrs/week policy if they are currently at 35hrs is a 5hr daily policy. //For weekly OT policies, they MUST include regular time + other WEEKLY over time rules. $udtlf = new UserDateTotalListFactory(); $weekly_total = $udtlf->getWeekRegularTimeSumByUserIDAndEpochAndStartWeekEpoch($this->getUserDateObject()->getUser(), $this->getUserDateObject()->getDateStamp(), TTDate::getBeginWeekEpoch($this->getUserDateObject()->getDateStamp(), $start_week_day_id)); Debug::text('Weekly Total: ' . $weekly_total, __FILE__, __LINE__, __METHOD__, 10); //Daily policy always takes precedence, then Weekly, Bi-Weekly, Day Of Week etc... //So unless the next policy in the list has a lower trigger time then the previous policy //We ignore it. //ie: if Daily OT is after 8hrs, and Day Of Week is after 10. Day of week will be ignored. // If Daily OT is after 8hrs, and Weekly is after 40, and they worked 35 up to yesterday, // and 12 hrs today, from 5hrs to 8hrs will be weekly, then anything after that is daily. $tmp_trigger_time_arr = array(); foreach ($otplf as $otp_obj) { Debug::text(' Checking Against Policy: ' . $otp_obj->getName() . ' Trigger Time: ' . $otp_obj->getTriggerTime(), __FILE__, __LINE__, __METHOD__, 10); $trigger_time = NULL; switch ($otp_obj->getType()) { case 10: //Daily $trigger_time = $otp_obj->getTriggerTime(); Debug::text(' Daily Trigger Time: ' . $trigger_time, __FILE__, __LINE__, __METHOD__, 10); break; case 20: //Weekly //Trigger time minus currently weekly time //$trigger_time = $otp_obj->getTriggerTime() - $weekly_total; $trigger_time = $otp_obj->getTriggerTime(); Debug::text(' Weekly Trigger Time: ' . $trigger_time, __FILE__, __LINE__, __METHOD__, 10); break; case 40: //Sunday if (date('w', $this->getUserDateObject()->getDateStamp()) == 0) { $trigger_time = $otp_obj->getTriggerTime(); Debug::text(' DayOfWeek OT for Sat ... Daily Trigger Time: ' . $trigger_time, __FILE__, __LINE__, __METHOD__, 10); } else { Debug::text(' NOT DayOfWeek OT for Sat...', __FILE__, __LINE__, __METHOD__, 10); continue; } break; case 50: //Monday if (date('w', $this->getUserDateObject()->getDateStamp()) == 1) { $trigger_time = $otp_obj->getTriggerTime(); Debug::text(' DayOfWeek OT for Sat ... Daily Trigger Time: ' . $trigger_time, __FILE__, __LINE__, __METHOD__, 10); } else { Debug::text(' NOT DayOfWeek OT for Sat...', __FILE__, __LINE__, __METHOD__, 10); continue; } break; case 60: //Tuesday if (date('w', $this->getUserDateObject()->getDateStamp()) == 2) { $trigger_time = $otp_obj->getTriggerTime(); Debug::text(' DayOfWeek OT for Sat ... Daily Trigger Time: ' . $trigger_time, __FILE__, __LINE__, __METHOD__, 10); } else { Debug::text(' NOT DayOfWeek OT for Sat...', __FILE__, __LINE__, __METHOD__, 10); continue; } break; case 70: //Wed if (date('w', $this->getUserDateObject()->getDateStamp()) == 3) { $trigger_time = $otp_obj->getTriggerTime(); Debug::text(' DayOfWeek OT for Sat ... Daily Trigger Time: ' . $trigger_time, __FILE__, __LINE__, __METHOD__, 10); } else { Debug::text(' NOT DayOfWeek OT for Sat...', __FILE__, __LINE__, __METHOD__, 10); continue; } break; case 80: //Thu if (date('w', $this->getUserDateObject()->getDateStamp()) == 4) { $trigger_time = $otp_obj->getTriggerTime(); Debug::text(' DayOfWeek OT for Sat ... Daily Trigger Time: ' . $trigger_time, __FILE__, __LINE__, __METHOD__, 10); } else { Debug::text(' NOT DayOfWeek OT for Sat...', __FILE__, __LINE__, __METHOD__, 10); continue; } break; case 90: //Fri if (date('w', $this->getUserDateObject()->getDateStamp()) == 5) { $trigger_time = $otp_obj->getTriggerTime(); Debug::text(' DayOfWeek OT for Sat ... Daily Trigger Time: ' . $trigger_time, __FILE__, __LINE__, __METHOD__, 10); } else { Debug::text(' NOT DayOfWeek OT for Sat...', __FILE__, __LINE__, __METHOD__, 10); continue; } break; case 100: //Sat if (date('w', $this->getUserDateObject()->getDateStamp()) == 6) { $trigger_time = $otp_obj->getTriggerTime(); Debug::text(' DayOfWeek OT for Sat ... Daily Trigger Time: ' . $trigger_time, __FILE__, __LINE__, __METHOD__, 10); } else { Debug::text(' NOT DayOfWeek OT for Sat...', __FILE__, __LINE__, __METHOD__, 10); continue; } break; case 150: //2-day Consecutive //2-day Consecutive case 151: //3-day Consecutive //3-day Consecutive case 152: //4-day Consecutive //4-day Consecutive case 153: //5-day Consecutive //5-day Consecutive case 154: //6-day Consecutive //6-day Consecutive case 155: //7-day Consecutive switch ($otp_obj->getType()) { case 150: $minimum_days_worked = 2; break; case 151: $minimum_days_worked = 3; break; case 152: $minimum_days_worked = 4; break; case 153: $minimum_days_worked = 5; break; case 154: $minimum_days_worked = 6; break; case 155: $minimum_days_worked = 7; break; } //Should these be reset on the week boundary or should any consecutive days worked apply? Or should we offer both options? //We should probably break this out to just a general "consecutive days worked" and add a field to specify any number of days //and a field to specify if its only per week, or any timeframe. //Will probably want to include a flag to consider scheduled days only too. $weekly_days_worked = $udtlf->getDaysWorkedByUserIDAndStartDateAndEndDate($this->getUserDateObject()->getUser(), TTDate::getBeginWeekEpoch($this->getUserDateObject()->getDateStamp(), $start_week_day_id), $this->getUserDateObject()->getDateStamp()); Debug::text(' Weekly Days Worked: ' . $weekly_days_worked . ' Minimum Required: ' . $minimum_days_worked, __FILE__, __LINE__, __METHOD__, 10); if ($weekly_days_worked >= $minimum_days_worked) { $trigger_time = $otp_obj->getTriggerTime(); Debug::text(' After Days Consecutive... Daily Trigger Time: ' . $trigger_time, __FILE__, __LINE__, __METHOD__, 10); } else { Debug::text(' NOT After Days Consecutive Worked...', __FILE__, __LINE__, __METHOD__, 10); continue; } unset($weekly_days_worked, $minimum_days_worked); break; case 180: //Holiday $hlf = new HolidayListFactory(); $hlf->getByPolicyGroupUserIdAndDate($this->getUserDateObject()->getUser(), $this->getUserDateObject()->getDateStamp()); if ($hlf->getRecordCount() > 0) { $holiday_obj = $hlf->getCurrent(); Debug::text(' Found Holiday: ' . $holiday_obj->getName(), __FILE__, __LINE__, __METHOD__, 10); if ($holiday_obj->getHolidayPolicyObject()->getForceOverTimePolicy() == TRUE or $holiday_obj->isEligible($this->getUserDateObject()->getUser())) { $trigger_time = $otp_obj->getTriggerTime(); Debug::text(' Is Eligible for Holiday: ' . $holiday_obj->getName() . ' Daily Trigger Time: ' . $trigger_time, __FILE__, __LINE__, __METHOD__, 10); } else { Debug::text(' Not Eligible for Holiday: ' . $holiday_obj->getName(), __FILE__, __LINE__, __METHOD__, 10); continue 2; //Skip to next policy } } else { Debug::text(' Not Holiday...', __FILE__, __LINE__, __METHOD__, 10); continue 2; //Skip to next policy } unset($hlf, $holiday_obj); break; case 200: //Over schedule / No Schedule $trigger_time = $schedule_total_time; Debug::text(' Over Schedule/No Schedule Trigger Time: ' . $trigger_time, __FILE__, __LINE__, __METHOD__, 10); break; } if (is_numeric($trigger_time) and $trigger_time < 0) { $trigger_time = 0; } if (is_numeric($trigger_time)) { $trigger_time_arr[] = array('calculation_order' => $otp_calculation_order[$otp_obj->getType()], 'trigger_time' => $trigger_time, 'over_time_policy_id' => $otp_obj->getId(), 'over_time_policy_type_id' => $otp_obj->getType()); } unset($trigger_time); } if (isset($trigger_time_arr)) { //sort($trigger_time_arr); $trigger_time_arr = $this->processTriggerTimeArray($trigger_time_arr, $weekly_total); } //Debug::Arr($trigger_time_arr, 'Trigger Time Array', __FILE__, __LINE__, __METHOD__, 10); } else { Debug::text(' No OverTime Policies found for this user.', __FILE__, __LINE__, __METHOD__, 10); } unset($otp_obj, $otplf); if (isset($trigger_time_arr)) { $total_daily_hours = 0; //$total_daily_hours = -1800; $total_daily_hours_used = 0; //get all worked total hours. $udtlf = new UserDateTotalListFactory(); $udtlf->getByUserDateIdAndStatus($this->getUserDateID(), 20); if ($udtlf->getRecordCount() > 0) { Debug::text('Found Total Hours to attempt to apply policy: Record Count: ' . $udtlf->getRecordCount(), __FILE__, __LINE__, __METHOD__, 10); if ($trigger_time_arr[0]['trigger_time'] > 0) { //No trigger time set at 0. $enable_regular_hour_calculating = TRUE; } else { $enable_regular_hour_calculating = FALSE; } $tmp_policy_total_time = NULL; foreach ($udtlf as $udt_obj) { //Ignore incomplete punches if ($udt_obj->getTotalTime() == 0) { continue; } $udt_total_time = $udt_obj->getTotalTime(); if (isset($udt_meal_policy_adjustment_arr[$udt_obj->getId()])) { $udt_total_time = bcadd($udt_total_time, $udt_meal_policy_adjustment_arr[$udt_obj->getId()]); } if (isset($udt_break_policy_adjustment_arr[$udt_obj->getId()])) { $udt_total_time = bcadd($udt_total_time, $udt_break_policy_adjustment_arr[$udt_obj->getId()]); } $total_daily_hours = bcadd($total_daily_hours, $udt_total_time); //Loop through each trigger. $i = 0; Debug::text('Total Hour: ID: ' . $udt_obj->getId() . ' Status: ' . $udt_obj->getStatus() . ' Total Time: ' . $udt_obj->getTotalTime() . ' Total Daily Hours: ' . $total_daily_hours . ' Used Total Time: ' . $total_daily_hours_used . ' Branch ID: ' . $udt_obj->getBranch() . ' Department ID: ' . $udt_obj->getDepartment() . ' Job ID: ' . $udt_obj->getJob() . ' Job Item ID: ' . $udt_obj->getJobItem() . ' Quantity: ' . $udt_obj->getQuantity(), __FILE__, __LINE__, __METHOD__, 10); foreach ($trigger_time_arr as $trigger_time_data) { if (isset($trigger_time_arr[$i + 1]['trigger_time']) and $total_daily_hours_used >= $trigger_time_arr[$i + 1]['trigger_time']) { Debug::text(' ' . $i . ': SKIPPING THIS TRIGGER TIME: ' . $trigger_time_data['trigger_time'], __FILE__, __LINE__, __METHOD__, 10); $i++; continue; } Debug::text(' ' . $i . ': Trigger Time Data: Trigger Time: ' . $trigger_time_data['trigger_time'] . ' ID: ' . $trigger_time_data['over_time_policy_id'], __FILE__, __LINE__, __METHOD__, 10); Debug::text(' ' . $i . ': Used Total Time: ' . $total_daily_hours_used, __FILE__, __LINE__, __METHOD__, 10); //Only consider Regular Time ONCE per user date total row. if ($i == 0 and $trigger_time_arr[$i]['trigger_time'] > 0 and $total_daily_hours_used < $trigger_time_arr[$i]['trigger_time']) { Debug::text(' ' . $i . ': Trigger Time: ' . $trigger_time_arr[$i]['trigger_time'] . ' greater then 0, found Regular Time.', __FILE__, __LINE__, __METHOD__, 10); if ($total_daily_hours > $trigger_time_arr[$i]['trigger_time']) { $regular_total_time = $trigger_time_arr[$i]['trigger_time'] - $total_daily_hours_used; $regular_quantity_percent = bcdiv($trigger_time_arr[$i]['trigger_time'], $udt_obj->getTotalTime()); $regular_quantity = round(bcmul($udt_obj->getQuantity(), $regular_quantity_percent), 2); $regular_bad_quantity = round(bcmul($udt_obj->getBadQuantity(), $regular_quantity_percent), 2); } else { //$regular_total_time = $udt_obj->getTotalTime(); $regular_total_time = $udt_total_time; $regular_quantity = $udt_obj->getQuantity(); $regular_bad_quantity = $udt_obj->getBadQuantity(); } Debug::text(' ' . $i . ': Regular Total Time: ' . $regular_total_time . ' Regular Quantity: ' . $regular_quantity, __FILE__, __LINE__, __METHOD__, 10); if (isset($user_data_total_compact_arr[20][(int) $udt_obj->getBranch()][(int) $udt_obj->getDepartment()][(int) $udt_obj->getJob()][(int) $udt_obj->getJobItem()])) { Debug::text(' Adding to Compact Array: Branch: ' . (int) $udt_obj->getBranch() . ' Department: ' . (int) $udt_obj->getDepartment(), __FILE__, __LINE__, __METHOD__, 10); $user_data_total_compact_arr[20][(int) $udt_obj->getBranch()][(int) $udt_obj->getDepartment()][(int) $udt_obj->getJob()][(int) $udt_obj->getJobItem()]['total_time'] += $regular_total_time; $user_data_total_compact_arr[20][(int) $udt_obj->getBranch()][(int) $udt_obj->getDepartment()][(int) $udt_obj->getJob()][(int) $udt_obj->getJobItem()]['quantity'] += $regular_quantity; $user_data_total_compact_arr[20][(int) $udt_obj->getBranch()][(int) $udt_obj->getDepartment()][(int) $udt_obj->getJob()][(int) $udt_obj->getJobItem()]['bad_quantity'] += $regular_bad_quantity; } else { Debug::text(' Initiating Compact Sub-Array: Branch: ' . (int) $udt_obj->getBranch() . ' Department: ' . (int) $udt_obj->getDepartment(), __FILE__, __LINE__, __METHOD__, 10); $user_data_total_compact_arr[20][(int) $udt_obj->getBranch()][(int) $udt_obj->getDepartment()][(int) $udt_obj->getJob()][(int) $udt_obj->getJobItem()] = array('total_time' => $regular_total_time, 'quantity' => $regular_quantity, 'bad_quantity' => $regular_bad_quantity); } Debug::text(' Compact Array Regular Total: ' . $user_data_total_compact_arr[20][(int) $udt_obj->getBranch()][(int) $udt_obj->getDepartment()][(int) $udt_obj->getJob()][(int) $udt_obj->getJobItem()]['total_time'], __FILE__, __LINE__, __METHOD__, 10); $total_daily_hours_used += $regular_total_time; } Debug::text(' ' . $i . ': Daily Total Time: ' . $total_daily_hours . ' Trigger Time: ' . $trigger_time_arr[$i]['trigger_time'] . ' Used Total Time: ' . $total_daily_hours_used . ' Overtime Policy Type: ' . $trigger_time_arr[$i]['over_time_policy_type_id'], __FILE__, __LINE__, __METHOD__, 10); if ($total_daily_hours > $trigger_time_arr[$i]['trigger_time']) { Debug::text(' ' . $i . ': Trigger Time: ' . $trigger_time_arr[$i]['trigger_time'] . ' greater then 0, found Over Time.', __FILE__, __LINE__, __METHOD__, 10); if (isset($trigger_time_arr[$i + 1]['trigger_time'])) { Debug::text(' ' . $i . ': Found trigger time after this one: ' . $trigger_time_arr[$i + 1]['trigger_time'], __FILE__, __LINE__, __METHOD__, 10); $max_trigger_time = $trigger_time_arr[$i + 1]['trigger_time'] - $trigger_time_arr[$i]['trigger_time']; } else { $max_trigger_time = $trigger_time_arr[$i]['trigger_time']; } Debug::text(' aMax Trigger Time ' . $max_trigger_time, __FILE__, __LINE__, __METHOD__, 10); if (isset($trigger_time_arr[$i + 1]['trigger_time']) and $total_daily_hours_used > $trigger_time_arr[$i]['trigger_time']) { //$max_trigger_time = $max_trigger_time - ($total_daily_hours_used - $max_trigger_time); $max_trigger_time = $max_trigger_time - ($total_daily_hours_used - $trigger_time_arr[$i]['trigger_time']); } Debug::text(' bMax Trigger Time ' . $max_trigger_time, __FILE__, __LINE__, __METHOD__, 10); $over_time_total = $total_daily_hours - $total_daily_hours_used; if (isset($trigger_time_arr[$i + 1]['trigger_time']) and $max_trigger_time > 0 and $over_time_total > $max_trigger_time) { $over_time_total = $max_trigger_time; } if ($over_time_total > 0) { $over_time_quantity_percent = bcdiv($over_time_total, $udt_obj->getTotalTime()); $over_time_quantity = round(bcmul($udt_obj->getQuantity(), $over_time_quantity_percent), 2); $over_time_bad_quantity = round(bcmul($udt_obj->getBadQuantity(), $over_time_quantity_percent), 2); Debug::text(' Inserting Hours (' . $over_time_total . ') for Policy ID: ' . $trigger_time_arr[$i]['over_time_policy_id'], __FILE__, __LINE__, __METHOD__, 10); if (isset($user_data_total_compact_arr[30][$trigger_time_arr[$i]['over_time_policy_id']][(int) $udt_obj->getBranch()][(int) $udt_obj->getDepartment()][(int) $udt_obj->getJob()][(int) $udt_obj->getJobItem()])) { Debug::text(' Adding to Compact Array: Policy ID: ' . $trigger_time_arr[$i]['over_time_policy_id'] . ' Branch: ' . (int) $udt_obj->getBranch() . ' Department: ' . (int) $udt_obj->getDepartment(), __FILE__, __LINE__, __METHOD__, 10); $user_data_total_compact_arr[30][$trigger_time_arr[$i]['over_time_policy_id']][(int) $udt_obj->getBranch()][(int) $udt_obj->getDepartment()][(int) $udt_obj->getJob()][(int) $udt_obj->getJobItem()]['total_time'] += $over_time_total; $user_data_total_compact_arr[30][$trigger_time_arr[$i]['over_time_policy_id']][(int) $udt_obj->getBranch()][(int) $udt_obj->getDepartment()][(int) $udt_obj->getJob()][(int) $udt_obj->getJobItem()]['quantity'] += $over_time_quantity; $user_data_total_compact_arr[30][$trigger_time_arr[$i]['over_time_policy_id']][(int) $udt_obj->getBranch()][(int) $udt_obj->getDepartment()][(int) $udt_obj->getJob()][(int) $udt_obj->getJobItem()]['bad_quantity'] += $over_time_bad_quantity; } else { Debug::text(' Initiating Compact Sub-Array: Policy ID: ' . $trigger_time_arr[$i]['over_time_policy_id'] . ' Branch: ' . (int) $udt_obj->getBranch() . ' Department: ' . (int) $udt_obj->getDepartment(), __FILE__, __LINE__, __METHOD__, 10); $user_data_total_compact_arr[30][$trigger_time_arr[$i]['over_time_policy_id']][(int) $udt_obj->getBranch()][(int) $udt_obj->getDepartment()][(int) $udt_obj->getJob()][(int) $udt_obj->getJobItem()] = array('total_time' => $over_time_total, 'quantity' => $over_time_quantity, 'bad_quantity' => $over_time_bad_quantity); } $total_daily_hours_used += $over_time_total; } else { Debug::text(' Over Time Total is 0: ' . $over_time_total, __FILE__, __LINE__, __METHOD__, 10); } unset($over_time_total, $over_time_quantity_percent, $over_time_quantity, $over_time_bad_quantity); } else { break; } $i++; } unset($udt_total_time); } unset($tmp_policy_total_time, $trigger_time_data, $trigger_time_arr); } } $profiler->stopTimer("UserDateTotal::calcOverTimePolicyTotalTime() - Part 1"); if (isset($user_data_total_compact_arr)) { return $user_data_total_compact_arr; } return FALSE; }