Exemplo n.º 1
0
 function setUserDateTotalArray()
 {
     //Loop through unique UserDateTotal rows... Adding entries to pay stubs.
     $udtlf = new UserDateTotalListFactory();
     $udtlf->getByUserIdAndPayPeriodIdAndEndDate($this->getUser(), $this->getPayPeriod(), $this->getPayPeriodObject()->getEndDate());
     $dock_absence_time = 0;
     $paid_absence_time = 0;
     $dock_absence_amount = 0;
     $paid_absence_amount = 0;
     $prev_wage_effective_date = 0;
     if ($udtlf->getRecordCount() > 0) {
         foreach ($udtlf as $udt_obj) {
             Debug::text('User Total Row... Type: ' . $udt_obj->getType() . ' OverTime Policy ID: ' . $udt_obj->getOverTimePolicyID() . ' User Wage ID: ' . $udt_obj->getColumn('user_wage_id'), __FILE__, __LINE__, __METHOD__, 10);
             if ($udt_obj->getStatus() == 10 and $udt_obj->getType() == 20) {
                 //Regular Time
                 Debug::text('User Total Row... Regular Time: ' . $udt_obj->getTotalTime(), __FILE__, __LINE__, __METHOD__, 10);
                 //Check if they are a salary user...
                 //Use WORKED time to calculate regular time. Not just regular time.
                 if (is_object($this->getUserWageObject($udt_obj->getColumn('user_wage_id'))) and $this->getUserWageObject($udt_obj->getColumn('user_wage_id'))->getType() != 10) {
                     //Salary
                     Debug::text('Strict Salary Wage: Reduce Regular Pay By: Dock Time: ' . $dock_absence_time . ' and Paid Absence: ' . $paid_absence_time, __FILE__, __LINE__, __METHOD__, 10);
                     if (isset($dock_absence_amount_arr[$udt_obj->getColumn('user_wage_id')])) {
                         $dock_absence_wage = $dock_absence_amount_arr[$udt_obj->getColumn('user_wage_id')];
                     } else {
                         $dock_absence_wage = 0;
                     }
                     if (isset($reduce_salary_absence_amount_arr[$udt_obj->getColumn('user_wage_id')])) {
                         $paid_absence_wage = $reduce_salary_absence_amount_arr[$udt_obj->getColumn('user_wage_id')];
                     } else {
                         $paid_absence_wage = 0;
                     }
                     Debug::text('Wage ID: ' . $udt_obj->getColumn('user_wage_id') . ' Dock Absence Wage: ' . $dock_absence_wage . ' Paid Absence Wage: ' . $paid_absence_wage, __FILE__, __LINE__, __METHOD__, 10);
                     $maximum_wage_salary = UserWageFactory::proRateSalary($this->getMaximumPayPeriodWage($udt_obj->getColumn('user_wage_id')), $this->getUserWageObject($udt_obj->getColumn('user_wage_id'))->getEffectiveDate(), $prev_wage_effective_date, $this->getPayPeriodObject()->getStartDate(), $this->getPayPeriodObject()->getEndDate());
                     $prev_wage_effective_date = $this->getUserWageObject($udt_obj->getColumn('user_wage_id'))->getEffectiveDate();
                     $amount = bcsub($maximum_wage_salary, bcadd($dock_absence_wage, $paid_absence_wage));
                     $total_time = $udt_obj->getTotalTime();
                     //Dont minus dock/paid absence time. Because its already not included.
                     $rate = NULL;
                     $pay_stub_entry = $this->getPayStubEntryAccountLinkObject()->getRegularTime();
                     unset($dock_absence_wage, $paid_absence_wage);
                 } else {
                     //Hourly
                     Debug::text('Hourly or Hourly + Bonus Wage', __FILE__, __LINE__, __METHOD__, 10);
                     $pay_stub_entry = $this->getPayStubEntryAccountLinkObject()->getRegularTime();
                     $total_time = $udt_obj->getTotalTime();
                     $rate = $this->getHourlyRate($udt_obj->getColumn('user_wage_id'));
                     $amount = $this->getWage($udt_obj->getTotalTime(), $rate);
                 }
                 Debug::text('aPay Stub Entry Account ID: ' . $pay_stub_entry . ' Amount: ' . $amount, __FILE__, __LINE__, __METHOD__, 10);
             } elseif ($udt_obj->getStatus() == 10 and $udt_obj->getType() == 30) {
                 //Overtime
                 Debug::text('User Total Row... Overtime Time: ' . $udt_obj->getTotalTime(), __FILE__, __LINE__, __METHOD__, 10);
                 //Get overtime policy info. Allow negative rates so they withdraw from pay stub accounts.
                 if ($udt_obj->getOverTimePolicyObject()->getRate() != 0) {
                     Debug::text('Paid Overtime Time Policy... Rate: ' . $udt_obj->getOverTimePolicyObject()->getRate(), __FILE__, __LINE__, __METHOD__, 10);
                     $pay_stub_entry = $udt_obj->getOverTimePolicyObject()->getPayStubEntryAccountId();
                     $total_time = $udt_obj->getTotalTime();
                     $rate = bcmul($this->getHourlyRate($udt_obj->getColumn('over_time_policy_wage_id')), $udt_obj->getOverTimePolicyObject()->getRate());
                     $amount = $this->getWage($udt_obj->getTotalTime(), $rate);
                     Debug::text('bPay Stub Entry Account ID: ' . $pay_stub_entry . ' Amount: ' . $amount . ' Rate: ' . $rate, __FILE__, __LINE__, __METHOD__, 10);
                 } else {
                     Debug::text('NOT Paid Overtime Time Policy: ', __FILE__, __LINE__, __METHOD__, 10);
                 }
             } elseif ($udt_obj->getStatus() == 30 and $udt_obj->getType() == 10) {
                 //Absence
                 Debug::text('User Total Row... Absence Time: ' . $udt_obj->getTotalTime(), __FILE__, __LINE__, __METHOD__, 10);
                 if (is_object($udt_obj->getAbsencePolicyObject()) and ($udt_obj->getAbsencePolicyObject()->getType() == 10 or $udt_obj->getAbsencePolicyObject()->getType() == 12) and $udt_obj->getAbsencePolicyObject()->getPayStubEntryAccountID() != '') {
                     //Paid
                     Debug::text('Paid Absence Time: ' . $udt_obj->getTotalTime(), __FILE__, __LINE__, __METHOD__, 10);
                     $pay_stub_entry = (int) $udt_obj->getAbsencePolicyObject()->getPayStubEntryAccountID();
                     $total_time = $udt_obj->getTotalTime();
                     $rate = bcmul($this->getHourlyRate($udt_obj->getColumn('absence_policy_wage_id')), $udt_obj->getAbsencePolicyObject()->getRate());
                     $amount = $this->getWage($udt_obj->getTotalTime(), $rate);
                     //$rate = $this->getHourlyRate( $udt_obj->getColumn('absence_policy_wage_id') );
                     //$amount = $this->getWage( $udt_obj->getTotalTime(), $this->getHourlyRate( $udt_obj->getColumn('absence_policy_wage_id') ) );
                     //Debug::text('Paid Absence Info: '. $udt_obj->getTotalTime() , __FILE__, __LINE__, __METHOD__,10);
                     Debug::text('cPay Stub Entry Account ID: ' . $pay_stub_entry . ' Amount: ' . $amount . ' Rate: ' . $rate, __FILE__, __LINE__, __METHOD__, 10);
                     $paid_absence_time = bcadd($paid_absence_time, $udt_obj->getTotalTime());
                     $paid_absence_amount = bcadd($paid_absence_amount, $amount);
                     //Make sure we add the amount below. Incase there are two or more
                     //entries for a paid absence in the same user_wage_id on one pay stub.
                     if (!isset($paid_absence_amount_arr[$udt_obj->getColumn('absence_policy_wage_id')])) {
                         $paid_absence_amount_arr[$udt_obj->getColumn('absence_policy_wage_id')] = 0;
                     }
                     $paid_absence_amount_arr[$udt_obj->getColumn('absence_policy_wage_id')] = bcadd($paid_absence_amount_arr[$udt_obj->getColumn('absence_policy_wage_id')], $amount);
                     //Some paid absences are over and above employees salary, so we need to track them separately.
                     //So we only reduce the salary of the amount of regular paid absences, not "Paid (Above Salary)" absences.
                     if (!isset($reduce_salary_absence_amount_arr[$udt_obj->getColumn('absence_policy_wage_id')])) {
                         $reduce_salary_absence_amount_arr[$udt_obj->getColumn('absence_policy_wage_id')] = 0;
                     }
                     if ($udt_obj->getAbsencePolicyObject()->getType() == 10) {
                         $reduce_salary_absence_amount_arr[$udt_obj->getColumn('absence_policy_wage_id')] = bcadd($reduce_salary_absence_amount_arr[$udt_obj->getColumn('absence_policy_wage_id')], $amount);
                     }
                 } elseif (is_object($udt_obj->getAbsencePolicyObject()) and $udt_obj->getAbsencePolicyObject()->getType() == 30) {
                     $dock_absence_time = bcadd($dock_absence_time, $udt_obj->getTotalTime());
                     $rate = bcmul($this->getHourlyRate($udt_obj->getColumn('absence_policy_wage_id')), $udt_obj->getAbsencePolicyObject()->getRate());
                     $amount = $this->getWage($udt_obj->getTotalTime(), $rate);
                     //$amount = $this->getWage( $udt_obj->getTotalTime(), $this->getHourlyRate( $udt_obj->getColumn('absence_policy_wage_id') ) );
                     $dock_absence_amount = bcadd($dock_absence_amount, $amount);
                     $dock_absence_amount_arr[$udt_obj->getColumn('absence_policy_wage_id')] = $amount;
                     Debug::text('DOCK Absence Time.. Adding: ' . $udt_obj->getTotalTime() . ' Total: ' . $dock_absence_time . ' Rate: ' . $rate, __FILE__, __LINE__, __METHOD__, 10);
                     unset($rate);
                 }
             } elseif ($udt_obj->getStatus() == 10 and $udt_obj->getType() == 40) {
                 //Premium
                 Debug::text('User Total Row... Premium Time: ' . $udt_obj->getTotalTime(), __FILE__, __LINE__, __METHOD__, 10);
                 //Get premium policy info.
                 if (is_object($udt_obj->getPremiumPolicyObject()) and $udt_obj->getPremiumPolicyObject()->getRate() != 0) {
                     Debug::text('Paid Premium Time Policy... Rate: ' . $udt_obj->getPremiumPolicyObject()->getRate(), __FILE__, __LINE__, __METHOD__, 10);
                     switch ($udt_obj->getPremiumPolicyObject()->getPayType()) {
                         case 10:
                             //Pay Factor
                             //Since they are already paid for this time with regular or OT, minus 1 from the rate
                             $rate = bcmul($this->getHourlyRate($udt_obj->getColumn('premium_policy_wage_id')), bcsub($udt_obj->getPremiumPolicyObject()->getRate(), 1));
                             break;
                         case 20:
                             //Pay Plus Premium
                             $rate = $udt_obj->getPremiumPolicyObject()->getRate();
                             break;
                         case 30:
                             //Flat Hourly Rate
                             //Get the difference between the employees current wage and the premium wage.
                             $rate = bcsub($udt_obj->getPremiumPolicyObject()->getRate(), $this->getHourlyRate($udt_obj->getColumn('premium_policy_wage_id')));
                             break;
                     }
                     $pay_stub_entry = $udt_obj->getPremiumPolicyObject()->getPayStubEntryAccountId();
                     $total_time = $udt_obj->getTotalTime();
                     $amount = $this->getWage($udt_obj->getTotalTime(), $rate);
                     Debug::text('dPay Stub Entry Account ID: ' . $pay_stub_entry . ' Amount: ' . $amount . ' Rate: ' . $rate, __FILE__, __LINE__, __METHOD__, 10);
                 } else {
                     Debug::text('NOT Paid Premium Time Policy: ', __FILE__, __LINE__, __METHOD__, 10);
                 }
             }
             if (isset($pay_stub_entry) and $pay_stub_entry != '') {
                 Debug::text('zPay Stub Entry Account ID: ' . $pay_stub_entry . ' Amount: ' . $amount, __FILE__, __LINE__, __METHOD__, 10);
                 $ret_arr['entries'][] = array('user_wage_id' => $udt_obj->getColumn('user_wage_id'), 'pay_stub_entry' => $pay_stub_entry, 'total_time' => $total_time, 'amount' => $amount, 'rate' => $rate);
             }
             unset($pay_stub_entry, $amount, $total_time, $rate);
         }
     } else {
         Debug::text('NO UserDate Total entries found.', __FILE__, __LINE__, __METHOD__, 10);
     }
     $ret_arr['other']['paid_absence_time'] = $paid_absence_time;
     $ret_arr['other']['dock_absence_time'] = $dock_absence_time;
     $ret_arr['other']['paid_absence_amount'] = $paid_absence_amount;
     $ret_arr['other']['dock_absence_amount'] = $dock_absence_amount;
     if (isset($ret_arr)) {
         Debug::Arr($ret_arr, 'UserDateTotal Array', __FILE__, __LINE__, __METHOD__, 10);
         return $this->user_date_total_arr = $ret_arr;
     }
     return FALSE;
 }