Пример #1
0
 function getData()
 {
     $psenlf = new PayStubEntryNameListFactory();
     $pslf = new PayStubListFactory();
     //$pslf->getByIdAndUserId($id, $current_user->getId(), $current_user_prefs->getItemsPerPage(), $page, NULL, array($sort_column => $sort_order) );
     $pslf->getById($this->pay_stub_id);
     $pager = new Pager($pslf);
     foreach ($pslf as $pay_stub_obj) {
         //Get pay stub entries.
         $pself = new PayStubEntryListFactory();
         $pself->getByPayStubId($pay_stub_obj->getId());
         $prev_type = NULL;
         $description_subscript_counter = 1;
         foreach ($pself as $pay_stub_entry) {
             $description_subscript = NULL;
             $pay_stub_entry_name_obj = $psenlf->getById($pay_stub_entry->getPayStubEntryNameId())->getCurrent();
             if ($prev_type == 40 or $pay_stub_entry_name_obj->getType() != 40) {
                 $type = $pay_stub_entry_name_obj->getType();
             }
             if ($pay_stub_entry->getDescription() !== NULL and $pay_stub_entry->getDescription() !== FALSE) {
                 $pay_stub_entry_descriptions[] = array('subscript' => $description_subscript_counter, 'description' => $pay_stub_entry->getDescription());
                 $description_subscript = $description_subscript_counter;
                 $description_subscript_counter++;
             }
             $this->pay_stub_entries[$type][] = array('id' => $pay_stub_entry->getId(), 'pay_stub_entry_name_id' => $pay_stub_entry->getPayStubEntryNameId(), 'type' => $pay_stub_entry_name_obj->getType(), 'name' => $pay_stub_entry_name_obj->getName(), 'display_name' => $pay_stub_entry_name_obj->getDescription(), 'rate' => $pay_stub_entry->getRate(), 'units' => $pay_stub_entry->getUnits(), 'ytd_units' => $pay_stub_entry->getYTDUnits(), 'amount' => $pay_stub_entry->getAmount(), 'ytd_amount' => $pay_stub_entry->getYTDAmount(), 'description' => $pay_stub_entry->getDescription(), 'description_subscript' => $description_subscript, 'created_date' => $pay_stub_entry->getCreatedDate(), 'created_by' => $pay_stub_entry->getCreatedBy(), 'updated_date' => $pay_stub_entry->getUpdatedDate(), 'updated_by' => $pay_stub_entry->getUpdatedBy(), 'deleted_date' => $pay_stub_entry->getDeletedDate(), 'deleted_by' => $pay_stub_entry->getDeletedBy());
             $prev_type = $pay_stub_entry_name_obj->getType();
         }
         //'entries' => $pay_stub_entries,
         $this->pay_stub = array('id' => $pay_stub_obj->getId(), 'user_id' => $pay_stub_obj->getUser(), 'pay_period_id' => $pay_stub_obj->getPayPeriod(), 'advance' => $pay_stub_obj->getAdvance(), 'status' => $pay_stub_obj->getStatus(), 'created_date' => $pay_stub_obj->getCreatedDate(), 'created_by' => $pay_stub_obj->getCreatedBy(), 'updated_date' => $pay_stub_obj->getUpdatedDate(), 'updated_by' => $pay_stub_obj->getUpdatedBy(), 'deleted_date' => $pay_stub_obj->getDeletedDate(), 'deleted_by' => $pay_stub_obj->getDeletedBy());
         //Get Pay Period information
         $pplf = new PayPeriodListFactory();
         $pay_period_obj = $pplf->getById($pay_stub_obj->getPayPeriod())->getCurrent();
         if ($pay_stub_obj->getAdvance() == TRUE) {
             $pp_start_date = $pay_period_obj->getStartDate();
             $pp_end_date = $pay_period_obj->getAdvanceEndDate();
             $pp_transaction_date = $pay_period_obj->getAdvanceTransactionDate();
         } else {
             $pp_start_date = $pay_period_obj->getStartDate();
             $pp_end_date = $pay_period_obj->getEndDate();
             $pp_transaction_date = $pay_period_obj->getTransactionDate();
         }
         $this->pay_period = array('start_date' => TTDate::getDate('DATE', $pp_start_date), 'end_date' => TTDate::getDate('DATE', $pp_end_date), 'transaction_date' => TTDate::getDate('DATE', $pp_transaction_date));
         //Get User information
         $ulf = new UserListFactory();
         $this->user_obj = $ulf->getById($pay_stub_obj->getUser())->getCurrent();
         //Get company information
         $clf = new CompanyListFactory();
         $this->company_obj = $clf->getById($this->user_obj->getCompany())->getCurrent();
     }
 }
