$udtf->setBadQuantity($udt_data['bad_quantity']); } $udtf->setOverTimePolicyID($udt_data['over_time_policy_id']); $udtf->setPremiumPolicyID($udt_data['premium_policy_id']); $udtf->setAbsencePolicyID($udt_data['absence_policy_id']); $udtf->setMealPolicyID($udt_data['meal_policy_id']); $udtf->setTotalTime($udt_data['total_time']); $udtf->setPunchControlID((int) $udt_data['punch_control_id']); if (isset($udt_data['override']) and $udt_data['override'] == 1) { Debug::Text('Setting override to TRUE!', __FILE__, __LINE__, __METHOD__, 10); $udtf->setOverride(TRUE); } else { $udtf->setOverride(FALSE); } if ($udtf->isValid()) { $udtf->setEnableCalcSystemTotalTime(TRUE); $udtf->setEnableCalcWeeklySystemTotalTime(TRUE); $udtf->setEnableCalcException(TRUE); $udtf->Save(); Redirect::Page(URLBuilder::getURL(array('refresh' => TRUE), '../CloseWindow.php')); break; } default: if ($id != '') { Debug::Text(' ID was passed: ' . $id, __FILE__, __LINE__, __METHOD__, 10); $udtlf = new UserDateTotalListFactory(); $udtlf->getById($id); foreach ($udtlf as $udt_obj) { //Debug::Arr($station,'Department', __FILE__, __LINE__, __METHOD__,10); $udt_data = array('id' => $udt_obj->getId(), 'user_date_id' => $udt_obj->getUserDateId(), 'date_stamp' => $udt_obj->getUserDateObject()->getDateStamp(), 'user_id' => $udt_obj->getUserDateObject()->getUser(), 'user_full_name' => $udt_obj->getUserDateObject()->getUserObject()->getFullName(), 'status_id' => $udt_obj->getStatus(), 'type_id' => $udt_obj->getType(), 'total_time' => $udt_obj->getTotalTime(), '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(), 'bad_quantity' => $udt_obj->getBadQuantity(), 'punch_control_id' => $udt_obj->getPunchControlID(), 'absence_policy_id' => $udt_obj->getAbsencePolicyID(), 'over_time_policy_id' => $udt_obj->getOverTimePolicyID(), 'premium_policy_id' => $udt_obj->getPremiumPolicyID(), 'meal_policy_id' => $udt_obj->getMealPolicyID(), 'override' => $udt_obj->getOverride(), 'created_date' => $udt_obj->getCreatedDate(), 'created_by' => $udt_obj->getCreatedBy(), 'updated_date' => $udt_obj->getUpdatedDate(), 'updated_by' => $udt_obj->getUpdatedBy(), 'deleted_date' => $udt_obj->getDeletedDate(), 'deleted_by' => $udt_obj->getDeletedBy(), 'override' => $udt_obj->getOverride()); }
function calcSystemTotalTime() { global $profiler; $profiler->startTimer("UserDateTotal::calcSystemTotalTime() - Part 1"); if (is_object($this->getUserDateObject()) and is_object($this->getUserDateObject()->getPayPeriodObject()) and $this->getUserDateObject()->getPayPeriodObject()->getStatus() == 20) { Debug::text(' Pay Period is closed!', __FILE__, __LINE__, __METHOD__, 10); return FALSE; } //Take the worked hours, and calculate Total,Regular,Overtime,Premium hours from that. //This is where many of the policies will be applied //Such as any meal/overtime/premium policies. $return_value = FALSE; $udtlf = new UserDateTotalListFactory(); $this->deleteSystemTotalTime(); //We can't assign a dock absence to a given branch/dept automatically, //Because several punches with different branches could fall within a schedule punch pair. //Just total up entire day, and entire scheduled time to see if we're over/under //FIXME: Handle multiple schedules on a single day better. $schedule_total_time = 0; $meal_policy_obj = NULL; $slf = new ScheduleListFactory(); $profiler->startTimer("UserDateTotal::calcSystemTotalTime() - Holiday"); //Check for Holidays $holiday_time = 0; $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->isEligible($this->getUserDateObject()->getUser())) { Debug::text(' User is Eligible for Holiday: ' . $holiday_obj->getName(), __FILE__, __LINE__, __METHOD__, 10); $holiday_time = $holiday_obj->getHolidayTime($this->getUserDateObject()->getUser()); Debug::text(' User average time for Holiday: ' . TTDate::getHours($holiday_time), __FILE__, __LINE__, __METHOD__, 10); if ($holiday_time > 0 and $holiday_obj->getHolidayPolicyObject()->getAbsencePolicyID() != FALSE) { Debug::text(' Adding Holiday hours: ' . TTDate::getHours($holiday_time), __FILE__, __LINE__, __METHOD__, 10); $udtf = new UserDateTotalFactory(); $udtf->setUserDateID($this->getUserDateID()); $udtf->setStatus(30); //Absence $udtf->setType(10); //Total $udtf->setBranch($this->getUserDateObject()->getUserObject()->getDefaultBranch()); $udtf->setDepartment($this->getUserDateObject()->getUserObject()->getDefaultDepartment()); $udtf->setAbsencePolicyID($holiday_obj->getHolidayPolicyObject()->getAbsencePolicyID()); $udtf->setTotalTime($holiday_time); $udtf->setEnableCalcSystemTotalTime(FALSE); if ($udtf->isValid()) { $udtf->Save(); } } } $slf->getByUserDateIdAndStatusId($this->getUserDateID(), 20); $schedule_absence_total_time = 0; if ($slf->getRecordCount() > 0) { //Check for schedule policy foreach ($slf as $s_obj) { Debug::text(' Schedule Absence Total Time: ' . $s_obj->getTotalTime(), __FILE__, __LINE__, __METHOD__, 10); $schedule_absence_total_time += $s_obj->getTotalTime(); if (is_object($s_obj->getSchedulePolicyObject()) and $s_obj->getSchedulePolicyObject()->getAbsencePolicyID() > 0) { $holiday_absence_policy_id = $s_obj->getSchedulePolicyObject()->getAbsencePolicyID(); Debug::text(' Found Absence Policy for docking: ' . $holiday_absence_policy_id, __FILE__, __LINE__, __METHOD__, 10); } else { Debug::text(' NO Absence Policy : ', __FILE__, __LINE__, __METHOD__, 10); } } } $holiday_total_under_time = $schedule_absence_total_time - $holiday_time; if (isset($holiday_absence_policy_id) and $holiday_total_under_time > 0) { Debug::text(' Schedule Under Time Case: ' . $holiday_total_under_time, __FILE__, __LINE__, __METHOD__, 10); $udtf = new UserDateTotalFactory(); $udtf->setUserDateID($this->getUserDateID()); $udtf->setStatus(30); //Absence $udtf->setType(10); //Total $udtf->setBranch($this->getUserDateObject()->getUserObject()->getDefaultBranch()); $udtf->setDepartment($this->getUserDateObject()->getUserObject()->getDefaultDepartment()); $udtf->setAbsencePolicyID($holiday_absence_policy_id); $udtf->setTotalTime($holiday_total_under_time); $udtf->setEnableCalcSystemTotalTime(FALSE); if ($udtf->isValid()) { $udtf->Save(); } } unset($holiday_total_under_time, $holiday_absence_policy_id, $schedule_absence_total_time); } $profiler->stopTimer("UserDateTotal::calcSystemTotalTime() - Holiday"); //Do this after holiday policies have been applied, so if someone //schedules a holiday manually, we don't double up on the time. $slf->getByUserDateId($this->getUserDateID()); 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); if ($s_obj->getStatus() == 20 and $s_obj->getAbsencePolicyID() != '') { Debug::text(' Scheduled Absence Found of Total Time: ' . $s_obj->getTotalTime(), __FILE__, __LINE__, __METHOD__, 10); //If a holiday policy is applied on this day, ignore the schedule so we don't duplicate it. //We could take the difference, and use the greatest of the two, //But I think that will just open the door for errors. if (!isset($holiday_obj) or $holiday_time == 0 and is_object($holiday_obj) and $holiday_obj->getHolidayPolicyObject()->getAbsencePolicyID() != $s_obj->getAbsencePolicyID()) { $udtf = new UserDateTotalFactory(); $udtf->setUserDateID($this->getUserDateID()); $udtf->setStatus(30); //Absence $udtf->setType(10); //Total $udtf->setBranch($s_obj->getBranch()); $udtf->setDepartment($s_obj->getDepartment()); $udtf->setJob($s_obj->getJob()); $udtf->setJobItem($s_obj->getJobItem()); $udtf->setAbsencePolicyID($s_obj->getAbsencePolicyID()); $udtf->setTotalTime($s_obj->getTotalTime()); $udtf->setEnableCalcSystemTotalTime(FALSE); if ($udtf->isValid()) { $udtf->Save(); } } else { Debug::text(' Holiday Time Found, ignoring schedule!', __FILE__, __LINE__, __METHOD__, 10); } } elseif ($s_obj->getStatus() == 10) { $schedule_total_time += $s_obj->getTotalTime(); if (is_object($s_obj->getSchedulePolicyObject())) { $schedule_absence_policy_id = $s_obj->getSchedulePolicyObject()->getAbsencePolicyID(); $meal_policy_obj = $s_obj->getSchedulePolicyObject()->getMealPolicyObject(); Debug::text(' Found Absence Policy for docking: ' . $schedule_absence_policy_id, __FILE__, __LINE__, __METHOD__, 10); } else { Debug::text(' NO Absence Policy : ', __FILE__, __LINE__, __METHOD__, 10); } } } } else { Debug::text(' No Schedules found. ', __FILE__, __LINE__, __METHOD__, 10); } unset($s_obj); unset($holiday_time, $holiday_obj); //Handle Meal Policy time. //Do this after schedule meal policies have been looked up, as those override any policy group meal policies. $meal_policy_time = $this->calcMealPolicyTotalTime($meal_policy_obj); $udt_meal_policy_adjustment_arr = $this->calcUserTotalMealPolicyAdjustment($meal_policy_time); //Debug::Arr($udt_meal_policy_adjustment_arr, 'UserDateTotal Meal Policy Adjustment: ', __FILE__, __LINE__, __METHOD__,10); $break_policy_time = $this->calcBreakPolicyTotalTime(); $udt_break_policy_adjustment_arr = $this->calcUserTotalBreakPolicyAdjustment($break_policy_time); //Debug::Arr($udt_break_policy_adjustment_arr, 'UserDateTotal Break Policy Adjustment: ', __FILE__, __LINE__, __METHOD__,10); $daily_total_time = $this->getDailyTotalTime(); Debug::text(' Daily Total Time: ' . $daily_total_time . ' Schedule Total Time: ' . $schedule_total_time, __FILE__, __LINE__, __METHOD__, 10); //Check for overtime policies or undertime absence policies if ($daily_total_time > $schedule_total_time) { Debug::text(' Schedule Over Time Case: ', __FILE__, __LINE__, __METHOD__, 10); } elseif (isset($schedule_absence_policy_id) and $schedule_absence_policy_id != '' and $daily_total_time < $schedule_total_time) { $total_under_time = bcsub($schedule_total_time, $daily_total_time); if ($total_under_time > 0) { Debug::text(' Schedule Under Time Case: ' . $total_under_time . ' Absence Policy ID: ' . $schedule_absence_policy_id, __FILE__, __LINE__, __METHOD__, 10); $udtf = new UserDateTotalFactory(); $udtf->setUserDateID($this->getUserDateID()); $udtf->setStatus(30); //Absence $udtf->setType(10); //Total $udtf->setBranch($this->getUserDateObject()->getUserObject()->getDefaultBranch()); $udtf->setDepartment($this->getUserDateObject()->getUserObject()->getDefaultDepartment()); $udtf->setAbsencePolicyID($schedule_absence_policy_id); $udtf->setTotalTime($total_under_time); $udtf->setEnableCalcSystemTotalTime(FALSE); if ($udtf->isValid()) { $udtf->Save(); } } else { Debug::text(' Schedule Under Time is a negative value, skipping dock time: ' . $total_under_time . ' Absence Policy ID: ' . $schedule_absence_policy_id, __FILE__, __LINE__, __METHOD__, 10); } } else { Debug::text(' No Dock Absenses', __FILE__, __LINE__, __METHOD__, 10); } unset($schedule_absence_policy_id); //Do this AFTER the UnderTime absence policy is submitted. $recalc_daily_total_time = $this->calcAbsencePolicyTotalTime(); if ($recalc_daily_total_time == TRUE) { //Total up all "worked" hours for the day again, this time include //Paid Absences. $daily_total_time = $this->getDailyTotalTime(); //$daily_total_time = $udtlf->getTotalSumByUserDateID( $this->getUserDateID() ); Debug::text('ReCalc Daily Total Time for Day: ' . $daily_total_time, __FILE__, __LINE__, __METHOD__, 10); } $profiler->stopTimer("UserDateTotal::calcSystemTotalTime() - Part 1"); $user_data_total_compact_arr = $this->calcOverTimePolicyTotalTime($udt_meal_policy_adjustment_arr, $udt_break_policy_adjustment_arr); //Debug::Arr($user_data_total_compact_arr, 'User Data Total Compact Array: ', __FILE__, __LINE__, __METHOD__, 10); //Insert User Date Total rows for each compacted array entry. //The reason for compacting is to reduce the amount of rows as much as possible. if (is_array($user_data_total_compact_arr)) { $profiler->startTimer("UserDateTotal::calcSystemTotalTime() - Part 2"); Debug::text('Compact Array Exists: ', __FILE__, __LINE__, __METHOD__, 10); foreach ($user_data_total_compact_arr as $type_id => $udt_arr) { Debug::text('Compact Array Entry: Type ID: ' . $type_id, __FILE__, __LINE__, __METHOD__, 10); if ($type_id == 20) { //Regular Time //Debug::text('Compact Array Entry: Branch ID: '. $udt_arr[' , __FILE__, __LINE__, __METHOD__, 10); foreach ($udt_arr as $branch_id => $branch_arr) { //foreach($branch_arr as $department_id => $total_time ) { foreach ($branch_arr as $department_id => $department_arr) { foreach ($department_arr as $job_id => $job_arr) { foreach ($job_arr as $job_item_id => $data_arr) { Debug::text('Compact Array Entry: Regular Time - Branch ID: ' . $branch_id . ' Department ID: ' . $department_id . ' Job ID: ' . $job_id . ' Job Item ID: ' . $job_item_id . ' Total Time: ' . $data_arr['total_time'], __FILE__, __LINE__, __METHOD__, 10); $user_data_total_expanded[] = array('type_id' => $type_id, 'over_time_policy_id' => NULL, 'branch_id' => $branch_id, 'department_id' => $department_id, 'job_id' => $job_id, 'job_item_id' => $job_item_id, 'total_time' => $data_arr['total_time'], 'quantity' => $data_arr['quantity'], 'bad_quantity' => $data_arr['bad_quantity']); } } } } } else { //Overtime //Overtime array is completely different then regular time array! foreach ($udt_arr as $over_time_policy_id => $policy_arr) { foreach ($policy_arr as $branch_id => $branch_arr) { //foreach($branch_arr as $department_id => $total_time ) { foreach ($branch_arr as $department_id => $department_arr) { foreach ($department_arr as $job_id => $job_arr) { foreach ($job_arr as $job_item_id => $data_arr) { Debug::text('Compact Array Entry: Policy ID: ' . $over_time_policy_id . ' Branch ID: ' . $branch_id . ' Department ID: ' . $department_id . ' Job ID: ' . $job_id . ' Job Item ID: ' . $job_item_id . ' Total Time: ' . $data_arr['total_time'], __FILE__, __LINE__, __METHOD__, 10); $user_data_total_expanded[] = array('type_id' => $type_id, 'over_time_policy_id' => $over_time_policy_id, 'branch_id' => $branch_id, 'department_id' => $department_id, 'job_id' => $job_id, 'job_item_id' => $job_item_id, 'total_time' => $data_arr['total_time'], 'quantity' => $data_arr['quantity'], 'bad_quantity' => $data_arr['bad_quantity']); } } } } } } unset($policy_arr, $branch_arr, $department_arr, $job_arr, $over_time_policy_id, $branch_id, $department_id, $job_id, $job_item_id, $data_arr); } $profiler->stopTimer("UserDateTotal::calcSystemTotalTime() - Part 2"); //var_dump($user_data_total_expanded); //Do the actual inserts now. if (isset($user_data_total_expanded)) { foreach ($user_data_total_expanded as $data_arr) { $profiler->startTimer("UserDateTotal::calcSystemTotalTime() - Part 2b"); Debug::text('Inserting from expanded array, Type ID: ' . $data_arr['type_id'], __FILE__, __LINE__, __METHOD__, 10); $udtf = new UserDateTotalFactory(); $udtf->setUserDateID($this->getUserDateID()); $udtf->setStatus(10); //System $udtf->setType($data_arr['type_id']); if (isset($data_arr['over_time_policy_id'])) { $udtf->setOverTimePolicyId($data_arr['over_time_policy_id']); } $udtf->setBranch($data_arr['branch_id']); $udtf->setDepartment($data_arr['department_id']); $udtf->setJob($data_arr['job_id']); $udtf->setJobItem($data_arr['job_item_id']); $udtf->setQuantity($data_arr['quantity']); $udtf->setBadQuantity($data_arr['bad_quantity']); $udtf->setTotalTime($data_arr['total_time']); $udtf->setEnableCalcSystemTotalTime(FALSE); if ($udtf->isValid()) { $udtf->Save(); } else { Debug::text('aINVALID UserDateTotal Entry!!: ', __FILE__, __LINE__, __METHOD__, 10); } $profiler->stopTimer("UserDateTotal::calcSystemTotalTime() - Part 2b"); } unset($user_data_total_expanded); } } else { $profiler->startTimer("UserDateTotal::calcSystemTotalTime() - Part 3"); //We need to break this out by branch, dept, job, task $udtlf = new UserDateTotalListFactory(); //FIXME: Should Absence time be included as "regular time". We do this on //the timesheet view manually as of 12-Jan-06. If we included it in the //regular time system totals, we wouldn't have to do it manually. //$udtlf->getByUserDateIdAndStatus( $this->getUserDateID(), array(20,30) ); $udtlf->getByUserDateIdAndStatus($this->getUserDateID(), array(20)); if ($udtlf->getRecordCount() > 0) { Debug::text('Found Total Hours for just regular time: Record Count: ' . $udtlf->getRecordCount(), __FILE__, __LINE__, __METHOD__, 10); $user_date_regular_time_compact_arr = NULL; foreach ($udtlf as $udt_obj) { //Create compact array, so we don't make as many system entries. //Check if this is a paid absence or not. if ($udt_obj->getStatus() == 20 and $udt_obj->getTotalTime() > 0) { $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()]); } if (isset($user_date_regular_time_compact_arr[(int) $udt_obj->getBranch()][(int) $udt_obj->getDepartment()][(int) $udt_obj->getJob()][(int) $udt_obj->getJobItem()])) { Debug::text(' Adding to Compact Array: Regular Time - Branch: ' . (int) $udt_obj->getBranch() . ' Department: ' . (int) $udt_obj->getDepartment(), __FILE__, __LINE__, __METHOD__, 10); $user_date_regular_time_compact_arr[(int) $udt_obj->getBranch()][(int) $udt_obj->getDepartment()][(int) $udt_obj->getJob()][(int) $udt_obj->getJobItem()]['total_time'] += $udt_total_time; $user_date_regular_time_compact_arr[(int) $udt_obj->getBranch()][(int) $udt_obj->getDepartment()][(int) $udt_obj->getJob()][(int) $udt_obj->getJobItem()]['quantity'] += $udt_obj->getQuantity(); $user_date_regular_time_compact_arr[(int) $udt_obj->getBranch()][(int) $udt_obj->getDepartment()][(int) $udt_obj->getJob()][(int) $udt_obj->getJobItem()]['bad_quantity'] += $udt_obj->getBadQuantity(); } else { $user_date_regular_time_compact_arr[(int) $udt_obj->getBranch()][(int) $udt_obj->getDepartment()][(int) $udt_obj->getJob()][(int) $udt_obj->getJobItem()] = array('total_time' => $udt_total_time, 'quantity' => $udt_obj->getQuantity(), 'bad_quantity' => $udt_obj->getBadQuantity()); } unset($udt_total_time); } else { Debug::text('Total Time is 0!!: ' . $udt_obj->getTotalTime() . ' Or its an UNPAID absence: ' . $udt_obj->getStatus(), __FILE__, __LINE__, __METHOD__, 10); } } if (isset($user_date_regular_time_compact_arr)) { foreach ($user_date_regular_time_compact_arr as $branch_id => $branch_arr) { //foreach($branch_arr as $department_id => $total_time ) { foreach ($branch_arr as $department_id => $department_arr) { foreach ($department_arr as $job_id => $job_arr) { foreach ($job_arr as $job_item_id => $data_arr) { Debug::text('Compact Array Entry: bRegular Time - Branch ID: ' . $branch_id . ' Department ID: ' . $department_id . ' Job ID: ' . $job_id . ' Job Item ID: ' . $job_item_id . ' Total Time: ' . $data_arr['total_time'], __FILE__, __LINE__, __METHOD__, 10); $udtf = new UserDateTotalFactory(); $udtf->setUserDateID($this->getUserDateID()); $udtf->setStatus(10); //System $udtf->setType(20); //Regular $udtf->setBranch($branch_id); $udtf->setDepartment($department_id); $udtf->setJob($job_id); $udtf->setJobItem($job_item_id); $udtf->setQuantity($data_arr['quantity']); $udtf->setBadQuantity($data_arr['bad_quantity']); $udtf->setTotalTime($data_arr['total_time']); $udtf->setEnableCalcSystemTotalTime(FALSE); $udtf->Save(); } } } } } unset($user_date_regular_time_compact_arr); } } //Handle Premium time. $this->calcPremiumPolicyTotalTime($udt_meal_policy_adjustment_arr, $udt_break_policy_adjustment_arr, $daily_total_time); //Total Hours $udtf = new UserDateTotalFactory(); $udtf->setUserDateID($this->getUserDateID()); $udtf->setStatus(10); //System $udtf->setType(10); //Total $udtf->setTotalTime($daily_total_time); $udtf->setEnableCalcSystemTotalTime(FALSE); if ($udtf->isValid()) { $return_value = $udtf->Save(); } else { $return_value = FALSE; } $profiler->stopTimer("UserDateTotal::calcSystemTotalTime() - Part 3"); if ($this->getEnableCalcException() == TRUE) { ExceptionPolicyFactory::calcExceptions($this->getUserDateID(), $this->getEnablePreMatureException()); } return $return_value; }