コード例 #1
0
    function getReportByCompanyIdAndArrayCriteria($company_id, $filter_data, $limit = NULL, $page = NULL, $where = NULL, $order = NULL)
    {
        if ($company_id == '') {
            return FALSE;
        }
        if (!is_array($order)) {
            //Use Filter Data ordering if its set.
            if (isset($filter_data['sort_column']) and $filter_data['sort_order']) {
                $order = array(Misc::trimSortPrefix($filter_data['sort_column']) => $filter_data['sort_order']);
            }
        }
        $additional_order_fields = array('pay_period_id');
        if ($order == NULL) {
            $order = array('b.user_id' => 'asc');
            $strict = FALSE;
        } else {
            //Do order by column conversions, because if we include these columns in the SQL
            //query, they contaminate the data array.
            /*
            if ( isset($order['default_branch']) ) {
            	$order['b.name'] = $order['default_branch'];
            	unset($order['default_branch']);
            }
            
            //Always try to order by status first so INACTIVE employees go to the bottom.
            if ( !isset($order['status_id']) ) {
            	$order = Misc::prependArray( array('status_id' => 'asc'), $order );
            }
            //Always sort by last name,first name after other columns
            if ( !isset($order['last_name']) ) {
            	$order['last_name'] = 'asc';
            }
            if ( !isset($order['first_name']) ) {
            	$order['first_name'] = 'asc';
            }
            */
            $strict = TRUE;
        }
        //Debug::Arr($order,'Order Data:', __FILE__, __LINE__, __METHOD__,10);
        //Debug::Arr($filter_data,'Filter Data:', __FILE__, __LINE__, __METHOD__,10);
        if (isset($filter_data['exclude_user_ids'])) {
            $filter_data['exclude_id'] = $filter_data['exclude_user_ids'];
        }
        if (isset($filter_data['include_user_ids'])) {
            $filter_data['id'] = $filter_data['include_user_ids'];
        }
        if (isset($filter_data['user_status_ids'])) {
            $filter_data['status_id'] = $filter_data['user_status_ids'];
        }
        if (isset($filter_data['user_title_ids'])) {
            $filter_data['title_id'] = $filter_data['user_title_ids'];
        }
        if (isset($filter_data['group_ids'])) {
            $filter_data['group_id'] = $filter_data['group_ids'];
        }
        if (isset($filter_data['branch_ids'])) {
            $filter_data['default_branch_id'] = $filter_data['branch_ids'];
        }
        if (isset($filter_data['department_ids'])) {
            $filter_data['default_department_id'] = $filter_data['department_ids'];
        }
        if (isset($filter_data['currency_ids'])) {
            $filter_data['currency_id'] = $filter_data['currency_ids'];
        }
        $bf = new BranchFactory();
        $df = new DepartmentFactory();
        $ugf = new UserGroupFactory();
        $utf = new UserTitleFactory();
        $psf = new PayStubFactory();
        $uf = new UserFactory();
        $ph = array('company_id' => $company_id);
        $query = '
					select 	a.*,
							b.user_id as user_id,
							b.pay_period_id as pay_period_id,
							b.start_date as pay_stub_start_date,
							b.end_date as pay_stub_end_date,
							b.transaction_date as pay_stub_transaction_date,
							b.currency_id as currency_id,
							b.currency_rate as currency_rate,
							a.pay_stub_entry_name_id as pay_stub_entry_name_id,
							a.amount as amount,
							a.ytd_amount as ytd_amount
					from 	(
							select aa.pay_stub_id as pay_stub_id,
								aa.pay_stub_entry_name_id as pay_stub_entry_name_id,
								sum(aa.amount) as amount,
								max(aa.ytd_amount) as ytd_amount
							from ' . $this->getTable() . ' as aa
							LEFT JOIN ' . $psf->getTable() . ' as bb ON aa.pay_stub_id = bb.id
							LEFT JOIN ' . $uf->getTable() . ' as cc ON bb.user_id = cc.id
							LEFT JOIN ' . $bf->getTable() . ' as dd ON cc.default_branch_id = dd.id
							LEFT JOIN ' . $df->getTable() . ' as ee ON cc.default_department_id = ee.id
							LEFT JOIN ' . $ugf->getTable() . ' as ff ON cc.group_id = ff.id
							LEFT JOIN ' . $utf->getTable() . ' as gg ON cc.title_id = gg.id

							where cc.company_id = ? ';
        if (isset($filter_data['permission_children_ids']) and isset($filter_data['permission_children_ids'][0]) and !in_array(-1, (array) $filter_data['permission_children_ids'])) {
            $query .= ' AND cc.id in (' . $this->getListSQL($filter_data['permission_children_ids'], $ph) . ') ';
        }
        if (isset($filter_data['id']) and isset($filter_data['id'][0]) and !in_array(-1, (array) $filter_data['id'])) {
            $query .= ' AND cc.id in (' . $this->getListSQL($filter_data['id'], $ph) . ') ';
        }
        if (isset($filter_data['user_id']) and isset($filter_data['user_id'][0]) and !in_array(-1, (array) $filter_data['user_id'])) {
            $query .= ' AND cc.id in (' . $this->getListSQL($filter_data['user_id'], $ph) . ') ';
        }
        if (isset($filter_data['exclude_id']) and isset($filter_data['exclude_id'][0]) and !in_array(-1, (array) $filter_data['exclude_id'])) {
            $query .= ' AND cc.id not in (' . $this->getListSQL($filter_data['exclude_id'], $ph) . ') ';
        }
        if (isset($filter_data['status_id']) and isset($filter_data['status_id'][0]) and !in_array(-1, (array) $filter_data['status_id'])) {
            $query .= ' AND cc.status_id in (' . $this->getListSQL($filter_data['status_id'], $ph) . ') ';
        }
        if (isset($filter_data['group_id']) and isset($filter_data['group_id'][0]) and !in_array(-1, (array) $filter_data['group_id'])) {
            if (isset($filter_data['include_subgroups']) and (bool) $filter_data['include_subgroups'] == TRUE) {
                $uglf = new UserGroupListFactory();
                $filter_data['group_id'] = $uglf->getByCompanyIdAndGroupIdAndSubGroupsArray($company_id, $filter_data['group_id'], TRUE);
            }
            $query .= ' AND cc.group_id in (' . $this->getListSQL($filter_data['group_id'], $ph) . ') ';
        }
        if (isset($filter_data['default_branch_id']) and isset($filter_data['default_branch_id'][0]) and !in_array(-1, (array) $filter_data['default_branch_id'])) {
            $query .= ' AND cc.default_branch_id in (' . $this->getListSQL($filter_data['default_branch_id'], $ph) . ') ';
        }
        if (isset($filter_data['default_department_id']) and isset($filter_data['default_department_id'][0]) and !in_array(-1, (array) $filter_data['default_department_id'])) {
            $query .= ' AND cc.default_department_id in (' . $this->getListSQL($filter_data['default_department_id'], $ph) . ') ';
        }
        if (isset($filter_data['title_id']) and isset($filter_data['title_id'][0]) and !in_array(-1, (array) $filter_data['title_id'])) {
            $query .= ' AND cc.title_id in (' . $this->getListSQL($filter_data['title_id'], $ph) . ') ';
        }
        if (isset($filter_data['sex_id']) and isset($filter_data['sex_id'][0]) and !in_array(-1, (array) $filter_data['sex_id'])) {
            $query .= ' AND cc.sex_id in (' . $this->getListSQL($filter_data['sex_id'], $ph) . ') ';
        }
        if (isset($filter_data['currency_id']) and isset($filter_data['currency_id'][0]) and !in_array(-1, (array) $filter_data['currency_id'])) {
            $query .= ' AND bb.currency_id in (' . $this->getListSQL($filter_data['currency_id'], $ph) . ') ';
        }
        if (isset($filter_data['pay_period_ids']) and isset($filter_data['pay_period_ids'][0]) and !in_array(-1, (array) $filter_data['pay_period_ids'])) {
            $query .= ' AND bb.pay_period_id in (' . $this->getListSQL($filter_data['pay_period_ids'], $ph) . ') ';
        }
        if (isset($filter_data['transaction_start_date']) and trim($filter_data['transaction_start_date']) != '') {
            $ph[] = $this->db->BindTimeStamp(strtolower(trim($filter_data['transaction_start_date'])));
            $query .= ' AND bb.transaction_date >= ?';
        }
        if (isset($filter_data['transaction_end_date']) and trim($filter_data['transaction_end_date']) != '') {
            $ph[] = $this->db->BindTimeStamp(strtolower(trim($filter_data['transaction_end_date'])));
            $query .= ' AND bb.transaction_date <= ?';
        }
        if (isset($filter_data['transaction_date']) and trim($filter_data['transaction_date']) != '') {
            $ph[] = $this->db->BindTimeStamp(strtolower(trim($filter_data['transaction_date'])));
            $query .= ' AND bb.transaction_date = ?';
        }
        $query .= '
								AND (aa.deleted = 0 AND bb.deleted = 0 AND cc.deleted=0)
							group by aa.pay_stub_id,aa.pay_stub_entry_name_id
							) a
						LEFT JOIN ' . $psf->getTable() . ' as b ON a.pay_stub_id = b.id
						LEFT JOIN ' . $uf->getTable() . ' as c ON b.user_id = c.id
					where	1=1
					';
        $query .= '
						AND (c.deleted=0)
					';
        $query .= $this->getWhereSQL($where);
        $query .= $this->getSortSQL($order, $strict, $additional_order_fields);
        if ($limit == NULL) {
            $this->rs = $this->db->Execute($query, $ph);
        } else {
            $this->rs = $this->db->PageExecute($query, $limit, $page, $ph);
        }
        return $this;
    }
