TimeTrex/unit_tests/testcases/selenium/CAPayrollDeductionCRACompare.php

522 lines
22 KiB
PHP

<?php /** @noinspection PhpMissingDocCommentInspection */
/*********************************************************************************
*
* TimeTrex is a Workforce Management program developed by
* TimeTrex Software Inc. Copyright (C) 2003 - 2021 TimeTrex Software Inc.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU Affero General Public License version 3 as published by
* the Free Software Foundation with the addition of the following permission
* added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED
* WORK IN WHICH THE COPYRIGHT IS OWNED BY TIMETREX, TIMETREX DISCLAIMS THE
* WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
* details.
*
*
* You should have received a copy of the GNU Affero General Public License along
* with this program; if not, see http://www.gnu.org/licenses or write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*
*
* You can contact TimeTrex headquarters at Unit 22 - 2475 Dobbin Rd. Suite
* #292 West Kelowna, BC V4T 2E9, Canada or at email address info@timetrex.com.
*
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
*
* In accordance with Section 7(b) of the GNU Affero General Public License
* version 3, these Appropriate Legal Notices must retain the display of the
* "Powered by TimeTrex" logo. If the display of the logo is not reasonably
* feasible for technical reasons, the Appropriate Legal Notices must display
* the words "Powered by TimeTrex".
*
********************************************************************************/
//Each Year:
// Copy testcases/payroll_deduction/CAPayrollDeductionCRATest2019.csv to the new year. Clear out all lines but the header.
// Update below "$this->year = 2021;" to the new year.
// Run: ./run_selenium.sh --filter CAPayrollDeductionCRACompareTest::testCRAToCSVFile <-- This will add lines to the above CSV file once its complete.
// Run: ./run_selenium.sh --filter CAPayrollDeductionCRACompareTest::testCRAFromCSVFile <-- This will test the PDOC numbers against our own.
/**
* @group CAPayrollDeductionCRACompareTest
*/
class CAPayrollDeductionCRACompareTest extends PHPUnit\Extensions\Selenium2TestCase {
private $default_wait_timeout = 4000;//100000;
function waitUntilByXPath( $xpath, $timeout = null ) {
if ( $timeout == null ) {
$timeout = $this->default_wait_timeout;
}
$this->waitUntil( function () use ( $xpath ) {
try {
$element = $this->byXPath( $xpath );
if ( $element->displayed() ) {
return true;
}
} catch ( PHPUnit_Extensions_Selenium2TestCase_WebDriverException $e ) {
}
return null;
}, $timeout );
}
public function setUp(): void {
global $selenium_config;
$this->selenium_config = $selenium_config;
Debug::text( 'Running setUp(): ', __FILE__, __LINE__, __METHOD__, 10 );
require_once( Environment::getBasePath() . '/classes/payroll_deduction/PayrollDeduction.class.php' );
$this->year = 2022;
$this->tax_table_file = dirname( __FILE__ ) . '/../payroll_deduction/CAPayrollDeductionTest' . $this->year . '.csv';
$this->cra_deduction_test_csv_file = dirname( $this->tax_table_file ) . DIRECTORY_SEPARATOR . 'CAPayrollDeductionCRATest' . $this->year . '.csv';
$this->company_id = PRIMARY_COMPANY_ID;
$this->selenium_test_case_runs = 0;
TTDate::setTimeZone( 'Etc/GMT+8', true ); //Due to being a singleton and PHPUnit resetting the state, always force the timezone to be set.
$this->setHost( $selenium_config['host'] );
$this->setBrowser( $selenium_config['browser'] );
$this->setBrowserUrl( $selenium_config['default_url'] );
}
public function tearDown(): void {
Debug::text( 'Running tearDown(): ', __FILE__, __LINE__, __METHOD__, 10 );
}
function CRAPayrollDeductionOnlineCalculator( $args = [] ) {
if ( ENABLE_SELENIUM_REMOTE_TESTS != true ) {
return false;
}
Debug::Arr( $args, 'Args: ', __FILE__, __LINE__, __METHOD__, 10 );
if ( count( $args ) == 0 ) {
return false;
}
try {
if ( $this->selenium_test_case_runs == 0 ) {
$url = 'https://www.canada.ca/en/revenue-agency/services/e-services/e-services-businesses/payroll-deductions-online-calculator.html';
Debug::text( 'Navigating to URL: ' . $url, __FILE__, __LINE__, __METHOD__, 10 );
$this->url( $url );
//Click "I Accept"
$this->waitUntilByXPath( '//a[contains(.,\'I accept\')]' );
$ae = $this->byXPath( '//a[contains(.,\'I accept\')]' );
Debug::text( 'Active Element Text: ' . $ae->text(), __FILE__, __LINE__, __METHOD__, 10 );
$ae->click();
$this->waitUntilByXPath( '//*[@id="welcome_button_next"]' );
$ae = $this->byXPath( '//*[@id="welcome_button_next"]' );
Debug::text( 'Active Element Text: ' . $ae->text(), __FILE__, __LINE__, __METHOD__, 10 );
$ae->click();
} else {
usleep( 500000 );
$this->waitUntilByXPath( '//*[@id="payrollDeductionsResults_button_modifyCalculationButton"]' );
$ae = $this->byXPath( '//*[@id="payrollDeductionsResults_button_modifyCalculationButton"]' ); //Modify the current calculation
Debug::text( 'Active Element Text: ' . $ae->text(), __FILE__, __LINE__, __METHOD__, 10 );
$ae->click();
}
$province_options = [
'AB' => 'ALBERTA',
'BC' => 'BRITISH_COLUMBIA',
'SK' => 'SASKATCHEWAN',
'MB' => 'MANITOBA',
'QC' => 'QUEBEC',
'ON' => 'ONTARIO',
'NL' => 'NEWFOUNDLAND_AND_LABRADOR',
'NB' => 'NEW_BRUNSWICK',
'NS' => 'NOVA_SCOTIA',
'PE' => 'PRINCE_EDWARD_ISLAND',
'NT' => 'NORTHWEST_TERRITORIES',
'YT' => 'YUKON',
'NU' => 'NUNAVUT',
];
Debug::Arr( Option::getByKey( $args['province'], $province_options ), 'Attempting to Select Province Value: ', __FILE__, __LINE__, __METHOD__, 10 );
$this->waitUntilByXPath( '//*[@id="jurisdiction"]' );
$ae = $this->byId( 'jurisdiction' );
$this->select( $ae )->selectOptionByValue( Option::getByKey( $args['province'], $province_options ) );
$pp_options = [
52 => 'WEEKLY_52PP',
26 => 'BI_WEEKLY',
24 => 'SEMI_MONTHLY',
];
$ae = $this->byId( 'payPeriodFrequency' );
$this->select( $ae )->selectOptionByValue( Option::getByKey( $args['pay_period_schedule'], $pp_options ) );
$ae = $this->byId( 'datePaidYear' );
$this->select( $ae )->selectOptionByLabel( date( 'Y', $args['date'] ) );
$ae = $this->byId( 'datePaidMonth' );
$this->select( $ae )->selectOptionByLabel( date( 'm', $args['date'] ) ); //Leading 0
$ae = $this->byId( 'datePaidDay' );
$this->select( $ae )->selectOptionByLabel( date( 'd', $args['date'] ) ); //Leading 0
$ae = $this->byId( 'payrollDeductionsStep1_button_next' );
Debug::text( 'Active Element Text: ' . $ae->text(), __FILE__, __LINE__, __METHOD__, 10 );
$ae->click();
$this->waitUntilByXPath( '//*[@id="incomeAmount"]' );
usleep( 500000 );
$ae = $this->byId( 'incomeAmount' );
$ae->click();
$this->keys( $args['gross_income'] ); //Sometimes some keystrokes get missed, try putting a wait above here.
$ae = $this->byId( 'payrollDeductionsStep2a_button_next' );
Debug::text( 'Active Element Text: ' . $ae->text(), __FILE__, __LINE__, __METHOD__, 10 );
$ae->click();
//$this->waitUntilByXPath( '//*[@id="federalClaimCode"]' );
//if ( isset( $args['federal_claim'] ) ) {
// $ae = $this->byId( 'federalClaimCode' );
// $this->select( $ae )->selectOptionByValue( ( $args['federal_claim'] == 0 ? 'CLAIM_CODE_0' : 'CLAIM_CODE_1' ) ); //Only support 0=$1, 1=Basic Claim
//}
//
//if ( isset( $args['provincial_claim'] ) && $args['province'] != 'QC' ) { //QC doesn't have provincial claim code.
// $ae = $this->byId( 'provinceTerritoryClaimCode' );
// $this->select( $ae )->selectOptionByValue( ( $args['provincial_claim'] == 0 ? 'CLAIM_CODE_0' : 'CLAIM_CODE_1' ) ); //Only support 0=$1, 1=Basic Claim
//}
if ( isset( $args['federal_claim'] ) ) {
$this->waitUntilByXPath( '//*[@id="td1ClaimAmountFed"]' );
$ae = $this->byId( 'td1ClaimAmountFed' );
$ae->click();
$this->keys( $args['federal_claim'] ); //Sometimes some keystrokes get missed, try putting a wait above here.
}
if ( isset( $args['provincial_claim'] ) && $args['province'] != 'QC' ) {
$this->waitUntilByXPath( '//*[@id="td1ClaimAmountProv"]' );
$ae = $this->byId( 'td1ClaimAmountProv' );
$ae->click();
$this->keys( $args['provincial_claim'] ); //Sometimes some keystrokes get missed, try putting a wait above here.
}
$result_row_offset = 1;
if ( isset( $args['ytd_cpp_earnings'] ) ) {
$ae = $this->byId( 'pensionableEarningsYearToDate' );
$ae->click();
$this->keys( $args['ytd_cpp_earnings'] );
}
if ( isset( $args['ytd_cpp'] ) ) {
$ae = $this->byId( 'cppOrQppContributionsDeductedYearToDate' );
$ae->click();
$this->keys( $args['ytd_cpp'] );
}
if ( isset( $args['ytd_ei_earnings'] ) ) {
$ae = $this->byId( 'insurableEarningsYearToDate' );
$ae->click();
$this->keys( $args['ytd_ei_earnings'] );
}
if ( isset( $args['ytd_ei'] ) ) {
$ae = $this->byId( 'employmentInsuranceDeductedYearToDate' );
$ae->click();
$this->keys( $args['ytd_ei'] );
}
usleep( 500000 );
$ae = $this->byId( 'payrollDeductionsStep3_button_calculate' );
Debug::text( 'Active Element Text: ' . $ae->text(), __FILE__, __LINE__, __METHOD__, 10 );
$ae->click();
//
//Handle results here
//
$screenshot_file_name = '/tmp/cra_result_screenshot-' . $args['province'] . '-' . $args['federal_claim'] . '-' . $args['provincial_claim'] . '-' . $args['gross_income'] . '.png';
file_put_contents( $screenshot_file_name, $this->currentScreenshot() );
//Make sure the gross income matches first.
$ae = $this->byXPath( '/html/body/div/div/main/section[2]/table[1]/tbody/tr[1]/td[1]' ); //Was: 1
Debug::Text( 'AE Text (Gross Income) [1]: ' . $ae->text(), __FILE__, __LINE__, __METHOD__, 10 );
$ae = $this->byXPath( '/html/body/div/div/main/section[2]/table[1]/tbody/tr[1]/td[3]' );
Debug::Text( 'AE Text (Gross Income) [1]: ' . $ae->text() . ' Expecting: ' . $args['gross_income'], __FILE__, __LINE__, __METHOD__, 10 );
//$retarr['gross_inc'] = TTi18n::parseFloat( $ae->text() );
$this->assertEquals( TTi18n::parseFloat( $ae->text() ), $args['gross_income'] );
$result_row_offset += 5;
//Federal Tax
$ae = $this->byXPath( '/html/body/div/div/main/section[2]/table[1]/tbody/tr[' . $result_row_offset . ']' ); //Was: 7
Debug::Text( 'AE Text (Federal) [' . $result_row_offset . ']: ' . $ae->text(), __FILE__, __LINE__, __METHOD__, 10 );
$ae = $this->byXPath( '/html/body/div/div/main/section[2]/table[1]/tbody/tr[' . $result_row_offset . ']/td[2]' );
Debug::Text( 'AE Text (Federal) [' . $result_row_offset . ']: ' . $ae->text(), __FILE__, __LINE__, __METHOD__, 10 );
$retarr['federal_deduction'] = TTi18n::parseFloat( $ae->text() );
$result_row_offset += 1;
//Provincial Tax
$ae = $this->byXPath( '/html/body/div/div/main/section[2]/table[1]/tbody/tr[' . $result_row_offset . ']' ); //Was: 8
Debug::Text( 'AE Text (Province) [' . $result_row_offset . ']: ' . $ae->text(), __FILE__, __LINE__, __METHOD__, 10 );
$ae = $this->byXPath( '/html/body/div/div/main/section[2]/table[1]/tbody/tr[' . $result_row_offset . ']/td[2]' );
Debug::Text( 'AE Text (Province) [' . $result_row_offset . ']: ' . $ae->text(), __FILE__, __LINE__, __METHOD__, 10 );
$retarr['provincial_deduction'] = TTi18n::parseFloat( $ae->text() );
$result_row_offset += 2;
//CPP
$ae = $this->byXPath( "/html/body/div/div/main/section[2]/table[1]/tbody/tr[" . $result_row_offset . "]" );
Debug::Text( 'AE Text (CPP) [' . $result_row_offset . ']: ' . $ae->text(), __FILE__, __LINE__, __METHOD__, 10 );
$ae = $this->byXPath( "/html/body/div/div/main/section[2]/table[1]/tbody/tr[" . $result_row_offset . "]/td[3]" );
Debug::Text( 'AE Text (CPP) [' . $result_row_offset . ']: ' . $ae->text(), __FILE__, __LINE__, __METHOD__, 10 );
$retarr['cpp_deduction'] = TTi18n::parseFloat( $ae->text() );
$result_row_offset += 1;
//EI
$ae = $this->byXPath( "/html/body/div/div/main/section[2]/table[1]/tbody/tr[" . $result_row_offset . "]" );
Debug::Text( 'AE Text (EI) [' . $result_row_offset . ']: ' . $ae->text(), __FILE__, __LINE__, __METHOD__, 10 );
$ae = $this->byXPath( "/html/body/div/div/main/section[2]/table[1]/tbody/tr[" . $result_row_offset . "]/td[3]" );
Debug::Text( 'AE Text (EI) [' . $result_row_offset . ']: ' . $ae->text(), __FILE__, __LINE__, __METHOD__, 10 );
$retarr['ei_deduction'] = TTi18n::parseFloat( $ae->text() );
//Debug::Arr( $this->source(), 'Raw Source: ', __FILE__, __LINE__, __METHOD__, 10);
//sleep(5);
$this->selenium_test_case_runs++;
} catch ( Exception $e ) {
Debug::Text( 'Exception: ' . $e->getMessage(), __FILE__, __LINE__, __METHOD__, 10 );
file_put_contents( tempnam( '/tmp/', 'cra_result_screenshot_exception' ) . '.png', $this->currentScreenshot() );
sleep( 15 );
}
if ( isset( $retarr ) ) {
Debug::Arr( $retarr, 'Retarr: ', __FILE__, __LINE__, __METHOD__, 10 );
return $retarr;
}
Debug::Text( 'ERROR: Returning FALSE!', __FILE__, __LINE__, __METHOD__, 10 );
return false;
}
//Simple control test to ensure the numbers match for the previous year.
function testCRAControlCurrentYear() {
$pd_obj = new PayrollDeduction( 'CA', 'BC' );
$pd_obj->setDate( TTDate::getEndYearEpoch( ( TTDate::getBeginYearEpoch() - 86400 ) ) );
$pd_obj->setEnableCPPAndEIDeduction( true ); //Deduct CPP/EI.
$pd_obj->setAnnualPayPeriods( 26 );
$pd_obj->setFederalTotalClaimAmount( 1 ); //1=Basic Claim Amount
$pd_obj->setProvincialTotalClaimAmount( 1 ); //1=Basic Claim Amount
$pd_obj->setEIExempt( false );
$pd_obj->setCPPExempt( false );
$pd_obj->setFederalTaxExempt( false );
$pd_obj->setProvincialTaxExempt( false );
$pd_obj->setYearToDateCPPContribution( 0 );
$pd_obj->setYearToDateEIContribution( 0 );
$pd_obj->setGrossPayPeriodIncome( 9933.99 );
$args = [
'date' => strtotime( $pd_obj->getDate() ), //Must be epoch.
'province' => $pd_obj->getProvince(),
'pay_period_schedule' => $pd_obj->getAnnualPayPeriods(),
'federal_claim' => $pd_obj->getFederalTotalClaimAmount(),
'provincial_claim' => $pd_obj->getProvincialTotalClaimAmount(),
'gross_income' => $pd_obj->getGrossPayPeriodIncome(),
];
$retarr = $this->CRAPayrollDeductionOnlineCalculator( $args );
$this->assertEquals( $this->mf( $pd_obj->getFederalPayPeriodDeductions() ), $retarr['federal_deduction'] );
$this->assertEquals( $this->mf( $pd_obj->getProvincialPayPeriodDeductions() ), $retarr['provincial_deduction'] );
$this->assertEquals( $this->mf( $pd_obj->getEmployeeCPP() ), $retarr['cpp_deduction'] );
$this->assertEquals( $this->mf( $pd_obj->getEmployeeEI() ), $retarr['ei_deduction'] );
return true;
}
//Simple control test to ensure the numbers match for the next year.
// Since this would normally be run sometimes in December, this will compare the values for the upcoming tax year.
function testCRAControlNextYear() {
$pd_obj = new PayrollDeduction( 'CA', 'BC' );
$pd_obj->setDate( ( TTDate::getEndYearEpoch( time() ) + 86400 ) ); //**NOTE: this will fail if its run in the most recent tax year.
$pd_obj->setEnableCPPAndEIDeduction( true ); //Deduct CPP/EI.
$pd_obj->setAnnualPayPeriods( 26 );
$pd_obj->setFederalTotalClaimAmount( 1 ); //1=Basic Claim Amount
$pd_obj->setProvincialTotalClaimAmount( 1 ); //1=Basic Claim Amount
$pd_obj->setEIExempt( false );
$pd_obj->setCPPExempt( false );
$pd_obj->setFederalTaxExempt( false );
$pd_obj->setProvincialTaxExempt( false );
$pd_obj->setYearToDateCPPContribution( 0 );
$pd_obj->setYearToDateEIContribution( 0 );
$pd_obj->setGrossPayPeriodIncome( 9933.99 );
$args = [
'date' => strtotime( $pd_obj->getDate() ), //Must be epoch.
'province' => $pd_obj->getProvince(),
'pay_period_schedule' => $pd_obj->getAnnualPayPeriods(),
'federal_claim' => $pd_obj->getFederalTotalClaimAmount(),
'provincial_claim' => $pd_obj->getProvincialTotalClaimAmount(),
'gross_income' => $pd_obj->getGrossPayPeriodIncome(),
];
$retarr = $this->CRAPayrollDeductionOnlineCalculator( $args );
$this->assertEquals( $this->mf( $pd_obj->getFederalPayPeriodDeductions() ), $retarr['federal_deduction'] );
$this->assertEquals( $this->mf( $pd_obj->getProvincialPayPeriodDeductions() ), $retarr['provincial_deduction'] );
$this->assertEquals( $this->mf( $pd_obj->getEmployeeCPP() ), $retarr['cpp_deduction'] );
$this->assertEquals( $this->mf( $pd_obj->getEmployeeEI() ), $retarr['ei_deduction'] );
return true;
}
public function mf( $amount ) {
return Misc::MoneyRound( $amount );
}
function testCRAToCSVFile() {
$this->assertEquals( true, file_exists( $this->tax_table_file ) );
if ( file_exists( $this->cra_deduction_test_csv_file ) ) {
$file = new SplFileObject( $this->cra_deduction_test_csv_file, 'r' );
$file->seek( PHP_INT_MAX );
$total_compare_lines = $file->key() + 1;
unset( $file );
Debug::text( 'Found existing CRATest file to resume with lines: ' . $total_compare_lines, __FILE__, __LINE__, __METHOD__, 10 );
}
$test_rows = Misc::parseCSV( $this->tax_table_file, true );
$total_rows = ( count( $test_rows ) + 1 );
$i = 2;
foreach ( $test_rows as $row ) {
if ( isset( $total_compare_lines ) && $i < $total_compare_lines ) {
Debug::text( ' Skipping to line: ' . $total_compare_lines . '/' . $i, __FILE__, __LINE__, __METHOD__, 10 );
$i++;
continue;
}
Debug::text( 'Province: ' . $row['province'] . ' Income: ' . $row['gross_income'], __FILE__, __LINE__, __METHOD__, 10 );
if ( isset( $row['gross_income'] ) && isset( $row['low_income'] ) && isset( $row['high_income'] )
&& $row['gross_income'] == '' && $row['low_income'] != '' && $row['high_income'] != '' ) {
$row['gross_income'] = ( $row['low_income'] + ( ( $row['high_income'] - $row['low_income'] ) / 2 ) );
}
if ( $row['country'] != '' && $row['gross_income'] != '' ) {
//echo $i.'/'.$total_rows.'. Testing Province: '. $row['province'] .' Income: '. $row['gross_income'] ."\n";
Debug::text( $i . '/' . $total_rows . '. Testing Province: ' . $row['province'] . ' Income: ' . $row['gross_income'], __FILE__, __LINE__, __METHOD__, 10 );
$args = [
'date' => strtotime( $row['date'] ),
'province' => $row['province'],
'pay_period_schedule' => 26,
'federal_claim' => $this->mf( $row['federal_claim'] ),
'provincial_claim' => $this->mf( $row['provincial_claim'] ),
'gross_income' => $this->mf( $row['gross_income'] ),
];
//Debug::Arr( $row, 'aFinal Row: ', __FILE__, __LINE__, __METHOD__, 10);
$tmp_cra_data = $this->CRAPayrollDeductionOnlineCalculator( $args );
if ( is_array( $tmp_cra_data ) ) {
$retarr[] = array_merge( $row, $tmp_cra_data );
//Debug::Arr( $retarr, 'bFinal Row: ', __FILE__, __LINE__, __METHOD__, 10);
//sleep(2); //Should we be friendly to the Gov't server?
// if ( $i > 5 ) {
// break;
// }
} else {
Debug::text( 'ERROR! Data from CRA is invalid!', __FILE__, __LINE__, __METHOD__, 10 );
break;
}
}
$i++;
}
if ( isset( $retarr ) ) {
//generate column array.
$column_keys = array_keys( $retarr[0] );
foreach ( $column_keys as $column_key ) {
$columns[$column_key] = $column_key;
}
//var_dump($test_data);
//var_dump($retarr);
//echo Misc::Array2CSV( $retarr, $columns, FALSE, TRUE );
file_put_contents( $this->cra_deduction_test_csv_file, Misc::Array2CSV( $retarr, $columns, false, true ), FILE_APPEND );
//Make sure all rows are tested.
$this->assertEquals( $total_rows, ( $i - 1 ) );
} else {
$this->assertEquals( true, false );
}
}
function testCRAFromCSVFile() {
$this->assertEquals( true, file_exists( $this->cra_deduction_test_csv_file ) );
$test_rows = Misc::parseCSV( $this->cra_deduction_test_csv_file, true );
$total_rows = ( count( $test_rows ) + 1 );
$i = 2;
foreach ( $test_rows as $row ) {
//Debug::text('Province: '. $row['province'] .' Income: '. $row['gross_income'], __FILE__, __LINE__, __METHOD__, 10);
if ( isset( $row['gross_income'] ) && isset( $row['low_income'] ) && isset( $row['high_income'] )
&& $row['gross_income'] == '' && $row['low_income'] != '' && $row['high_income'] != '' ) {
$row['gross_income'] = ( $row['low_income'] + ( ( $row['high_income'] - $row['low_income'] ) / 2 ) );
}
if ( $row['country'] != '' && $row['gross_income'] != '' ) {
//echo $i.'/'.$total_rows.'. Testing Province: '. $row['province'] .' Income: '. $row['gross_income'] ."\n";
$pd_obj = new PayrollDeduction( $row['country'], $row['province'] );
$pd_obj->setDate( strtotime( $row['date'] ) );
$pd_obj->setEnableCPPAndEIDeduction( true ); //Deduct CPP/EI.
$pd_obj->setAnnualPayPeriods( $row['pay_periods'] );
$pd_obj->setFederalTotalClaimAmount( $row['federal_claim'] ); //Amount from 2005, Should use amount from 2007 automatically.
$pd_obj->setProvincialTotalClaimAmount( $row['provincial_claim'] );
$pd_obj->setEIExempt( false );
$pd_obj->setCPPExempt( false );
$pd_obj->setFederalTaxExempt( false );
$pd_obj->setProvincialTaxExempt( false );
$pd_obj->setYearToDateCPPContribution( 0 );
$pd_obj->setYearToDateEIContribution( 0 );
$pd_obj->setGrossPayPeriodIncome( $this->mf( $row['gross_income'] ) );
$this->assertEquals( $this->mf( $pd_obj->getGrossPayPeriodIncome() ), $this->mf( $row['gross_income'] ) );
if ( $row['federal_deduction'] != '' ) {
$this->assertEqualsWithDelta( (float)$this->mf( $row['federal_deduction'] ), (float)$this->mf( $pd_obj->getFederalPayPeriodDeductions() ), 0.015, 'I: '. $i .' Gross Income: '. $row['gross_income'] .' Province: '. $row['province'] .' Federal Claim: '. $row['federal_claim'] ); //0.015=Allowed Delta
}
if ( $row['provincial_deduction'] != '' ) {
$this->assertEqualsWithDelta( (float)$this->mf( $row['provincial_deduction'] ), (float)$this->mf( $pd_obj->getProvincialPayPeriodDeductions() ), 0.015, 'I: '. $i .' Gross Income: '. $row['gross_income'] .' Province: '. $row['province'] .' Provincial Claim: '. $row['provincial_claim'] ); //0.015=Allowed Delta
}
}
$i++;
}
//Make sure all rows are tested.
$this->assertEquals( $total_rows, ( $i - 1 ) );
}
}
?>