Пример #2
0
 function testEditMultiplePayStub()
 {
     //Test all parts of multiple pay stubs that span a year boundary.
     //Start 6 pay periods from the last one. Should be beginning/end of December,
     //Its the TRANSACTION date that counts
     $start_pay_period_id = count($this->pay_period_objs) - 6;
     Debug::text('Starting Pay Period: ' . TTDate::getDate('DATE+TIME', $this->pay_period_objs[$start_pay_period_id]->getStartDate()), __FILE__, __LINE__, __METHOD__, 10);
     //
     // First Pay Stub
     //
     //Test UnUsed YTD entries...
     $pay_stub = new PayStubFactory();
     $pay_stub->setUser($this->user_id);
     $pay_stub->setPayPeriod($this->pay_period_objs[$start_pay_period_id]->getId());
     $pay_stub->setStatus('NEW');
     $pay_stub->setDefaultDates();
     $pay_stub->loadPreviousPayStub();
     $pse_accounts = array('regular_time' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 10, 'Regular Time'), 'over_time_1' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 10, 'Over Time 1'), 'vacation_accrual_release' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 10, 'Vacation Accrual Release'), 'federal_income_tax' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 20, 'Federal Income Tax'), 'state_income_tax' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 20, 'State Income Tax'), 'medicare' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 30, 'Medicare'), 'state_unemployment' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 30, 'State Unemployment Ins.'), 'vacation_accrual' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 50, 'Vacation Accrual'));
     $pay_stub->addEntry($pse_accounts['regular_time'], 100.01);
     $pay_stub->addEntry($pse_accounts['regular_time'], 10.01);
     $pay_stub->addEntry($pse_accounts['over_time_1'], 100.02);
     $pay_stub->addEntry($pse_accounts['vacation_accrual_release'], 1.0);
     $pay_stub->addEntry($pse_accounts['federal_income_tax'], 50.01);
     $pay_stub->addEntry($pse_accounts['state_income_tax'], 25.04);
     $pay_stub->addEntry($pse_accounts['medicare'], 10.01);
     $pay_stub->addEntry($pse_accounts['state_unemployment'], 15.05);
     $pay_stub->addEntry($pse_accounts['vacation_accrual'], 5.01);
     $pay_stub->setEnableProcessEntries(TRUE);
     $pay_stub->processEntries();
     if ($pay_stub->isValid() == TRUE) {
         Debug::text('Pay Stub is valid, final save.', __FILE__, __LINE__, __METHOD__, 10);
         $first_pay_stub_id = $pay_stub_id = $pay_stub->Save();
     }
     $pse_arr = $this->getPayStubEntryArray($pay_stub_id);
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][0]['amount'], '100.01');
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][0]['ytd_amount'], '0.00');
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][1]['amount'], '10.01');
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][1]['ytd_amount'], '110.02');
     $this->assertEquals($pse_arr[$pse_accounts['over_time_1']][0]['amount'], '100.02');
     $this->assertEquals($pse_arr[$pse_accounts['over_time_1']][0]['ytd_amount'], '100.02');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual_release']][0]['amount'], '1.00');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual_release']][0]['ytd_amount'], '1.00');
     $this->assertEquals($pse_arr[$pse_accounts['federal_income_tax']][0]['amount'], '50.01');
     $this->assertEquals($pse_arr[$pse_accounts['federal_income_tax']][0]['ytd_amount'], '50.01');
     $this->assertEquals($pse_arr[$pse_accounts['state_income_tax']][0]['amount'], '25.04');
     $this->assertEquals($pse_arr[$pse_accounts['state_income_tax']][0]['ytd_amount'], '25.04');
     $this->assertEquals($pse_arr[$pse_accounts['medicare']][0]['amount'], '10.01');
     $this->assertEquals($pse_arr[$pse_accounts['medicare']][0]['ytd_amount'], '10.01');
     $this->assertEquals($pse_arr[$pse_accounts['state_unemployment']][0]['amount'], '15.05');
     $this->assertEquals($pse_arr[$pse_accounts['state_unemployment']][0]['ytd_amount'], '15.05');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][0]['amount'], '-1.00');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][0]['ytd_amount'], '0.00');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][1]['amount'], '5.01');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][1]['ytd_amount'], '4.01');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['amount'], '211.04');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['ytd_amount'], '211.04');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'], '75.05');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['ytd_amount'], '75.05');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'], '135.99');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['ytd_amount'], '135.99');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['employer_contribution']][0]['amount'], '25.06');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['employer_contribution']][0]['ytd_amount'], '25.06');
     unset($pse_arr, $pay_stub_id, $pay_stub);
     //
     //
     //
     //Second Pay Stub
     //
     //
     //
     $pay_stub = new PayStubFactory();
     $pay_stub->setUser($this->user_id);
     $pay_stub->setPayPeriod($this->pay_period_objs[$start_pay_period_id + 1]->getId());
     $pay_stub->setStatus('NEW');
     $pay_stub->setDefaultDates();
     $pay_stub->loadPreviousPayStub();
     $pse_accounts = array('regular_time' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 10, 'Regular Time'), 'over_time_1' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 10, 'Over Time 1'), 'vacation_accrual_release' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 10, 'Vacation Accrual Release'), 'federal_income_tax' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 20, 'Federal Income Tax'), 'state_income_tax' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 20, 'State Income Tax'), 'medicare' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 30, 'Medicare'), 'state_unemployment' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 30, 'State Unemployment Ins.'), 'vacation_accrual' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 50, 'Vacation Accrual'));
     $pay_stub->addEntry($pse_accounts['regular_time'], 198.01);
     $pay_stub->addEntry($pse_accounts['regular_time'], 12.01);
     //$pay_stub->addEntry( $pse_accounts['over_time_1'], 111.02 );
     $pay_stub->addEntry($pse_accounts['vacation_accrual_release'], 1.03);
     $pay_stub->addEntry($pse_accounts['federal_income_tax'], 53.01);
     $pay_stub->addEntry($pse_accounts['state_income_tax'], 27.04);
     $pay_stub->addEntry($pse_accounts['medicare'], 13.04);
     $pay_stub->addEntry($pse_accounts['state_unemployment'], 16.09);
     $pay_stub->addEntry($pse_accounts['vacation_accrual'], 6.01);
     $pay_stub->setEnableProcessEntries(TRUE);
     $pay_stub->processEntries();
     if ($pay_stub->isValid() == TRUE) {
         Debug::text('Pay Stub is valid, final save.', __FILE__, __LINE__, __METHOD__, 10);
         $second_pay_stub_id = $pay_stub_id = $pay_stub->Save();
     }
     $pse_arr = $this->getPayStubEntryArray($pay_stub_id);
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][0]['amount'], '198.01');
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][0]['ytd_amount'], '0.00');
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][1]['amount'], '12.01');
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][1]['ytd_amount'], '320.04');
     $this->assertEquals($pse_arr[$pse_accounts['over_time_1']][0]['amount'], '0.00');
     $this->assertEquals($pse_arr[$pse_accounts['over_time_1']][0]['ytd_amount'], '100.02');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual_release']][0]['amount'], '1.03');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual_release']][0]['ytd_amount'], '2.03');
     $this->assertEquals($pse_arr[$pse_accounts['federal_income_tax']][0]['amount'], '53.01');
     $this->assertEquals($pse_arr[$pse_accounts['federal_income_tax']][0]['ytd_amount'], '103.02');
     $this->assertEquals($pse_arr[$pse_accounts['state_income_tax']][0]['amount'], '27.04');
     $this->assertEquals($pse_arr[$pse_accounts['state_income_tax']][0]['ytd_amount'], '52.08');
     $this->assertEquals($pse_arr[$pse_accounts['medicare']][0]['amount'], '13.04');
     $this->assertEquals($pse_arr[$pse_accounts['medicare']][0]['ytd_amount'], '23.05');
     $this->assertEquals($pse_arr[$pse_accounts['state_unemployment']][0]['amount'], '16.09');
     $this->assertEquals($pse_arr[$pse_accounts['state_unemployment']][0]['ytd_amount'], '31.14');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][0]['amount'], '-1.03');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][0]['ytd_amount'], '0.00');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][1]['amount'], '6.01');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][1]['ytd_amount'], '8.99');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['amount'], '211.05');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['ytd_amount'], '422.09');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'], '80.05');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['ytd_amount'], '155.10');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'], '131.00');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['ytd_amount'], '266.99');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['employer_contribution']][0]['amount'], '29.13');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['employer_contribution']][0]['ytd_amount'], '54.19');
     unset($pse_arr, $pay_stub_id, $pay_stub);
     //
     // Third Pay Stub
     //
     //Test UnUsed YTD entries...
     $pay_stub = new PayStubFactory();
     $pay_stub->setUser($this->user_id);
     $pay_stub->setPayPeriod($this->pay_period_objs[$start_pay_period_id + 2]->getId());
     $pay_stub->setStatus('NEW');
     $pay_stub->setDefaultDates();
     $pay_stub->loadPreviousPayStub();
     $pse_accounts = array('regular_time' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 10, 'Regular Time'), 'over_time_1' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 10, 'Over Time 1'), 'vacation_accrual_release' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 10, 'Vacation Accrual Release'), 'federal_income_tax' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 20, 'Federal Income Tax'), 'state_income_tax' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 20, 'State Income Tax'), 'medicare' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 30, 'Medicare'), 'state_unemployment' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 30, 'State Unemployment Ins.'), 'vacation_accrual' => CompanyDeductionFactory::getPayStubEntryAccountByCompanyIDAndTypeAndFuzzyName($this->company_id, 50, 'Vacation Accrual'));
     $pay_stub->addEntry($pse_accounts['regular_time'], 100.01);
     $pay_stub->addEntry($pse_accounts['regular_time'], 10.01);
     $pay_stub->addEntry($pse_accounts['over_time_1'], 100.02);
     $pay_stub->addEntry($pse_accounts['vacation_accrual_release'], 1.0);
     $pay_stub->addEntry($pse_accounts['federal_income_tax'], 50.01);
     $pay_stub->addEntry($pse_accounts['state_income_tax'], 25.04);
     $pay_stub->addEntry($pse_accounts['medicare'], 10.01);
     $pay_stub->addEntry($pse_accounts['state_unemployment'], 15.05);
     $pay_stub->addEntry($pse_accounts['vacation_accrual'], 5.01);
     $pay_stub->setEnableProcessEntries(TRUE);
     $pay_stub->processEntries();
     if ($pay_stub->isValid() == TRUE) {
         $third_pay_stub_id = $pay_stub_id = $pay_stub->Save();
         Debug::text('Pay Stub is valid, final save, ID: ' . $pay_stub_id, __FILE__, __LINE__, __METHOD__, 10);
     }
     $pse_arr = $this->getPayStubEntryArray($pay_stub_id);
     //
     // IN NEW YEAR, YTD amounts are zero'd!
     //
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][0]['amount'], '100.01');
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][0]['ytd_amount'], '0.00');
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][1]['amount'], '10.01');
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][1]['ytd_amount'], '110.02');
     $this->assertEquals($pse_arr[$pse_accounts['over_time_1']][0]['amount'], '100.02');
     $this->assertEquals($pse_arr[$pse_accounts['over_time_1']][0]['ytd_amount'], '100.02');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual_release']][0]['amount'], '1.00');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual_release']][0]['ytd_amount'], '1.00');
     $this->assertEquals($pse_arr[$pse_accounts['federal_income_tax']][0]['amount'], '50.01');
     $this->assertEquals($pse_arr[$pse_accounts['federal_income_tax']][0]['ytd_amount'], '50.01');
     $this->assertEquals($pse_arr[$pse_accounts['state_income_tax']][0]['amount'], '25.04');
     $this->assertEquals($pse_arr[$pse_accounts['state_income_tax']][0]['ytd_amount'], '25.04');
     $this->assertEquals($pse_arr[$pse_accounts['medicare']][0]['amount'], '10.01');
     $this->assertEquals($pse_arr[$pse_accounts['medicare']][0]['ytd_amount'], '10.01');
     $this->assertEquals($pse_arr[$pse_accounts['state_unemployment']][0]['amount'], '15.05');
     $this->assertEquals($pse_arr[$pse_accounts['state_unemployment']][0]['ytd_amount'], '15.05');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][0]['amount'], '-1.00');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][0]['ytd_amount'], '0.00');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][1]['amount'], '5.01');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][1]['ytd_amount'], '13.00');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['amount'], '211.04');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['ytd_amount'], '211.04');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'], '75.05');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['ytd_amount'], '75.05');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'], '135.99');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['ytd_amount'], '135.99');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['employer_contribution']][0]['amount'], '25.06');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['employer_contribution']][0]['ytd_amount'], '25.06');
     unset($pse_arr, $pay_stub_id, $pay_stub);
     //
     //Now edit the first pay stub.
     //
     $pslf = new PayStubListFactory();
     $pay_stub = $pslf->getByID($first_pay_stub_id)->getCurrent();
     $pay_stub->loadPreviousPayStub();
     $pay_stub->deleteEntries(TRUE);
     $pay_stub->setEnableLinkedAccruals(FALSE);
     $pay_stub->addEntry($pse_accounts['regular_time'], 105.01);
     $pay_stub->addEntry($pse_accounts['regular_time'], 10.01);
     $pay_stub->addEntry($pse_accounts['over_time_1'], 100.02);
     $pay_stub->addEntry($pse_accounts['vacation_accrual_release'], 1.0);
     $pay_stub->addEntry($pse_accounts['federal_income_tax'], 50.01);
     $pay_stub->addEntry($pse_accounts['state_income_tax'], 25.04);
     $pay_stub->addEntry($pse_accounts['medicare'], 10.01);
     $pay_stub->addEntry($pse_accounts['state_unemployment'], 15.05);
     $pay_stub->addEntry($pse_accounts['vacation_accrual'], -1.0);
     $pay_stub->addEntry($pse_accounts['vacation_accrual'], 5.01);
     $pay_stub->setEnableProcessEntries(TRUE);
     $pay_stub->processEntries();
     if ($pay_stub->isValid() == TRUE) {
         $pay_stub->Save();
         //Recalculate all pay stubs after this one.
         $pslf = new PayStubListFactory();
         $pslf->getById($first_pay_stub_id);
         if ($pslf->getRecordCount() > 0) {
             $ps_obj = $pslf->getCurrent();
             $ps_obj->reCalculateYTD();
         }
         unset($ps_obj);
         //Debug::text('Pay Stub is valid, final save, ID: '. $pay_stub_id, __FILE__, __LINE__, __METHOD__,10);
     }
     $pse_arr = $this->getPayStubEntryArray($first_pay_stub_id);
     //Debug::Arr($pse_arr, 'Pay Stub Entry Arr: ', __FILE__, __LINE__, __METHOD__,10);
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][0]['amount'], '105.01');
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][0]['ytd_amount'], '0.00');
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][1]['amount'], '10.01');
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][1]['ytd_amount'], '115.02');
     $this->assertEquals($pse_arr[$pse_accounts['over_time_1']][0]['amount'], '100.02');
     $this->assertEquals($pse_arr[$pse_accounts['over_time_1']][0]['ytd_amount'], '100.02');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual_release']][0]['amount'], '1.00');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual_release']][0]['ytd_amount'], '1.00');
     $this->assertEquals($pse_arr[$pse_accounts['federal_income_tax']][0]['amount'], '50.01');
     $this->assertEquals($pse_arr[$pse_accounts['federal_income_tax']][0]['ytd_amount'], '50.01');
     $this->assertEquals($pse_arr[$pse_accounts['state_income_tax']][0]['amount'], '25.04');
     $this->assertEquals($pse_arr[$pse_accounts['state_income_tax']][0]['ytd_amount'], '25.04');
     $this->assertEquals($pse_arr[$pse_accounts['medicare']][0]['amount'], '10.01');
     $this->assertEquals($pse_arr[$pse_accounts['medicare']][0]['ytd_amount'], '10.01');
     $this->assertEquals($pse_arr[$pse_accounts['state_unemployment']][0]['amount'], '15.05');
     $this->assertEquals($pse_arr[$pse_accounts['state_unemployment']][0]['ytd_amount'], '15.05');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][0]['amount'], '-1.00');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][0]['ytd_amount'], '0.00');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][1]['amount'], '5.01');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][1]['ytd_amount'], '4.01');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['amount'], '216.04');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['ytd_amount'], '216.04');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'], '75.05');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['ytd_amount'], '75.05');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'], '140.99');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['ytd_amount'], '140.99');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['employer_contribution']][0]['amount'], '25.06');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['employer_contribution']][0]['ytd_amount'], '25.06');
     unset($pse_arr, $pay_stub_id, $pay_stub);
     //
     // Confirm YTD values in second pay stub are correct
     //
     Debug::Text('First Pay Stub ID: ' . $first_pay_stub_id . ' Second Pay Stub ID: ' . $second_pay_stub_id, __FILE__, __LINE__, __METHOD__, 10);
     $pse_arr = $this->getPayStubEntryArray($second_pay_stub_id);
     //Debug::Arr($pse_arr, 'Second Pay Stub Entry Arr: ', __FILE__, __LINE__, __METHOD__,10);
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][0]['amount'], '198.01');
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][0]['ytd_amount'], '0.00');
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][1]['amount'], '12.01');
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][1]['ytd_amount'], '325.04');
     $this->assertEquals($pse_arr[$pse_accounts['over_time_1']][0]['amount'], '0.00');
     $this->assertEquals($pse_arr[$pse_accounts['over_time_1']][0]['ytd_amount'], '100.02');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual_release']][0]['amount'], '1.03');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual_release']][0]['ytd_amount'], '2.03');
     $this->assertEquals($pse_arr[$pse_accounts['federal_income_tax']][0]['amount'], '53.01');
     $this->assertEquals($pse_arr[$pse_accounts['federal_income_tax']][0]['ytd_amount'], '103.02');
     $this->assertEquals($pse_arr[$pse_accounts['state_income_tax']][0]['amount'], '27.04');
     $this->assertEquals($pse_arr[$pse_accounts['state_income_tax']][0]['ytd_amount'], '52.08');
     $this->assertEquals($pse_arr[$pse_accounts['medicare']][0]['amount'], '13.04');
     $this->assertEquals($pse_arr[$pse_accounts['medicare']][0]['ytd_amount'], '23.05');
     $this->assertEquals($pse_arr[$pse_accounts['state_unemployment']][0]['amount'], '16.09');
     $this->assertEquals($pse_arr[$pse_accounts['state_unemployment']][0]['ytd_amount'], '31.14');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][0]['amount'], '-1.03');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][0]['ytd_amount'], '0.00');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][1]['amount'], '6.01');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][1]['ytd_amount'], '8.99');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['amount'], '211.05');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['ytd_amount'], '427.09');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'], '80.05');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['ytd_amount'], '155.10');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'], '131.00');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['ytd_amount'], '271.99');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['employer_contribution']][0]['amount'], '29.13');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['employer_contribution']][0]['ytd_amount'], '54.19');
     unset($pse_arr, $pay_stub_id, $pay_stub);
     //
     // Confirm YTD values in third pay stub are correct
     //
     $pse_arr = $this->getPayStubEntryArray($third_pay_stub_id);
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][0]['amount'], '100.01');
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][0]['ytd_amount'], '0.00');
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][1]['amount'], '10.01');
     $this->assertEquals($pse_arr[$pse_accounts['regular_time']][1]['ytd_amount'], '110.02');
     $this->assertEquals($pse_arr[$pse_accounts['over_time_1']][0]['amount'], '100.02');
     $this->assertEquals($pse_arr[$pse_accounts['over_time_1']][0]['ytd_amount'], '100.02');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual_release']][0]['amount'], '1.00');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual_release']][0]['ytd_amount'], '1.00');
     $this->assertEquals($pse_arr[$pse_accounts['federal_income_tax']][0]['amount'], '50.01');
     $this->assertEquals($pse_arr[$pse_accounts['federal_income_tax']][0]['ytd_amount'], '50.01');
     $this->assertEquals($pse_arr[$pse_accounts['state_income_tax']][0]['amount'], '25.04');
     $this->assertEquals($pse_arr[$pse_accounts['state_income_tax']][0]['ytd_amount'], '25.04');
     $this->assertEquals($pse_arr[$pse_accounts['medicare']][0]['amount'], '10.01');
     $this->assertEquals($pse_arr[$pse_accounts['medicare']][0]['ytd_amount'], '10.01');
     $this->assertEquals($pse_arr[$pse_accounts['state_unemployment']][0]['amount'], '15.05');
     $this->assertEquals($pse_arr[$pse_accounts['state_unemployment']][0]['ytd_amount'], '15.05');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][0]['amount'], '-1.00');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][0]['ytd_amount'], '0.00');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][1]['amount'], '5.01');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][1]['ytd_amount'], '13.00');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['amount'], '211.04');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['ytd_amount'], '211.04');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['amount'], '75.05');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_deductions']][0]['ytd_amount'], '75.05');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['amount'], '135.99');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['ytd_amount'], '135.99');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['employer_contribution']][0]['amount'], '25.06');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['employer_contribution']][0]['ytd_amount'], '25.06');
     unset($pse_arr, $pay_stub_id, $pay_stub);
     return TRUE;
 }
 function getPayStub($pslf = NULL, $hide_employer_rows = TRUE)
 {
     if (!is_object($pslf) and $this->getId() != '') {
         $pslf = new PayStubListFactory();
         $pslf->getById($this->getId());
     }
     if (get_class($pslf) !== 'PayStubListFactory') {
         return FALSE;
     }
     $border = 0;
     if ($pslf->getRecordCount() > 0) {
         $pdf = new TTPDF('P', 'mm', 'Letter');
         $pdf->setMargins(0, 0);
         //$pdf->SetAutoPageBreak(TRUE, 30);
         $pdf->SetAutoPageBreak(FALSE);
         $pdf->SetFont('freeserif', '', 10);
         //$pdf->SetFont('FreeSans','',10);
         $i = 0;
         foreach ($pslf as $pay_stub_obj) {
             $psealf = new PayStubEntryAccountListFactory();
             Debug::text($i . '. Pay Stub Transaction Date: ' . $pay_stub_obj->getTransactionDate(), __FILE__, __LINE__, __METHOD__, 10);
             //Get Pay Period information
             $pplf = new PayPeriodListFactory();
             $pay_period_obj = $pplf->getById($pay_stub_obj->getPayPeriod())->getCurrent();
             //Use Pay Stub dates, not Pay Period dates.
             $pp_start_date = $pay_stub_obj->getStartDate();
             $pp_end_date = $pay_stub_obj->getEndDate();
             $pp_transaction_date = $pay_stub_obj->getTransactionDate();
             //Get pay period numbers
             $ppslf = new PayPeriodScheduleListFactory();
             $pay_period_schedule_obj = $ppslf->getById($pay_period_obj->getPayPeriodSchedule())->getCurrent();
             //Get User information
             $ulf = new UserListFactory();
             $user_obj = $ulf->getById($pay_stub_obj->getUser())->getCurrent();
             //Get company information
             $clf = new CompanyListFactory();
             $company_obj = $clf->getById($user_obj->getCompany())->getCurrent();
             //Change locale to users own locale.
             TTi18n::setCountry($user_obj->getCountry());
             TTi18n::setLanguage($user_obj->getUserPreferenceObject()->getLanguage());
             TTi18n::setLocale();
             //
             // Pay Stub Header
             //
             $pdf->AddPage();
             $adjust_x = 20;
             $adjust_y = 10;
             //Logo
             $pdf->Image($company_obj->getLogoFileName(), Misc::AdjustXY(0, $adjust_x + 0), Misc::AdjustXY(1, $adjust_y + 0), 50, 12, '', '', '', FALSE, 300, '', FALSE, FALSE, 0, TRUE);
             //Company name/address
             $pdf->SetFont('', 'B', 14);
             $pdf->setXY(Misc::AdjustXY(50, $adjust_x), Misc::AdjustXY(0, $adjust_y));
             $pdf->Cell(75, 5, $company_obj->getName(), $border, 0, 'C');
             $pdf->SetFont('', '', 10);
             $pdf->setXY(Misc::AdjustXY(50, $adjust_x), Misc::AdjustXY(5, $adjust_y));
             $pdf->Cell(75, 5, $company_obj->getAddress1() . ' ' . $company_obj->getAddress2(), $border, 0, 'C');
             $pdf->setXY(Misc::AdjustXY(50, $adjust_x), Misc::AdjustXY(10, $adjust_y));
             $pdf->Cell(75, 5, $company_obj->getCity() . ', ' . $company_obj->getProvince() . ' ' . strtoupper($company_obj->getPostalCode()), $border, 0, 'C');
             //Pay Period info
             $pdf->SetFont('', '', 10);
             $pdf->setXY(Misc::AdjustXY(125, $adjust_x), Misc::AdjustXY(0, $adjust_y));
             $pdf->Cell(30, 5, TTi18n::gettext('Pay Start Date:') . ' ', $border, 0, 'R');
             $pdf->setXY(Misc::AdjustXY(125, $adjust_x), Misc::AdjustXY(5, $adjust_y));
             $pdf->Cell(30, 5, TTi18n::gettext('Pay End Date:') . ' ', $border, 0, 'R');
             $pdf->setXY(Misc::AdjustXY(125, $adjust_x), Misc::AdjustXY(10, $adjust_y));
             $pdf->Cell(30, 5, TTi18n::gettext('Payment Date:') . ' ', $border, 0, 'R');
             $pdf->SetFont('', 'B', 10);
             $pdf->setXY(Misc::AdjustXY(155, $adjust_x), Misc::AdjustXY(0, $adjust_y));
             $pdf->Cell(20, 5, TTDate::getDate('DATE', $pp_start_date), $border, 0, 'R');
             $pdf->setXY(Misc::AdjustXY(155, $adjust_x), Misc::AdjustXY(5, $adjust_y));
             $pdf->Cell(20, 5, TTDate::getDate('DATE', $pp_end_date), $border, 0, 'R');
             $pdf->setXY(Misc::AdjustXY(155, $adjust_x), Misc::AdjustXY(10, $adjust_y));
             $pdf->Cell(20, 5, TTDate::getDate('DATE', $pp_transaction_date), $border, 0, 'R');
             //Line
             $pdf->setLineWidth(1);
             $pdf->Line(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY(17, $adjust_y), Misc::AdjustXY(185, $adjust_y), Misc::AdjustXY(17, $adjust_y));
             $pdf->SetFont('', 'B', 14);
             $pdf->setXY(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY(19, $adjust_y));
             $pdf->Cell(175, 5, TTi18n::gettext('STATEMENT OF EARNINGS AND DEDUCTIONS'), $border, 0, 'C', 0);
             //Line
             $pdf->setLineWidth(1);
             $pdf->Line(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY(27, $adjust_y), Misc::AdjustXY(185, $adjust_y), Misc::AdjustXY(27, $adjust_y));
             $pdf->setLineWidth(0.25);
             //Get pay stub entries.
             $pself = new PayStubEntryListFactory();
             $pself->getByPayStubId($pay_stub_obj->getId());
             Debug::text('Pay Stub Entries: ' . $pself->getRecordCount(), __FILE__, __LINE__, __METHOD__, 10);
             $prev_type = NULL;
             $description_subscript_counter = 1;
             foreach ($pself as $pay_stub_entry) {
                 Debug::text('Pay Stub Entry Account ID: ' . $pay_stub_entry->getPayStubEntryNameId(), __FILE__, __LINE__, __METHOD__, 10);
                 $description_subscript = NULL;
                 $pay_stub_entry_name_obj = $psealf->getById($pay_stub_entry->getPayStubEntryNameId())->getCurrent();
                 //Use this to put the total for each type at the end of the array.
                 if ($prev_type == 40 or $pay_stub_entry_name_obj->getType() != 40) {
                     $type = $pay_stub_entry_name_obj->getType();
                 }
                 //Debug::text('Pay Stub Entry Name ID: '. $pay_stub_entry_name_obj->getId() .' Type ID: '. $pay_stub_entry_name_obj->getType() .' Type: '. $type, __FILE__, __LINE__, __METHOD__,10);
                 if ($pay_stub_entry->getDescription() !== NULL and $pay_stub_entry->getDescription() !== FALSE and strlen($pay_stub_entry->getDescription()) > 0) {
                     $pay_stub_entry_descriptions[] = array('subscript' => $description_subscript_counter, 'description' => $pay_stub_entry->getDescription());
                     $description_subscript = $description_subscript_counter;
                     $description_subscript_counter++;
                 }
                 //If type if 40 (a total) and the amount is 0, skip it.
                 //This if the employee has no deductions at all, it won't be displayed
                 //on the pay stub.
                 if ($type != 40 or $type == 40 and $pay_stub_entry->getAmount() != 0) {
                     $pay_stub_entries[$type][] = array('id' => $pay_stub_entry->getId(), 'pay_stub_entry_name_id' => $pay_stub_entry->getPayStubEntryNameId(), 'type' => $pay_stub_entry_name_obj->getType(), 'name' => $pay_stub_entry_name_obj->getName(), 'display_name' => $pay_stub_entry_name_obj->getName(), 'rate' => $pay_stub_entry->getRate(), 'units' => $pay_stub_entry->getUnits(), 'ytd_units' => $pay_stub_entry->getYTDUnits(), 'amount' => $pay_stub_entry->getAmount(), 'ytd_amount' => $pay_stub_entry->getYTDAmount(), 'description' => $pay_stub_entry->getDescription(), 'description_subscript' => $description_subscript, 'created_date' => $pay_stub_entry->getCreatedDate(), 'created_by' => $pay_stub_entry->getCreatedBy(), 'updated_date' => $pay_stub_entry->getUpdatedDate(), 'updated_by' => $pay_stub_entry->getUpdatedBy(), 'deleted_date' => $pay_stub_entry->getDeletedDate(), 'deleted_by' => $pay_stub_entry->getDeletedBy());
                 }
                 $prev_type = $pay_stub_entry_name_obj->getType();
             }
             //There should always be pay stub entries for a pay stub.
             if (!isset($pay_stub_entries)) {
                 continue;
             }
             //Debug::Arr($pay_stub_entries, 'Pay Stub Entries...', __FILE__, __LINE__, __METHOD__,10);
             //$pay_period_number = $pay_period_schedule_obj->getCurrentPayPeriodNumber( $pay_period_obj->getTransactionDate(), $pay_period_obj->getEndDate() );
             $block_adjust_y = 30;
             //
             //Earnings
             //
             if (isset($pay_stub_entries[10])) {
                 //Earnings Header
                 $pdf->SetFont('', 'B', 10);
                 $pdf->setXY(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                 $pdf->Cell(90, 5, TTi18n::gettext('Earnings'), $border, 0, 'L');
                 $pdf->Cell(17, 5, TTi18n::gettext('Rate'), $border, 0, 'R');
                 $pdf->Cell(23, 5, TTi18n::gettext('Hrs/Units'), $border, 0, 'R');
                 $pdf->Cell(20, 5, TTi18n::gettext('Amount'), $border, 0, 'R');
                 $pdf->Cell(25, 5, TTi18n::gettext('YTD Amount'), $border, 0, 'R');
                 $block_adjust_y = $block_adjust_y + 5;
                 $pdf->SetFont('', '', 10);
                 foreach ($pay_stub_entries[10] as $pay_stub_entry) {
                     if ($pay_stub_entry['type'] == 10) {
                         if ($pay_stub_entry['description_subscript'] != '') {
                             $subscript = '[' . $pay_stub_entry['description_subscript'] . ']';
                         } else {
                             $subscript = NULL;
                         }
                         $pdf->setXY(Misc::AdjustXY(2, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                         $pdf->Cell(88, 5, $pay_stub_entry['name'] . $subscript, $border, 0, 'L');
                         $pdf->Cell(17, 5, TTi18n::formatNumber($pay_stub_entry['rate'], TRUE), $border, 0, 'R');
                         $pdf->Cell(23, 5, TTi18n::formatNumber($pay_stub_entry['units'], TRUE), $border, 0, 'R');
                         $pdf->Cell(20, 5, TTi18n::formatNumber($pay_stub_entry['amount']), $border, 0, 'R');
                         $pdf->Cell(25, 5, TTi18n::formatNumber($pay_stub_entry['ytd_amount']), $border, 0, 'R');
                     } else {
                         //Total
                         $pdf->SetFont('', 'B', 10);
                         $pdf->line(Misc::AdjustXY(110, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y), Misc::AdjustXY(130, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                         $pdf->line(Misc::AdjustXY(131, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y), Misc::AdjustXY(150, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                         $pdf->line(Misc::AdjustXY(151, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y), Misc::AdjustXY(175, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                         $pdf->setXY(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                         $pdf->Cell(90, 5, $pay_stub_entry['name'], $border, 0, 'L');
                         $pdf->Cell(17, 5, '', $border, 0, 'R');
                         $pdf->Cell(23, 5, TTi18n::formatNumber($pay_stub_entry['units'], TRUE), $border, 0, 'R');
                         $pdf->Cell(20, 5, TTi18n::formatNumber($pay_stub_entry['amount']), $border, 0, 'R');
                         $pdf->Cell(25, 5, TTi18n::formatNumber($pay_stub_entry['ytd_amount']), $border, 0, 'R');
                     }
                     $block_adjust_y = $block_adjust_y + 5;
                 }
             }
             //
             // Deductions
             //
             if (isset($pay_stub_entries[20])) {
                 $max_deductions = count($pay_stub_entries[20]);
                 //Deductions Header
                 $block_adjust_y = $block_adjust_y + 5;
                 $pdf->SetFont('', 'B', 10);
                 if ($max_deductions > 2) {
                     $pdf->setXY(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                     $pdf->Cell(40, 5, TTi18n::gettext('Deductions'), $border, 0, 'L');
                     $pdf->Cell(20, 5, TTi18n::gettext('Amount'), $border, 0, 'R');
                     $pdf->Cell(25, 5, TTi18n::gettext('YTD Amount'), $border, 0, 'R');
                     $pdf->setXY(Misc::AdjustXY(90, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                     $pdf->Cell(40, 5, TTi18n::gettext('Deductions'), $border, 0, 'L');
                 } else {
                     $pdf->setXY(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                     $pdf->Cell(130, 5, TTi18n::gettext('Deductions'), $border, 0, 'L');
                 }
                 $pdf->Cell(20, 5, TTi18n::gettext('Amount'), $border, 0, 'R');
                 $pdf->Cell(25, 5, TTi18n::gettext('YTD Amount'), $border, 0, 'R');
                 $block_adjust_y = $tmp_block_adjust_y = $top_block_adjust_y = $block_adjust_y + 5;
                 $pdf->SetFont('', '', 10);
                 $x = 0;
                 $max_block_adjust_y = 0;
                 foreach ($pay_stub_entries[20] as $pay_stub_entry) {
                     //Start with the right side.
                     if ($x < floor($max_deductions / 2)) {
                         $tmp_adjust_x = 90;
                     } else {
                         if ($tmp_block_adjust_y != 0) {
                             $block_adjust_y = $tmp_block_adjust_y;
                             $tmp_block_adjust_y = 0;
                         }
                         $tmp_adjust_x = 0;
                     }
                     if ($pay_stub_entry['type'] == 20) {
                         if ($pay_stub_entry['description_subscript'] != '') {
                             $subscript = '[' . $pay_stub_entry['description_subscript'] . ']';
                         } else {
                             $subscript = NULL;
                         }
                         if ($max_deductions > 2) {
                             $pdf->setXY(Misc::AdjustXY(2, $tmp_adjust_x + $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                             $pdf->Cell(38, 5, $pay_stub_entry['name'] . $subscript, $border, 0, 'L');
                         } else {
                             $pdf->setXY(Misc::AdjustXY(2, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                             $pdf->Cell(128, 5, $pay_stub_entry['name'] . $subscript, $border, 0, 'L');
                         }
                         $pdf->Cell(20, 5, TTi18n::formatNumber($pay_stub_entry['amount']), $border, 0, 'R');
                         $pdf->Cell(25, 5, TTi18n::formatNumber($pay_stub_entry['ytd_amount']), $border, 0, 'R');
                     } else {
                         $block_adjust_y = $max_block_adjust_y + 0;
                         //Total
                         $pdf->SetFont('', 'B', 10);
                         $pdf->line(Misc::AdjustXY(130, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y), Misc::AdjustXY(150, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                         $pdf->line(Misc::AdjustXY(151, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y), Misc::AdjustXY(175, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                         $pdf->setXY(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                         $pdf->Cell(130, 5, $pay_stub_entry['name'], $border, 0, 'L');
                         $pdf->Cell(20, 5, TTi18n::formatNumber($pay_stub_entry['amount']), $border, 0, 'R');
                         $pdf->Cell(25, 5, TTi18n::formatNumber($pay_stub_entry['ytd_amount']), $border, 0, 'R');
                     }
                     $block_adjust_y = $block_adjust_y + 5;
                     if ($block_adjust_y > $max_block_adjust_y) {
                         $max_block_adjust_y = $block_adjust_y;
                     }
                     $x++;
                 }
                 //Draw line to separate the two columns
                 if ($max_deductions > 2) {
                     $pdf->Line(Misc::AdjustXY(88, $adjust_x), Misc::AdjustXY($top_block_adjust_y - 5, $adjust_y), Misc::AdjustXY(88, $adjust_x), Misc::AdjustXY($max_block_adjust_y - 5, $adjust_y));
                 }
                 unset($x, $max_deductions, $tmp_adjust_x, $max_block_adjust_y, $tmp_block_adjust_y, $top_block_adjust_y);
             }
             if (isset($pay_stub_entries[40][0])) {
                 $block_adjust_y = $block_adjust_y + 5;
                 //Net Pay entry
                 $pdf->SetFont('', 'B', 10);
                 $pdf->setXY(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                 $pdf->Cell(130, 5, $pay_stub_entries[40][0]['name'], $border, 0, 'L');
                 $pdf->Cell(20, 5, TTi18n::formatNumber($pay_stub_entries[40][0]['amount']), $border, 0, 'R');
                 $pdf->Cell(25, 5, TTi18n::formatNumber($pay_stub_entries[40][0]['ytd_amount']), $border, 0, 'R');
                 $block_adjust_y = $block_adjust_y + 5;
             }
             //
             //Employer Contributions
             //
             //echo "Employee Ded: <br>\n";
             if (isset($pay_stub_entries[30]) and $hide_employer_rows != TRUE) {
                 $max_deductions = count($pay_stub_entries[30]);
                 //echo "Max Employee Ded: ". $max_deductions ."<br>\n";
                 //Deductions Header
                 $block_adjust_y = $block_adjust_y + 5;
                 $pdf->SetFont('', 'B', 10);
                 if ($max_deductions > 2) {
                     $pdf->setXY(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                     $pdf->Cell(40, 5, TTi18n::gettext('Employer Contributions'), $border, 0, 'L');
                     $pdf->Cell(20, 5, TTi18n::gettext('Amount'), $border, 0, 'R');
                     $pdf->Cell(25, 5, TTi18n::gettext('YTD Amount'), $border, 0, 'R');
                     $pdf->setXY(Misc::AdjustXY(90, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                     $pdf->Cell(40, 5, TTi18n::gettext('Employer Contributions'), $border, 0, 'L');
                 } else {
                     $pdf->setXY(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                     $pdf->Cell(130, 5, TTi18n::gettext('Employer Contributions'), $border, 0, 'L');
                 }
                 $pdf->Cell(20, 5, TTi18n::gettext('Amount'), $border, 0, 'R');
                 $pdf->Cell(25, 5, TTi18n::gettext('YTD Amount'), $border, 0, 'R');
                 $block_adjust_y = $tmp_block_adjust_y = $top_block_adjust_y = $block_adjust_y + 5;
                 $pdf->SetFont('', '', 10);
                 $x = 0;
                 $max_block_adjust_y = 0;
                 foreach ($pay_stub_entries[30] as $pay_stub_entry) {
                     //Start with the right side.
                     if ($x < floor($max_deductions / 2)) {
                         $tmp_adjust_x = 90;
                     } else {
                         if ($tmp_block_adjust_y != 0) {
                             $block_adjust_y = $tmp_block_adjust_y;
                             $tmp_block_adjust_y = 0;
                         }
                         $tmp_adjust_x = 0;
                     }
                     if ($pay_stub_entry['type'] == 30) {
                         if ($pay_stub_entry['description_subscript'] != '') {
                             $subscript = '[' . $pay_stub_entry['description_subscript'] . ']';
                         } else {
                             $subscript = NULL;
                         }
                         if ($max_deductions > 2) {
                             $pdf->setXY(Misc::AdjustXY(2, $tmp_adjust_x + $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                             $pdf->Cell(38, 5, $pay_stub_entry['name'] . $subscript, $border, 0, 'L');
                         } else {
                             $pdf->setXY(Misc::AdjustXY(2, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                             $pdf->Cell(128, 5, $pay_stub_entry['name'] . $subscript, $border, 0, 'L');
                         }
                         $pdf->Cell(20, 5, TTi18n::formatNumber($pay_stub_entry['amount']), $border, 0, 'R');
                         $pdf->Cell(25, 5, TTi18n::formatNumber($pay_stub_entry['ytd_amount']), $border, 0, 'R');
                     } else {
                         $block_adjust_y = $max_block_adjust_y + 0;
                         //Total
                         $pdf->SetFont('', 'B', 10);
                         $pdf->line(Misc::AdjustXY(130, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y), Misc::AdjustXY(150, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                         $pdf->line(Misc::AdjustXY(151, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y), Misc::AdjustXY(175, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                         $pdf->setXY(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                         $pdf->Cell(130, 5, $pay_stub_entry['name'], $border, 0, 'L');
                         $pdf->Cell(20, 5, TTi18n::formatNumber($pay_stub_entry['amount']), $border, 0, 'R');
                         $pdf->Cell(25, 5, TTi18n::formatNumber($pay_stub_entry['ytd_amount']), $border, 0, 'R');
                     }
                     $block_adjust_y = $block_adjust_y + 5;
                     if ($block_adjust_y > $max_block_adjust_y) {
                         $max_block_adjust_y = $block_adjust_y;
                     }
                     $x++;
                 }
                 //Draw line to separate the two columns
                 if ($max_deductions > 2) {
                     $pdf->Line(Misc::AdjustXY(88, $adjust_x), Misc::AdjustXY($top_block_adjust_y - 5, $adjust_y), Misc::AdjustXY(88, $adjust_x), Misc::AdjustXY($max_block_adjust_y - 5, $adjust_y));
                 }
                 unset($x, $max_deductions, $tmp_adjust_x, $max_block_adjust_y, $tmp_block_adjust_y, $top_block_adjust_y);
             }
             //
             //Accruals PS accounts
             //
             if (isset($pay_stub_entries[50])) {
                 //Accrual Header
                 $block_adjust_y = $block_adjust_y + 5;
                 $pdf->SetFont('', 'B', 10);
                 $pdf->setXY(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                 $pdf->Cell(130, 5, TTi18n::gettext('Accruals'), $border, 0, 'L');
                 $pdf->Cell(20, 5, TTi18n::gettext('Amount'), $border, 0, 'R');
                 $pdf->Cell(25, 5, TTi18n::gettext('Balance'), $border, 0, 'R');
                 $block_adjust_y = $block_adjust_y + 5;
                 $pdf->SetFont('', '', 10);
                 foreach ($pay_stub_entries[50] as $pay_stub_entry) {
                     if ($pay_stub_entry['type'] == 50) {
                         if ($pay_stub_entry['description_subscript'] != '') {
                             $subscript = '[' . $pay_stub_entry['description_subscript'] . ']';
                         } else {
                             $subscript = NULL;
                         }
                         $pdf->setXY(Misc::AdjustXY(2, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                         $pdf->Cell(128, 5, $pay_stub_entry['name'] . $subscript, $border, 0, 'L');
                         $pdf->Cell(20, 5, TTi18n::formatNumber($pay_stub_entry['amount']), $border, 0, 'R');
                         $pdf->Cell(25, 5, TTi18n::formatNumber($pay_stub_entry['ytd_amount']), $border, 0, 'R');
                     }
                     $block_adjust_y = $block_adjust_y + 5;
                 }
             }
             //
             //Accrual Policy Balances
             //
             $ablf = new AccrualBalanceListFactory();
             $ablf->getByUserIdAndCompanyIdAndEnablePayStubBalanceDisplay($user_obj->getId(), $user_obj->getCompany(), TRUE);
             if ($ablf->getRecordCount() > 0) {
                 //Accrual Header
                 $block_adjust_y = $block_adjust_y + 5;
                 $pdf->SetFont('', 'B', 10);
                 $pdf->setXY(Misc::AdjustXY(40, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                 $accrual_time_header_start_x = $pdf->getX();
                 $accrual_time_header_start_y = $pdf->getY();
                 $pdf->Cell(70, 5, TTi18n::gettext('Accrual Time Balances as of ') . TTDate::getDate('DATE', time()), $border, 0, 'L');
                 $pdf->Cell(25, 5, TTi18n::gettext('Balance (hrs)'), $border, 0, 'R');
                 $block_adjust_y = $block_adjust_y + 5;
                 $box_height = 5;
                 $pdf->SetFont('', '', 10);
                 foreach ($ablf as $ab_obj) {
                     $balance = $ab_obj->getBalance();
                     if (!is_numeric($balance)) {
                         $balance = 0;
                     }
                     $pdf->setXY(Misc::AdjustXY(40, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                     $pdf->Cell(70, 5, $ab_obj->getColumn('name'), $border, 0, 'L');
                     $pdf->Cell(25, 5, TTi18n::formatNumber(TTDate::getHours($balance)), $border, 0, 'R');
                     $block_adjust_y = $block_adjust_y + 5;
                     $box_height = $box_height + 5;
                     unset($balance);
                 }
                 $pdf->Rect($accrual_time_header_start_x, $accrual_time_header_start_y, 95, $box_height);
                 unset($accrual_time_header_start_x, $accrual_time_header_start_y, $box_height);
             }
             //
             //Descriptions
             //
             if (isset($pay_stub_entry_descriptions) and count($pay_stub_entry_descriptions) > 0) {
                 //Description Header
                 $block_adjust_y = $block_adjust_y + 5;
                 $pdf->SetFont('', 'B', 10);
                 $pdf->setXY(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                 $pdf->Cell(175, 5, TTi18n::gettext('Notes'), $border, 0, 'L');
                 $block_adjust_y = $block_adjust_y + 5;
                 $pdf->SetFont('', '', 8);
                 $x = 0;
                 foreach ($pay_stub_entry_descriptions as $pay_stub_entry_description) {
                     if ($x % 2 == 0) {
                         $pdf->setXY(Misc::AdjustXY(2, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                     } else {
                         $pdf->setXY(Misc::AdjustXY(90, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y));
                     }
                     //$pdf->Cell(173,5, '['.$pay_stub_entry_description['subscript'].'] '.$pay_stub_entry_description['description'], $border, 0, 'L');
                     $pdf->Cell(85, 5, '[' . $pay_stub_entry_description['subscript'] . '] ' . $pay_stub_entry_description['description'], $border, 0, 'L');
                     if ($x % 2 != 0) {
                         $block_adjust_y = $block_adjust_y + 5;
                     }
                     $x++;
                 }
             }
             unset($x, $pay_stub_entry_descriptions, $pay_stub_entry_description);
             //
             // Pay Stub Footer
             //
             $block_adjust_y = 215;
             //Line
             $pdf->setLineWidth(1);
             $pdf->Line(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y, $adjust_y), Misc::AdjustXY(185, $adjust_y), Misc::AdjustXY($block_adjust_y, $adjust_y));
             //Non Negotiable
             $pdf->SetFont('', 'B', 14);
             $pdf->setXY(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y + 3, $adjust_y));
             $pdf->Cell(175, 5, TTi18n::gettext('NON NEGOTIABLE'), $border, 0, 'C', 0);
             //Employee Address
             $pdf->SetFont('', 'B', 12);
             $pdf->setXY(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y + 9, $adjust_y));
             $pdf->Cell(60, 5, TTi18n::gettext('CONFIDENTIAL'), $border, 0, 'C', 0);
             $pdf->SetFont('', '', 10);
             $pdf->setXY(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y + 14, $adjust_y));
             $pdf->Cell(60, 5, $user_obj->getFullName(), $border, 0, 'C', 0);
             $pdf->setXY(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y + 19, $adjust_y));
             $pdf->Cell(60, 5, $user_obj->getAddress1(), $border, 0, 'C', 0);
             $address2_adjust_y = 0;
             if ($user_obj->getAddress2() != '') {
                 $address2_adjust_y = 5;
                 $pdf->setXY(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y + 24, $adjust_y));
                 $pdf->Cell(60, 5, $user_obj->getAddress2(), $border, 0, 'C', 0);
             }
             $pdf->setXY(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y + 24 + $address2_adjust_y, $adjust_y));
             $pdf->Cell(60, 5, $user_obj->getCity() . ', ' . $user_obj->getProvince() . ' ' . $user_obj->getPostalCode(), $border, 1, 'C', 0);
             //Pay Period - Balance - ID
             $net_pay_amount = 0;
             if (isset($pay_stub_entries[40][0])) {
                 $net_pay_amount = $pay_stub_entries[40][0]['amount'];
             }
             if (isset($pay_stub_entries[65]) and count($pay_stub_entries[65]) > 0) {
                 $net_pay_label = TTi18n::gettext('Balance');
             } else {
                 $net_pay_label = TTi18n::gettext('Net Pay');
             }
             /*
             if ( $pay_period_schedule_obj->getType() != 5 AND $pay_period_number > 0 AND $pay_period_schedule_obj->getAnnualPayPeriods() > 0 ) {
             	$pdf->setXY( Misc::AdjustXY(125, $adjust_x), Misc::AdjustXY($block_adjust_y+10, $adjust_y) );
             	$pdf->Cell(50, 5, TTi18n::gettext('Pay Period').' '. $pay_period_number .' '. TTi18n::gettext('of') .' '. $pay_period_schedule_obj->getAnnualPayPeriods(), $border, 1, 'L', 0);
             }
             */
             $pdf->SetFont('', 'B', 12);
             $pdf->setXY(Misc::AdjustXY(125, $adjust_x), Misc::AdjustXY($block_adjust_y + 17, $adjust_y));
             $pdf->Cell(50, 5, $net_pay_label . ': ' . $pay_stub_obj->getCurrencyObject()->getSymbol() . $net_pay_amount . ' ' . $pay_stub_obj->getCurrencyObject()->getISOCode(), $border, 1, 'L', 0);
             if ($pay_stub_obj->getTainted() == TRUE) {
                 $tainted_flag = 'T';
             } else {
                 $tainted_flag = '';
             }
             $pdf->SetFont('', '', 8);
             $pdf->setXY(Misc::AdjustXY(125, $adjust_x), Misc::AdjustXY($block_adjust_y + 30, $adjust_y));
             $pdf->Cell(50, 5, TTi18n::gettext('Identification #:') . ' ' . str_pad($pay_stub_obj->getId(), 12, 0, STR_PAD_LEFT) . $tainted_flag, $border, 1, 'L', 0);
             unset($net_pay_amount, $tainted_flag);
             //Line
             $pdf->setLineWidth(1);
             $pdf->Line(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y + 35, $adjust_y), Misc::AdjustXY(185, $adjust_y), Misc::AdjustXY($block_adjust_y + 35, $adjust_y));
             $pdf->SetFont('', '', 6);
             $pdf->setXY(Misc::AdjustXY(0, $adjust_x), Misc::AdjustXY($block_adjust_y + 38, $adjust_y));
             $pdf->Cell(175, 1, TTi18n::gettext('Pay Stub Generated by') . ' ' . APPLICATION_NAME, $border, 0, 'C', 0);
             unset($pay_period_schedule_obj, $pay_stub_entries, $pay_period_number);
             $i++;
         }
         $output = $pdf->Output('', 'S');
     }
     TTi18n::setMasterLocale();
     if (isset($output)) {
         return $output;
     }
     return FALSE;
 }
Пример #4
0
             echo "Found Pay Period: Start: " . TTDate::getDate('DATE', $pp_obj->getStartDate()) . ' End: ' . TTDate::getDate('DATE', $pp_obj->getEndDate()) . ' Transaction: ' . TTDate::getDate('DATE', $pp_obj->getTransactionDate()) . "\n";
             $pay_period_id = $pp_obj->getId();
             break;
         }
         $x++;
     }
 }
 if (isset($pay_period_id)) {
     $pslf = new PayStubListFactory();
     $pslf->getByCompanyIdAndPayPeriodId($company_id, $pay_period_id);
     if ($pslf->getRecordCount() > 0) {
         echo "Export Directory: " . $output_directory . "\n";
         $i = 1;
         foreach ($pslf as $tmp_ps_obj) {
             $pslf_b = new PayStubListFactory();
             $pslf_b->getById($tmp_ps_obj->getId());
             if ($pslf_b->getRecordCount() > 0) {
                 $ps_obj = $pslf_b->getCurrent();
                 if (is_object($ps_obj->getUserObject())) {
                     $file_name = $output_directory . DIRECTORY_SEPARATOR . 'pay_stub_' . $ps_obj->getUserObject()->getUserName() . '_' . date('Ymd', $ps_obj->getStartDate()) . '.pdf';
                     $output = $pslf->getPayStub($pslf_b, TRUE);
                     if ($output !== FALSE) {
                         echo "  {$i}. Exporting Pay Stub for: " . $ps_obj->getUserObject()->getFullName() . "\t\tFile: " . $file_name . "\n";
                         file_put_contents($file_name, $output);
                         unset($output);
                         $i++;
                     } else {
                         echo "  ERROR: Unable to Export Pay Stub.\n";
                     }
                 }
             }
 function calculate($epoch = NULL)
 {
     if ($this->getUserObject() == FALSE or $this->getUserObject()->getStatus() !== 10) {
         return FALSE;
     }
     $generic_queue_status_label = $this->getUserObject()->getFullName(TRUE) . ' - ' . TTi18n::gettext('Pay Stub');
     if ($epoch == NULL or $epoch == '') {
         $epoch = TTDate::getTime();
     }
     if ($this->getPayPeriodObject() == FALSE) {
         return FALSE;
     }
     Debug::text('bbUser Id: ' . $this->getUser() . ' Pay Period End Date: ' . TTDate::getDate('DATE+TIME', $this->getPayPeriodObject()->getEndDate()), __FILE__, __LINE__, __METHOD__, 10);
     $pay_stub = new PayStubFactory();
     $pay_stub->StartTransaction();
     $old_pay_stub_id = NULL;
     if ($this->getEnableCorrection() == TRUE) {
         Debug::text('Correction Enabled!', __FILE__, __LINE__, __METHOD__, 10);
         $pay_stub->setTemp(TRUE);
         //Check for current pay stub ID so we can compare against it.
         $pslf = new PayStubListFactory();
         $pslf->getByUserIdAndPayPeriodId($this->getUser(), $this->getPayPeriod());
         if ($pslf->getRecordCount() > 0) {
             $old_pay_stub_id = $pslf->getCurrent()->getId();
             Debug::text('Comparing Against Pay Stub ID: ' . $old_pay_stub_id, __FILE__, __LINE__, __METHOD__, 10);
         }
     }
     $pay_stub->setUser($this->getUser());
     $pay_stub->setPayPeriod($this->getPayPeriod());
     $pay_stub->setCurrency($this->getUserObject()->getCurrency());
     $pay_stub->setStatus('NEW');
     //Use User Termination Date instead of ROE.
     if ($this->getUserObject()->getTerminationDate() != '' and $this->getUserObject()->getTerminationDate() >= $this->getPayPeriodObject()->getStartDate() and $this->getUserObject()->getTerminationDate() <= $this->getPayPeriodObject()->getEndDate()) {
         Debug::text('User has been terminated in this pay period!', __FILE__, __LINE__, __METHOD__, 10);
         $is_terminated = TRUE;
     } else {
         $is_terminated = FALSE;
     }
     if ($is_terminated == TRUE) {
         Debug::text('User is Terminated, assuming final pay, setting End Date to terminated date: ' . TTDate::getDate('DATE+TIME', $this->getUserObject()->getTerminationDate()), __FILE__, __LINE__, __METHOD__, 10);
         $pay_stub->setStartDate($pay_stub->getPayPeriodObject()->getStartDate());
         $pay_stub->setEndDate($this->getUserObject()->getTerminationDate());
         //Use the PS generation date instead of terminated date...
         //Unlikely they would pay someone before the pay stub is generated.
         //Perhaps still use the pay period transaction date for this too?
         //Anything we set won't be correct for everyone. Maybe a later date is better though?
         //Perhaps add to the user factory under Termination Date a: "Final Transaction Date" for this purpose?
         //Use the end of the current date for the transaction date, as if the employee is terminated
         //on the same day they are generating the pay stub, the transaction date could be before the end date
         //as the end date is at 11:59PM
         $pay_stub->setTransactionDate(TTDate::getEndDayEpoch(TTDate::getTime()));
     } else {
         Debug::text('User Termination Date is NOT set, assuming normal pay.', __FILE__, __LINE__, __METHOD__, 10);
         $pay_stub->setDefaultDates();
     }
     //This must go after setting advance
     if ($this->getEnableCorrection() == FALSE and $pay_stub->IsUniquePayStub() == FALSE) {
         Debug::text('Pay Stub already exists', __FILE__, __LINE__, __METHOD__, 10);
         $this->CommitTransaction();
         UserGenericStatusFactory::queueGenericStatus($generic_queue_status_label, 20, TTi18n::gettext('Pay Stub for this employee already exists, skipping...'), NULL);
         return FALSE;
     }
     if ($pay_stub->isValid() == TRUE) {
         $pay_stub->Save(FALSE);
         $pay_stub->setStatus('Open');
     } else {
         Debug::text('Pay Stub isValid failed!', __FILE__, __LINE__, __METHOD__, 10);
         UserGenericStatusFactory::queueGenericStatus($generic_queue_status_label, 10, $pay_stub->Validator->getTextErrors(), NULL);
         $this->FailTransaction();
         $this->CommitTransaction();
         return FALSE;
     }
     $pay_stub->loadPreviousPayStub();
     $user_date_total_arr = $this->getWageObject()->getUserDateTotalArray();
     if (isset($user_date_total_arr['entries']) and is_array($user_date_total_arr['entries'])) {
         foreach ($user_date_total_arr['entries'] as $udt_arr) {
             //Allow negative amounts so flat rate premium policies can reduce an employees wage if need be.
             if ($udt_arr['amount'] != 0) {
                 Debug::text('Adding Pay Stub Entry: ' . $udt_arr['pay_stub_entry'] . ' Amount: ' . $udt_arr['amount'], __FILE__, __LINE__, __METHOD__, 10);
                 $pay_stub->addEntry($udt_arr['pay_stub_entry'], $udt_arr['amount'], TTDate::getHours($udt_arr['total_time']), $udt_arr['rate']);
             } else {
                 Debug::text('NOT Adding ($0 amount) Pay Stub Entry: ' . $udt_arr['pay_stub_entry'] . ' Amount: ' . $udt_arr['amount'], __FILE__, __LINE__, __METHOD__, 10);
             }
         }
     } else {
         //No Earnings, CHECK FOR PS AMENDMENTS next for earnings.
         Debug::text('NO TimeSheet EARNINGS ON PAY STUB... Checking for PS amendments', __FILE__, __LINE__, __METHOD__, 10);
     }
     //Get all PS amendments and Tax / Deductions so we can determine the proper order to calculate them in.
     $psalf = new PayStubAmendmentListFactory();
     $psalf->getByUserIdAndAuthorizedAndStartDateAndEndDate($this->getUser(), TRUE, $this->getPayPeriodObject()->getStartDate(), $this->getPayPeriodObject()->getEndDate());
     $udlf = new UserDeductionListFactory();
     $udlf->getByCompanyIdAndUserId($this->getUserObject()->getCompany(), $this->getUserObject()->getId());
     $deduction_order_arr = $this->getOrderedDeductionAndPSAmendment($udlf, $psalf);
     if (is_array($deduction_order_arr) and count($deduction_order_arr) > 0) {
         foreach ($deduction_order_arr as $calculation_order => $data_arr) {
             Debug::text('Found PS Amendment/Deduction: Type: ' . $data_arr['type'] . ' Name: ' . $data_arr['name'] . ' Order: ' . $calculation_order, __FILE__, __LINE__, __METHOD__, 10);
             if (isset($data_arr['obj']) and is_object($data_arr['obj'])) {
                 if ($data_arr['type'] == 'UserDeductionListFactory') {
                     $ud_obj = $data_arr['obj'];
                     //Determine if this deduction is valid based on start/end dates.
                     //Determine if this deduction is valid based on min/max length of service.
                     if ($ud_obj->getCompanyDeductionObject()->isActiveDate($pay_stub->getPayPeriodObject()->getEndDate()) == TRUE and $ud_obj->getCompanyDeductionObject()->isActiveLengthOfService($this->getUserObject(), $pay_stub->getPayPeriodObject()->getEndDate()) == TRUE) {
                         $amount = $ud_obj->getDeductionAmount($this->getUserObject()->getId(), $pay_stub, $this->getPayPeriodObject());
                         Debug::text('User Deduction: ' . $ud_obj->getCompanyDeductionObject()->getName() . ' Amount: ' . $amount . ' Calculation Order: ' . $ud_obj->getCompanyDeductionObject()->getCalculationOrder(), __FILE__, __LINE__, __METHOD__, 10);
                         //Allow negative amounts, so they can reduce previously calculated deductions or something.
                         if (isset($amount) and $amount != 0) {
                             $pay_stub->addEntry($ud_obj->getCompanyDeductionObject()->getPayStubEntryAccount(), $amount);
                         } else {
                             Debug::text('Amount is 0, skipping...', __FILE__, __LINE__, __METHOD__, 10);
                         }
                     }
                     unset($amount, $ud_obj);
                 } elseif ($data_arr['type'] == 'PayStubAmendmentListFactory') {
                     $psa_obj = $data_arr['obj'];
                     Debug::text('Found Pay Stub Amendment: ID: ' . $psa_obj->getID() . ' Entry Name ID: ' . $psa_obj->getPayStubEntryNameId() . ' Type: ' . $psa_obj->getType(), __FILE__, __LINE__, __METHOD__, 10);
                     $amount = $psa_obj->getCalculatedAmount($pay_stub);
                     if (isset($amount) and $amount != 0) {
                         Debug::text('Pay Stub Amendment Amount: ' . $amount, __FILE__, __LINE__, __METHOD__, 10);
                         $pay_stub->addEntry($psa_obj->getPayStubEntryNameId(), $amount, $psa_obj->getUnits(), $psa_obj->getRate(), $psa_obj->getDescription(), $psa_obj->getID(), NULL, NULL, $psa_obj->getYTDAdjustment());
                         //Keep in mind this causes pay stubs to be re-generated every time, as this modifies the updated time
                         //to slightly more then the pay stub creation time.
                         $psa_obj->setStatus('IN USE');
                         $psa_obj->Save();
                     } else {
                         Debug::text('bPay Stub Amendment Amount is not set...', __FILE__, __LINE__, __METHOD__, 10);
                     }
                     unset($amount, $psa_obj);
                 }
             }
         }
     }
     unset($deduction_order_arr, $calculation_order, $data_arr);
     $pay_stub_id = $pay_stub->getId();
     $pay_stub->setEnableProcessEntries(TRUE);
     $pay_stub->processEntries();
     if ($pay_stub->isValid() == TRUE) {
         Debug::text('Pay Stub is valid, final save.', __FILE__, __LINE__, __METHOD__, 10);
         $pay_stub->Save();
         if ($this->getEnableCorrection() == TRUE) {
             if (isset($old_pay_stub_id)) {
                 Debug::text('bCorrection Enabled - Doing Comparison here', __FILE__, __LINE__, __METHOD__, 10);
                 PayStubFactory::CalcDifferences($pay_stub_id, $old_pay_stub_id);
             }
             //Delete newly created temp paystub.
             //This used to be in the above IF block that depended on $old_pay_stub_id
             //being set, however in cases where the old pay stub didn't exist
             //TimeTrex wouldn't delete these temporary pay stubs.
             //Moving this code outside that IF statement so it only depends on EnableCorrection()
             //to be TRUE should fix that issue.
             $pslf = new PayStubListFactory();
             $pslf->getById($pay_stub_id);
             if ($pslf->getRecordCount() > 0) {
                 $tmp_ps_obj = $pslf->getCurrent();
                 $tmp_ps_obj->setDeleted(TRUE);
                 $tmp_ps_obj->Save();
                 unset($tmp_ps_obj);
             }
         }
         $pay_stub->CommitTransaction();
         UserGenericStatusFactory::queueGenericStatus($generic_queue_status_label, 30, NULL, NULL);
         return TRUE;
     }
     Debug::text('Pay Stub is NOT valid returning FALSE', __FILE__, __LINE__, __METHOD__, 10);
     UserGenericStatusFactory::queueGenericStatus($generic_queue_status_label, 10, $pay_stub->Validator->getTextErrors(), NULL);
     $pay_stub->FailTransaction();
     //Reduce transaction count by one.
     //$pay_stub->FailTransaction(); //Reduce transaction count by one.
     $pay_stub->CommitTransaction();
     return FALSE;
 }