コード例 #2
0
    function getPayPeriodsWithPayStubsByCompanyId($id, $limit = NULL, $page = NULL, $where = NULL, $order = NULL)
    {
        if ($id == '') {
            return FALSE;
        }
        if ($order == NULL) {
            $order = array('a.transaction_date' => 'desc');
            $strict = FALSE;
        } else {
            $strict = TRUE;
        }
        $ph = array('id' => $id);
        $psf = new PayStubFactory();
        $query = '
					select 	a.*
					from	' . $this->getTable() . ' as a
					where	a.company_id = ?
						AND EXISTS ( select z.id from ' . $psf->getTable() . ' as z where z.pay_period_id = a.id AND z.deleted = 0 )
						AND a.deleted=0';
        $query .= $this->getWhereSQL($where);
        $query .= $this->getSortSQL($order);
        if ($limit == NULL) {
            $this->rs = $this->db->Execute($query, $ph);
        } else {
            $this->rs = $this->db->PageExecute($query, $limit, $page, $ph);
        }
        return $this;
    }
コード例 #3
0
 function testMultiplePayStubAccruals()
 {
     //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) - 8;
     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->setCurrency($pay_stub->getUserObject()->getCurrency());
     $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);
     //Adjust YTD balance, emulating a YTD PS amendment
     $pay_stub->addEntry($pse_accounts['vacation_accrual'], -340.38, NULL, NULL, 'Vacation Accrual YTD adjustment', -1, 0, 0);
     $pay_stub->addEntry($pse_accounts['vacation_accrual_release'], 6.13);
     $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'], 60.03);
     $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_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'], '6.13');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual_release']][0]['ytd_amount'], '6.13');
     $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'], '-340.38');
     //YTD adjustment
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][0]['ytd_amount'], '0.00');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][1]['amount'], '-6.13');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][1]['ytd_amount'], '0.00');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][2]['amount'], '60.03');
     //YTD adjustment
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][2]['ytd_amount'], '-286.48');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['amount'], '216.17');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['ytd_amount'], '216.17');
     $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'], '141.12');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['ytd_amount'], '141.12');
     $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->setCurrency($pay_stub->getUserObject()->getCurrency());
     $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'], 240.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);
         $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'], '240.01');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][0]['ytd_amount'], '-46.47');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['amount'], '210.02');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['total_gross']][0]['ytd_amount'], '426.19');
     $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'], '129.97');
     $this->assertEquals($pse_arr[$this->pay_stub_account_link_arr['net_pay']][0]['ytd_amount'], '271.09');
     $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->setCurrency($pay_stub->getUserObject()->getCurrency());
     $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'], 65.01000000000001);
     $pay_stub->setEnableProcessEntries(TRUE);
     $pay_stub->processEntries();
     if ($pay_stub->isValid() == TRUE) {
         $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'], '430.06');
     $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'], '200.04');
     $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'], '7.13');
     $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'], '153.03');
     $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'], '77.12');
     $this->assertEquals($pse_arr[$pse_accounts['medicare']][0]['amount'], '10.01');
     $this->assertEquals($pse_arr[$pse_accounts['medicare']][0]['ytd_amount'], '33.06');
     $this->assertEquals($pse_arr[$pse_accounts['state_unemployment']][0]['amount'], '15.05');
     $this->assertEquals($pse_arr[$pse_accounts['state_unemployment']][0]['ytd_amount'], '46.19');
     $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'], '65.01');
     $this->assertEquals($pse_arr[$pse_accounts['vacation_accrual']][1]['ytd_amount'], '17.54');
     $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'], '637.23');
     $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'], '230.15');
     $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'], '407.08');
     $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'], '79.25');
     unset($pse_arr, $pay_stub_id, $pay_stub);
     return TRUE;
 }
コード例 #4
0
        $filter_data['src_user_title_options'] = Misc::arrayDiffByKey((array) $filter_data['user_title_ids'], $user_title_options);
        $filter_data['selected_user_title_options'] = Misc::arrayIntersectByKey((array) $filter_data['user_title_ids'], $user_title_options);
        //Get pay periods
        //$pplf = new PayPeriodListFactory();
        //$pplf->getPayPeriodsWithPayStubsByCompanyId( $current_company->getId() );
        $pay_period_options = Misc::prependArray($all_array_option, $pplf->getArrayByListFactory($pplf, FALSE, TRUE));
        $filter_data['src_pay_period_options'] = Misc::arrayDiffByKey((array) $filter_data['pay_period_ids'], $pay_period_options);
        $filter_data['selected_pay_period_options'] = Misc::arrayIntersectByKey((array) $filter_data['pay_period_ids'], $pay_period_options);
        //Get currencies
        $crlf = new CurrencyListFactory();
        $crlf->getByCompanyId($current_company->getId());
        $currency_options = Misc::prependArray($all_array_option, $crlf->getArrayByListFactory($crlf, FALSE, TRUE));
        $filter_data['src_currency_options'] = Misc::arrayDiffByKey((array) $filter_data['currency_ids'], $currency_options);
        $filter_data['selected_currency_options'] = Misc::arrayIntersectByKey((array) $filter_data['currency_ids'], $currency_options);
        //Get column list
        $filter_data['src_column_options'] = Misc::arrayDiffByKey((array) $filter_data['column_ids'], $columns);
        $filter_data['selected_column_options'] = Misc::arrayIntersectByKey((array) $filter_data['column_ids'], $columns);
        //Get primary/secondary order list
        $filter_data['sort_options'] = $columns;
        $filter_data['sort_direction_options'] = Misc::getSortDirectionArray();
        $filter_data['group_by_options'] = Misc::prependArray(array('0' => TTi18n::gettext('No Grouping')), $static_columns);
        $psf = new PayStubFactory();
        $filter_data['export_type_options'] = Misc::prependArray(array('csv' => TTi18n::gettext('CSV (Excel)')), $psf->getOptions('export_type'));
        $saved_report_options = $ugdlf->getByUserIdAndScriptArray($current_user->getId(), $_SERVER['SCRIPT_NAME']);
        $generic_data['saved_report_options'] = $saved_report_options;
        $smarty->assign_by_ref('generic_data', $generic_data);
        $smarty->assign_by_ref('filter_data', $filter_data);
        $smarty->assign_by_ref('ugdf', $ugdf);
        $smarty->display('report/PayStubSummary.tpl');
        break;
}
コード例 #5
0
    function getPayPeriodsWithPayStubsByCompanyId($id, $limit = NULL, $page = NULL, $where = NULL, $order = NULL)
    {
        if ($id == '') {
            return FALSE;
        }
        if ($order == NULL) {
            $order = array('a.transaction_date' => 'desc');
            $strict = FALSE;
        } else {
            $strict = TRUE;
        }
        $ph = array('id' => $id);
        $uf = new UserFactory();
        $psf = new PayStubFactory();
        //Make sure just one row per pay period is returned.
        /*
        		//This is way too slow on older versions of PGSQL.
        		$query = '
        					select 	a.*
        					from	'. $this->getTable() .' as a
        					where	a.company_id = ?
        						AND ( a.deleted = 0 )
        						AND EXISTS ( select id from '. $psf->getTable() .' as b WHERE a.id = b.pay_period_id AND b.deleted = 0)';
        */
        $query = '	select 	distinct a.*
					from	' . $this->getTable() . ' as a
						LEFT JOIN ' . $psf->getTable() . ' as b on ( a.id = b.pay_period_id )
					where	a.company_id = ?
						AND ( a.deleted = 0 AND b.deleted = 0 )';
        $query .= $this->getWhereSQL($where);
        $query .= $this->getSortSQL($order);
        $this->ExecuteSQL($query, $ph, $limit, $page);
        return $this;
    }
コード例 #6
0
    function getAPIReportByCompanyIdAndArrayCriteria($company_id, $filter_data, $limit = NULL, $page = NULL, $where = NULL, $order = NULL)
    {
        if ($company_id == '') {
            return FALSE;
        }
        if (!is_array($order)) {
            //Use Filter Data ordering if its set.
            if (isset($filter_data['sort_column']) and $filter_data['sort_order']) {
                $order = array(Misc::trimSortPrefix($filter_data['sort_column']) => $filter_data['sort_order']);
            }
        }
        $additional_order_fields = array('default_branch', 'default_department', 'group', 'title', 'currency', 'pay_period_transaction_date', 'pay_stub_transaction_date', 'user_id');
        if ($order == NULL) {
            $order = array('b.user_id' => 'asc');
            $strict = FALSE;
        } else {
            $strict = TRUE;
        }
        //Debug::Arr($order,'Order Data:', __FILE__, __LINE__, __METHOD__,10);
        //Debug::Arr($filter_data,'Filter Data:', __FILE__, __LINE__, __METHOD__,10);
        $ppf = new PayPeriodFactory();
        $bf = new BranchFactory();
        $df = new DepartmentFactory();
        $ugf = new UserGroupFactory();
        $utf = new UserTitleFactory();
        $psf = new PayStubFactory();
        $uf = new UserFactory();
        $psaf = new PayStubAmendmentFactory();
        $ph = array('company_id' => $company_id);
        $query = '
					select 	a.*,
							b.user_id as user_id,
							b.pay_period_id as pay_period_id,
							ppf.start_date as pay_period_start_date,
							ppf.end_date as pay_period_end_date,
							ppf.transaction_date as pay_period_transaction_date,

							b.start_date as pay_stub_start_date,
							b.end_date as pay_stub_end_date,
							b.transaction_date as pay_stub_transaction_date,
							b.currency_id as currency_id,
							b.currency_rate as currency_rate,
							a.pay_stub_entry_name_id as pay_stub_entry_name_id,
							a.rate as rate,
							a.units as units,
							a.amount as amount,
							a.ytd_amount as ytd_amount
					from 	(
							select aa.pay_stub_id as pay_stub_id,
								aa.pay_stub_entry_name_id as pay_stub_entry_name_id,
								avg(aa.rate) as rate,
								sum(aa.units) as units,
								sum(aa.amount) as amount,
								max(aa.ytd_amount) as ytd_amount
							from ' . $this->getTable() . ' as aa
							LEFT JOIN ' . $psaf->getTable() . ' as hh ON aa.pay_stub_amendment_id = hh.id
							LEFT JOIN ' . $psf->getTable() . ' as bb ON aa.pay_stub_id = bb.id
							LEFT JOIN ' . $uf->getTable() . ' as cc ON bb.user_id = cc.id
							LEFT JOIN ' . $bf->getTable() . ' as dd ON cc.default_branch_id = dd.id
							LEFT JOIN ' . $df->getTable() . ' as ee ON cc.default_department_id = ee.id
							LEFT JOIN ' . $ugf->getTable() . ' as ff ON cc.group_id = ff.id
							LEFT JOIN ' . $utf->getTable() . ' as gg ON cc.title_id = gg.id

							where cc.company_id = ? ';
        $query .= isset($filter_data['permission_children_ids']) ? $this->getWhereClauseSQL('cc.id', $filter_data['permission_children_ids'], 'numeric_list', $ph) : NULL;
        $query .= isset($filter_data['id']) ? $this->getWhereClauseSQL('cc.id', $filter_data['id'], 'numeric_list', $ph) : NULL;
        $query .= isset($filter_data['user_id']) ? $this->getWhereClauseSQL('cc.id', $filter_data['user_id'], 'numeric_list', $ph) : NULL;
        $query .= isset($filter_data['include_user_id']) ? $this->getWhereClauseSQL('cc.id', $filter_data['include_user_id'], 'numeric_list', $ph) : NULL;
        $query .= isset($filter_data['exclude_user_id']) ? $this->getWhereClauseSQL('cc.id', $filter_data['exclude_user_id'], 'not_numeric_list', $ph) : NULL;
        $query .= isset($filter_data['status_id']) ? $this->getWhereClauseSQL('cc.status_id', $filter_data['status_id'], 'numeric_list', $ph) : NULL;
        if (isset($filter_data['exclude_ytd_adjustment']) and (bool) $filter_data['exclude_ytd_adjustment'] == TRUE) {
            $query .= ' AND ( hh.ytd_adjustment is NULL OR hh.ytd_adjustment = 0 )';
        }
        if (isset($filter_data['include_subgroups']) and (bool) $filter_data['include_subgroups'] == TRUE) {
            $uglf = new UserGroupListFactory();
            $filter_data['group_id'] = $uglf->getByCompanyIdAndGroupIdAndSubGroupsArray($company_id, $filter_data['group_id'], TRUE);
        }
        $query .= isset($filter_data['group_id']) ? $this->getWhereClauseSQL('cc.group_id', $filter_data['group_id'], 'numeric_list', $ph) : NULL;
        $query .= isset($filter_data['default_branch_id']) ? $this->getWhereClauseSQL('cc.default_branch_id', $filter_data['default_branch_id'], 'numeric_list', $ph) : NULL;
        $query .= isset($filter_data['default_department_id']) ? $this->getWhereClauseSQL('cc.default_department_id', $filter_data['default_department_id'], 'numeric_list', $ph) : NULL;
        $query .= isset($filter_data['title_id']) ? $this->getWhereClauseSQL('cc.title_id', $filter_data['title_id'], 'numeric_list', $ph) : NULL;
        $query .= isset($filter_data['sex_id']) ? $this->getWhereClauseSQL('cc.sex_id', $filter_data['sex_id'], 'numeric_list', $ph) : NULL;
        $query .= isset($filter_data['currency_id']) ? $this->getWhereClauseSQL('bb.currency_id', $filter_data['currency_id'], 'numeric_list', $ph) : NULL;
        $query .= isset($filter_data['pay_period_id']) ? $this->getWhereClauseSQL('bb.pay_period_id', $filter_data['pay_period_id'], 'numeric_list', $ph) : NULL;
        //$query .= ( isset($filter_data['tag']) ) ? $this->getWhereClauseSQL( 'a.id', array( 'company_id' => $company_id, 'object_type_id' => 200, 'tag' => $filter_data['tag'] ), 'tag', $ph ) : NULL;
        if (isset($filter_data['start_date']) and trim($filter_data['start_date']) != '') {
            $ph[] = $this->db->BindTimeStamp(strtolower(trim($filter_data['start_date'])));
            $query .= ' AND bb.transaction_date >= ?';
        }
        if (isset($filter_data['end_date']) and trim($filter_data['end_date']) != '') {
            $ph[] = $this->db->BindTimeStamp(strtolower(trim($filter_data['end_date'])));
            $query .= ' AND bb.transaction_date <= ?';
        }
        /*
        if ( isset($filter_data['transaction_date']) AND trim($filter_data['transaction_date']) != '' ) {
        	$ph[] = $this->db->BindTimeStamp( strtolower(trim($filter_data['transaction_date'])) );
        	$query  .=	' AND bb.transaction_date = ?';
        }
        */
        $query .= '
								AND (aa.deleted = 0 AND bb.deleted = 0 AND cc.deleted=0)
							group by aa.pay_stub_id,aa.pay_stub_entry_name_id
							) a
						LEFT JOIN ' . $psf->getTable() . ' as b ON a.pay_stub_id = b.id
						LEFT JOIN ' . $uf->getTable() . ' as c ON b.user_id = c.id
						LEFT JOIN ' . $ppf->getTable() . ' as ppf ON b.pay_period_id = ppf.id
					where	1=1
					';
        $query .= '
						AND (c.deleted=0)
					';
        $query .= $this->getWhereSQL($where);
        $query .= $this->getSortSQL($order, $strict, $additional_order_fields);
        //Debug::Arr($ph, 'Query: '. $query, __FILE__, __LINE__, __METHOD__,10);
        $this->ExecuteSQL($query, $ph, $limit, $page);
        return $this;
    }
コード例 #7
0
 function calculate($epoch = NULL)
 {
     if ($this->getUserObject() == FALSE) {
         return FALSE;
     }
     if ($this->getPayPeriodObject() == FALSE) {
         return FALSE;
     }
     if ($epoch == NULL or $epoch == '') {
         $epoch = TTDate::getTime();
     }
     //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;
     }
     //Allow generating pay stubs for employees who have any status, but if its not ID=10
     //Then the termination date must fall within the start/end date of the pay period, or after the end date (if its the current pay period)
     //The idea here is to allow employees to be marked terminated (or on leave) and still get their previous or final pay stub generated.
     //Also allow pay stubs to be generated in pay periods *before* their termination date.
     if ($this->getUserObject()->getStatus() != 10 and ($is_terminated == FALSE and ($this->getUserObject()->getTerminationDate() == '' or $this->getUserObject()->getTerminationDate() < $this->getPayPeriodObject()->getStartDate()))) {
         Debug::text('Pay Period is after users termination date (' . $this->getUserObject()->getTerminationDate() . '), or no termination date is set...', __FILE__, __LINE__, __METHOD__, 10);
         return FALSE;
     }
     Debug::text('User Id: ' . $this->getUser() . ' Pay Period End Date: ' . TTDate::getDate('DATE+TIME', $this->getPayPeriodObject()->getEndDate()), __FILE__, __LINE__, __METHOD__, 10);
     $generic_queue_status_label = $this->getUserObject()->getFullName(TRUE) . ' - ' . TTi18n::gettext('Pay Stub');
     $pay_stub = TTnew('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 = TTnew('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(10);
     //New
     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
         //For now make sure that the transaction date for a terminated employee is never before their termination date.
         if (TTDate::getEndDayEpoch(TTDate::getTime()) < $this->getUserObject()->getTerminationDate()) {
             $pay_stub->setTransactionDate($this->getUserObject()->getTerminationDate());
         } else {
             $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(25);
         //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 = TTnew('PayStubAmendmentListFactory');
     $psalf->getByUserIdAndAuthorizedAndStartDateAndEndDate($this->getUser(), TRUE, $this->getPayPeriodObject()->getStartDate(), $this->getPayPeriodObject()->getEndDate());
     $udlf = TTnew('UserDeductionListFactory');
     $udlf->getByCompanyIdAndUserId($this->getUserObject()->getCompany(), $this->getUserObject()->getId());
     if (getTTProductEdition() >= TT_PRODUCT_ENTERPRISE and $this->getUserObject()->getCompanyObject()->getProductEdition() >= TT_PRODUCT_ENTERPRISE) {
         $uelf = TTnew('UserExpenseListFactory');
         $uelf->getByUserIdAndAuthorizedAndStartDateAndEndDate($this->getUser(), TRUE, $this->getPayPeriodObject()->getStartDate(), $this->getPayPeriodObject()->getEndDate());
         Debug::text('Total User Expenses: ' . $uelf->getRecordCount(), __FILE__, __LINE__, __METHOD__, 10);
     } else {
         $uelf = FALSE;
     }
     $deduction_order_arr = $this->getOrderedDeductionAndPSAmendment($udlf, $psalf, $uelf);
     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.
                     //Determine if this deduction is valid based on min/max user age.
                     if ($ud_obj->getCompanyDeductionObject()->isActiveDate($pay_stub->getPayPeriodObject()->getEndDate()) == TRUE and $ud_obj->getCompanyDeductionObject()->isActiveLengthOfService($this->getUserObject(), $pay_stub->getPayPeriodObject()->getEndDate()) == TRUE and $ud_obj->getCompanyDeductionObject()->isActiveUserAge($this->getUserObject(), $pay_stub->getPayPeriodObject()->getEndDate()) == TRUE and $ud_obj->getCompanyDeductionObject()->inApplyFrequencyWindow($pay_stub->getPayPeriodObject()->getStartDate(), $pay_stub->getPayPeriodObject()->getEndDate(), $this->getUserObject()->getHireDate(), $this->getUserObject()->getTerminationDate(), $this->getUserObject()->getBirthDate()) == 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, NULL, NULL, $ud_obj->getCompanyDeductionObject()->getPayStubEntryDescription());
                         } 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);
                         //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(52);
                         //InUse
                         if ($psa_obj->isValid()) {
                             $pay_stub->addEntry($psa_obj->getPayStubEntryNameId(), $amount, $psa_obj->getUnits(), $psa_obj->getRate(), $psa_obj->getDescription(), $psa_obj->getID(), NULL, NULL, $psa_obj->getYTDAdjustment());
                             $psa_obj->Save();
                         }
                     } else {
                         Debug::text('bPay Stub Amendment Amount is not set...', __FILE__, __LINE__, __METHOD__, 10);
                     }
                     unset($amount, $psa_obj);
                 } elseif ($data_arr['type'] == 'UserExpenseListFactory') {
                     $ue_obj = $data_arr['obj'];
                     Debug::text('Found User Expense: ID: ' . $ue_obj->getID() . ' Expense Policy ID: ' . $ue_obj->getExpensePolicy(), __FILE__, __LINE__, __METHOD__, 10);
                     $amount = $ue_obj->getReimburseAmount();
                     if (isset($amount) and $amount != 0) {
                         Debug::text('User Expense reimbursable Amount: ' . $amount, __FILE__, __LINE__, __METHOD__, 10);
                         $pay_stub->addEntry($ue_obj->getExpensePolicyObject()->getPayStubEntryAccount(), $amount, NULL, NULL, NULL, NULL, NULL, NULL, FALSE, $ue_obj->getID());
                         //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.
                         $ue_obj->setStatus(35);
                         //InUse
                         $ue_obj->Save();
                     } else {
                         Debug::text('bUser Expense Amount is not set...', __FILE__, __LINE__, __METHOD__, 10);
                     }
                     unset($amount, $ue_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->setEnableCalcYTD(TRUE);
         //When recalculating old pay stubs in the middle of the year, we need to make sure YTD values are updated.
         $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 = TTnew('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->CommitTransaction();
     return FALSE;
 }